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

 

读取磁盘的性能取决于磁盘的使用时间,比如一个磁盘如果一直处于读取状态,那么你再多的线程也没有用。

系统总线也是不支持并行的,再多的线程总线上的数据也得一个一个来。

posted @ 2020-09-06 17:01  熊鑫xxx1x  阅读(538)  评论(0)    收藏  举报