緩衝區(Buffer)定義
緩衝區(Buffer),它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區,顯然緩衝區是具有一定大小的。
有時候,從鍵盤輸入的內容,或者將要輸出到顯示器上的內容,會暫時進入緩衝區,待時機成熟,再一股腦將緩衝區中的所有內容“倒出”,我們才能看到變數的值被重新整理,或者螢幕產生變化。
有時候,使用者希望得到最及時的反饋,輸入輸出的內容就不能進入緩衝區。
為什麼要引入緩衝區?
首先,緩衝區可以使低速的輸入輸出裝置和高速執行的程式能夠協調工作。一般來說程式在CPU上執行,其速度必定遠超過一般硬體執行速度。例如,硬碟的速度要遠低於 CPU,它們之間有好幾個數量級的差距,當向硬碟寫入資料時,程式需要等待,不能做任何事情,就好像卡頓了一樣,使用者體驗非常差。計算機上絕大多數應用程式都需要和硬體打交道,例如讀寫硬碟、向顯示器輸出、從鍵盤輸入等,如果每個程式都等待硬體,那麼整臺計算機也將變得卡頓。但是有了緩衝區,就可以將資料先放入緩衝區中(記憶體的讀寫速度也遠高於硬碟),然後程式可以繼續往下執行,等所有的資料都準備好了,再將緩衝區中的所有資料一次性地寫入硬碟,這樣程式就減少了等待的次數,變得流暢起來。
其次,緩衝區可以有效減少硬體裝置的讀寫次數。如果每次輸入輸出操作只傳輸少量資料,就需要傳送很多次,這樣會浪費很多時間,因為開始讀寫與終止讀寫所需要的時間很長,如果將資料送往緩衝區,待緩衝區滿後再進行傳送會大大減少讀寫次數,這樣就可以節省很多時間。例如,我們想將資料寫入到磁碟中,不是立馬將資料寫到磁碟中,而是先輸入緩衝區中,當緩衝區滿了以後,再將資料寫入到磁碟中,這樣就可以減少磁碟的讀寫次數,不然磁碟很容易壞掉。
簡單來說,緩衝區就是一塊記憶體區,它用在輸入輸出裝置和CPU之間,用來儲存資料。它使得低速的輸入輸出裝置和高速的CPU能夠協調工作,避免低速的輸入輸出裝置佔用CPU,解放出CPU,使其能夠高效率工作,同時減少操作硬體的次數。
緩衝區的型別
緩衝區分為三種類型:全緩衝、行緩衝和不帶緩衝。
1、全緩衝在這種情況下,當填滿標準I/O快取後才進行實際I/O操作,即一定大小的緩衝區填滿後。全緩衝的典型代表是對磁碟檔案的讀寫。
2、行緩衝在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字元先存放在緩衝區,等按下回車鍵換行時才進行實際的I/O操作。行緩衝的典型代表就是標準輸入裝置(也即鍵盤)和標準輸出裝置(也即顯示器)。
比如:對以下語句進行執行,
執行時將會看到在Windows 平臺下,會先輸出 key0 語句,過5s後才會輸出 key1 語句。這好像與理論矛盾,其實這只是因為在Windows 平臺下,輸出裝置認為是不帶緩衝區的;在Linux 和 Mac OS 平臺下,輸出裝置帶有行緩衝區。這時就會等5s後 key0key1 一起輸出。
而對於輸入裝置,沒有緩衝區將導致非常奇怪的行為,因此Windows、Linux、Mac OS 在實現時都給輸入裝置帶上了行緩衝,所以 scanf()、getchar()、gets() 等輸入函式在每個平臺下的表現都一致。
當然,考慮到有些特殊情況希望輸入不帶有行緩衝,這時有Windows 下特有的 getche() 和 getch() 函式滿足這種特殊需求,它們都不帶緩衝區。
3、不帶緩衝也就是不進行緩衝處理,例如C語言中的getch和getche即是如此。
緩衝區的重新整理條件
不管是行緩衝還是全緩衝,緩衝區滿時會自動重新整理;行緩衝遇到換行符\n時會重新整理;關閉檔案時會重新整理緩衝區;程式關閉時一般也會重新整理緩衝區,這個是由標準庫來保障的;
當緩衝區重新整理時,就會進行真正的I/O操作。
快取(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偏重於輸入操作。
緩衝區(Buffer)定義
緩衝區(Buffer),它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區,顯然緩衝區是具有一定大小的。
有時候,從鍵盤輸入的內容,或者將要輸出到顯示器上的內容,會暫時進入緩衝區,待時機成熟,再一股腦將緩衝區中的所有內容“倒出”,我們才能看到變數的值被重新整理,或者螢幕產生變化。
有時候,使用者希望得到最及時的反饋,輸入輸出的內容就不能進入緩衝區。
為什麼要引入緩衝區?
首先,緩衝區可以使低速的輸入輸出裝置和高速執行的程式能夠協調工作。一般來說程式在CPU上執行,其速度必定遠超過一般硬體執行速度。例如,硬碟的速度要遠低於 CPU,它們之間有好幾個數量級的差距,當向硬碟寫入資料時,程式需要等待,不能做任何事情,就好像卡頓了一樣,使用者體驗非常差。計算機上絕大多數應用程式都需要和硬體打交道,例如讀寫硬碟、向顯示器輸出、從鍵盤輸入等,如果每個程式都等待硬體,那麼整臺計算機也將變得卡頓。但是有了緩衝區,就可以將資料先放入緩衝區中(記憶體的讀寫速度也遠高於硬碟),然後程式可以繼續往下執行,等所有的資料都準備好了,再將緩衝區中的所有資料一次性地寫入硬碟,這樣程式就減少了等待的次數,變得流暢起來。
其次,緩衝區可以有效減少硬體裝置的讀寫次數。如果每次輸入輸出操作只傳輸少量資料,就需要傳送很多次,這樣會浪費很多時間,因為開始讀寫與終止讀寫所需要的時間很長,如果將資料送往緩衝區,待緩衝區滿後再進行傳送會大大減少讀寫次數,這樣就可以節省很多時間。例如,我們想將資料寫入到磁碟中,不是立馬將資料寫到磁碟中,而是先輸入緩衝區中,當緩衝區滿了以後,再將資料寫入到磁碟中,這樣就可以減少磁碟的讀寫次數,不然磁碟很容易壞掉。
簡單來說,緩衝區就是一塊記憶體區,它用在輸入輸出裝置和CPU之間,用來儲存資料。它使得低速的輸入輸出裝置和高速的CPU能夠協調工作,避免低速的輸入輸出裝置佔用CPU,解放出CPU,使其能夠高效率工作,同時減少操作硬體的次數。
緩衝區的型別
緩衝區分為三種類型:全緩衝、行緩衝和不帶緩衝。
1、全緩衝在這種情況下,當填滿標準I/O快取後才進行實際I/O操作,即一定大小的緩衝區填滿後。全緩衝的典型代表是對磁碟檔案的讀寫。
2、行緩衝在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字元先存放在緩衝區,等按下回車鍵換行時才進行實際的I/O操作。行緩衝的典型代表就是標準輸入裝置(也即鍵盤)和標準輸出裝置(也即顯示器)。
比如:對以下語句進行執行,
執行時將會看到在Windows 平臺下,會先輸出 key0 語句,過5s後才會輸出 key1 語句。這好像與理論矛盾,其實這只是因為在Windows 平臺下,輸出裝置認為是不帶緩衝區的;在Linux 和 Mac OS 平臺下,輸出裝置帶有行緩衝區。這時就會等5s後 key0key1 一起輸出。
而對於輸入裝置,沒有緩衝區將導致非常奇怪的行為,因此Windows、Linux、Mac OS 在實現時都給輸入裝置帶上了行緩衝,所以 scanf()、getchar()、gets() 等輸入函式在每個平臺下的表現都一致。
當然,考慮到有些特殊情況希望輸入不帶有行緩衝,這時有Windows 下特有的 getche() 和 getch() 函式滿足這種特殊需求,它們都不帶緩衝區。
3、不帶緩衝也就是不進行緩衝處理,例如C語言中的getch和getche即是如此。
緩衝區的重新整理條件
不管是行緩衝還是全緩衝,緩衝區滿時會自動重新整理;行緩衝遇到換行符\n時會重新整理;關閉檔案時會重新整理緩衝區;程式關閉時一般也會重新整理緩衝區,這個是由標準庫來保障的;
當緩衝區重新整理時,就會進行真正的I/O操作。
快取(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偏重於輸入操作。