对文件 I/O,标准 I/O 的缓冲的理解
1.标准I/O缓冲区
要理解标准I/O,就要先知道文件I/O的业务逻辑。
下面图示为文件I/O

如执行下面的代码:
write(fd, buf2, sizeof(buf2));
图中
buf:就是buf2。
缓冲区:是文件系统的页缓存。
当执行写操作时,buf中的数据会被复制到内核空间的页缓冲区,如果使用的是同步写,那么数据会从页缓冲写到磁盘,如果使用的是延迟写,那么数据不会立即写入磁盘,只有当页缓冲区满了,或者页缓冲区被其他I/O使用时,才会写入磁盘。
当执行读操作时,磁盘数据先被复制到页缓冲,进程再从页缓冲中取数据,当页缓冲空间大小大于用户要求读取的数据量时,文件系统会假设用户紧接着会读取后面连续的数据,所以会将随后的数据预先载入页缓冲,这样用户下次读时,就可以直接从页缓冲中读取。
标准I/O的不足就是 buf 的大小不一定等于页缓冲区的大小,当 buf 的大小小于页缓冲区的大小时,一次写后页缓冲区并没有被填满,便进行了一次磁盘访问。文件I/O对此进行了改进。
2.文件I/O缓冲区
文件I/O的图示如下:

我们知道文件I/O是对文件流对象进行操作的,FILE 中重要的数据结构就是:文件描述符、指向缓冲区的指针。
文件I/O多了一个缓冲区,该缓冲区由 malloc分配,在用户空间,并且它的大小和内核页缓冲区的大小匹配。
当执行全缓冲的写操作时,buf中的数据先复制到流缓冲区中,当流缓冲区填充满后,再复制到内核页缓冲区,然后访问磁盘,写入数据。
当执行读操作时,第一次读操作:数据从磁盘复制到页缓冲,再从页缓冲复制到流缓冲,进程从流缓冲中复制需要的数据,由于每个流都有自己的流缓冲,那么当页缓冲中数据被刷掉后,进程不需要调用read函数,而只需要读自己的流缓冲区中预先读取的数据。
文件I/O提高速率的方法就是:尽量让流缓冲区填满后,再将数据传送给内核的页缓冲区,这样每次访问磁盘,都可以最大效率的传送数据。
3.实验证明效率
用三种不同的函数,完成读文件后写到标准输出的工作。




对文件 I/O,标准 I/O 的缓冲的理解的更多相关文章
- 文件IO和标准IO的区别【转】
一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所 ...
- 文件IO与标准IO的区别
文件IO与标准IO的区别 文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作,文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立 ...
- 文件IO和标准IO
2015.2.26 星期四,阴天 今天的内容主要是文件IO man 手册的分册: man -f open 查看那些分册中有openman 1 -- 普通的命令程序man 2 -- 系统调用man 3 ...
- [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符
文件描述符 当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明 操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移 ...
- C基础 大文件读取通过标准库
引言 - 问题的构建 C大部分读取文件的时候采用fgetc, 最近在使用过程中发现性能不是很理想.都懂得fgetc每次只能读取一个字符, IO操作太频繁. 所以性能低. 本文希望通过标准库函数frea ...
- linux文件io与标准io
文件IO实际是API,Linux对文件操作主要流程为:打开(open),操作(write.read.lseek),关闭(close). 1.打开文件函数open(): 涉及的头文件: #includ ...
- Linux中从oracle官网下载jdk文件不是标准的gzip格式文件问题
首先你要知道,在linux系统中,文件类型跟后缀名无关,后缀名只是为了方便识别,所以你下载的压缩包可能是tar.gz格式的,也有可能是tar.bz2或tar.xz格式,因为可能别人压缩之后不小心改错了 ...
- java IO流文件拷贝文件(字节流标准写法)
public static void copyFile(String srcPath, String destPath) { FileInputStream fis = null; FileOutpu ...
- 标准输入输出 stdio 流缓冲
**From : http://www.pixelbeat.org/programming/stdio_buffering/** 我发现找出标准流用的是什么缓冲是一件困难的事. 例如下面这个使用uni ...
随机推荐
- poj 1987 节点距离小于等于K(树DP)
这题和poj 1741是一模一样的 但是1741能AC的代码,在这里却是TLE,暂时没看出哪里出现了问题.. AC代码: #include <iostream> #include < ...
- Hibernate课程 初探一对多映射4-1 inverse属性
1 <Set>节点的inverse属性默认由one方来维护(默认值为false).将inverse属性修改为true则由多方来维护.
- jquery的on()方法总结
摘自菜鸟教程 废话不说 直接上demo 实例: 向<p>元素添加click事件处理程序: <html> <head> <script src="ht ...
- LINQ&EF任我行(二)--LinQ to Object
(原创:灰灰虫的家http://hi.baidu.com/grayworm)LinQ to Objects是LinQ家庭的核心,其它的LinQ也使用了与LinQ to Objects相同的查询句法.最 ...
- 【起航计划 002】2015 起航计划 Android APIDemo的魔鬼步伐 01
本文链接:[起航计划 002]2015 起航计划 Android APIDemo的魔鬼步伐 01 参考链接:http://blog.csdn.net/column/details/mapdigitap ...
- [SVN]TortoiseSVN工具培训5─常见问题解决
1.文件提交时状态异常 产生原因:操作不当 解决方法:使用SVN的clean up命令 2.权限不足 产生原因:当前用户权限不足 解决方法:找配置管理员申请权限 3.网络故障 产生原因:无法访问到配置 ...
- Azure IOT 设备固件更新技巧,看这一篇就够了
嫌长不看版 今天为大家准备的硬菜是:在 Azure IoT 中心创建 Node.js 控制台应用,进行端到端模拟固件更新,为基于 Intel Edison 的设备安装新版固件的流程.通过创建模拟设备应 ...
- Linux目录与文件的权限意义
ls -l和ls -al的区别:第一个不会显示隐藏文件,第二个会显示隐藏文件(以点(.)开头的文件) 一.权限对文件(r.w.x主要针对文件的内容而言)的重要性 r:可读取文件内容 w:可以编辑.新增 ...
- 笨办法学Python(三)
习题 3: 数字和数学计算 每一种编程语言都包含处理数字和进行数学计算的方法.不必担心,程序员经常撒谎说他们是多么牛的数学天才,其实他们根本不是.如果他们真是数学天才,他们早就去从事数学相关的行业了, ...
- ubuntu linux查看cpu信息
$ cat /proc/cpuinfo CPU核心数量 $ grep -c processor /proc/cpuinfo