工学1号馆

home

« | 返回首页 | »

Unix I/O 模型比较

By Wu Yudong on January 11, 2017

可重入I/O:内核发现进程指定的一个或多个 I/O 条件就绪,它就通知进程,这个能力被称为可重入I/O,这个功能是由select和poll这两个函数支持的

Unix下共有五种I/O模型:

阻塞式 I/O

非阻塞式 I/O

I/O复用(select 和 poll)

信号驱动式 I/O(SIGIO)

异步I/O(Posix.1的aio_系列函数)

接下来分别介绍

阻塞式 I/O:进程在调用函数开始到它返回的整段时间内都是被阻塞的,当函数返回成功后,应用程序开始处理数据

非阻塞式 I/O:进程把套接字设置成非阻塞的,即是告诉内核在进程等待数据的时候,不要将其投入睡眠,而是返回一个错误,直到数据从内核复制到用户空间。

当一个应用进程不断对一个非阻塞描述符循环调用某个函数的时候,称为轮询(polling)

应用程序持续轮询内核,以查看某个操作是否就绪,但这往往消耗大量CPU时间,这种情况偶尔会用到

I/O复用(select 和 poll):使用select或者poll,将原来的阻塞在I/O之上转换为阻塞在这两种的其中一种之上,如果内核将数据准备好,则select将返回可读条件到相应的应用进程,再回到阻塞式 I/O 的后半段操作,I/O复用并不显出有什么优势,反而由于两次的系统调用还稍有劣势,使用select的优势在于我们可以等待多个描述符就绪

信号驱动式 I/O(SIGIO):使用信号,让内核在描述符就绪的时候通知我们,这种模型称为信号驱动式I/O

这种模式首先开启套接字的信号驱动式 I/O 功能,通过sigaction系统调用安装一个信号处理函数,该系统调用立即返回,我们的进程将进行继续工作,也即是它没有被阻塞,当数据准备好读取时,内核就为该进程产生一个SIGIO信号,我们既可以在信号处理函数中调用相应的函数读取数据,也可以立即通知主循环,让它读取数据报。

这种模型的优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行,只要等待来自信号处理函数的通知,既可以是数据已准备好被处理,也可以是数据报已准备好被读取

异步I/O(Posix.1 的aio_系列函数):告知内核启动某个操作,并让内核在整个操作完成后通知我们。这种操作和之前介绍的信号驱动式 I/O的区别在于:信号驱动式 I/O 是由内核通知我们何时可以启动一个I/O操作。而异步I/O模型是由内核通知我们I/O操作何时完成。

前面四种属于同步I/O 操作,后面的一种属于异步 I/O 操作

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)