对文件 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 ...
随机推荐
- hdu 4044 树形DP 炮台打怪 (好题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题目大意:给定n个节点组成的树,1为敌方基地,叶子结点为我方结点.我们可以在每个结点安放炮台,至 ...
- elasticsearch映射及分析-----3
首先我们看下不同的索引方式相同的字段指定字段类型与不指定字段类型es会怎么处理 1.不指定类型,直接创建索引及类型文档 我们看下他默认的索引映射 2.创建索引和类型时指定字段类型 这里创建了一个索引为 ...
- IDEA学习中的参考资料
下载安装破解:https://www.cnblogs.com/wang1024/p/7485758.html FIntelliJ-IDEA13基础教程: http://static.runoob.co ...
- thinkphp中怎么判断是手机端访问还是pc端访问?
function isMobile() { // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) r ...
- HTML中6种空白空格
HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格( )在不同浏览器中宽度各异. ...
- K星异客
http://baike.baidu.com/view/222058.htm 这部改编自基恩·布汝尔1995年出版的同名小说的电影在当年的十月档票房榜上称冠.本来这部电影的外星人主人公属意于威尔.史密 ...
- HTML5开发,背后的事情你知道吗?
现在的H5越来越受到企业或者是开发者的一个大力的追捧,已经成为网络推广必不可少的一个使用的工具,相信还有很多朋友现在都不知道H5是个什么东西,本文将为大家讲的是关于H5一些分类的问题,让你进一步的去学 ...
- JSON:json_encode函数不能获取属性原因及解决方案
json_encode()是个解析json数据的函数,但是这个函数可以有两个参数 形式: json_decode ( string $json, ture || false ) 第一个参数传字 ...
- API:access_token
access_token存在意义: 1.身份验证(一个channel_id一般有0个或1个有效的access_token) 2.限制用户访问服务器数据的有效期 3.限制用户访问权限 access_ ...
- 译:Local Spectral Graph Convolution for Point Set Feature Learning-用于点集特征学习的局部谱图卷积
标题:Local Spectral Graph Convolution for Point Set Feature Learning 作者:Chu Wang, Babak Samari, Kaleem ...