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
没看