不帶快取的I O和標準 帶快取的 I O

2021-06-25 11:24:22 字數 895 閱讀 4728

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運算元據流向路徑:資料——流快取區——核心快取區——磁碟

這裡為了說明標準i/o的工作原理,借用了glibc中標準i/o實現的細節,所以**多是不可移植的.

帶快取IO和不帶快取IO

ssize t write int fd,const void buf,size t count 寫操作時,設每次寫入長度count 10個位元組,那麼你幾要呼叫10次這個函式才能把這個緩衝區寫滿,此時資料還是在緩衝區,並沒有寫入到磁碟,緩衝區滿時才進行實際上的io操作,把資料寫入到磁碟上,所以上面...

標準IO和不帶快取的IO

分類 unix程式設計 2014 09 17 00 47 42人閱讀收藏 舉報io快取c 最近在看 unix環境高階程式設計 這是自己的一些心得體會。不帶快取的io是什麼,比如read 函式和write 函式,這兩個函式的函式原型如下 需要注意的是這兩個函式都有乙個引數就是buf,這個引數用來指向讀...

帶快取和不帶快取操作和程序總結

總結 1 建立檔案的三種方式 creat 函式 用於建立乙個檔案 open 函式,o creat 模式用於建立乙個檔案 2 比較read和 feof 同 可以判斷是否到了檔案尾 read函式 在檔案結束或者無資料的時候,返回為0 feof 函式 返回非 0表示到了檔案尾 異 read是不帶緩衝的,基...