Linux下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_系列函数)
1. 阻塞式I/O(blocking I/O):基本所有套接字都是阻塞的,下面以数据报套接字为例。
一般系统调用会从应用进程空间切换到内核空间,一段时间后再切换回来。
进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或发生错误才返回(常见的错误如系统调用被信号中断)。
进程在调用recvfrom开始到它返回的整段时间内是被阻塞的,该函数成功返回后,应用进程开始处理数据报。
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。
取快递:某个时候到A楼一层(假如是内核缓冲区)取快递,但你不知道快递什么时候过来,又不能干别的事,只能死等着。但你可以睡觉(进程处于休眠状态),因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。--http://blog.csdn.net/hguisu/article/details/7453390
2. 非阻塞式I/O(nonblocking I/O):当请求的I/O操作非得把本进程投入睡眠才能完成时,拒绝睡眠并返回一个错误。
前三次调用recvfrom时没有数据返回,因此内核立即返回一个EWOULDBLOCK错误。第四次调用时已有一个数据报准备好,它被复制到应用进程缓冲区,于是recvfrom成功返回。
当一个应用进程对一个非阻塞描述符循环调用recvfrom,我们称之为轮询(polling)。应用进程持续轮询内核,以查看某个操作是否就绪。这样做会消耗大量CPU时间。
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
取快递:如果用忙轮询的方法,每隔5分钟到A楼一层(内核缓冲区)去看快递来了没有。如果没来,立即返回。而快递来了,就放在A楼一层,等你去取。
同步IO和异步IO的区别就在于:数据访问的时候进程是否阻塞!
阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回!--http://blog.csdn.net/hguisu/article/details/7453390
3. I/O复用(I/O multiplexing):主要调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。
服务器阻塞于select调用,等待数据报套接字变为可读。
当select返回套接字可读这一条件时,再调用recvfrom把所读数据报复制到应用进程缓冲区。
I/O复用使用select需要两个而不是单个系统调用,I/O复用还稍有劣势,但其优势在于可以等待多个描述符就绪。
与I/O复用密切相关的另一种I/O模型是在多线程中使用阻塞式I/O,使用多个线程可以自由地调用诸如recvfrom之类的阻塞式I/O系统调用。
4. 信号驱动式I/O(signal-driven I/O):使用信号让内核在描述符就绪时发送SIGIO通知服务器。
我们首先开启套接字的信号驱动式I/O功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回,服务器进程继续工作(并没有阻塞)。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。随后在信号处理函数中调用recvfrom读取数据报。
5. 异步I/O(asynchronous I/O):告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到应用进程的缓冲区)完成后通知服务器。
异步I/O与信号驱动模型区别在于:前者由内核通知我们I/O操作何时完成;后者是由内核通知我们何时可以启动一个I/O操作。
调用aio_read函数(POSIX异步I/O函数以aio_或lio_开头),给内核传递描述符、缓冲区指针、缓冲区大小(与read相同的三个参数)和文件偏移(与lseek类似),并告诉内核当整个操作完成时如何通知我们。该系统调用立即返回,应用进程并在等待I/O完成期间不被阻塞。
各个I/O模型对比:
Linux下I/O模型的更多相关文章
- linux下的IO模型---学习笔记
1.linux文件系统和缓存 文件系统接口 文件系统-一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问. 存储层次 文件系统缓存 主存(通常时DRAM)的一块区域 ...
- linux下的工作模型以及Nginx工作原理
Web服务器主要任务就是处理来自客户端的请求,一般情况下Web服务器处理并发连接请求的工作模型有以下几种方式: 1.单线程web服务器(Single-threaded web servers) 此 ...
- Linux下面的IO模型
1. Linux下的五种I/O模型 阻塞I/O模型: 一直阻塞 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好. 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空 ...
- Linux下套接字具体解释(三)----几种套接字I/O模型
參考: 网络编程–IO模型演示样例 几种server端IO模型的简介及实现 背景知识 堵塞和非堵塞 对于一个套接字的 I/O通信,它会涉及到两个系统对象.一个是调用这个IO的进程或者线程,还有一个就是 ...
- Linux下VLAN功能的实现 (转)
1.Linux网络栈下两层实现 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去.下两层涉及到具体的硬件 ...
- Linux下经常使用的C/C++开源Socket库
1. Linux Socket Programming In C++ : http://tldp.org/LDP/LG/issue74/tougher.html 2. ACE: h ...
- Linux下经常使用的C/C++开源Socket库【转】
转自:https://www.cnblogs.com/gccbuaa/p/7015599.html 1. Linux Socket Programming In C++ : http://t ...
- Linux下5种IO模型的小结
概述 接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous).异步(ASynchronous).阻塞(blocking)和非阻塞(non-blocking).关于概念的区 ...
- DPM检测模型 VoC-release 5 linux 下编译运行
(转载请注明作者和出处 楼燚(yì)航的blog :http://www.cnblogs.com/louyihang-loves-baiyan/ 未经允许请勿用于商业用途) DPM目前使非神经网络方法 ...
随机推荐
- 【转】Ubuntu防火墙设置
1.安装 sudo apt-get install ufw 2.启用 sudo ufw enable sudo ufw default deny 运行以上两条命令后,开启了防火墙,并在系统启动时自动开 ...
- Java基础之扩展GUI——使用对话框创建文本元素(Sketcher 4 creating text elements)
控制台程序. 为了与Sketcher中的其他元素类型保持一致,需要为Elements菜单添加Text菜单项和工具栏按钮.还需要定义用来表示文本元素的类Element.Text. 1.修改Sketche ...
- Leetcode: Partition Equal Subset Sum
Given a non-empty array containing only positive integers, find if the array can be partitioned into ...
- c++ socket编程步骤
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的socket编程是采用的流式套接字. 服务器 ...
- Android View坐标Left, Right, Top, Bottom
Android View坐标Left, Right, Top, Bottom 1.分析说明Left, Right, Top, Bottom View中对于该字段说明如下,相对父布局的的位置 相对父布局 ...
- 多列布局——Columns
为了能在Web页面中方便实现类似报纸.杂志那种多列排版的布局,W3C特意给CSS3增加了一个多列布局模块(CSS Multi Column Layout Module).它主要应用在文本的多列布局方面 ...
- android opengl
引用:http://weimingtom.iteye.com/blog/1616972 二维坐标系变换为原点在左上角(测试用) * GLES * JOGL * LWJGL * libgdx(使用g2d ...
- WMI资料汇总
简介 http://technet.microsoft.com/zh-cn/library/ee692772.aspx#E5IAC 主页 http://msdn.microsoft.com/zh-cn ...
- 蓝灯(lantern)在服务器(vps)上运行
蓝灯(lantern)在无界面的linux下运行的时候,会遇到一个错误: error while loading shared libraries: libappindicator3.so.1: ca ...
- Prince2的七大原则(6)
Prince2科普_Prince2的七大原则(6) 按照惯例我们先来回顾一下,PRINCE2七大原则分别是指:持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 今天讲第六个 ...