文件緩沖區


參考:http://blog.csdn.net/sole_cc/article/details/47983225

緩沖區分為以下三種:

1,流,標准庫的IO緩沖區

  文件流操作函數(File *p)直接交互的都是C 標准庫IO buffer,除open(), openat(), read(), write()等文件描述符相關的函數外,其他IO庫函數進行IO操作的直接操作對象都是IO buffer。而且read,write等函數並不是直接從用戶程序直接讀寫數據到磁盤而是與內核IO緩沖區交互。  

     C標准庫的I/O緩沖區有三種類型:全緩沖、行緩沖和無緩沖。當用戶程序調用庫函數做寫操作(讀操作時I/O緩沖區是如何變化的?)時, 不同類型的緩沖區具有不同特性。 

    全緩沖:如果緩沖區寫滿了就寫回內核。對於駐留在磁盤上的文件通常是由標准I/O庫實施全緩沖的。在一個流上執行第一次I/O操作時,相關標准I/O函數通常調用malloc獲得需使用的緩沖區。

     行緩沖:如果用戶程序寫的數據中有換行符就把這一行寫回內核,或者如果緩沖區寫滿了就寫回內核。標准輸入和標准輸出對應終端設備時通常是行緩沖的。 

     無緩沖:用戶程序每次調庫函數做寫操作都要通過系統調用寫回內核。標准錯誤輸出通常是無緩沖的,這樣用戶程序產生的錯誤信息可以盡快輸出到設備。

  緩沖區類型與調用的函數接口無關,於調用時指定的參數預計默認值有關;標准I/O緩存區是針對每個流的(FILE *fp),而不是針對I/O函數的
     下面的是引至APUE的,實際上ISO C要求:
     1.當且僅當標准輸入和標准輸出並不涉及交互式設備時,他們才是全緩沖的

   2.標准錯誤輸出決不是全緩沖的.

2,內核IO緩沖區

  大部分接口函數都是從用戶層到庫IO buffer層(fread(), fwrite()),或是到系統IO緩沖區層(read(), write(), fflush()),那在什么情況下,系統IO緩沖區的數據會同步的磁盤呢,系統在以下兩種情況作出處理:

  a) 當內存的臟數據的數量到達一定的閾值時,系統同步到磁盤,釋放緩沖區;

  b) 當某項數據停留在緩沖區的時間超過某個時間閾值時。系統也會同步到磁盤;

  用戶可通過以下函數接口來處理:

  fsync():阻塞至IO同步完成后才返回;

  fdatasync():阻塞至IO同步后才會回,只改變data block;

3,用戶緩沖區

  應用程序級別的數據空間,局部或者全局變量等;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM