IO模型-对阻塞/非阻塞,同步/异步的理解

本文深入解析Unix下五种IO模型:blockingio、nonblockingio、iomultiplexing、signaldrivenio及asynchronousio,对比同步与异步IO操作的区别,帮助理解socket编程中的关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看一个同学面经的时候看到这个问题,在unp(因此介绍的背景是socket编程)上找到了相应的内容介绍:

unix下的io模型有五种:

  1. blocking io
  2. nonblocking io
  3. io multiplexing
  4. signal driven io
  5. asynchronous io

1.blocking io

socket默认是blocking的,这种情况下,发出一个系统调用,如果当前没有数据可读(如果调用read),那么该进程会block直到有数据可读,然后完成读取,返回

2.nonblocking io

如果是nonblocking,此时如果没有数据可读,也会马上返回,并设置errno为EWOULDBLOCK,所以如图中所示,类似人为的执行轮询(polling),当有数据可读了,就完成数据的读取,并且返回

一般来说,这种手动的轮询很浪费资源

3.io multiplexing

特点在于这个让requesting process 阻塞的系统调用本身并不执行读取,而是判断观察的文件描述符集合里是否有文件描述符ready,如果没有,就block(阻塞多久可配置),当有任一个ready,就返回,此时requesting process再去执行读数据的系统调用,因为已经知道现在可读,所以此时也就不会再block

4.signal-driven io

首先注册一个sigio handler,当有数据到达后(ready),会发出SIGIO的信号,被requesting process捕捉后,就可以读数据了,此时也不用担心读时会block

5.asynchronous io

异步io,此时使用特殊的系统调用,即使当前没有可读的数据,也能立刻返回,我们可以配置读的操作完成后,发出一个信号通知requesting‘ process,从而在signal handler里对接收成功的数据做下一步的处理

五种io模型的比较:

POSIX对同步和异步的定义:

同步:一个同步的io操作,让requesting process 阻塞直到io完成

异步:一个异步的io操作,不会造成requesting process 阻塞

根据这个定义,可知前四种是同步的,第五种是异步的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值