分布式学习笔记---分布式架构网络通信-同步与异步-阻塞和非阻塞
分类:
文章
•
2025-01-25 18:34:52
分布式学习笔记—分布式架构网络通信-同步与异步-阻塞和非阻塞
1. 三种IO模型:BIO、NIO、AIO
-
BIO
:同步阻塞
-
NIO
:同步非阻塞
-
AIO
:异步非阻塞
2. 同步和异步简介: 强调的是消息通信机制
2-1.同步:
-
同步(synchronize)
、异步(asychronize)
是指应用程序和内核(操作系统)
的交互而言的.
-
同步
:指用户进程触发IO操作等待或者轮训的方式查看IO操作是否就绪。
-
同步举例
: 银行取钱,我自己去取钱,取钱的过程中等待.
2-2.异步:
- 当一个异步进程调用发出之后,调用者不会立刻得到结果。而是在调用发出之后,被调用者通过状态、通知来通知调用者,或者通过回调函数来处理这个调用。
- 使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,OS需要支持异步IO操作
-
异步举例
:我请朋友帮我取钱,他取到钱后返回给我. (委托给操作系统OS, OS需要支持IO异步API)
3. 阻塞和非阻塞: 强调的是程序在等待调用结果(消息,返回值)时的状态
-
阻塞和非阻塞
是针对于进程访问数据的时候,根据IO操作的就绪状态来采取不同的方式.
- 简单点说就是一种读写操作方法的实现方式. 阻塞方式下读取和写入将一直等待, 而非阻塞方式下,读取和写入方法会立即返回一个状态值.
-
举个例子:
-
阻塞
:ATM机排队取款,你只能等待排队取款(使用阻塞IO的时候,Java调用会一直阻塞到读写完成才返回。)
-
非阻塞
:
柜台取款,取个号,然后坐在椅子上做其他事,等广播通知,没到你的号你就不能去,但你可以不断的问大堂经理排到了没有。(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)
4. 同步和异步,阻塞和非阻塞的例子
老张煮开水。 老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
- 老张把水壶放到火上,站立着等水开。
(同步阻塞)
- 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。
(同步非阻塞)
- 老张把响水壶放到火上,立等水开。
(异步阻塞)
- 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。
(异步非阻塞)
5. BIO: 同步阻塞IO,B代表blocking
- 服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
- 适用场景:Java1.4之前唯一的选择,简单易用但资源开销太高
6. NIO介绍: 同步非阻塞IO (non-blocking IO / new io)是指JDK 1.4 及以上版本
- 服务器实现模式为一个请求一个通道,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。
6-1.通道(Channels)
- NIO 新引入的最重要的抽象是通道的概念。Channel 数据连接/传输的通道。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中 .
6-2.缓冲区(Buffers)
- 通道channel可以向缓冲区Buffer中写数据,也可以像buffer中存数据。
6-3.选择器(Selector)
- 使用选择器,借助单一线程,就可对数量庞大的活动 I/O 通道实时监控和维护。
7. AIO介绍: 异步非阻塞IO。A代表asynchronize
-
当有流可以读时
,操作系统会将可以读的流传入read方法的缓冲区,并通知应用程序,对于写操作,OS将write方法的流写入完毕是操作系统会主动通知应用程序。因此read和write都是异步 的,完成后会调用回调函数。
-
使用场景
:连接数目多且连接比较长(重操作)的架构,比如相册服务器。重点调用了OS参与并发操作,编程比较复杂。Java7开始支持