转: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 ...
随机推荐
- Nginx常用功能配置二
Nginx常用功能配置二 Nginx location匹配设置 location作用:可以根据用户请求的URI来执行不同的应用,根据用户请求的网站的地址URL匹配. location语法: locat ...
- jdk1.8新特性学习
package com.xll.code.jdk1_8study; import com.xll.code.jdk1_8study.pojo.User; import org.junit.jupite ...
- mysql查询小技巧
如果所传bookTypeName为空则执行select * from t_bookType(搜索框里未输入信息) 否则追加 and bookTypeName like '%"+bookTy ...
- C 终端输入 字符123 输出 10进制123
#include <stdio.h> #define N 20 int main(int argc, const char *argv[]) { char a[N] = {'\0'}; i ...
- MySQL中查询所有数据库占用磁盘空间大小
查询所有数据库占用磁盘空间大小的SQL语句: 复制代码 代码如下:select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2), ...
- leetcood学习笔记-79-单词搜索
题目描述: 方法一;回溯 class Solution: def exist(self, board: List[List[str]], word: str) -> bool: max_x,ma ...
- SQL Server ODBC 解决方案
{ } { }
- mysql的卸载重装+导入大量数据失败的解决方案+工具执行和项目执行结果不同
1.卸载 1>快捷键win+r输入regedit进入注册表 找到3个文件夹,全部删除 . HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eve ...
- 第二篇:怕碰到是因为没掌握,来吧,zTree!
一直以来看见web项目中的树就头疼.这次又给碰上了,什么也别说,这次自己整理一个版本出来实践一下.zTree v3.2的API界面非常清爽,但是在查看API之前,你需要自己先实践一下,知道基本的概念和 ...
- 多重背包 /// 单调队列DP oj1943
题目大意: em.... 就是多重背包 挑战340页的东西 ...自己的笔记总结总是比较乱的 重点:原始的状态转移方程中 更新第 i 种物品时 重量%w[i] 的值不同 则它们之间是相互独立的: 1- ...