4

ファイル I/O にLinux aio ( io_submit()/ ) を使用しています。io_getevents()一部の操作には同等の aio ( open()fsync()fallocate()) がないため、メイン スレッドに影響を与えずにブロックできるワーカー スレッドを使用します。私の質問は、close()このリストに追加する必要がありますか?

すべてのファイルはO_DIRECTXFS で開かれますが、質問に対する一般的な回答と、ファイルシステムとオープンモードの選択に関する特定の回答の両方に興味があります。

close()ワーカー スレッドはクリーンアップ パスで呼び出されることが多いため、ワーカー スレッドの使用は簡単ではないことに注意してくださいclose()。クリーンアップ パスは、ワーカー スレッド リクエストを起動して待機するのに適した場所ではありません。close()したがって、このシナリオではそれが非ブロッキングであることを願っています。

この質問では、「ブロッキング」とは、I/O 操作、または I/O 操作が完了したときにのみ解放される可能性のあるロックを待機することを意味しますが、ページ フォールト サービスは除きます。

4

1 に答える 1

2

close()一部のファイルシステムでブロックされる可能性があります。可能であれば、コードはできるだけ移植可能に作成する必要があります。close()そのため、ブロッキング ワーカー スレッドからのみ呼び出される呼び出しのリストに確実に追加する必要があります。

close()ただし、多くの場合、クリーンアップ パスを呼び出す必要があると述べています。close()これらがアプリケーションの終了時に実行されるクリーンアップ パスである場合、直接呼び出した場合にブロックされても、それほど大きな違いはない可能性があります。

または、ワーカーのプールに供給されるキューを作成することもできます。ではglibc AIO、これは多くのコールに対して行われることです。で AIO を初期化するときに、ワーカー スレッドのキューとプールを設定しますaio_init()glibcAIO 呼び出しが行われるたびglibcに、関連するタスクとデータをキューに追加するだけです。バックグラウンドでは、ワーカー スレッドがキューで待機し、ブロッキング呼び出しとコードを実行してから、関連するアクションを実行します。

非ブロッキング (およびその他の) 呼び出しが本当に必要な場合は、close()単純にタスク キューとスレッド プールをセットアップし、特定の呼び出しをキューに送信し、スレッド プールに次のように呼び出しを実行させることが有利な場合があります。彼らが入ってきます。

于 2015-07-05T20:20:06.973 に答える