IO复用模型

2021-03-22  本文已影响0人  Balram

Unix下可用的5中I/O模型

一个输入操作通常包含两个不同阶段

  1. 等待数据准备好。

  2. 从内核向进程复制数据。

第一步通常涉及等待数据从网络中到达,当所等待分组到达时,他被复制到内核中的某个缓冲区。

第二步是把数据从内核缓冲区复制到应用进程缓冲区。

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。

参考资料

  1. 《UNIX网络编程卷1》第6章 6.2 I/O模型
上一篇下一篇

猜你喜欢

热点阅读