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目前使非神经网络方法 ...
随机推荐
- iOS ARC中CTCallCenter没用,无法监听电话的解决方案
今天在尝试使用CTCallCenter进行电话监听时,发现一直无法捕获电话状态改变的事件,研究了一番之后找到了解决方案,在这里分享给大家. 首先使用CTCallCenter监听电话的代码如下: CTC ...
- PRML读书笔记——Introduction
1.1. Example: Polynomial Curve Fitting 1. Movitate a number of concepts: (1) linear models: Function ...
- Leetcode: Non-overlapping Intervals
Given a collection of intervals, find the minimum number of intervals you need to remove to make the ...
- ubuntu15.04安装Chrome浏览器
首先到: https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 下载最新的安装文件. 然后: sudo a ...
- System.arraycopy
ref : http://blog.csdn.net/jaycee110905/article/details/45228249
- PHP之十六个魔术方法详解
https://segmentfault.com/a/1190000007250604#articleHeader14
- 夺命雷公狗-----React---9--map数据的遍历
比如我们要实现的是这种效果: 用这种方法来写,她只能写死在哪,没啥意思,所以我们定义一个数据,然后来测试下map方法对她遍历出来的数据 <!DOCTYPE html> <html l ...
- 使用Jquery解析Json基础知识
前言 在WEB数据传输过程中,json是以文本,即字符串的轻量级形式传递的,而客户端一般用JS操作的是接收到的JSON对象,所以,JSON对象和JSON字符串之间的相互转换.JSON数据的解析是关键. ...
- GridView----CustomRowCellEdit 使用注意事项
当你在Grid和TreeList中,需要对不同的行中的某一个单元格(Cell)提供特定的RepositoryItem时,使用CustomRowCellEdit 绝对能胜任, 但在使用时千万要注意了:“ ...
- Session与cookie的区别?
1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据. 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间. ...