緩沖區 (buffer) 與緩存(cache)


緩沖區 (buffer) 與緩存(cache)

下面介紹緩沖區的知識。

一、什么是緩沖區

緩沖區 (buffer),它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數據,這部分預留的空間就叫做緩沖區,顯然緩沖區是具有一定大小的。

緩沖區根據其對應的是輸入設備還是輸出設備,分為輸入緩沖區和輸出緩沖區。

**二、為什么要引入緩沖區

**

我們為什么要引入緩沖區呢?

高速設備與低速設備的不匹配,勢必會讓高速設備花時間等待低速設備,我們可以在這兩者之間設立一個緩沖區。

緩沖區的作用:

\1. 可以解除兩者的制約關系,數據可以直接送往緩沖區,高速設備不用再等待低速設備,提高了計算機的效率。例如:我們使用打印機打印文檔,由於打印機的打印速度相對較慢,我們先把文檔輸出到打印機相應的緩沖區,打印機再自行逐步打印,這時我們的 CPU 可以處理別的事情。

\2. 可以減少數據的讀寫次數,如果每次數據只傳輸一點數據,就需要傳送很多次,這樣會浪費很多時間,因為開始讀寫與終止讀寫所需要的時間很長,如果將數據送往緩沖區,待緩沖區滿后再進行傳送會大大減少讀寫次數,這樣就可以節省很多時間。例如:我們想將數據寫入到磁盤中,不是立馬將數據寫到磁盤中,而是先輸入緩沖區中,當緩沖區滿了以后,再將數據寫入到磁盤中,這樣就可以減少磁盤的讀寫次數,不然磁盤很容易壞掉。

簡單來說,緩沖區就是一塊內存區,它用在輸入輸出設備和 CPU 之間,用來存儲數據。它使得低速的輸入輸出設備和高速的 CPU 能夠協調工作,避免低速的輸入輸出設備占用 CPU,解放出 CPU,使其能夠高效率工作。

**三、緩沖區的類型

**

緩沖區 分為三種類型:全緩沖、行緩沖和不帶緩沖。

1、全緩沖

在這種情況下,當填滿標准 I/O 緩存后才進行實際 I/O 操作。全緩沖的典型代表是對磁盤文件的讀寫。

2、行緩沖

在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的 I/O 操作。這時,我們輸入的字符先存放在緩沖區,等按下回車鍵換行時才進行實際的 I/O 操作。典型代表是鍵盤輸入數據。

3、不帶緩沖

也就是不進行緩沖,標准出錯情況 stderr 是典型代表,這使得出錯信息可以直接盡快地顯示出來。

四、緩沖區的刷新

下列情況會引發緩沖區的刷新:

  • 緩沖區滿時;
  • 關閉文件。

可見,緩沖區滿或關閉文件時都會刷新緩沖區,進行真正的 I/O 操作。

大家要仔細理解緩沖區刷新的意思,刷新字面上的意思是用刷子刷,把原來舊的東西變新了,這里就是改變的意思,例如像緩沖區溢出的時候,多余出來的數據會直接將之前的數據覆蓋,這樣緩沖區里的數據就發生了改變。

比如在 Linux 下,操作命令行就屬於常見的行緩沖模式 輸入一行命令例如 ls, 命令 ls 就會進入到緩沖區內,不輸入回車的話,什么也不會發生,當輸入回車就會執行真正的 IO 操作

img

還有一種情況,並不需要輸入回車。

例如在 vim 的正常模式下,輸入 dd 可以直接刪除某一行,並不需要輸入回車。這種情況貌似就是直接把信號傳送到內存中。

我個人的想法是:鍵盤把 dd 輸入到緩沖區,然后 vim 直接就從緩沖區把數據讀出來了,不需要人為的干預,當然這只是我個人的假想 (╯□╰)。

關於緩沖區的大小:

img

在這種情況下,輸出的信息特別多,我們可以通過滑動條來進行上下移動。這種情況屬於緩沖區比較大的情況。

在真正的 linux 終端下:

執行 find / ls 命令的話。

img

只能顯示最后幾行,因為在 linux 終端的緩沖區很小,出現了緩沖區溢出的現象,緩沖區里的數據被直接覆蓋了。

為此 linux 提供了管道符 | 與 less,more 組合,可以一頁一頁的查看。

緩存(cache)

cache 是一個非常大的概念。

一、

CPU 的 Cache,它中文名稱是高速緩沖存儲器,讀寫速度很快,幾乎與 CPU 一樣。由於 CPU 的運算速度太快,內存的數據存取速度無法跟上 CPU 的速度,所以在 cpu 與內存間設置了 cache 為 cpu 的數據快取區。當計算機執行程序時,數據與地址管理部件會預測可能要用到的數據和指令,並將這些數據和指令預先從內存中讀出送到 Cache。一旦需要時,先檢查 Cache,若有就從 Cache 中讀取,若無再訪問內存,現在的 CPU 還有一級 cache,二級 cache。簡單來說,Cache 就是用來解決 CPU 與內存之間速度不匹配的問題,避免內存與輔助內存頻繁存取數據,這樣就提高了系統的執行效率。

二、
磁盤也有 cache, 硬盤的 cache 作用就類似於 CPU 的 cache,它解決了總線接口的高速需求和讀寫硬盤的矛盾以及對某些扇區的反復讀取。

三、

瀏覽器緩存(Browser Caching)是為了節約網絡的資源加速瀏覽,瀏覽器在用戶磁盤上對最近請求過的文檔進行存儲,當訪問者再次請求這個頁面時,瀏覽器就可以從本地磁盤顯示文檔,這樣就可以加速頁面的閱覽,並且可以減少服務器的壓力。這個過程與下載非常類似,不過下載是用戶的主動過程,並且下載的數據一般是長時間保存,游覽器的緩存的數據只是短時間保存,可以人為的清空

四、

同樣 cache 也有大小,例如現在市面上購買的 CPU 的 cache 越大,級數越多,CPU 的訪問速度越快。cache 在很多方面都有應用,就不一一列舉了。

緩存(cache)與緩沖 (buffer) 的主要區別

Buffer 的核心作用是用來緩沖,緩和沖擊。比如你每秒要寫 100 次硬盤,對系統沖擊很大,浪費了大量時間在忙着處理開始寫和結束寫這兩件事嘛。用個 buffer 暫存起來,變成每 10 秒寫一次硬盤,對系統的沖擊就很小,寫入效率高了,日子過得爽了。極大緩和了沖擊。

Cache 的核心作用是加快取用的速度。比如你一個很復雜的計算做完了,下次還要用結果,就把結果放手邊一個好拿的地方存着,下次不用再算了。加快了數據取用的速度。

簡單來說就是 buffer 偏重於寫,而 cache 偏重於讀。

ps:有時候大家要好好理解這些專有名詞字面上的意思,對理解這些概念有好處,緩沖:緩解沖擊,緩存:臨時存儲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM