Linux下的五种I/O模型
堵塞I/O(blocking I/O)
非堵塞I/O (nonblocking I/O)
I/O复用(select 和poll) (I/O multiplexing)
信号驱动I/O (signal driven I/O (SIGIO))
异步I/O (asynchronous I/O (the POSIX aio_functions))
前四种都是同步。仅仅有最后一种才是异步IO。
I/O过程分为两个过程,数据准备和数据拷贝
堵塞I/O模型:
该模型在两个过程中一直处于堵塞状态,直到数据拷贝完毕,系统调用返回.
堵塞I/O模型图:

当调用recv()函数时,系统首先查是否有准备好的数据。
假设数据没有准备好,那么系统就处于等待状态。
当数据准备好后。将数据从系统缓冲区拷贝到用户空间。然后该函数返回。
在套接应用程序中。当调用recv()函数时。未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。
非堵塞IO模型
我们把一个SOCKET接口设置为非堵塞就是告诉内核,当所请求的I/O操作无法完毕时,不要将进程睡眠。而是返回一个错误。
这样我们的I/O操作函数将不断的測试数据是否已经准备好。假设没有准备好。继续測试,直到数据准备好为止。在这个不断測试的过程中。会耗费大量的占用CPU的时间。
有点类似于轮询
非堵塞I/O模型图:

IO复用模型:
I/O复用模型经常使用的函数有select、poll和epoll,详细的差别请查阅相关文档。
这几个函数也会使进程堵塞(请注意和I/O堵塞进行区分)该函数能够监听多个socket,看是否有socket就绪。假设就绪就返回就绪的socket数(或者超时返回)。然后对就绪的socket依照相应的就绪事件进行相关的操作(读数据或者写数据)
I/O复用模型图:

信号驱动IO
首先我们同意套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续执行并不堵塞。
当数据准备好时。进程会收到一个SIGIO信号,我们能够在信号处理函数中调用I/O操作函数处理数据。

异步IO模型
当一个异步过程调用发出后,调用者不能立马得到结果。实际处理这个调用的模块在完毕I/O操作后。通过状态或者回调来通知调用者

同步IO和异步IO的差别:数据拷贝的过程中,进程是否堵塞!
堵塞IO和非堵塞IO的差别:数据准备的过程中,进程是否堵塞!
5种I/O模型的比較:

Linux下的五种I/O模型的更多相关文章
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- 浅谈Linux下的五种I/O模型 两篇别人的博客
http://blog.csdn.net/sinat_34990639/article/details/52778562 http://www.cnblogs.com/chy2055/p/5220 ...
- 浅谈Linux下的五种I/O模型
一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所 ...
- Linux下的5种I/O模型(转)
Linux下的五种I/O模型: l 阻塞I/O l 非阻塞I/O l I/O复用(select.poll.epoll) l 信号驱动I/ ...
- Linux 下的五种 IO 模型
概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...
- Linux下的5种I/O模型与3组I/O复用
引言 上一篇文章中介绍了一些无缓冲文件I/O函数,但应该什么时机调用这些函数,调用这些I/O函数时进程和内核的行为如何,如何高效率地实现I/O?这篇文章就来谈一谈Linux下的5种I/O模型,以及高性 ...
- Linux五种I/O模型性能分析
转载自:http://blog.csdn.net/jay900323/article/details/18141217/ socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理 ...
- Unix下 五种 I/O模型
Unix下共有五种I/O模型: 1. 阻塞式I/O 2. 非阻塞式I/O 3. I/O复用(select和poll) 4. 信号驱动式I/O(SIGIO) 5. 异步I/O(POSIX的aio ...
- Linux 中的五种 IO 模型
Linux 中的五种 IO 模型 在正式开始讲Linux IO模型前,比如:同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一 ...
随机推荐
- PCB MS SQL 行转列(动态拼SQL)
一.原数据: SELECT inman,indate FROM [fp_db].[dbo].[ppezhpbb] WHERE indate > '2016-5-1' AND indate < ...
- Sequence(优先队列)
http://poj.org/problem?id=2442 题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列, 让你求出序列和最小的前n个序列的序列和. # ...
- NYOJ999 师傅又被妖怪抓走了
只记得当下的眼疼 , ok 各种数据也试了 , 就是 他娘的不对 , 我也是醉了 . 也是日了最野的狗 附上日了哮天犬的代码 , 这个题 先放放, 一段时间后再试试 , 明天开始状态压缩吧 .为期两天 ...
- 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址
昨天因为要从JFrame控件获取密码,注意到一个问题,那就是用toString方法得到的不一定是你想要的,如下: jPasswordField是JFrame中的密码输入框,如果用下面的方法是得不到密码 ...
- Promise-js异步加载解决方案
范例: var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('执行完 ...
- Eclipse Rap开发 异步刷新UI处理
1.Display.getCurrent()获取的是当前线程的display对象,如果当前在非UI线程中那么获取到的display对象为空: 一般Display.getCurrent() 用 ...
- openMSP430之io_test
openMSP430: IO functionality test with interupt #include "omsp_system.h" volatile char shi ...
- Matlab atan2
对Matlab不是很熟悉,在这个Matlab atan2 函数上出现了问题. 百度知道上的解释是这样的: atan2() 区别于 atan() 函数,返回 -pi~+pi 范围的角度: 使用过程中发现 ...
- eclipse快捷键:
打开快捷键提示: ctrl + shift + L; 自动补全代码: Alt + /; 快速修复: ctrl + 1; 导包: ctrl + shift + o; 格式化代码: ctrl + shif ...
- 移动端mui常用方法
本文分享一些用Mui的时候所采的坑 1.mui中上拉刷新事件a标签中的链接.元素onclick事件在手机上点击不了 mui('body').on('tap','a',function(){docume ...