1

fopen()を使用してファイルを開き、受け取ったファイル ポインタから、 を使用してファイル記述子をフェッチすると仮定しましょうfileno()read()次に、このファイルから 4 バイトから 10 キロバイトのサイズの比較的小さなチャンクのランダムな s をたくさん (>10^8)実行します。

read()ファイルerrnoシステムが

  1. ext3

  2. NFS

  3. OCFS2

  4. 2 と 3 の組み合わせ (OCFS2経由NFS)

?

私の測定値は、1.(ファイルが設定されていない場合、O_NONBLOCK設定できる場合ext3)に対しては可能ではないという結論を出しましたが、他の3つ(2.、3.、4.)については不明です.

O_NONBLOCK(ところで:いずれにせよ、デフォルトに設定されていないと仮定できますか?)

この疑問が生じたのは、ケース 4 で設定read()せずにリクエストした場合よりも少ないバイト数を返す sを観察したためです。errno

テストによってこれをドリルダウンする問題は、そのような動作が 1/1000000000 のケースで発生することです...-これはまだあまりにも頻繁です:-}

更新: 平均ファイル サイズは、数 TByte から約 1 GB です。

4

2 に答える 2

1

read() がファイルシステムに対して要求されたよりも少ないバイトを返さないと仮定しないでください。POSIX.1 は、SSIZE_MAX より大きいサイズの read() の動作は実装に依存することを示しているため、これは特に大きな読み取りの場合に当てはまります。私が現在使用している主流の Unix ボックスでは、SSIZE_MAX は 32767 バイトです。read() が今日常に全額を返すという事実は、将来もそうなるという意味ではありません。

考えられる理由の 1 つは、I/O 優先度が将来的にカーネルでより完全に具体化されることです。たとえば、優先度の高い別のプロセスと同じデバイスから読み込もうとしていて、プロセスが他のプロセスが必要とするセクターからヘッドを移動させていなければ、他のプロセスのスループットが向上します。カーネルは、非効率的なインターリーブ ブロック読み取りを続行する代わりに、read() に短いカウントを与えて、しばらく邪魔にならないようにすることを選択する場合があります。 I/O 効率のために、見知らぬことが行われています。禁止されていないことが義務化されることがよくあります。

于 2012-04-16T18:07:56.717 に答える
0

ファイルシステムを指してread()いるマウント上にあるファイルから読み取るときに、要求よりも少ないバイトを返すと説明されている問題を解決しました(私の質問のケース4)。NFSOCFS2

上記のセットアップを使用すると、read()ファイル記述子のそのような s が、設定せずに要求されたよりも少ないバイト数を返すことがあるのは事実ですerrno

すべてのデータを読み取るには、read()要求された量のデータが読み取られるまで、何度も何度も ing するだけです。

また、そのような設定はread()で失敗することもありEIO、その場合でも簡単な操作read()で成功し、データが到着します。

私の結論: 経由で読み取るOCFS2と、ファイルからの ingNFSが、 http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.htmlの仕様と矛盾するソケットからの ing のread()ように動作します。read()read()

ノンブロッキング読み取りをサポートし、現在使用可能なデータがないファイル (パイプまたは FIFO 以外) を読み取ろうとすると、次のようになります。

O_NONBLOCK が設定されている場合、read() は -1 を返し、errno を [EAGAIN] に設定します。

O_NONBLOCK がクリアされている場合、read() は、一部のデータが利用可能になるまで呼び出しスレッドをブロックします。

O_NONBLOCK言うまでもなく、問題のファイル記述子を設定しようとしたことも考えたこともありません。

于 2012-07-06T18:55:21.750 に答える