緩沖區又稱為緩存,它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數據,這部分預留的空間就叫做緩沖區。
緩沖區根據其對應的是輸入設備還是輸出設備,分為輸入緩沖區和輸出緩沖區。
為什么要引入緩沖區
比如我們從磁盤里取信息,我們先把讀出的數據放在緩沖區,計算機再直接從緩沖區中取數據,等緩沖區的數據取完后再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數,再加上計算機對緩沖區的操作大大快於對磁盤的操作,故應用緩沖區可大大提高計算機的運行速度。
又比如,我們使用打印機打印文檔,由於打印機的打印速度相對較慢,我們先把文檔輸出到打印機相應的緩沖區,打印機再自行逐步打印,這時我們的CPU可以處理別的事情。
現在您基本明白了吧,緩沖區就是一塊內存區,它用在輸入輸出設備和CPU之間,用來緩存數據。它使得低速的輸入輸出設備和高速的CPU能夠協調工作,避免低速的輸入輸出設備占用CPU,解放出CPU,使其能夠高效率工作。
緩沖區的類型
緩沖區 分為三種類型:全緩沖、行緩沖和不帶緩沖。
1) 全緩沖
在這種情況下,當填滿標准I/O緩存后才進行實際I/O操作。全緩沖的典型代表是對磁盤文件的讀寫。
2) 行緩沖
在這種情況下,當在輸入和輸出中遇到換行符時,執行真正的I/O操作。這時,我們輸入的字符先存放在緩沖區,等按下回車鍵換行時才進行實際的I/O操作。典型代表是標准輸入(stdin)和標准輸出(stdout)。
3) 不帶緩沖
也就是不進行緩沖,標准出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。
ANSI C( C89 )要求緩存具有下列特征:
當且僅當標准輸入和標准輸出並不涉及交互設備時,它們才是全緩存的。
標准出錯決不會是全緩存的。
但是,這並沒有告訴我們如果標准輸入和輸出涉及交互作用設備時,它們是不帶緩存的還是行緩存的,以及標准輸出是不帶緩存的,還是行緩存的。
大部分系統默認使用下列類型的緩存:
標准出錯是不帶緩存的。
如果是涉及終端設備的流,則它們是行緩存的;否則是全緩存的。
我們經常要用到標准輸入輸出流,而ANSI C對stdin、stdout和stderr的緩存特征沒有強行的規定,以至於不同的系統可能有不同的stdin、stdout和stderr的緩存特征。目前主要的緩存特征是:stdin和stdout是行緩存;而stderr是無緩存的。
緩沖區的大小
如果我們沒有自己設置緩沖區的話,系統會默認為標准輸入輸出設置一個緩沖區,這個緩沖區的大小通常是4096個字節的大小,這和計算機中的分頁機制有關,因為進程在計算機中分配內存使用的就是分頁與分段的機制,並且每個頁的大小是4096個字節,因此通常情況下緩沖區的大小會設置為4096個字節的大小。
緩沖區的刷新(清空)
下列情況會引發緩沖區的刷新:
緩沖區滿時;
行緩沖區遇到回車時;
關閉文件;
使用特定函數刷新緩沖區。