美文网首页
IO复用模型

IO复用模型

作者: Balram | 来源:发表于2021-03-22 12:59 被阅读0次

    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模型

    相关文章

      网友评论

          本文标题:IO复用模型

          本文链接:https://www.haomeiwen.com/subject/tcezcltx.html