2

特定のファイルへの AIO 書き込みがないかどうかを確認する方法はありますか? Unix コースでプロジェクトを作成しています。これは、コンテキスト フリー (UDP ベース) のチェス サーバーであり、すべてのデータをファイルに保存する必要があります。アプリケーションはシングル プロセスおよびシングル スレッドになります (AIO 関数を想定)。私の問題は次のとおりです。

1) プレイヤー 1 がファイルへの aio_write 操作をトリガーするデータを送信し、プロセスが進行します
2) プレイヤー 2 がそのファイルから読み取る必要がある現在のボードの状態を要求しますが、前の aio_write がまだ終了していない場合、このファイルは最終的なものではないため、まだ読み込まれていませんが、aio_write が終了するのを待ちます。
問題は、コンテキストフリーであるため、aio_write 呼び出しからの aiocb 構造がないことです。

また、特定のファイルが現在書き込み中の場合にのみ、気にする必要のない他のゲーム (異なるファイルを使用する) からの aio_writes がある可能性もあります。

4

2 に答える 2

2

なぜこれにAIOを使用しているのですか?AIOの目的は、プロセス間の同期ではありません。これは、ディスクの負荷(読み取り)またはキャッシュの負荷(書き込み)が原因で読み取りまたは書き込みをすぐに満たすことができない場合に、プロセスがカーネルスペースでスリープしないようにするためだけのものです。チェスゲームが機能するような小さなトランザクションでは、AIOは通常readおよびwriteIOとまったく同じように動作する必要があります。すべての操作は、適度に多くのオーバーヘッドがありますが、すぐに完了します。

ファイルアクセスを同期することが目標である場合は、fcntlロックまたはmmapファイルを使用して、ファイルのどこかにミューテックスまたはセマフォを含めることができます。

于 2011-06-12T22:33:08.510 に答える
1

文脈自由であるという事実は、いくつかの状態情報を保持することを妨げるべきではありません。

コンテキスト(つまりio_context)を保持し、それを再利用する(読み取り要求を送信して待機する- io_getevents)ことができます。io_submitリクエストをキューにプッシュするので、操作の順序が維持されると思います。

または、(io_submit順序が保持されないことがわかった場合)書き込み操作が保留中であることを認識し、を使用して待機するのに十分な状態を維持することもできますio_geteventsそうすれば読書は安全になります。

私はあなたの質問を読み間違えなかったと思います。

編集

あなたの質問を読み間違えたようです。あなたはおそらくPOSIXについて話しているでしょうaio(7)。私は真の非同期I/O(libaio.h)について話していました。POSIX aioは通常、スレッドを使用して実装されます(これは一種の問題です)。

いずれにせよ、イベントを待つことができる場合(私はあなたができると思います)、それでもそれを行うことができます:書き込みが保留中であることを宣言するためにいくつかの状態を維持し、誰かが読み取りを望んでいるときは書き込みが完了するのを待ちます。

于 2011-06-12T22:32:24.283 に答える