檔案操作的不帶緩衝和帶緩衝的區別是什麼!

2021-07-26 05:26:48 字數 960 閱讀 8420

以 ssize_t write(int filedes, const void *buff, size_t nbytes)和size_t fwrite(const void *ptr, size_t size, size_t nobj, file *fp)來講講自己對unix系統下帶快取的i/o和不帶快取的i/o的區別。

首先要清楚乙個概念,所謂的代快取並不是指上面兩個函式的buff引數,而是指unix系統在核心中所設的緩衝儲存器。

當將資料寫到檔案上時,核心先將該資料寫到快取,如果該快取未滿,則並不將其排入輸出佇列,直到快取寫滿或者核心再次需要重新使用此快取時才將其排入輸入佇列,待其到達對首,在進行實際的i/o操作,也就是此時才把資料真正寫到磁碟,這種技術叫延遲寫。現在假設核心所設的快取是100個位元組,如果你使用write,且buff的size為10,當你要把9個同樣的buff寫到檔案時,你需要呼叫9次write,也就是9次系統呼叫,此時也並沒有寫到硬碟,如果想立即寫到硬碟,呼叫fsync,可以進行實際的i/o操作。標準i/o,也就是帶快取的i/o採用file*,file實際上包含了為管理流所需要的所有資訊:實際i/o的檔案描述符,指向流快取的指標(標準i/o快取,由malloc分配,又稱為使用者態程序空間的快取,區別於核心所設的快取),快取長度,當前在快取中的位元組數,出錯標誌等,假設流快取的長度為50位元組,把以上的資料寫到檔案,則只需要2次系統呼叫(fwrite呼叫write系統呼叫),因為先把資料寫到流快取,當其滿以後或者呼叫fflush時才填入核心快取,所以進行了2次的系統呼叫write。fflush將流所有未寫的資料送入(重新整理)到核心(核心緩衝區),fsync將所有核心緩衝區的資料寫到檔案(磁碟)。

不帶快取的read和write是相對於fread/fwrite等流函式來說明的,因為fread和fwrite是使用者函式(3),所以他們會在使用者層進行一次資料的快取,而read/write是系統呼叫(2)所以他們在使用者層是沒有快取的,所以稱read和write是無快取的io,其實對於核心來說還是進行了快取,不過使用者層看不到罷了。

無緩衝和帶緩衝channel的區別

常規定義的channel都是預設不帶緩衝的,如下 所示 package main import fmt func main 執行上述 會產生乙個錯誤 因為在預設不帶緩衝的channel中,每乙個傳送者與接收者都會阻塞當前執行緒,只有當接受者與傳送者都準備就緒了,channel才能正常使用,正確的使用...

不帶緩衝區open和帶緩衝區的fopen的區別

open和fopen的區別 1.緩衝檔案系統 緩衝檔案系統的特點是 在記憶體開闢乙個 緩衝區 為程式中的每乙個檔案使用,當執行讀檔案的操作時,從磁碟檔案將資料先讀入記憶體 緩衝區 裝滿後再從記憶體 緩衝區 依此讀入接收的變數。執行寫檔案的操作時,先將資料寫入記憶體 緩衝區 待記憶體 緩衝區 裝滿後再...

帶緩衝的IO和不帶緩衝的IO

首先說說帶緩衝的i o是什麼意思,在unix環境高階程式設計裡面,是這樣解釋的 術語不帶緩衝指的是每個read和write都呼叫核心中的乙個系統呼叫。所有的磁碟i o都要經過核心的塊緩衝 也稱核心的緩衝區快取記憶體 唯一例外的是對原始磁碟裝置的i o。既然read或write的資料都要被核心緩衝,那...