一个IO操作涉及两个系统对象:
- 调用这个IO的用户Process/Thread
- 系统内核 - System Kernel
一个具体的Read操作包括两个阶段:
- 内核等待数据准备就绪:Waiting for the data to be ready
- 从内核向用户进程/线程拷贝数据:Copying the data from the Kernel to the Process/Thread
只有在同步的情况下才会有“阻塞”和“非阻塞”之说,异步情况,必须是非阻塞的!
同步 vs 异步
同步与异步是针对应用程序与内核的交互而言的,进程/线程触发IO操作后:
- 同步过程:进程/线程等待IO操作完成(阻塞)或轮询查看IO操作是否完成(非阻塞);
- 异步过程:直接返回,进程/线程做自己的事情,IO操作交给内核处理、完成后内核通知进程/线程;
同步 Synchronous
A Synchronous-I/O operation causes the requesting process to be blocked until that I/O operation completes.
串行,无条件等待。
异步 Asynchronous
An Asynchronous-I/O operation does not cause the requesting process to be blocked.
并发,
阻塞 vs 非阻塞
关于阻塞/非阻塞,在网络编程中通常应用在是不是需要等待数据就绪。
阻塞 Blocking
挂起等待,
非阻塞 Non-Blocking
轮询检查等待,
I/O模型
阻塞I/O(Blocking I/O)
非阻塞I/O(Non-Blocking I/O)
I/O多路复用(I/O Multiplexing)
信号驱动I/O(Signal Driven I/O)
异步I/O(Asynchronous I/O)
推荐书籍:
- 《UNIX网络编程 - 卷1》:第六章
参考:
时间: 2024-10-14 00:33:23