天天看點

系統調用與IO庫函數的緩沖與不帶緩沖問題

首先要明白不帶緩沖的概念:所謂不帶緩沖,并不是指核心不提供緩沖,而是隻單純的系統調用,不是函數庫的調用。系統核心對磁盤的讀寫都會提供一個塊緩沖,當用write函數對其寫資料時,直接調用系統調用,将資料寫入到塊緩沖進行排隊,當塊緩沖達到一定的量時,才會把資料寫入磁盤。是以所謂的不帶緩沖的I/O是指程序不提供緩沖功能。每調用一次write或read函數,直接系統調用。

而帶緩沖的I/O是指程序對輸入輸出流進行了改進,提供了一個流緩沖,當用fwrite函數網磁盤寫資料時,先把資料寫入流緩沖區中,當達到一定條件,比如流緩沖區滿了,或重新整理流緩沖,這時候才會把資料一次送往核心提供的塊緩沖,再經塊緩沖寫入磁盤。

是以,帶緩沖的I/O在往磁盤寫入相同的資料量時,會比不帶緩沖的I/O調用系統調用的次數要少。

下面的東西是我從網上查到的對這兩者的了解,我覺得還是很到位的:

以下主要讨論關于open,write等基本系統IO的帶緩沖與不帶緩沖的差别

      帶緩存的檔案操作是标準C 庫的實作,第一次調用帶緩存的檔案操作函數時标準庫會自動配置設定記憶體并且讀出一段固定大小的内容存儲在緩存中。是以以後每次的讀寫操作并不是針對硬碟上的文 件直接進行的,而是針對記憶體中的緩存的。何時從硬碟中讀取檔案或者向硬碟中寫入檔案有标準庫的機制控制。不帶緩存的檔案操作通常都是系統提供的系統調用, 更加低級,直接從硬碟中讀取和寫入檔案,由于IO瓶頸的原因,速度并不如意,而且原子操作需要程式員自己保證,但使用得當的話效率并不差。另外标準庫中的 帶緩存檔案IO 是調用系統提供的不帶緩存IO實作的。

“術語不帶緩沖指的是每個read和write都調用嗯核心中的一個系統調用。所有的磁盤I/O都要經過核心的塊緩沖(也稱核心的緩沖區高速緩 存),唯一例外的是對原始磁盤裝置的I/O。既然read或write的資料都要被核心緩沖,那麼術語“不帶緩沖的I/O“指的是在使用者的程序中對這兩個 函數不會自動緩沖,每次read或write就要進行一次系統調用。“--------摘自<unix環境程式設計>

繼續閱讀