看一个同学面经的时候看到这个问题,在unp(因此介绍的背景是socket编程)上找到了相应的内容介绍:
unix下的io模型有五种:
- blocking io
- nonblocking io
- io multiplexing
- signal driven io
- 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 阻塞
根据这个定义,可知前四种是同步的,第五种是异步的