stdioライブラリを使用するときにレベル3のバッファリングはありますか、それともレベル2のバッファリングはありますか?

stdioライブラリを使用するときにレベル3のバッファリングはありますか、それともレベル2のバッファリングはありますか?

~からLinuxプログラミングインターフェース:(
関連部分を読みました。説明のためにこの要約図を貼り付けました。) ここに画像の説明を入力してください。

私はそれが使用する直接IOreadwriteシステムコールを知っています。レベル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

一般的な状況では、2つのレベルがあります。ユーザー空間のバッファはstdioライブラリによって割り当てられ、put / printf / fprintfなどを呼び出すとバッファに文字が入力されます。いくつかのステップ(例えば、バッファがいっぱいになったり改行文字が作成されたりストリームがラインバッファモードの場合)では、stdioライブラリ呼び出しはカーネルwriteにバッファに書き込むように要求します。カーネルは通常、バッファをカーネルバッファにコピーし、データをターゲットにインポートするために必要なすべての操作を開始して返します。これにより、ユーザースペースは必要に応じてユーザースペースバッファーを使用できます。

別の方法で実行される他のstdio実装を持つことが可能です(一般的ではありません)。SFIOstdio互換性レイヤがあります。zero copyなど様々な方案が提案されました。ポイントは、stdio効果がどのように行われたのかを知らせるのではなく、効果が何であるかを知らせることです。

おすすめ記事