setbuffer与文件的缓存机制
背景: 都知道文件的读取用到了缓存机制,但是有以下几点问题却一直没有确切的答案:
1. 缓存机制到底是什么机制。
2. 读取文件I/O的过程到底是怎样的,多线程并发读取一二文件是否会有速度上的提升。
参考:https://blog.csdn.net/yusiguyuan/article/details/23358913
无缓存IO操作数据流向路径:数据——内核缓存区——磁盘
标准IO操作数据流向路径:数据——流缓存区——内核缓存区——磁盘
总结如下:
所谓带不带缓冲,指的是在调用系统调用如write或read时是否有用户级的缓冲。标准函数fread和fwrite会为用户定制缓冲区,这个缓冲区的大小控制了调用系统函数的节奏。
首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用。系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其写数据时,直接调用系统调用,将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘。因此所谓的不带缓冲的I/O是指进程不提供缓冲功能(但内核还是提供缓冲的)。每调用一次write或read函数,直接系统调用。
而带缓冲的I/O是指进程对输入输出流进行了改进,提供了一个流缓冲,当用fwrite函数网磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘。(双重缓冲)
因此,带缓冲的I/O在往磁盘写入相同的数据量时,会比不带缓冲的I/O调用系统调用的次数要少。
问题2 : 参考: https://www.zhihu.com/question/319248072
读取磁盘的性能取决于磁盘的使用时间,比如一个磁盘如果一直处于读取状态,那么你再多的线程也没有用。
系统总线也是不支持并行的,再多的线程总线上的数据也得一个一个来。

浙公网安备 33010602011771号