Linux學習筆記之IO緩衝

2022-09-07 11:57:12 字數 1155 閱讀 9957

**:   寫的很好

現在,再聊不帶快取的i/o操作:

linix對io檔案的操作分為不帶快取的io操作和標準io操作(即帶快取),剛開始,要明確以下幾點:

1:不帶快取,不是直接對磁碟檔案進行讀取操作,像read()和write()函式,它們都屬於系統呼叫,只不過在使用者層沒有快取,所以叫做無快取io,但對於核心來說,還是進行了快取,只是使用者層看不到罷了。如果這一點看不懂,請看第二點;

2:帶不帶快取是相對來說的,如果你要寫入資料到檔案上時(就是寫入磁碟上),核心先將資料寫入到核心中所設的緩衝儲存器,假如這個緩衝儲存器的長度是100個位元組,你呼叫系統函式:

ssize_t write (int fd,const void * buf,size_t count);

寫操作時,設每次寫入長度count=10個位元組,那麼你幾要呼叫10次這個函式才能把這個緩衝區寫滿,此時資料還是在緩衝區,並沒有寫入到磁碟,緩衝區滿時才進行實際上的io操作,把資料寫入到磁碟上,所以上面說的「不帶快取不是就沒有快取直寫進磁碟」就是這個意思。

那麼,既然不帶快取的操作實際在核心是有快取器的,那帶快取的io操作又是怎麼回事呢?

帶快取io也叫標準io,符合ansi c 的標準io處理,不依賴系統核心,所以移植性強,我們使用標準io操作很多時候是為了減少對read()和write()的系統呼叫次數,帶快取io其實就是在使用者層再建立乙個快取區,這個快取區的分配和優化長度等細節都是標準io庫代你處理好了,不用去操心,還是用上面那個例子說明這個操作過程:

上面說要寫資料到檔案上,核心快取(注意這個不是使用者層快取區)區長度是100位元組,我們呼叫不帶快取的io函式write()就要呼叫10次,這樣系統效率低,現在我們在使用者層建立另乙個快取區(使用者層快取區或者叫流快取),假設流快取的長度是50位元組,我們用標準c庫函式的fwrite()將資料寫入到這個流快取區裡面,流快取區滿50位元組後在進入核心快取區,此時再呼叫系統函式write()將資料寫入到檔案(實質是磁碟)上,看到這裡,你用該明白一點,標準io操作fwrite()最後還是要掉用無快取io操作write,這裡進行了兩次呼叫fwrite()寫100位元組也就是進行兩次系統呼叫write()。

如果看到這裡還沒有一點眉目的話,那就比較麻煩了,希望下面兩條總結能夠幫上忙:

無快取io運算元據流向路徑:資料——核心快取區——磁碟

標準io運算元據流向路徑:資料——流快取區——核心快取區——磁碟

linux學習筆記之檔案IO

讀函式 recv fd open recv file name,o rdwr o creat o trunc,0764 if recv fd 0 open函式的flag 讀寫許可權 o rdonly o wronly o nonblock 1 阻塞與非阻塞。如果乙個函式是阻塞式的,則我們呼叫這個函式...

Linux 檔案IO 緩衝與非緩衝

本地普通檔案io一般關注的是快取,一般都是同步阻塞的。普通檔案的file descriptor是block也是posix標準。這點不同於網路io,網路io要考慮傳輸兩邊程序處理等,設計之初就提供了帶狀態檢測的非同步操作方式,本地檔案io則必然要求高可靠性的。不帶緩衝指的是每個read和write都呼...

學習筆記之緩衝流

使用位元組輸入流讀取 乙個乙個傳 使用位元組緩衝輸入流 傳陣列bufferedoutputstream位元組緩衝輸出流 close flush write byte b write byte b,int off,int len abstract void write int b 要flush或者cl...