转:Linux 文件IO理解
源地址http://blog.csdn.net/lonelyrains/article/details/6604851
linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作。不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出。它以文件标识符(整型)作为文件唯一性的判断依据。这种操作不是ASCI标准的,与系统有关,移植有一定的问题。而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准。大体说来,不带缓存的方式频繁进行用户态和内核态的切换,高效但是需要程序员自己维护;带缓冲的方式因为有了缓冲区,不是非常高效,但是易于维护。由此,不带缓冲区的通常用于文件设备的操作,而带缓冲区的通常用于普通文件的操作。
之前看到有人把不带缓冲区的方式定义为低级IO操作,而带缓冲区的方式定义为高级IO操作。从是否是直接系统调用的角度,这个说法是成立的。但是,不带缓冲区的方式里,又有5种IO处理模型的划分,这5种二级范畴的IO处理模型的讨论全都是被称为高级IO操作的。为了不至于混淆,不把不带缓冲区的IO操作称为低级IO操作,而称为非ASCI标准的文件IO操作。
刚说了,不带缓冲区的方式高效但是需要程序员自己维护,包含5种对我个人来说比较难以理解的处理模型。现在就来谈谈这5中处理模型:阻塞IO模型、非阻塞模型、IO多路转接模型、信号驱动IO模型、异步IO模型。
很多人对阻塞和非阻塞、同步和异步的概念混淆不清。我举一个非常简单的例子,把大象关进冰箱需要三步:开门、把大象放进冰箱、关门。阻塞的意思是:开门开不了,一直猫在那等着;非阻塞的意思是:开门开不了,等下再来看看。同步的意思是:开不开门的请求和等待开不开门的结果是有序的;异步的意思是:假设要装两头大象进冰箱,如果冰箱门是开的,可以提交两条把大象放进冰箱的请求,而不是等待第一条请求有了结果之后再决定是否发出第二条请求。也就是说,阻塞非阻塞是针对具体应用的,而同步同步是仅指的通信应答方面。计算机科班的学生可能对前者理解更深刻,而通信科班的学生可能对后者理解的更深刻。不过,在讨论文件IO的时候,这个情况有些特殊。异步IO模型指的并不是异步通信的实质,而是不含阻塞的现象。
言归正传,来谈不含缓存的五种IO模型。
1、阻塞IO模型:从开门到把大象放进去到关门,一直是守着的,不干别的。所以,有多少步就有多少次阻塞。
2、非阻塞模型:当前是不是可以开门?不是。哦,干点别的。当前是不是可以开门?……如果不可以,一直重复上述步骤。直到——当前是不是可以开门?是。好的,开门。然后针对以下步骤重复上面的操作。但是实际文件IO操作,从内核把数据拷到用户进程的操作,仍然是阻塞的。
3、IO多路转接模型:在一个循环体中,实现对几套把大象关进冰箱的操作,而所用的冰箱是不同的冰箱,所以不存在冲突问题。在第一个冰箱关进冰箱需要等待的时候,就看第二个能不能执行。这种方式与用多线程下,每个子线程执行阻塞IO模型的操作类似。这个调度过程由OS执行。
4、信号驱动IO模型:发出打开冰箱的请求之后,可以干别的了。直到内核通知你可以等待从内核态拷贝数据了。从内核把数据 拷到用户进程的操作,仍然是阻塞的。
5、异步IO模型:发出打开冰箱的请求之后,可以干别的了。直到完成从内核到用户进程的数据拷贝,再通知用户。
参考 Unix Network Programming Volume 1。理解不透彻的地方,加强交流。
转:Linux 文件IO理解的更多相关文章
- 转 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- linux 文件IO
1.文件描述符 (1)文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表.(2)文 ...
- <摘录>linux文件IO
这篇文章写的比较全面,也浅显易懂,备份下.转载自:http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的 ...
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- 2.Linux文件IO编程
2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...
- linux文件io与标准io
文件IO实际是API,Linux对文件操作主要流程为:打开(open),操作(write.read.lseek),关闭(close). 1.打开文件函数open(): 涉及的头文件: #includ ...
- linux文件IO操作篇 (一) 非缓冲文件
文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...
- Linux文件IO与通用块层的请求合并
本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号“Linux阅码场” 请求合并就是将进程内或者进程间产生的在物理地址上连续的多个IO ...
随机推荐
- 学无止境的CSS(xHTML+CSS技巧教程资源大全)
本文里面收集一些有关CSS的技巧.教程.工具和观点等,其中一些你也许早就运用的炉火纯青,也可能有的你听都没听说过.不管是新手还是高手,大家都继续学习吧. 一,Web 标准 要玩游戏,就得先了解规则.要 ...
- Linux内存 mem 和 swap
摘抄并用于自查 Linux mem/swap/buffers/cached区别 free命令相对于top,提供了更简洁的查看系统内存使用情况: # free -m mem:表示物理内存统计 buff/ ...
- linux下svn 客户端使用方式
输入 yes 开始 checkout服务器上的文件到本地目录 2.将文件 添加文件到某个目录下(是svn的服务器checkout下来的目录中) 3. 提交到服务器 4 .即可在服务器目录看到(wind ...
- PHP-SQL查询上升的温度
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id. +---------+------------------+------------- ...
- python open函数关于w+ r+ 读写操作的理解(转)
r 只能读 (带r的文件必须先存在)r+ 可读可写 不会创建不存在的文件.如果直接写文件,则从顶部开始写,覆盖之前此位置的内容,如果先读后写,则会在文件最后追加内容.w+ 可读可写 如果文件存在 则覆 ...
- css---7自定义字体
1.Adobe illustrator AI是一种应用于出版.多媒体和在线图像的工业标准矢量插画的软件,是一款非常好的矢量图形处理工具. 该软件主要应用于印刷出版.海报书籍排版.专业插画.多媒体图像处 ...
- 帆软报表PC端实施报表心得体会
1.报表制作完成后,预览时自动显示查询内容,在控件处设置: 2.求一列数据的最小值(除去0),并对最小值字体加粗标绿,需要对对应单元格设置条件属性,并插入公式:C6 = min(greparray(C ...
- MySQL安装pdf介绍
pdf地址:https://files.cnblogs.com/files/pygo/mysql%E5%AE%89%E8%A3%85.pdf
- WPF命令好状态刷新机制
https://blog.csdn.net/WPwalter/article/details/90344470 this.DispatcherInvoke(() => { System.Wind ...
- 训练计划Day1
Day1:二分答案,三分查找,快速幂,欧拉筛素数 | 题目:火星人,Bridge,GCD,Prime Path 二分答案 [JSOI 2008] 火星人 对于第一个操作用\(hash + 二分\)来求 ...