問題タブ [overlapped-io]
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.
c - IOCP が使用される理由
IOCP が使用される理由を理解しようとしています。次の 2 つの理由が考えられます。
- ブロックしないため
WSARecv()
、クライアントごとに新しいスレッドを作成することなく、数千のクライアントを処理できます (また、作成できるスレッドの数には制限があるため、処理できるクライアントの数は制限されます)。 . - ブロックしないため
WSASend()
、大きなファイルを送信する場合、送信するために新しいスレッドを作成する必要はありません (新しいスレッドを作成しなかった場合、UI スレッドはもちろんブロックされます)。
IOCP を使用する他の理由は何ですか?
c++ - WINAPI ReadFile を使用してファイル非同期から行を読み取る
ファイルから複数行を同時に、つまり非同期で読み取る必要があります。ファイル内の行は同じサイズです。
たとえば、ファイルの 2 行目と 4 行目を読み取って、変数を分離したり配列にしたりする必要があります。
私は c# の async/await に慣れており、これらすべてOVERLAPPED
を理解するのは少し難しいです。
msdn の例を使用して、これを達成しました。ファイルからデータを 1 つの文字列として読み取るだけです (それは非同期読み取りですか?):
ファイルから 2 行を非同期で読み取る方法を教えてください。
SetFilePointer
行間を移動するために使用する必要がありますか?
c++ - WaitForSingleObject で待機中のファイル HANDLE を通知する方法
私が制御できないこのコードは、重複した I/O を使用してファイルを読み取ります。
別のスレッド (実際には ReadFile の API フック) で、hFile
ブロックを解除するために にシグナルを送る必要がありWaitForSingleObject
ます。通常、Windows (または を処理するデバイス ドライバーReadFile
) がこれを行いますが、シミュレートする必要があります。
、 、およびhFile
を含むReleaseMutex
、通常これを行う API は見つかりませんでした。それらはすべてエラー 6 を返します (ハンドルが無効です)。ファイル、名前付きパイプ、または通信デバイスで動作する API はありますか?ReleaseSemaphore
SetEvent
推奨されていないことはわかっていWaitForSingleObject(hFile)
ますが、上記のコードは与えられたものであり、それを使用する必要があります。ありがとう!
c++ - IO 完了ポート UDP ソケット、実装、および WSASendTo
UDP ソケットで IOCP を使用するアプリケーションを開発する必要がありますが、資料はマイクロソフトのドキュメントに他の例として示されているか、あいまいであるか、実装の形式に焦点を当てています。IOCP の使用経験のある方に、正しい使用法が次のとおりであることを確認していただきたいと思います。
- CreateIoCompletionPort 関数を呼び出して IOCP を作成します。
- 同じ関数でソケットを IOCP に関連付けます。
- IO 操作を実行します (私の場合は WSARecvFrom または WSASendTo)。
- IO操作が完了するまでプロセスをブロックするGetQueuedCompletionStatus関数を呼び出します(これは、たとえばスレッドプールで実行できます)
- バッファの読み込みや演算結果を実現します。
ソケットの実装は焦点ではないので説明していませんが、これは IOCP を操作する正しい方法ですか?
2 つ目の質問は、情報を送信する場合のアプリケーションの設計に関するものです。IOCP で動作するアプリケーションは、出力操作への直接呼び出し (WSASendTo 関数を直接呼び出すなど) を使用せず、PostQueuedCompletionStatus 関数を使用してスレッドでイベントを生成し、この操作を実行するという記述を読みました。私が調べたところによると、パフォーマンスの点で利点は見られません。
両方の形式がスレッド プールに適用されると仮定すると、PostQueuedCompletionStatus を使用して出力操作を実行する利点はありますか?
windows - SetFileIoOverlappedRange を複数回呼び出して、4GB 以上のメモリ ブロックをロックできますか?
のLength
パラメータSetFileIoOverlappedRange
はULONG
だけなので、どうすれば 4GB 以上のメモリ ブロックをロックできますか?
オーバーラップ I/O で使用する連続した 4 GB メモリ ブロックを割り当て、SetFileIoOverlappedRange
ブロックの半分ごとに 1 回ずつ、2 回呼び出すとします。どちらの呼び出しも、成功 (ゼロ以外) ステータス コードを返します。呼び出しは付加的であり、4 GB ブロック全体がロックされますか? それとも、2 番目の呼び出しが最初の呼び出しを「オーバーライド」しますか? どうすればわかりますか?
c++ - 非同期 IO が好まれる理由
だから私はいくつかのWIN32ソケットプログラミングを行ってきました.Overlapped IOが好まれる理由を理解しようとしています. 特に、どうしてこんなことになったのか気になる
このような通常の IO 呼び出しよりも優先されます
私の理解では、IO イベントが WSAWaitForMultipleEvents で完了しなかった場合、最初の呼び出しはブロックされますが、2 番目の呼び出しは、データが到着するまで recv で直接ブロックされます。では、IO 呼び出しブロックを少し遅らせることの実際の利点は何でしょうか? 待つ前にできることがあれば、それをするということですか?
その場合、オーバーラップ IO は、データが到着するまで何もできないアプリケーションで価値がある/必要ですか?