從Linux 程式設計介面:(
我已經閱讀了相關部分。我貼上這個總結圖只是為了說明。)
我知道對於直接IO它使用read
和write
系統呼叫。有 2 級緩衝。read/write buffer
+ kernel buffer
.
當使用stdio
建構在直接系統 IO 呼叫之上的函式庫呼叫時,
stdio buffer
+read/write buffer
+kernel buffer
, 3 級緩衝,
或者
stdio
並write/read
共享相同的緩衝區,2級緩衝
stdio calls
<---> user buffer
<-----> read/write
+kernel buffer
?
(我認為這是 2 級緩衝,但我想確定一下。)
答案1
在常見情況下,有兩個等級。使用者空間中的緩衝區由 stdio 函式庫分配,呼叫 put/printf/fprintf 等會將字元放入該緩衝區。在某個階段(例如緩衝區已滿或寫入換行符且流處於行緩衝模式),stdio 函式庫呼叫要求write
內核寫入緩衝區。核心通常會將緩衝區複製到核心緩衝區中,啟動將資料取得到目的地所需的任何操作並返回。然後,使用者空間可以隨意使用使用者空間緩衝區。
可能(但不常見)有不同的 stdio 實現,其執行方式不同。sfio有一個 stdio 相容層。已經提出了各種方案zero copy
等等stdio
。