詳細查看:http://c.biancheng.net/cpp/html/2413.htmlhtml
緩衝區(Buffer)又稱爲緩存(Cache),是內存空間的一部分。也就是說,計算機在內存中預留了必定的存儲空間,用來暫時保存輸入或輸出的數據,這部分預留的空間就叫作緩衝區(緩存)。數據庫
有時候,從鍵盤輸入的內容,或者將要輸出到顯示器上的內容,會暫時進入緩衝區,待時機成熟,再一股腦將緩衝區中的全部內容「倒出」,咱們才能看到變量的值被刷新,或者屏幕產生變化。緩存
1.爲何要引入緩衝區(緩存)
緩衝區是爲了讓低速的輸入輸出設備和高速的用戶程序可以協調工做,並下降輸入輸出設備的讀寫次數。網絡
例如,咱們都知道硬盤的速度要遠低於 CPU,它們之間有好幾個數量級的差距,當向硬盤寫入數據時,程序須要等待,不能作任何事情,就好像卡頓了同樣,用戶體驗很是差。計算機上絕大多數應用程序都須要和硬件打交道,例如讀寫硬盤、向顯示器輸出、從鍵盤輸入等,若是每一個程序都等待硬件,那麼整臺計算機也將變得卡頓。函數
可是有了緩衝區,就能夠將數據先放入緩衝區中(內存的讀寫速度也遠高於硬盤),而後程序能夠繼續往下執行,等全部的數據都準備好了,再將緩衝區中的全部數據一次性地寫入硬盤,這樣程序就減小了等待的次數,變得流暢起來。性能
緩衝區的另一個好處是能夠減小硬件設備的讀寫次數。其實咱們的程序並不能直接讀寫硬件,它必須告訴操做系統,讓操做系統內核(Kernel)去調用驅動程序,只有驅動程序才能真正的操做硬件。網站
從用戶程序到硬件設備要通過好幾層的轉換,每一層的轉換都有時間和空間的開銷,並且開銷不必定小;一旦用戶程序須要密集的輸入輸出操做,這種開銷將變得很是大,會成爲制約程序性能的瓶頸。spa
這個時候,分配緩衝區就是必不可少的。每次調用讀寫函數,先將數據放入緩衝區,等數據都準備好了再進行真正的讀寫操做,這就大大減小了轉換的次數。實踐證實,合理的緩衝區設置能成倍提升程序性能。操作系統
如今你基本明白了吧,緩衝區其實就是一塊內存空間,它用在硬件設備和用戶程序之間,用來緩存數據,目的是讓快速的 CPU 沒必要等待慢速的輸入輸出設備,同時減小操做硬件的次數。.net
2.緩衝區的類型
根據不一樣的標準,緩衝區能夠有不一樣的分類。
根據緩衝區對應的是輸入設備仍是輸出設備,能夠分爲輸入緩衝區和輸出緩衝區。
根據數據刷新(也能夠稱爲清空緩衝區,就是將緩衝區中的數據「倒出」)的時機,能夠分爲全緩衝、行緩衝、不帶緩衝。這種分類才本節要重點講解的內容。
1) 全緩衝
在這種狀況下,當緩衝區被填滿之後才進行真正的輸入輸出操做。緩衝區的大小都有限制的,好比 1KB、4MB 等,數據量達到最大值時就清空緩衝區。如,文件操做,關閉文件,或者程序結束,或者緩存區滿就會刷新緩存。
2) 行緩衝
在這種狀況下,當在輸入或者輸出的過程當中遇到換行符時,才執行真正的輸入輸出操做。行緩衝的典型表明就是標準輸入設備(也即鍵盤)和標準輸出設備(也即顯示器)。
3) 不帶緩衝
不帶緩衝區,數據就沒有地方緩存,必須當即進行輸入輸出。
getche()、getch() 就不帶緩衝區,輸入一個字符後當即就執行了,根本不用按下回車鍵。
3.緩衝區的刷新(清空)
所謂刷新緩衝區,就是將緩衝區中的內容送達到目的地。緩衝區的刷新遵循如下的規則:
- 不論是行緩衝仍是全緩衝,緩衝區滿時會自動刷新;
- 行緩衝遇到換行符\n時會刷新;
- 關閉文件時會刷新緩衝區;
- 程序關閉時通常也會刷新緩衝區,這個是由標準庫來保障的;
- 使用特定的函數也能夠手動刷新緩衝區。
4.總結
緩衝區位於用戶程序和硬件設備之間,用來緩存數據,目的是讓快速的 CPU 沒必要等待慢速的輸入輸出設備,同時減小操做硬件的次數。對於 IO 密集型的網絡應用程序,好比網站、數據庫、DNS、CDN 等,緩衝區的設計相當重要,它能十倍甚至一百倍得提升程序性能。