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

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

没看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值