web-dev-qa-db-ja.com

stdioライブラリを使用する場合、3レベルのバッファリング、または2レベルのバッファリングがありますか?

FromLinuxプログラミングインターフェイス
(関連するセクションを読みました。説明のために、この要約図を貼り付けました。) enter image description here

readおよびwriteシステムコールを使用する直接IOの場合。2つのレベルのバッファリングがあります。read/write buffer + kernel buffer

直接システム上に構築されたstdioライブラリ呼び出しを使用する場合、IO呼び出しは、

  1. stdio buffer + read/write buffer + kernel buffer、3レベルのバッファリング、

または

  1. stdioおよびwrite/read同じバッファ、2レベルのバッファリングを共有する

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

(これは2レベルのバッファリングだと思いますが、確認したいと思います。)

2
Rick

一般的なケースでは、2つのレベルがあります。ユーザースペースのバッファーはstdioライブラリによって割り当てられ、puts/printf/fprintfなどの呼び出しは文字をこのバッファーに入れます。ある段階で(たとえば、バッファがいっぱいになるか、改行が書き込まれ、ストリームがラインバッファモードになります)、stdioライブラリはwriteを呼び出して、カーネルにバッファの書き込みを要求します。カーネルは通常、バッファーをカーネルバッファーにコピーし、データを宛先に取得して返すために必要なものをすべて開始します。その後、ユーザースペースはユーザースペースバッファーを自由に使用できます。

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

4
icarus