五种I/O模型
文档地址:https://www.cse.huji.ac.il/course/2004/com1/Exercises/Ex4/I.O.models.pdf
五种I/O模型:
1. blocking I/O 阻塞I/O
2. nonblocking I/O 非阻塞I/O
3. I/O multiplexing (select and poll) I/O多路复用
4. signal driven I/O (SIGIO) 信号驱动I/O
5. asynchronous I/O (the POSIX aio_functions) 异步I/O
对于input操作,有两个不同的阶段:
1. 等待数据准备完毕(用户空间 通过 内核空间 调用系统资源,数据准备完毕是在内核里的)
2. 从kernel拷贝数据到相应的进程 (即从 内核空间 复制到 用户空间 的某个进程,内核空间是系统内核运行的地方,用户空间是用户程序运行的地方,两者是独立分割的,用户空间没有什么权限,只能通过内核空间调用系统资源)
对于socket的input,两个阶段通常是:
1. 等待网络的数据到达,并将数据拷贝到内核空间的buffer里。
2. 从kernel的buffer里拷贝数据到应用程序的buffer
1. 阻塞I/O

上图使用的是UDP协议,在这个过程中,进程调用recvfrom,在这个过程中,程序一直是阻塞的,直到网络数据报到达本地,并且数据从内核空间拷贝到了用户空间,此时才会return,当recvfrom成功return后,应用程序才获取到这个数据报。
从图看出,此模型全程阻塞。
2. 非阻塞I/O

首先,进程每隔一阵子调用一次 recvfrom,图中前三次调用recvfrom,但是数据报没有准备好,所以每一次内核都返回EWOULDBLOCK错误,第四次调用recvfrom,数据报此时已经准备完毕,拷贝到用户空间中后,recvfrom成功返回,此时进程就获取到了值。
当系统用这种不停的循环的方法对一个非阻塞的描述符调用recvfrom,这种被称为polling
此模型并不阻塞,但是需要循环查询,浪费CPU的时间,低效。
3. 多路复用I/O

给一个select阻塞住,直到数据报readable(也就是准备好了,readable是select返回的值),当select返回readable时,说明数据报准备好了,此时就recvfrom,让数据报从内核空间拷贝到用户空间,拷贝完成后,recvfrom返回成功,数据报也就成功的被用户程序所拥有了。
其实select并没有什么优势,反而略微有点劣势,因为它使用了两次系统调用,而不是一次。但是它的优势是它能够等待多个描述符准备好。
此模型也会阻塞,但是它可以等待多个描述符准备,因此还是有优势的。
4. 信号驱动的I/O

除了上面的方法,我们也可以使用信号,告诉内核当数据报准备好时,你就用信号通知我。
首先启动信号驱动I/O的socket,然后安装一个使用sigaction系统调用的signal handler,这个系统调用是立即返回的,并且返回后还继续执行,它是非阻塞的,当数据报准备好时,就会生成SIGIO信号,我们可以调用recvfrom从signal handler读取数据,并且告诉主循环数据已经准备好被获取了;或者我们可以通知主循环,让它自己读取数据。
此模型第一个阶段是非阻塞的,主循环可以做别的事情,但是从内核拷贝数据到用户的过程,是阻塞的。
5. 异步I/O

异步I/O是完全不阻塞的模型,它调用aio_read,会立刻返回,在等待I/O的过程中,进程是完全不阻塞的,我们猜测它可能在I/O完成时(这里的完成 包括从内核拷贝数据到用户)生成一个signal,这是它和信号I/O不同的地方(信号I/O不会拷贝数据到用户)
五种模型的比较:

简单来讲,如果把等待数据准备过程比作钓鱼时等待鱼上钩,把从内核拷贝数据到用户空间比作拉线收鱼,那么:
1. 阻塞I/O:守着一个鱼竿一直等待鱼上钩,期间不干别的事情,就等着,鱼上钩了就拉线取走鱼。
2. 非阻塞I/O: 弄个鱼竿搁在那儿,可以干别的事情去,每隔一段时间回来看一次有没有鱼上钩,直到有鱼上钩了,就拉线取走鱼。
3. I/O 多路复用: 一次性弄好多鱼竿钓鱼(select就是可以同时等待多个描述符),这些鱼竿如果有任何一个有鱼上钩,就拉线取走鱼,没有的话就干等着鱼上钩,不干别的事情。
4. 信号I/O: 给一个鱼竿弄个铃铛,然后自己干别的事情去,一旦铃铛响了,说明鱼上钩了,就过来取走鱼。
5. 异步I/O:放个鱼竿钓鱼,然后自己干别的事情去,一旦鱼上钩了,鱼竿比较高级,自动把鱼拉上来放到桶里。
五种I/O模型的更多相关文章
- 转:Windows Socket五种I/O模型
原文转自: Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...
- Windows Socket五种I/O模型
转载:http://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813637.html 如果你想在Windows平台上构建服务器应用,那么I/O模 ...
- I/O模型之一:Unix的五种I/O模型
目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...
- 你可以这么理解五种I/O模型
因为项目需要,接触和使用了Netty,Netty是高性能NIO通信框架,在业界拥有很好的口碑,但知其然不知其所以然. 所以本系列文章将从基础开始学起,深入细致的学习NIO.本文主要是介绍五种I/O模型 ...
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- 第3章 文件I/O(5)_五种I/O模型
6. I/O处理方式(5种I/O模型) 6.1 几个概念的辨析 (1)同步和异步 ①是访问数据的方式,主要是针对IO(资源.数据)而言的.关键在于I/O操作完成后,有没有提供通知机制. ②同步的IO, ...
- 五种典型开发周期模型(瀑布、V、原型化、螺旋、迭代)
五种典型开发周期模型(瀑布.V.原型化.螺旋.迭代) 总结一下经常可以见到的系统开发周期模型. 在过去的几年里,可以很奇葩的碰到类似于“创业项目库”这种需求非常明确,工作量十分可控,对质量要求比 ...
- Linux五种I/O模型性能分析
转载自:http://blog.csdn.net/jay900323/article/details/18141217/ socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理 ...
- Unix网络编程中的五种I/O模型_转
转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...
- 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 ...
随机推荐
- nodejs之fs 模块
1.fs模块函数 * .fs.stat 检测是文件还是目录 * .fs.mkdir 创建目录 * .fs.writeFile 创建写入文件 * .fs.appendFile 追加文件 * .fs.re ...
- 阶段3 2.Spring_07.银行转账案例_10 使用动态代理实现事务控制
回到事物的案例中 我们现在希望用代码比较精简的这个AccountServiceImpl这个类.而不是一堆事物的AccountServiceImpl_OLD这个类 新建BeanFactory类 Acco ...
- 集中式日志分析平台 Elastic Stack(介绍)
一.ELK 介绍 二.ELK的几种常见架构 >>ELK 介绍<< ELK 构建在开源基础之上,让您能够安全可靠地获取任何来源.任何格式的数据,并且能够实时地对数据进行搜索.分析 ...
- Opencv中copyTo()函数的使用方法
在Mat矩阵类的成员函数中copyTo(roi , mask)函数是非常有用的一个函数,尤其是后面的mask可以实现蒙版的功能,我们用几个实例来说明它的作用.我们要注意mask的数据类型,必须是CV_ ...
- python指定pip安装源
python的pip默认的安装源的位置是国外的,导致有时候下载很慢或者直接失败我们可以切换国内的源 目前国内可用的我知道的有两个 豆瓣的:http://pypi.doubanio.com/simple ...
- #Java学习之路——基础阶段二(第十四篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- 【CUDA】CUDA框架介绍
引用 出自Bookc的博客,链接在此http://bookc.github.io/2014/05/08/my-summery-the-book-cuda-by-example-an-introduct ...
- ucloud自动创建instance
用terrform for ucloud: https://www.terraform.io/docs/providers/ucloud/index.html https://docs.ucloud. ...
- Android 子线程无法刷新UI界面
问题:在Android开发中,子线程无法直接更改UI界面视图的刷新 这个时候 Handler 起到了至关重要的作用. 简单来说 , Handler就是用来传递消息的. Handler可以当成子线程与主 ...
- OpenTSDB查询和写入毫秒级数据
由于OpenTSDB没有支持Java的SDK进行调用,所以基于Java开发OpenTSDB的调用将要依靠HTTP请求的方式进行. 1.毫秒级数据写入 /api/put:通过POST方式插入JSON格式 ...