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 的缓冲的理解的更多相关文章

  1. 文件IO和标准IO的区别【转】

    一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所 ...

  2. 文件IO与标准IO的区别

    文件IO与标准IO的区别 文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作,文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立 ...

  3. 文件IO和标准IO

    2015.2.26 星期四,阴天 今天的内容主要是文件IO man 手册的分册: man -f open 查看那些分册中有openman 1 -- 普通的命令程序man 2 -- 系统调用man 3 ...

  4. [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符

    文件描述符   当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明 操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移 ...

  5. C基础 大文件读取通过标准库

    引言 - 问题的构建 C大部分读取文件的时候采用fgetc, 最近在使用过程中发现性能不是很理想.都懂得fgetc每次只能读取一个字符, IO操作太频繁. 所以性能低. 本文希望通过标准库函数frea ...

  6. linux文件io与标准io

    文件IO实际是API,Linux对文件操作主要流程为:打开(open),操作(write.read.lseek),关闭(close). 1.打开文件函数open(): 涉及的头文件:  #includ ...

  7. Linux中从oracle官网下载jdk文件不是标准的gzip格式文件问题

    首先你要知道,在linux系统中,文件类型跟后缀名无关,后缀名只是为了方便识别,所以你下载的压缩包可能是tar.gz格式的,也有可能是tar.bz2或tar.xz格式,因为可能别人压缩之后不小心改错了 ...

  8. java IO流文件拷贝文件(字节流标准写法)

    public static void copyFile(String srcPath, String destPath) { FileInputStream fis = null; FileOutpu ...

  9. 标准输入输出 stdio 流缓冲

    **From : http://www.pixelbeat.org/programming/stdio_buffering/** 我发现找出标准流用的是什么缓冲是一件困难的事. 例如下面这个使用uni ...

随机推荐

  1. 在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移

    我看到很多nopCommerce论坛的用户问他们如何使用Entity Framework(EF)代码优先迁移来自定义nopCommerce,添加新的字段和entites核心.我实际上在做nopComm ...

  2. js中各种距离clientWidth

    1: offsetLeft.offsetTop.offsetHeight.offsetWidth 1.1 偏移参照——定位父级offsetParent   offsetParent的定义是:与当前元素 ...

  3. 解决浏览器窗口缩小出现白色背景的bug

    父容器上添加最小宽度min-width=xxxpx min-width的值大于浏览器横向滚动条出现时的宽度.

  4. 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 ...

  5. Window10 Bug记录

    1.两台新电脑刚安装: 妹子的电脑JDK配置后,重启后环境变量配置丢失,cmd里能输出,但eclipse启动不了,重新配置后正常. 我的电脑JDK配置,重启后环境变量在,但好像没加载,cmd输出与ec ...

  6. 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 ...

  7. innerHTML动态添加html代码和脚本兼容性问题处理方法

    给某个元素的innerHTML赋值,并使得值中的js代码有效(兼容多个浏览器) 症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在 ...

  8. 【BZOJ1067】[SCOI2007] 降雨量(RMQ+分类讨论)

    点此看题面 大致题意:请你判断"\(x\)年是自\(y\)年以来降雨量最多的"这句话的真假. 离散化/\(lower\_bound\) 首先,考虑到年份的范围非常大,便可以离散化. ...

  9. CentOS系统中使用iptables设置端口转发

    echo 1 > /proc/sys/net/ipv4/ip_forward 首先应该做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默认是0  ...

  10. 2017.11.10 web中URL和URI的区别

    URI:Uniform Resource Identifier,统一资源标识符: •URL:Uniform Resource Locator,统一资源定位符: •URN:Uniform Resourc ...