からLinux プログラミング インターフェース:
(関連セクションを読みました。説明のためにこの要約図を貼り付けました。)
read
システム コールを使用する直接 IO の場合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
一般的なケースでは、2 つのレベルがあります。ユーザー空間のバッファーは stdio ライブラリによって割り当てられ、puts/printf/fprintf などの呼び出しによってこのバッファーに文字が配置されます。ある段階 (バッファーがいっぱいになったり、改行が書き込まれてストリームが行バッファー モードになったりした場合など) で、stdio ライブラリが呼び出してwrite
カーネルにバッファーへの書き込みを要求します。カーネルは通常、バッファーをカーネル バッファーにコピーし、データを宛先に渡すために必要な処理を開始して戻ります。その後、ユーザー空間はユーザー空間バッファーを自由に使用できます。
これを異なる方法で実行する stdio の異なる実装を持つことは可能です (ただし、珍しいことです)。sfiostdio 互換レイヤーがあります。zero copy
など、さまざまなスキームが提案されています。重要なのは、stdio
どのように実行されるかではなく、どのような効果があるかを示すことです。