1. 一些概念

1.1

  • 进程切换:百科
  • 进程阻塞:百科 进程进入阻塞状态也就让出了CPU资源,等相应的事件出现才被唤醒
  • 同步与异步:关注的是消息通信机制 (synchronous communication/ asynchronous communication)。如果在函数调用返回的时候就能得到结果,那这就是同步的;相反,如果在函数调用返回的时候还不能得到结果,而是要等到适当的时候才能得到结果,那这就是异步的。
  • 阻塞与非阻塞:关注的是调用过程中的状态。如果请求的过程中需要等待(线程阻塞挂起),那这就是阻塞式;如果不需要等待,那这就是非阻塞式

同步不等同于阻塞,异步也不等同与非阻塞,因为关注点不同。

1.2 IO输入流程图

Linux 五种IO模型

2. 五种IO模型

2.1 阻塞IO

  • 从编程视角来看:从函数调用—>等待数据—>数据拷贝—>返回结果整个过程中都是阻塞的。因为在函数返回的时候,也一起返回了结果(数据),因此是同步IO的
  • 举例:去商场吃饭,从下单—>商家做饭—>自己去取做好的饭菜—>开吃,整个过程你都坐在那什么也不干傻傻的等
    Linux 五种IO模型

2.2.非阻塞IO

  • 从编程的视角来看:函数调用之后,如果没有数据那么该函数就立马返回,因此需要你自己在代码逻辑中加入轮询逻辑,如果该函数调用发现有数据那么就会返回数据。
  • 举例:去商场吃饭,你下完单,然后问商家,商家告诉你他还没做好呢,你觉得无聊就去隔壁买了点奶茶(当然了你也可以什么也不干傻傻的等),然后又来问商家,商家还是告诉你他还没做好呢,你又去隔壁打了会游戏机,然后又来问商家(当然了你也可以什么也不干傻傻的等),他告诉你以经做好一会了,然后你去取做好的饭菜,你可以吃了。
    Linux 五种IO模型

2.3.多路复用IO

  • 从编程的视角来看:同时监听多个socket端口,如果有一个端口有数据了,那么就阻塞读取
  • 举例:(商场升级了,商场里面的商品都可以通过一个软件来下单了)去商场吃饭,你觉得光吃饭还不过瘾,还要可奶茶,还要吃蛋糕,但是这几个东西都需要等,于是你用软件下单,上面显示你下单商品的进度,做好了就会提示你,你就一直盯着这个软件看,如果蛋糕好了就去取蛋糕,如果奶茶好了你就去取奶茶,如果饭好了你就去取做好的饭菜,吃饭。
  • Linux 五种IO模型

2.4 信号驱动式IO

  • 从编程的角度来看:与socket绑定信号处理函数后,立马返回,然后你程序逻辑中就可以做其他的了,等数据准备好后,就用recvfrom函数来拷贝数据到用户空间(这个过程是阻塞的)
  • 举例:去商场吃饭,这个店里有信号牌,你下完单后商家会给你一个信号牌,你就可以去干别的了,或者坐着啥也不干,商家把饭菜准备好后,信号牌就响了,你就可以去取做好的饭菜开吃了
    Linux 五种IO模型

2.5.异步IO

从编程的角度来看:函数调用之后立马返回(但并没有返回任何结果或数据),数据都读取到用户空间后,你的程序就可以直接处理了,期间没有任何阻塞等待
举例:你都懒得出门了,直接点了个外卖,商家做好饭,快递小哥把饭菜送到你家,你直接吃就行了
Linux 五种IO模型

3.五种IO模型的分类

POSIX把同步IO和异步IO定义为:
1.同步IO操作导致请求进程阻塞,直到IO操作完成
2.异步IO操作不导致请求进程阻塞

阻塞IO(bloking IO)、非阻塞IO(non-blocking IO)、多路复用IO(multiplexing IO)
、信号驱动式IO(signal-driven IO)、异步IO(asynchronous IO)
其中前四种都是同步IO,因为他们真正的IO操作(recvfrom)将阻塞进程。
Linux 五种IO模型

参考:
《Unix网络编程》第六章,第二节,(文中图片来源于此书)
https://www.zhihu.com/question/19732473
https://www.jianshu.com/p/486b0965c296

相关文章:

  • 2021-10-12
  • 2021-12-18
  • 2021-11-15
  • 2022-12-23
  • 2021-04-10
猜你喜欢
  • 2021-05-25
  • 2021-11-17
  • 2021-06-22
  • 2021-11-07
相关资源
相似解决方案