Linux_UNIX编程手册-读书笔记-第十三章(文件I/O缓冲)

岁酱吖の 提交于 2019-12-30 19:14:50

13.1 文件I/O的内核缓冲:缓冲区高速缓冲

read()和write()系统调用都会操作磁盘时不会直接发起磁盘访问,而是仅仅在用户空间缓冲区与内核缓冲区高速缓存之间复制数据。

采用这一机制的原因是使read()和write调用的操作更为快速,因为它们不需要等待缓慢的磁盘操作。

缓冲区大小对I/O调用性能的影响:

如果与文件发生大量的数据传输,通过采用大块空间缓冲数据,以及执行更少的系统调用,可以极大的提高I/O性能。
若强制在数据传输到磁盘前阻塞输出操作,则调用write()所需的时间会显著上升。

13.2 stdio库的缓冲

使用stdio库可以使编程者免于自行处理对数据的缓冲,

使用setvbuf函数,可以控制stdio库使用缓冲的方式,setvbuf()调用将影响后续在指定流上进行的所有I/O操作

在这里插入图片描述
stream: 标识将要修改的文件流
buf 和 size 针对stream要使用的缓冲区。(需要动态或静态指定堆上的空间,若buf为NULL,则stdio库会自动分配一个)
mode:
1._IONBF 不缓冲,stderr默认属于此类型
2._IOLBF 行缓冲,在输入一个换行符之前缓冲数据
3._IOFBF 全缓冲,单次读写数据的大小与缓冲区相同,磁盘的流默认采用此模式。

在这里插入图片描述
该函数相当于setvbuf(fp,buf ,(buf != NULL)? _IOFBF:_IONBF, BUFSIZ );
在这里插入图片描述
这个函数也类似

刷新缓冲区:
在这里插入图片描述
若参数为NULL,则刷新所有。
刷新输入缓冲区时,将丢弃已缓冲的输入数据。
关闭相应流时,会自动刷新缓冲区。

应显式调用fflush(stdout),避免stdin输入导致的stdout缓冲区属性。一个输出操作不能紧跟一个输入操作,需要在二者之间调用fflush

13.3 控制文件的内核缓冲

SUSv3中同步I/O的定义:某一I/O操作,要么已成功完成到磁盘的数据传输,要么被诊断为不成功。

用于控制文件I/O内核缓冲的系统调用:
在这里插入图片描述

该系统调用将使缓冲数据和与打开文件描述符FD相关的所有元数据都刷新到磁盘上。
在这里插入图片描述
该函数会刷新所有内核缓冲区。

使所有写入同步:O_SYNC

在调用open()函数时如指定O_SYNC标志,则会使所有后续输出同步。
该标志对性能的影响极大

O_DSYNC和O_RSYNC
看不懂。。

13.4 I/O缓冲小结

在这里插入图片描述 没啥好说的,图挺好懂的。

13.5-13.7

没看

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!