源地址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理解的更多相关文章

  1. 转 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  2. 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  3. linux 文件IO

    1.文件描述符 (1)文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表.(2)文 ...

  4. <摘录>linux文件IO

    这篇文章写的比较全面,也浅显易懂,备份下.转载自:http://blog.chinaunix.net/uid-27105712-id-3270102.html 在Linux 开发中,有几个关系到性能的 ...

  5. Linux文件IO操作

    来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...

  6. 2.Linux文件IO编程

    2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...

  7. linux文件io与标准io

    文件IO实际是API,Linux对文件操作主要流程为:打开(open),操作(write.read.lseek),关闭(close). 1.打开文件函数open(): 涉及的头文件:  #includ ...

  8. linux文件IO操作篇 (一) 非缓冲文件

    文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...

  9. Linux文件IO与通用块层的请求合并

    本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号“Linux阅码场” 请求合并就是将进程内或者进程间产生的在物理地址上连续的多个IO ...

随机推荐

  1. uoj139 【UER #4】被删除的黑白树

    题目 不难发现有一个暴力\(dp\) 设\(dp[x][l]\)表示\(x\)点子树内所有叶子节点到\(x\)的路径上都有\(l\)和黑点时最多能染多个黑点 转移就是 \[dp[x][l]=\max( ...

  2. 2018湘潭大学程序设计竞赛【B】

    题目链接: https://www.nowcoder.com/acm/contest/105/B 题意: 给你一个字母矩阵,和测试组数,让你统计字符串的字符累计出现的次数,然后让你找出需要找的字符,这 ...

  3. linux下创建oracle表空间

    来自:http://blog.sina.com.cn/s/blog_62192aed01018aep.html 1 . 登录服务器 2 . 查看磁盘空间是否够大df -h -h更具目前磁盘空间和使用情 ...

  4. 【ASP.Net Core】不编译视图文件

    原文:[ASP.Net Core]不编译视图文件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aqtata/article/details/818 ...

  5. docker ps -a

    1 pwd 2 mkdir data 3 ll 4 uname -n 5 cd data/ 6 ll 7 pwd 8 ll 9 wget -N --no-check-certificate https ...

  6. digitalpersona 开发(系统托盘,监听指纹扫描)

    其实很简单,主要是生成  DPFPCapture  对象时,设置他的优先级就可以了. (改成High的话,发布后,windows系统会认为你是病毒.....) C# //设置优先级,这个就是系统托盘后 ...

  7. hdu多校第二场1011 (hdu6601) Keen On Everything But Triangle 主席树

    题意: 给定一个数列,每次询问一个区间,问这个区间中的值可组成的周长最大的三角形的周长. 题解: 定理1:给定一些值,这些值中组成边长最大的三角形的三条边的大小排名一定是连续的. 证明:假如第k大,第 ...

  8. System.Configuration.ConfigurationManager.cs

    ylbtech-System.Configuration.ConfigurationManager.cs 1.程序集 System.Configuration, Version=4.0.0.0, Cu ...

  9. 可拖拽排序的vue组件

    最近在优化一个vue的博客系统,想实现文章列表处的文章拖拽功能.就试了一下awe-dnd vue插件,觉得还挺好用的. 安装 npm install awe-dnd --save 使用 在main.j ...

  10. zookeeper 选举白话理解