对文件 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 ...
随机推荐
- 在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移
我看到很多nopCommerce论坛的用户问他们如何使用Entity Framework(EF)代码优先迁移来自定义nopCommerce,添加新的字段和entites核心.我实际上在做nopComm ...
- js中各种距离clientWidth
1: offsetLeft.offsetTop.offsetHeight.offsetWidth 1.1 偏移参照——定位父级offsetParent offsetParent的定义是:与当前元素 ...
- 解决浏览器窗口缩小出现白色背景的bug
父容器上添加最小宽度min-width=xxxpx min-width的值大于浏览器横向滚动条出现时的宽度.
- C++ Knowledge series Inheritance & RTTI & Exception Handling
Inheritance The pointer or reference to base class can address/be assigned with any of the classes d ...
- Window10 Bug记录
1.两台新电脑刚安装: 妹子的电脑JDK配置后,重启后环境变量配置丢失,cmd里能输出,但eclipse启动不了,重新配置后正常. 我的电脑JDK配置,重启后环境变量在,但好像没加载,cmd输出与ec ...
- lunix重启service network restart错误Job for network.service failed. See 'system 或Failed to start LSB: Bring
1.mac地址不对 通过ip addr查看mac地址,然后修改cd /etc/sysconfig/network-scripts/目录下的文件里面的mac地址 2.通过以下方法 systemctl s ...
- innerHTML动态添加html代码和脚本兼容性问题处理方法
给某个元素的innerHTML赋值,并使得值中的js代码有效(兼容多个浏览器) 症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在 ...
- 【BZOJ1067】[SCOI2007] 降雨量(RMQ+分类讨论)
点此看题面 大致题意:请你判断"\(x\)年是自\(y\)年以来降雨量最多的"这句话的真假. 离散化/\(lower\_bound\) 首先,考虑到年份的范围非常大,便可以离散化. ...
- CentOS系统中使用iptables设置端口转发
echo 1 > /proc/sys/net/ipv4/ip_forward 首先应该做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默认是0 ...
- 2017.11.10 web中URL和URI的区别
URI:Uniform Resource Identifier,统一资源标识符: •URL:Uniform Resource Locator,统一资源定位符: •URN:Uniform Resourc ...