C C 零散知識點彙總之緩衝區

2021-10-08 22:59:42 字數 1834 閱讀 7608

緩衝區是為了讓低速的輸入輸出裝置和高速的使用者程式能夠協調工作,並降低輸入輸出裝置的讀寫次數。

使用者程式的執行速度可以看做cpu的允許速度,如果沒有各種硬體的阻礙,理論上它們是同步的。

例如,我們都知道硬碟的速度要遠低於cpu,它們之間有好幾個數量級的差距,當向硬碟寫入資料是,程式需要等到,不能做任何事情,就像卡頓了一樣,使用者體驗非常差。計算機上絕大多數應用程式都需要和硬體打交道,例如讀寫硬碟、向顯示器輸出、從鍵盤輸入等,如果每個程式都等待硬體,那麼整台計算機也將變得卡頓。

但是如果有了緩衝區,就可以將資料先放入緩衝區中(記憶體的讀寫速度也遠高於硬碟),然後程式可以繼續向下執行,等所有的資料都準備好了,再將緩衝區的所有資料一次性寫入硬碟,這樣程式就減少了等待的次數,變得流暢起來。

緩衝區的另外乙個好處是可以減少硬體裝置的讀寫次數。其實我們的程式並不能只講讀寫硬體。它必須告訴作業系統,讓作業系統核心(kernel)去呼叫驅動程式,只有驅動程式才能真正的操作硬體。

從使用者程式到硬體裝置要經過好幾層的轉換,每一層的轉換都有時間和空間的開銷,而且開銷不一定小;一旦使用者程式需要秘籍的輸入輸出操作,這種開銷將變得非常大,會成為制約程式效能的瓶頸。

這時候分配緩衝區是必不可少的。每次呼叫讀寫函式,先將資料放入緩衝區,等資料都準備好了再真正的進行讀寫操作,這就大大減少了轉換的次數。實踐證明,合理的緩衝區設定能成倍提高程式效能。

緩衝區其實就是一塊記憶體空間,它用在硬體裝置和使用者程式之間,用了快取資料,目的是讓快速的cpu不必等待慢速的輸入輸出裝置,同時減少操作硬體的次數。

根據不同的標準,緩衝區可以有不同的分類。

根據緩衝區對應的輸入裝置還是輸出裝置,可以分為輸入緩衝區和輸出緩衝區。

根據資料重新整理(也可以稱為清空緩衝區,就是講緩衝區中的資料「倒出」)的時機,可以分為全緩衝、行緩衝、不帶緩衝。

1、全緩衝

在這種情況下,當緩衝區被填滿之後才進行真正的輸入輸出操作。緩衝區的大小都有限制的,比如1kb、4mb等,資料

量達到最大值時就清空快取區。全緩衝的典型代表就是對硬碟檔案的讀寫。

在實際開發中,將資料寫入檔案後,開啟檔案並不能立即看到內容,只有清空緩衝區,或者關閉檔案,或者關閉程式

後,才能在檔案中看到內容。這種現象,就是緩衝區在作怪。

2、行緩衝

當在輸入或者輸出的過程中遇到換行符時,才知曉真正的輸入輸出操作。行緩衝的典型代表就是標準輸入裝置和標準輸

出裝置。

3、不帶緩衝

不帶緩衝區,資料就沒有地方快取,必須立即進行輸入輸出。

getche(),getch()就不帶緩衝區,輸入乙個字元後立即就執行了,根本不用按下回車鍵。windows下的printf()也不帶緩

沖區,不管最後有沒有換行符\n,都會立即輸出,所以對於類似的輸出**,windows、linux和mac os會有不同的表現。

錯誤資訊輸出函式perror()也沒有緩衝區,錯誤資訊必須刻不容緩、立刻、馬上顯示出來,緩衝區將會增加捕獲錯誤的

時間,這是毫無理由的。

所謂重新整理緩衝區,就是講緩衝區的內容送達目的地。緩衝區的重新整理遵循以下的規則:

1、不管是行緩衝還是全緩衝,緩衝區滿時自動重新整理。

2、行緩衝遇到換行符\n時會重新整理。

3、關閉檔案時會重新整理緩衝區。

4、程式關閉時一般也會重新整理緩衝區,這個是由標準卡來保障的。

5、特定的函式也可以手動重新整理緩衝區。

緩衝區是位於使用者程式和硬體裝置之間,用了快取資料,目的是讓快速的cpu不必等待慢速的輸入輸出裝置,同時減少操作硬體的次數。對於io密集型的網路應用程式,比如**、資料庫、dns、cdn等,緩衝區的設計至關重要,它能十倍設定一百倍的提高程式效能。

C C 零散知識點彙總

1 在c 程式中呼叫被c編譯器編譯過的函式,為什麼需要加上extern c c 語言支援函式過載,c語言不支援函式過載,函式被c 和c語言的不同。假設某個函式的原型為void foo int x,int y 該函式被c編譯器編譯後在哭的名字為 foo,而c 編譯器會產生像 foo ini int之類...

零散知識點

魔術變數 echo 這是第 line 行 當前行號 echo 該檔案位於 file e wamp www test index.php 絕對路徑 echo 該檔案位於 dir e wamp www test 等價於 dirname file echo 命名空間為 namespace 當前命名空間的名...

零散知識點

一 sendmessage 和broadcastmessage 在了解專案結構的前提下,sendmessage 和broadcastmessage 方法使用起來非常靈活而且容易實現,但它使用了反射,而反射會造成更多的cpu開銷。在清楚要呼叫哪個元件的哪個方法時應該通過元件的引用直接呼叫方法 在不清楚...