五种 IO 模型

Posted rason

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五种 IO 模型相关的知识,希望对你有一定的参考价值。

前段时间学习了一下 Thrift 的工作过程,说到底核心就是根据消息协议进行通信。脑补了一下如果自己来实现会怎么做,想着想着就想到网络通信和I/O这一块了。好吧,就先研究一下I/O模型,我管这种学习方法为缘分学习法。学习这东西感觉就是一个无底洞,越挖发现东西越多。

五种I/O模型

其实之前也有大概看过这方面的知识,什么同步异步,什么阻塞非阻塞,当时看得一团糟。今天再次梳理一下:

  • 同步和异步是根据数据从内核空间到用户空间是否需要等待来区别的,等就是同步,不等就是异步。

  • 阻塞和非阻塞是根据数据在就绪之前是立即返回还是等待,即发起I/O请求是否会被阻塞来区别的,等就是阻塞,不等就是非阻塞。

同步阻塞

上图中 recvfrom 方法等待数据就绪,也等待数据从内核空间拷贝到用户空间,因此是同步阻塞模型。

同步非阻塞

五种 IO 模型

上图中不断调用 recvfrom 看数据就绪了没有,会立即返回没有阻塞;当数据就绪后会等待从内核空间拷贝到用户空间,属于同步,因此这是同步非阻塞模型。通过对socket设置O_NONBLOCK可实现同步非阻塞。

I/O复用

五种 IO 模型

上面的模型虽然是非阻塞,但是还是会不断去询问数据就绪了没有,好像也没啥卵用。所以就出现了I/O复用,就是先向操作系统注册自己感兴趣的一大堆数据,然后统一问操作系统有哪几个是已经准备好的了。

上面的 select 方法其实也是阻塞的,但是他会返回批量已经准备好的数据,所以效率还是挺高的。 recvfrom 方法是同步的,需要等待系统进行数据复制,这个操作是纯CPU 操作,速度并不慢。

信号驱动

此模型利用信号的模型来通知用户进程数据是否就绪,但是Linux中信号队列是有限制的,如果超过这个数字问题就无法读取数据。

异步非阻塞

这个模型不用等数据就绪,也不用等数据拷贝,直接准备好数据给你。数据异步非阻塞。


以上是关于五种 IO 模型的主要内容,如果未能解决你的问题,请参考以下文章

五种高阶IO模型以及多路转接技术(selectpoll和epoll)及其代码验证

(转载) Linux五种IO模型

深入底层,Linux五种IO模型全解析

深入底层,Linux五种IO模型全解析

五种IO模型

五种IO模型详解