問題タブ [aio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - LinuxでのIO多重化
複数のターゲットファイル記述子で機能するsendfile -syscallのようなものはありますか(つまり、あるFDから別のFDにコピーする代わりに、たとえば4つのFDにコピーする必要があります)?
非同期IOについて話すとき、これは収集/分散として知られていますが、LinuxAIOのドキュメントには何も見つかりませんでした。
linux - aio_write() を使用しても、キャッシュを通過するデータが表示されますか?
Linux 2.6.16.46 で次のコードを試しています。
これは、バッファが指すメモリを IO 操作に使用する必要があります。それでも、あたかもキャッシュに書き込んでいるかのように、ダーティ ページの数が増えていることがわかります。何故ですか?
ビルド マシンでは、open() で O_DIRECT がサポートされていません。しかし、私は write() を使用していないので、それでも問題になるのでしょうか?
ターゲットに直接 IO がサポートされていることは確かです。
c - Linux2.6のposixaioはソケットファイル記述子をサポートしていますか?
私はグーグルでそのような質問を探し、異なる答えを得ました。Linux2.6のposixaioがソケットファイル記述子をサポートしているかどうかを判断できません。
tcpソケットをサポートしている場合、aiocb.aio_offset = 0は、tcpソケットfdから読み取られた最初のバイトを基準にしていますか?
そうでない場合、Linuxの非同期IOライブラリはソケットfdをサポートしていますか?
c++ - aio.h aio_read()および書き込みメモリリーク
ここで概説されている指示に従って、C ++で(Ubuntu10.04のposixaioライブラリを使用して)非同期でディスクの読み取りと書き込みを行おうとしています:aioチュートリアル。非同期で読み取りと書き込みを行うことはできますが、ある種の小さなメモリリークが発生するのではないかと心配しています。私のvalgrindの出力は、288バイトが失われた可能性があり、3,648バイトがまだ到達可能であることを示しています。これらの数値は、ファイルから実際に読み取られるバイト数とは無関係のようです。このリークをどこで、どのように排除するかがわかりません。aioライブラリに問題があるようにさえ見えます。誰かがこれを見たことがありますか?完全なvalgrind出力は以下のとおりです。前もって感謝します。
c++ - C++非同期ネットワークプログラミング
簡単な質問がいくつかあります。クライアントサーバーアプリケーションとデータがネットワーク上で送信されています。
データを回復して適切に処理できるようにしたいと思います。
これらの構造を見てみましょう。これらは、T1またはT2のいずれかが続くかどうかを示すintが前に付いたネットワーク上で送信されます。クライアントが私にT1を送信し、次にT2を送信した場合、asio :: ip :: tcp :: socket.async_read()を使用して完全な構造を読み取ることができるという保証がありますか?単一の構造体を処理するハンドラーを設定したいのですが、単一のasync_read()ですべてを読み取ることができない場合はどうなりますか?
非同期操作は、次のいずれかの条件が満たされるまで続行されます。
- 提供されたバッファがいっぱいです。つまり、転送されるバイト数は、バッファサイズの合計に等しくなります。
- エラーが発生しました。
読み取れないデータは破棄されますか?別のasync_readをトリガーしますか?そして、クライアントがID +構造を順番に送信した場合、async_readは1つのID +構造のみを取得することが保証されていますか?それとも、OSが物事を最適化し、両方を同じパケに入れることができますか?お気づきかもしれませんが、私は少し混乱しています。サーバー/クライアントアプリケーションを設計するときに正しい決定を下したいと思います。助けていただければ幸いです。
ありがとうございました。
linux-kernel - 書き込みバリアがない場合、ディスクコントローラーは同じセクターへの同時書き込みをどのように処理しますか?
O_DIRECT | O_ASYNCを使用してファイルを開き、fsyncまたはfdatasyncを間にせずに、同じディスクセクターに2つの同時書き込みを行うと、Linuxディスクサブシステムまたはハードウェアディスクコントローラーは、そのディスクセクターの最終データが2番目の書き込みになりますか?
O_DIRECTがOSバッファキャッシュをバイパスするのは事実ですが、データは最終的に低レベルIOキュー(ディスクスケジューラキュー、ディスクドライバのキュー、ハードウェアコントローラのキャッシュ/キューなど)に入れられます。IOスタックをエレベータアルゴリズムまで追跡しました。
たとえば、次の一連の要求が最終的にディスクスケジューラキューに入れられた場合
エレベータコードは、バッファ1、2からそれぞれセクター1、2を合体させるために「バックマージ」を実行します。次に、ディスクに2つのディスクIOを発行します。しかし、ディスクセクター1の最終データがバッファー1からのものかバッファー3からのものかはわかりません(ドライバー/コントローラーの書き込みの並べ替えのセマンティクスについてはわかりません)。
シナリオ2:
このシナリオはどのように処理されますか?より基本的な質問は、AIOを使用してO_DIRECTモードで書き込みを行う場合、明示的な書き込みバリアがない場合、この一連の要求がディスクスケジューラのキューに入れられる可能性があるかどうかです。
はいの場合、「同じセクターへの複数の書き込みにより、最後の書き込みが最後の書き込みになる」などの順序保証はありますか?
または、その順序付けは非決定論的です[シーク時間を最適化するためにバリア内で書き込みを並べ替えるディスクコントローラー/そのキャッシュに翻弄されます]
linux - Linux(特にaio)での同時ソケット読み取り/書き込み(「全二重」)
ACE Proactor フレームワークの上に構築されたアプリケーションを移植しています。このアプリケーションは VxWorks と Windows の両方で完全に動作しますが、Linux (CentOS 5.5、WindRiver Linux 1.4 & 3.0) ではカーネル 2.6.XX (librt を使用) では動作しません。
私は問題を非常に基本的な問題に絞り込みました。アプリケーションは、ソケットで非同期 (aio_read 経由) 読み取り操作を開始し、その後、まったく同じソケットで非同期 (aio_write 経由) 書き込みを開始します。プロトコルはアプリケーション側で初期化されているため、読み取り操作はまだ実行できません。- ソケットがブロッキング モードの場合、書き込みに到達せず、プロトコルが「ハング」します。- O_NONBLOCK ソケットを使用している場合、書き込みは成功しますが、読み取りは「EWOULDBLOCK/EAGAIN」エラーで無期限に返され、回復することはありません (AIO 操作が再開されても)。
私は複数のフォーラムを調べましたが、Linux AIO でこれが機能するか (そして私は何か間違ったことをしている)、または不可能であるかについて、決定的な答えを見つけることができませんでした。AIO を削除して別の実装を探すことは可能ですか (epoll/poll/select などを介して)?
非ブロッキング ソケットで問題をすばやく再現するためのサンプル コードを添付します。
Yotamさん、よろしくお願いします。
c - OS X でのファイル エラーからの aio_read
次のコード:
Linux (Ubuntu 9.10、-lrt でコンパイル) で正常に動作し、印刷
しかし、OS X では失敗します (10.6.6 と 10.6.5、2 台のマシンでテストしました):
これは、OS X のライブラリ エラーが原因である可能性がありますか、それとも何か間違っていますか?
c++ - Mac OS X で aio シグナル ハンドラーのユーザー データを取得する方法
Mac OS X で非同期ファイル IO に aio_* 関数を使用しようとしていますが、何らかの形式のユーザー データをシグナル ハンドラに取り込む際に問題が発生しています。
これは、操作を設定するコードです。
これは、次のように別の場所から呼び出されます。
私のシグナル処理設定は次のようになります。
実際のハンドラーは次のようになります。
したがって、問題は、si_value.sival_ptr が、aiocb 構造体で設定した aio_context ポインターではなく、シグナル ハンドラーで常に NULL であることです。これを行う方法について何か誤解しているに違いないので、誰かが私が間違っていることを教えてもらえますか?
私は MacOSX 10.6 で実行していますが、問題があれば 10.5 用にコンパイルしています (少なくともそうしようとしています)。
また、この質問への回答は、AIO を完全に無視する必要があることを示しているようです。これは本当に事実ですか?
アップデート:
http://lists.apple.com/archives/darwin-dev/2008/Oct/msg00054.htmlで同じ問題を抱えている他の人を見つけました。
http://www.opensource.apple.com/source/xnu/xnu-1504.9.26/bsd/kern/kern_aio.cでカーネル コードも確認しましたが、正しく理解できれば、sigev_value は完全に無視されます。ここで、Mac OS X で aio_* 関数の予想される使用法がどうなるかについて、私は本当に途方に暮れています。私は何かを誤解していますか、それとも aio_* 関数は私のユースケースの行き止まりですか?
aio - リリースビルドでaio_writeが失敗する
私はaio_writeを使用していますが、デバッグビルドでは機能していますが、リリースでは機能していません。すべてが初期化されていることをコンストラクターで確認しましたが、初期化されていない変数に関する警告は表示されません。このクラスは、16Kチャンクでディスクに書き込まれるデータを収集します。データが16K未満の場合は、リリースビルドでも機能します。データが16Kより大きい場合、最初のチャンクのみが書き込まれます。WriteBuffer :: ContinueWriteToFileは、WriteFileState_Activeを無期限に返します。
WriteBuffer_posix.h:
WriteBuffer_posix.cpp: