使用 stdio 函式庫時,它是否有 3 級緩衝或 2 級緩衝?

使用 stdio 函式庫時,它是否有 3 級緩衝或 2 級緩衝?

Linux 程式設計介面:(
我已經閱讀了相關部分。我貼上這個總結圖只是為了說明。) 在此輸入影像描述

我知道對於直接IO它使用readwrite系統呼叫。有 2 級緩衝。read/write buffer+ kernel buffer.

當使用stdio建構在直接系統 IO 呼叫之上的函式庫呼叫時,

  1. stdio buffer+ read/write buffer+ kernel buffer, 3 級緩衝,

或者

  1. stdiowrite/read共享相同的緩衝區,2級緩衝

stdio calls <---> user buffer<-----> read/write+kernel buffer

(我認為這是 2 級緩衝,但我想確定一下。)

答案1

在常見情況下,有兩個等級。使用者空間中的緩衝區由 stdio 函式庫分配,呼叫 put/printf/fprintf 等會將字元放入該緩衝區。在某個階段(例如緩衝區已滿或寫入換行符且流處於行緩衝模式),stdio 函式庫呼叫要求write內核寫入緩衝區。核心通常會將緩衝區複製到核心緩衝區中,啟動將資料取得到目的地所需的任何操作並返回。然後,使用者空間可以隨意使用使用者空間緩衝區。

可能(但不常見)有不同的 stdio 實現,其執行方式不同。sfio有一個 stdio 相容層。已經提出了各種方案zero copy等等stdio

相關內容