
It shows that the main difference between the first four models is the first phase, as the second phase in the first four models is the same: the process is blocked in a call to recvfrom while the data is copied from the kernel to the caller's buffer. Asynchronous I/O, however, handles both phases and is different from the first four
参考资料
下面列出参考资料,以及资料里边对于IO Models观点的整理。基本上,各方资料就是对上图的各角度阐述
unix_network_programming IO Models
POSIX defines these two terms as follows:
- A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
- An asynchronous I/O operation does not cause the requesting process to be blocked.
Using these definitions, the first four I/O models—blocking, nonblocking, I/O multiplexing, and signal-driven I/O—are all synchronous because the actual I/O operation (recvfrom) blocks the process. Only the asynchronous I/O model matches the asynchronous I/O definition.
阻塞 (Blocking) 与非阻塞 (Non-Blocking) 描述的是请求在等待结果时的状态
- 阻塞 (Blocking):调用的程序或应用程序发起请求,在获得结果之前,调用方的程序会悬(Hang)住不动,无法响应,直到获得结果
- 非阻塞 (Non-Blocking):概念与阻塞相同,但是调用方不会因为等待结果,而悬着不动。后续通常透过轮询机制(Polling)取得结果
同步 (Synchronous) 与 非同步 (Asynchronous) 描述的是:使用者执行端与 Kernel 的 通讯模式
- 同步 (Synchronous):使用者执行端发出I / O请求后,要等待、或者轮询Kernel I / O的操作完成后,才能继续执行。
- 等待Kernel回复:Blocking IO,简称 BIO
- 轮询类似于Non-Blocking IO,简称 NIO
- 非同步 (Asynchronous):或称异步,用户执行端发出I / O请求后仍继续执行下一个操作,当Kernel I / O操作结束后,会通知执行端,或者调用回调函数
- synchronous / asynchronous is to describe the relation between two modules
- blocking / non-blocking is to describe the situation of one module
架构设计:系统间通信(4)——IO通信模型和JAVA实践 中篇
- 什么叫做“同步IO”。实际上一句话就可以说清楚:只有上层(包括上层的某种代理机制)系统询问我是否有某个事件发生了,否则我不会主动告诉上层系统事件发生了
- 异步IO则是采用“订阅-通知”模式:即应用程序向操作系统注册IO监听,然后继续做自己的事情。当操作系统发生IO事件,并且准备好数据后,在主动通知应用程序,触发相应的函数
- 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;
- 同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写
参考了多篇文章之后,个人对IO-Models的看法
阻塞、非阻塞:描述的是请求方需要的数据未准备就绪时,要不要等待(一个人的寂寞)
- 阻塞:要等待,体现在Linux上就是进程会进入到waiting状态(非Java Thread State)
- 非阻塞:不等待
同步、异步:描述的是两个事物之间的通信方式,可能是两个线程(池)、也可能是一个线程之内不同的执行态,取决于操作系统具体实现(两个人的错)
- 同步,意味着需要协同两个事物之间的步调,需要一方主动等待另一方,表现的方式就是block住(即便不block,也需不断polling),只有这样,才能保持一定的步调(画话音:是同步导致了等待,并以阻塞的形式表现,而不是因为阻塞,所以同步)
- 异步,意味着不需要协调二者的步调,请求方可以继续往下执行应用程序代码,不再需要询问数据是否就绪,只需当数据准备好之后,由另一方推送给请求方
同步与异步还有一个特性在unix_network_programming
没有明确表示出来,但却可以推断:
- Blocking I/O model: 询问数据是否到达,到达后取数据
- Nonblocking I/O model: 来回咨询数据是否达到,到达后取数据
- I/O multiplexing model: 通过其他途径(select)询问数据是否到达,到达后取数据
- Signal-Driven I/O model: 通过一些手段(sigaction)告知数据准备方,当数据准备好的时候,通知请求方来取数据
- Asynchronous I/O model: 通过另外手段(aio_read)告知数据准备方,当数据准备好的时候,直接读取,并将数据推送给请求方
由上可知,同步需要请求方主动去取数据,而异步是请求方被动等待数据送达
另外,从严格意义上,不存在同步非阻塞
这种说法,网上流传的同步非阻塞
,大抵上是为了强调请求方在wait for data
阶段不阻塞
于recvfrom
的特性。而实际上,在data copy
阶段,同步调用仍然会阻塞于recvfrom
。因此听到同步非阻塞
这个概念时候,不需刻意去纠正谁对谁错,只要大家在理解上达成一致,明白描述是同一件事即可
网友评论