linux基础之IO模型
一、IO模型
一次read操作:
(1)等待数据准备好:从磁盘到内核内存
(2)从内核内存复制到进程内存
示意图如下:

I/O类型:
同步和异步:synchronous,asynchronous
关注的是消息通知机制
同步: 调用发出之后不会立即返回,但一旦返回,则返回的是最终结果
异步: 调用发出之后,被调用方立即返回消息,但返回的并非最终结果;被调用者通过状态、通知机制等来通知调用者,或通过回调函数来处理结果
阻塞和非阻塞: block, nonblock
关注的是调用者等待被调用者返回结果时的状态
阻塞: 调用结果返回之前,调用者会被挂起;调用者只有在得到返回结果之后才能继续
非阻塞: 调用者在结果返回之前,不会被挂起,即调用不会阻塞调用者
I/O模型:
blocking IO: 阻塞式IO
nonblocking IO: 非阻塞式IO
IO multiplexing: 复用型IO
select(),poll()
signal driven IO: 事件驱动式IO
通知:
水平触发: 多次通知
边缘触发: 只通知一次
asynchronous IO: 异步IO

上图为阻塞型IO:调用者发起请求后,整个过程会被挂起,处于不可中断状态,直到IO完成。

上图为非阻塞型IO:调用者发起请求后,内核会立即响应。内核准备数据的第一阶段,调用者虽然不会被阻塞,但是处于"盲等待",调用者会每隔一段时间向内核发起调用,询问是否准备好数据, 拷贝数据的第二阶段,调用者依然是被阻塞的。

上图为复用型IO:简单理解为有一个代理来为调用者服务,这个代理可能是select或者poll,代理接收一个请求之后,可以继续接收下一个请求,调用者被阻塞在select上,到数据复制第二阶段,调用者被阻塞在IO阶段。select默认上限为1024个

上图为事件驱动型IO:调用者发起请求之后,被调用者立即响应请求,然后调用者可以去做别的事情,等到第一阶段完成后,被调用者向调用者发通知,告诉调用者数据已准备好,调用者再去处理第二阶段。事件驱动型IO的好处就是可以一次处理多个请求。
事件型IO第二阶段是被阻塞的,第一阶段被调用者准备好数据后,给调用者发通知的机制有两种:水平触发和边缘触发
水平触发:多次通知,发送通知后没响应,就会一直发送通知直到通知被调用者响应
边缘触发: 通知一次,发送一次通知调用者没响应,那就不会再发通知,调用者没接收到通知没关系,可以根据回调函数来获取资源

上图为异步型IO:调用者发起请求之后,被调用者响应,然后调用者可以去做别的事情,直到被调用者处理完第一阶段和第二阶段后,最后给调用者发个信号。整个过程调用者不会被阻塞,大大提高了性能。
linux基础之IO模型的更多相关文章
- Linux 的 Socket IO 模型
前言 之前有看到用很幽默的方式讲解Windows的socket IO模型,借用这个故事,讲解下linux的socket IO模型: 老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系. 他 ...
- [转载] Linux五种IO模型
转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型性能分析 目录(?)[-] 概念理解 Lin ...
- 网络通信 --> Linux 五种IO模型
Linux 五种IO模型 聊聊Linux 五种IO模型
- Linux五种IO模型(同步 阻塞概念)
Linux五种IO模型 同步和异步 这两个概念与消息的通知机制有关. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.比如,调用readfrom系统调用时,必须等待IO操 ...
- Windows五种IO模型性能分析和Linux五种IO模型性能分析
Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...
- (转载) Linux五种IO模型
转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型及分析 目录(?)[-] 概念理解 Linux下 ...
- 从 Linux 操作系统谈谈 IO 模型(终)
Linux 为什么要区分内核空间与用户空间? Linux 操作系统的 IO 模型有哪几种?有啥区别? 常说的阻塞现象,到底是咋回事? 网络编程研发时,那块到底耗时最多,代码是否还有优化空间? 前几期的 ...
- linux下的IO模型---学习笔记
1.linux文件系统和缓存 文件系统接口 文件系统-一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问. 存储层次 文件系统缓存 主存(通常时DRAM)的一块区域 ...
- 深入理解JAVA I/O系列六:Linux中的IO模型
IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...
随机推荐
- 转AngularJS路由插件
AngularJS学习笔记--002--Angular JS路由插件ui.router源码解析 标签: angular源码angularjs 2016-05-04 13:14 916人阅读 评论(0) ...
- 使用newtonsoft完美序列化WebApi返回的ValueTuple
由于开发功能的需要,又懒得新建太多的class,所以ValueTuple是个比较好的偷懒方法,但是,由于WebApi需要返回序列化后的json,默认的序列化只能将ValueTuple定义的各个属性序列 ...
- Python3(六) 面向对象
一.类的定义 1. class Student(): name = ' ' #定义变量 age = 0 def print_file(self): #定义函数 ...
- k8s调度器kube-scheduler
kube-scheduler简介 调度是容器编排的重要环节,需要经过严格的监控和控制,现实生产通常对调度有各类限制,譬如某些服务必须在业务独享的机器上运行,或者从灾备的角度考虑尽量把服务调度到不同机器 ...
- 如何构建OpenStack镜像
本文以制作CentOS7.2镜像为例,详细介绍手动制作OpenStack镜像详细步骤,解释每一步这么做的原因.镜像上传到OpenStack glance,支持以下几个功能: 支持密码注入功能(nova ...
- day14 jQuery
day13-14 jQueryjQuery是对js和dom的封装,相当于一个类库使用jQuery的目的: 1:获取标签 2:修改jQuery提供的方法:http://www.php100.com/ma ...
- apache 访问状态 分析
状态查看: 1.查看apache 各状态连接数 [root]#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' ...
- python环境开发
Python3 下载 Python3 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到: Python 官网:https://www.python.org/ 你可以在以下链接中下载 ...
- JS推箱子游戏
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...
- 不懂怎么创建可视化大屏?手把手教你使用数据可视化BI软件创建工厂车间数据监控大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以工厂车间数据监控大屏为例 ...