转: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 ...
随机推荐
- 【POJ】1426 Find The Multiple
题目链接:http://poj.org/problem?id=1426 题意:给定一个正整数n,找一个比n大且能只由01构成的且能够被n整除的数. 题解:这个就是在后面添0和添1小心试探.一定要是添0 ...
- jsonArray转换成List
从字符串String转换成List 字符串格式: String jsonstr = "{'studentsjson':[{'student':'张三'},{'student':'李四'}] ...
- redhat7和redhat6混合搭建文档
1.下载cm对应redhat7的版本.2.修改/opt/cloudera/cm-5.10.0/etc/cloudera-scm-agent/config.ini成为中心机器hostname/ip(ma ...
- JS对象 返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数 一小时为:60*60*1000
返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数,计算从 1970 年 1 月 1 日零时到日期对象所指的日期的毫秒数. 如果将目前日期对象的时间推迟1小时,代码如下: &l ...
- K8S之WebApi部署
转载声明 本文转自:ASP.NET Core on K8S学习初探(3)部署API到K8S 1.下载镜像 docker pull edisonsaonian/k8s-demo 因为是测试流程,直接把文 ...
- echarts折线区域图
一.使用场景 当舒张压和收缩压超过或低于他们对应的范围时,折线应该给与不同颜色.两个指标对应的范围也要填充不同的颜色. 二.实现方案 主要使用了echarts中的visualMap,series.ma ...
- hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
题意: 给你一个数字拼图,问你数字拼图能否能复原成原来的样子. 题解: 数字拼图的性质是,逆序数奇偶相同时,可以互相转化,逆序数奇偶不同,不能互相转化. 因此统计逆序对即可. #include< ...
- 10 行 Python 代码实现模糊查询/智能提示
10 行 Python 代码实现模糊查询/智能提示 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的 ...
- VS2010-MFC(常用控件:静态文本框)
转自:http://www.jizhuomi.com/software/179.html 关于对话框的使用和各种通用对话框的介绍就到此为止,从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文 ...
- HTML引入CSS的方法
1.嵌入式 通过<style>标记,来引入CSS样式. 语法格式:<style type = “text/css”></style> 提示:<style> ...