Cache
緩衝區和記憶體有什麼區別?
我知道記憶體用於提高從硬碟讀取數據的速度,因為從硬碟讀取數據的速度和從 RAM 讀取數據的速度是非常不同的。所以記憶體未命中的索引非常重要。
另外,我知道在讀寫硬碟驅動器或其他設備(如鍵盤)時,我們有緩衝區(例如,Java 中有
BufferedWriter
和)。BufferedReader
但我不知道為什麼我們需要一個緩衝區。如果我們沒有緩衝區怎麼辦?緩衝區也是為了提高閱讀速度嗎?如果是這樣,緩衝區和記憶體之間有什麼區別?另外,我知道記憶體是為了提高讀取速度,但是記憶體可以提高從RAM寫入數據到硬碟的速度嗎?
據我了解,當生產者和消費者最佳生產或消費數據的速率不同時,緩衝區最有用。
例如,一個程序可能一次將 8 個字節的數據寫入一個文件。對於正在寫入的磁碟,一次實際寫入 4 KiB 數據可能是最佳選擇。對於明顯更小的塊,寫入磁碟所涉及的成本可能會大於磁碟實際寫入數據所花費的時間(因此 512*T_8b >> T_4KiB)。因此,中間有一個緩衝區可以收集 4 KiB 的數據塊並一次寫入它們將大大提高性能。例如,請參見:為什麼 dd 需要太長時間?,其中最簡單的解決方案是使用更大的緩衝區大小。(當然,我這裡的數字純粹是舉例。適用於現代磁碟的實際數字可能會有很大不同。)
高速記憶體與緩沖正交。記憶體和緩衝都是為了防止對慢速源(磁碟、網路等)進行不必要的額外訪問。但是記憶體的工作原理是通過保存結果以供重用來消除重複的讀取和寫入,而緩衝區的工作原理是通過將重複的順序讀取和寫入聚集在一起來消除重複的順序讀取和寫入。一個簡單的觀點:
- 當你讀取同一個位置 n 次時,只有第一個實際命中磁碟,其餘的來自記憶體
- 當您向同一位置寫入 n 次時,實際上只寫入最後一個