UNIX的五种IO模型

目录

0.引入

1.阻塞式I/O模型

2.非阻塞式I/O模型

3.I/O复用模型

​4.信号驱动式I/O模型

5.异步I/O模型

6.五种I/O模型的比较


0.引入与说明

详解unix5种IO模型-阅读引用

UNIX下的5种IO模型-老陈他们钓鱼了

connect()函数阻塞问题 

UNIX的五种缓冲模型

《UNIX网络编程卷一 套接字联网API》我的纸书是在122页.
1.阻塞式I/O模型
2.非阻塞式I/O模型
3.I/O复用模型
4.信号驱动式I/O模型;
5.异步I/O模型.


本文中的图都是以UDP为协议来做出的图示.

1.阻塞式I/O模型

文件描述符open时,如果没有指定flags为O_NONBLOCK,或者open后,没有使用fcntl设置O_NONBLOCK,
默认文件描述符为阻塞模式.
阻塞式IO在等待接收缓冲区数据到来时,会阻塞;
数据到来,进行数据复制时,也会阻塞.

2.非阻塞式I/O模型

如上所述,可以通过open或者fcntl设置文件描述符为非阻塞模式.

非阻塞式IO,当内核缓冲区没有数据时,不会阻塞,会立即返回一个错误——EAGAIN或者EWOULDBLOCK.
EAGAIN表示需要再次调用recvfrom,以判断数据是否准备好,这也是非阻塞式IO的用法,不断的调用
recvfrom,以判断是否可以读. EWOULDBLOCK是虚拟语气,表示“本应该阻塞”,其实没有阻塞。由于
并不确定返回EAGAIN还是EWOULDBLOCK,因此需要对这两个值都进行判断.

从接收缓冲区向应用缓冲区复制数据阶段,调用进程阻塞.

3.I/O复用模型

在阻塞式IO中,如果接收缓冲区没有数据,调用进程阻塞于recvfrom操作.
使用select或者poll,可以在此情况下使进程阻塞于select或者poll操作(因此要把文件描述符设置为非阻塞式),
而且可以同时检测多个文件描述符是否可读,即检测这些描述符对应的内核中的接收缓冲区是否有数据.

从接收缓冲区向应用缓冲区复制数据阶段,调用进程阻塞.


4.信号驱动式I/O模型

信号驱动式IO与上述三个IO模型相比,即不像阻塞式IO那样阻塞于recvfrom操作,也不像非阻塞式IO那样需要多
次调用甚至轮询recvfrom才能得知是否有数据,也不像IO复用那样阻塞于select或者poll,而是当内核接收缓冲
区有数据时向调用进程发送一个信号.
从接收缓冲区向应用缓冲区复制数据阶段,调用进程阻塞.

5.异步I/O模型

非阻塞式IO通过轮询recvfrom以判断接收缓冲区是否有数据;
IO复用中使用select或者poll以判断接收缓冲区是否有数据;信号驱动IO通过信号通知接收缓冲区是否有数据.

其相同点在于,IO操作的第二个阶段,即从内核接收缓冲区向应用缓冲区复制数据时,调用recvfrom的进程会阻塞.
可见,上述4种IO模型都会使进程阻塞,直到IO操作的两个阶段都完成才能执行其他操作,因此称为同步IO.
异步IO模型中,IO操作的两个阶段都不阻塞,因此称为异步IO.

6.五种I/O模型的比较

有一个钓鱼的例子经常被拿来比喻这5种IO模型,这里也不免俗套的讲一下:

(1)阻塞式IO
老蒋钓鱼时把鱼竿伸进水中,需要一直守着鱼竿(第一阶段的阻塞),直到有鱼上钩了才拉杆(拉杆是第二阶段的塞);

(2)非阻塞IO
老宋鱼竿有个功能,可以显示是否有鱼上钩(返回EAGAIN或者EWOULDBLOCK),因此他可以边和旁边的MM聊天,边看看
是否有鱼上钩(轮询调用recvfrom);

(3)IO复用
老孔的鱼竿和老蒋的一样,但他想了一个好办法,同时放了多个鱼竿,然后一直守着,一旦某个鱼竿上有鱼,马上将其
拉起;

(4)信号驱动IO
老陈很有钱,但又喜欢拉杆的快感,于是他雇了个人帮他守着,一旦那人发现有鱼上钩,马上通知老陈收杆;

(5)异步IO
老刘也有钱,但很懒,直接雇了个人帮他钓鱼,一旦钓上了鱼就通知老刘.

7.同步/非同步,阻塞/非阻塞(仅做参考)

同步:在发出一个同步功能调用时,在没有得到结果之前,该调用就不返回,必须一件一件事做,等前一件做完了才能做下一件事.

非同步:异步过程调用发出后,调用者不能立刻得到结果,但它能够返回,之后实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行),函数只有在得到结果之后才会返回

           执行接下来的操作.

非阻塞: 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回.

有些场景下,同步和阻塞、非同步和非阻塞 有很多的类似之处,但有些场景下又有所不同.

同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞;

阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值