红联Linux门户
Linux帮助

重新理解Linux操作系统的四种I/O模型

发布时间:2015-08-10 10:59:42来源:linux网站作者:Linux中国

其实我觉得I/O模型已经是计算机领域技术出现频率非常高的一个词汇,而且我相信大多数有志向的程序员一定都专门的去学习和研究过相关的概念。但是作者觉得大部分的文章都写的差不多,看了一遍学习了一些“词汇”,当然可以拿出原话来给大家介绍I/O模型的相关概念,但是对于这些“词汇”我觉得还是不是很清楚,今天基于Linux的I/O模型的基础我们一起重新理解一下。


I/O模型

Linux操作系统中I/O模型主要有四种:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞:

重新理解Linux操作系统的四种I/O模型

四种I/O模型矩阵

同步阻塞通常出现在对read、write的系统调用的时候;同步非阻塞则是用O_NONBLOCK模式来打开一个文件然后调用read、write系统调用的时候;异步非阻塞主要出现在对select、poll、epoll系统调用的时候;异步非阻塞要借助一些库来首先,如libaio。


同步阻塞I/O

同步阻塞模型是最长用的一种模型,在这个模型中,用户空间的应用程序执行一个系统调用然后应用程序会阻塞住,如调用read的时候用户进程将读请求告诉内核进程同时自己被挂起,read会切换内核进程来进行I/O,首先数据由内核进程将数据由I/O设备读取到内核缓冲区,然后由内核进程将数据从内核缓冲区复制到用户进程缓冲区同时唤醒被挂起的用户进程。

重新理解Linux操作系统的四种I/O模型

同步阻塞I/O模型

结合上图,同步阻塞很好理解。


同步非阻塞I/O

同步非阻塞其实是同步阻塞的一种遍变种,不同点从名字可以看出,不同的地方是非阻塞,也就是用户进程调用read读的时候不会被阻塞,前提是要以O_NONBLOCK方式打开文件,但是用户需要多次调用read来轮训查看数据是否就绪。

重新理解Linux操作系统的四种I/O模型

同步非阻塞I/O模型

在实际应用中,具体做法是用户程序需要主动循环查看文件描述符看I/O是否就绪,也就是要不断轮训内核I/O状态,直到返回正确为止,这么做是很浪费CPU资源的。


异步阻塞I/O

这是一种带有阻塞通知的异步I/O,主要是通过调用select来查看有操作的句柄,而且select可以为多个句柄服务,当调用select的时候会阻塞用户进程,直到被select服务的某个句柄可用的时候返回,可以理解为对于单个I/O来说是异步返回的,阻塞的地方在于select的调用及返回,这个select也叫做多路复用器,因为他被多个句柄所复用。

重新理解Linux操作系统的四种I/O模型

异步阻塞I/O模型


异步非阻塞I/O

在异步非阻塞I/O模型中,读请求会立即返回,说明读请求已经成功发送并在后台进行,后台读操作完成的时候会主动通知用户进程,在此期间用户进程可以做其他的事情。通常这个通知是一个基于线程的回调函数来完成I/O处理过程。

重新理解Linux操作系统的四种I/O模型

异步非阻塞I/O模型


四种I/O模型最好的一种就是最后一种了,专业词汇叫AIO,我们可以看出AIO的出现主要是为了利用用户进程发起I/O到I/O就绪这段时间。


Linux I/O(输入和输出):http://www.linuxdiyf.com/linux/6062.html

Linux下I/O资源管理(原理):http://www.linuxdiyf.com/linux/5895.html

Linux I/O调度策略:http://www.linuxdiyf.com/linux/4039.html

Ubuntu在顶部面板显示系统负载、流量,磁盘I/O:http://www.linuxdiyf.com/linux/1917.html