IO复用模型
Unix下可用的5中I/O模型
一个输入操作通常包含两个不同阶段
-
等待数据准备好。
-
从内核向进程复制数据。
第一步通常涉及等待数据从网络中到达,当所等待分组到达时,他被复制到内核中的某个缓冲区。
第二步是把数据从内核缓冲区复制到应用进程缓冲区。
1. 阻塞式I/O
阻塞式IO模型.png进程调用recvfrom,其系统调用知道数据到达且被复制到应用进程的缓冲区中,或者发生错误才返回。从调用recvfrom开始,到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据。
非阻塞式I/O
非阻塞式IO模型.png进程把一个套接字设置成非阻塞是在通知内核:当所请求的IO操作时,不进行阻塞,而是返回一个错误。当应用进程像对这样一个非阻塞描述符循环调用recvfrom时,称之为轮询。
应用进程持持续轮询内核,以便查看某个操作是否就绪、这样做往往消耗大量CPU时间。
I/O复用(select 和 poll)
IO复用模型.png阻塞与select调用,等待数据报套接字变为可读,。当select返回套接字可读这一条件,调用recvfrom把可读数据复制到应用进程缓冲区。
使用IO复用并没有什么优势,而且还需要两个系统调用。但是select的优势,在于可以等待多个描述符就绪。
信号驱动式I/O(SIGIO)
信号驱动式IO模型.png首先要开启套接字的信号驱动式IO功能,并通过系统调用,安装一个信号处理函数,该调用会立即返回,进程可以继续工作,不会阻塞。
当数据准备好,内核就为该进程产生一个SIGIO信号。随后可以在信号处理函数中调用revcfrom读取数据,并通知主循环数据已经准备好处理。
这种模型优势在于,等待数据到达期间,进程不会被阻塞,主循环可以继续执行。
异步I/O
异步IO模型.png工作机制是:告知内核后启动某个操作,并让内核在整个操作(包括将数据从内核复制到进程缓冲区),完成后通知进程。信号驱动的话,只是由内核通知进程可以启动一个IO操作。异步IO是内核通知应用进程IO操作何时完成。
同步IO操作:导致请求进程阻塞,直到IO操作完成。
异步IO操作:不导致请求进程阻塞。
因此可以知道:阻塞IO模型、非阻塞IO模型、IO复用模型和信号驱动IO模型 都是同步IO模型,因为真正的IO操作(recvfrom)将阻塞进程。只有异步IO模型 是异步IO。
参考资料
- 《UNIX网络编程卷1》第6章 6.2 I/O模型