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