我知道缓存用于提高从硬盘读取数据的速度,因为从硬盘读取数据的速度和从 RAM 读取数据的速度是非常不同的。所以缓存未命中的索引非常重要。
另外,我知道在读写硬盘驱动器或其他设备(如键盘)时,我们有缓冲区(例如,Java 中有BufferedWriter
和)。BufferedReader
但我不知道为什么我们需要一个缓冲区。如果我们没有缓冲区怎么办?缓冲区也是为了提高阅读速度吗?如果是这样,缓冲区和缓存之间有什么区别?
另外,我知道缓存是为了提高读取速度,但是缓存可以提高从RAM写入数据到硬盘的速度吗?
据我了解,当生产者和消费者最佳生产或消费数据的速率不同时,缓冲区最有用。
例如,一个程序可能一次将 8 个字节的数据写入一个文件。对于正在写入的磁盘,一次实际写入 4 KiB 数据可能是最佳选择。对于明显更小的块,写入磁盘所涉及的开销可能会大于磁盘实际写入数据所花费的时间(因此 512*T_8b >> T_4KiB)。因此,中间有一个缓冲区可以收集 4 KiB 的数据块并一次写入它们将大大提高性能。例如,请参见:为什么 dd 需要太长时间?,其中最简单的解决方案是使用更大的缓冲区大小。(当然,我这里的数字纯粹是举例。适用于现代磁盘的实际数字可能会有很大不同。)
高速缓存与缓冲正交。缓存和缓冲都是为了防止对慢速源(磁盘、网络等)进行不必要的额外访问。但是缓存的工作原理是通过保存结果以供重用来消除重复的读取和写入,而缓冲区的工作原理是通过将重复的、顺序的读取和写入聚集在一起来消除它们。一个简单的观点: