stdio ライブラリを使用する場合、バッファリングのレベルは 3 ですか、それとも 2 ですか?

stdio ライブラリを使用する場合、バッファリングのレベルは 3 ですか、それとも 2 ですか?

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

readシステム コールを使用する直接 IO の場合write、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 ライブラリによって割り当てられ、puts/printf/fprintf などの呼び出しによってこのバッファーに文字が配置されます。ある段階 (バッファーがいっぱいになったり、改行が書き込まれてストリームが行バッファー モードになったりした場合など) で、stdio ライブラリが呼び出してwriteカーネルにバッファーへの書き込みを要求します。カーネルは通常、バッファーをカーネル バッファーにコピーし、データを宛先に渡すために必要な処理を開始して戻ります。その後、ユーザー空間はユーザー空間バッファーを自由に使用できます。

これを異なる方法で実行する stdio の異なる実装を持つことは可能です (ただし、珍しいことです)。sfiostdio 互換レイヤーがあります。zero copyなど、さまざまなスキームが提案されています。重要なのは、stdioどのように実行されるかではなく、どのような効果があるかを示すことです。

関連情報