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分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...
随机推荐
- char*a[10] ={"123456","2345"}和char*a="abcde"
- bind() 理解 【转】
bind()可稍后执行 call() apply() 为了搞清这个陌生又熟悉的bind,google一下,发现javascript1.8.5版本中原生实现了此方法,目前IE9+,ff4+,chro ...
- Spring IOC容器源码分析
注:本文转自https://javadoop.com/post/spring-ioc Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容 ...
- 在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据
百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路 ...
- 使用DIV实现页面的遮罩效果
Div实现页面的遮罩 之前没动手搞过,项目有个需求刚好可以用到,就想着去试下,结果发现自己都理解的有问题了. 遮罩的实现是使用opacity或者IE下的filter滤镜来设置透明度的,而且一个div必 ...
- PgSQL备份
SQL转储. 这里我们用到的工具是pg_dump和pg_dumpall. 这种方式可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问.它会产生一个脚本文件,里面包含备份开始时 ...
- Linux安装Redis,在测试阶段即make test出现“You need tcl 8.5 or newer in order to run the Redis test”问题解决方案
Linux安装Redis,在测试阶段即make test出现"You need tcl 8.5 or newer in order to run the Redis test"问题 ...
- [CSGO]跑图CFG
bot_kick //剔除所有电脑 sv_cheats 1 //允许作弊指令 bot_stop 1 //bot静止 mp_warmup_end //结束热身时间 mp_freezetime 0 //开 ...
- 算法训练 最大获利 注意数据规模(long long)
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Chakra是一位年轻有为的企业家,最近他在进军餐饮行业.他在各地开拓市场,共买下了N个饭店.在初期的市场调研中,他将一天划分为M ...
- PL/SQL不安装Oracle连接,Oracle instantclient安装
================================ ©Copyright 蕃薯耀 2020-01-07 https://www.cnblogs.com/fanshuyao/ 第一步: 下 ...