Unix下五种IO模型简介

阻塞式IO

阻塞式IO模型是最一般的IO模型。在这种模型下,IO函数调用(read & write等等)都会在操作完成或者发生中断以后才会返回。如果指定的操作数据没有就绪,或者操作需要的外部条件(比如缓冲区)尚未符合要求,操作会一直阻塞。


非阻塞式IO

相对于阻塞式IO模型,非阻塞式IO的特点就是:当所请求的IO操作暂无法如期完成时,不要把本进程投入睡眠时,而是直接返回一个错误(EWOULDBLOCK)。这样做避免了程序长时间被挂起。但是由于在这种模式下,程序需要不断去轮询,会耗费大量的CPU时间。


IO复用

IO复用是指在一个IO请求内,等待多个可能的IO对象可用(在unix下由文件描述符来标记)。虽然IO复用还是会导致阻塞,但是当IO操作对象较多时,就能够避免产生很大一部分的阻塞时间。在Unix下,我们可以用select或poll函数实现IO复用。


信号驱动式IO

在信号驱动式IO模型下,我们可以让内核在描述符就绪时发送SIGIO信号通知我们。使用这种模型,我们需要首先开启套接字的信号驱动式IO功能,并通过sigaction系统调用来安装一个信号处理函数。


异步IO

异步IO的特点是:让内核启动某个IO操作,并让内核在这个操作完成后通知我们。在这期间,调用异步IO操作的进程不会被阻塞

异步IO与信号驱动式IO的区别在于:信号驱动式IO是由内核通知我们何时可以启动IO操作,而异步IO模型是由内核通知我们操作何时完成。



五种模型的相互比较:

从上面的描述可以看出,前四种模型的第二阶段是一样的:数据从内核复制到调用者的缓冲区期间,进程阻塞于selectfrom等调用。

根据POSIX对同步IO的定义:IO操作导致进程阻塞直到操作完成。我们可以得出结论:前四种模型都是同步IO模型

剩下的special one——异步IO模型,由于不导致请求进程阻塞,则属于POSIX定义的异步IO。



=======================END==========================


展开阅读全文

没有更多推荐了,返回首页