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

看一个同学面经的时候看到这个问题,在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 阻塞

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

猜你喜欢

转载自blog.csdn.net/RedemptionC/article/details/106673686