問題タブ [io-completion-ports]
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.
windows - I/O 完了ポートを実行するときに、OVERLAPPED 構造体に hEvent を設定する必要がありますか?
シリアル ポート通信に Windows で I/O 完了ポートを使用しています (シリアル ポートを大量に使用する可能性があります)。IOCP を作成し、I/O スレッドをスピンアップし、CreateFile()
ハンドルを IOCP に関連付けます (CreateFile()
で呼び出されましたFILE_FLAG_OVERLAPPED
)。それはすべてうまくいっています。完全に非同期にするために、に設定されているものを除いて、COMMTIMEOUTS
すべてを 0に設定しました。ReadIntervalTimeout
MAXDWORD
私の I/O スレッドで、それがGetQueuedCompletionStatus()
無期限にブロックされることに気付きました。INFINITE
タイムアウトを使用しています。そのためReadFile()
、ハンドルを IOCP に関連付けた直後に呼び出しを行いました。これによりGetQueuedCompletionStatus()
、なんらかの理由で 0 バイトが転送されてすぐに解放されますが、エラーはありません (true を返し、GetLastError() は 0 を報告します)。何もすることがない場合は、明らかにブロックしたいと思います。ReadFile()
GetQueuedCompletionStatus() の後に別のスレッドを配置すると、プール内の別のスレッドがそれを取得し、0 バイトが転送され、エラーは発生しません。
私が見てフォローした例では、IOCP を使用しているときに構造体に をhEvent
設定している人はいません。OVERLAPPED
それは必要ですか?私は IOCP スレッドをブロックしたくありませんCreateEvent(...) | 1
。
必要でない場合、何が問題を引き起こしている可能性がありますか? GetQueuedCompletionStatus()
データがシリアル ポートに到着するまでブロックする必要があります。
そこに良いIOCPシリアルポートの例はありますか? 完全なシリアル ポート + IOCP の例は見つかりませんでした。それらのほとんどはソケット用です。理論的には、シリアルポート、ファイル、ソケットなどで機能するはずです。
asynchronous - Mac OS X の IO 完了ポート
ファイルに非同期 IO を実装するために、Mac OS X に IO COMPLETION ポートに相当するものはありますか?
ありがとうございました....
synchronization - I/O での同期アクセスについて I/O Completion での動作
プロセッサの数に対応する I/O Completion Port を使用する I/O ワーカーが 4 つある場合、それらはクライアント コンテキストで相互に同期アクセスする必要がありますか?
ここでのクライアント コンテキストは、I/O CompletionKey を介して渡されるものを参照します。問題は、ワーカー A がコンテキストを使用して I/O 完了キューに I/O をポストしたが、現在コンテキストを変更している場合です。I/O を処理するためにウェイクアップされたワーカー B は、同時にコンテキストを読み取ります。何が起こるでしょうか?
c - リソース Windows で IOCP を学習するには
私は最近、Windows の IOCP と呼ばれるものに気づき、それに関する詳細情報を検索し始めましたが、最新のものを見つけることができませんでした (ほとんどの例は、ほぼ 5 年前の codeproject にありました)。チュートリアル。オンライン チュートリアルやサンプル プロジェクト (あなたが書いて共有できるもの、または他のオープン ソース プロジェクト) の形で、それに関する最新のリソースをお勧めできますか。それは広範囲に及ぶので、私はそれに投資します。
ありがとうございました。
c++ - Winsock:重複したAcceptExは、クライアントが接続していないときに新しい接続を示します
私のプログラムでは、重複したバージョンを使用してAcceptEx()
新しい接続を受け入れています。新しい接続が受け入れられた後、プログラムは、AcceptEx()
さらに接続を受け入れるために、への別の重複呼び出しを開始します。これは正常に機能し、複数のクライアントをサーバーに正常に接続できます。
しかし、1つのクライアントを接続し、サーバーアプリケーションにこのソケットでWSARecv(オーバーラップ)を呼び出させると、 AcceptEx()
魔法のように新しい「ゴースト」接続を受け入れます(最初のクライアントは何も実行していません)。もちろん、私がそれを呼び出すとWSARecv
、エラーが発生します。
プログラムには、重複するすべての呼び出し用のI/O完了ポートが組み込まれています。
偽の接続がどこから来ているのかわかりません。しかし、それは私が見つけることができない私のコードのバグのようです。
エラーの理由から明確に除外できるもの:1。使用する重複構造とキャストのパラメーターは正しく機能します。2.IOCPラッパークラス。
以下は関連するコードです(私の意見では)-もっと必要な場合は教えてください:)
編集:問題なく動作するテストサーバーを作成しました
windows - I/O 完了ポートに CompletionKey があるのはなぜですか?
CreateIoCompletionPort関数の CompletionKey に関する MSDN からのコメント:
CompletionKey パラメーターを使用して、どの I/O 操作が完了したかをアプリケーションが追跡できるようにします。この値は、機能制御のために CreateIoCompletionPort によって使用されません。むしろ、I/O 完了ポートとの関連付け時に FileHandle パラメータで指定されたファイル ハンドルにアタッチされます。この完了キーは、ファイル ハンドルごとに一意である必要があり、内部完了キュー プロセス全体でファイル ハンドルに付随します。完了パケットが到着すると、GetQueuedCompletionStatus 関数呼び出しで返されます。CompletionKey パラメータは、PostQueuedCompletionStatus 関数によっても使用され、独自の特殊目的の完了パケットをキューに入れます。
上記の発言は私に疑問を残します。次のように拡張されたオーバーラップ構造でユーザー コンテキストをファイル ハンドルに関連付けることができるのに、CompletionKey を使用する理由は次のとおりです。
完了後に CONTAINING_RECORD マクロを介して取得しますか?
クール、私は CompletionKey がハンドルごとのコンテキストであり、拡張されたオーバーラップ構造が I/O ごとのものであると確信しています。しかし、そのような設計の背後にある哲学は何ですか? また、ユーザー コンテキストの観点から拡張されたオーバーラップ構造の代わりに、どのような状況で CompletionKey を使用する必要があるのでしょうか?
sockets - GetQueuedCompletionStatus は永久にブロックします
私はサーバー アプリケーションを作成していて、IOCompletion ポートを使用したいので、サーバーのプロトタイプを作成しましたが、GetQueuedCompletionStatus が返されない (ブロックする) という問題に直面しています。以下は私のコードです:
何か案が?前もって感謝します。
windows - ConnectEx を使用しない Windows でのノンブロッキング ソケット接続
1 つのプロセスで数千のクライアント接続を開始する必要があります。回避する必要がある主な制限は、ドライバーが ConnectEx をサポートしていないため、純粋な IOCP ソリューションを使用できないことです。
私が最初に考えたのは、接続を処理するためのスレッド プールです。各ハンドルは、単純な接続/選択セマンティクスを使用して最大 64 の接続を処理でき、接続されると IOCP を続行します。しかし、これは機能しません。select が実行されると、別のソケットを FD_SET に追加することはできません。したがって、ソケットをノンブロッキングに設定し、代わりにポーリングする必要があります。
最善の解決策は、最も単純なものかもしれません。スレッドごとに1 つの接続クライアント。接続レートを適切に維持できると仮定すると、プール内のスレッドの数は少なくなる可能性があります。
これは奇妙な状況です。ドライバーが ConnectEx をサポートするのが理想的ですが、(今のところ) サポートしていないため、可能な限り最善の方法で回避する必要があります。
別の方法はありますか?
asp.net - 複数の HTTP リクエストを送信して、同じ I/O 完了ポートを待機する
私のアプリケーションは、Web サービスと "Application_Start" から大量の情報を非同期にロードします。
ユーザー要求がその情報を使用したいが、準備ができていない場合、スレッドは Monitor.Wait でブロックされます。情報の準備が整うと、キャッシュ オブジェクトは、待機中のすべてのスレッドを Monitor.Pulse します。情報には数十秒かかり、ユーザーはログイン ページにリダイレクトされ、ログイン情報を投稿し、再度リダイレクトされる必要があるため、これで問題ありません。
問題は、Monitor.Wait が CLR ThreadPool スレッドをブロックすることです。「大きな情報」を要求する要求のバーストが到着したかどうかを知る限り、アプリケーションは CLR ThreadPool の枯渇によってブロックされたままになる可能性があります (私は少し混乱しています)。現在の IIS/ASP.NET スレッド ゲーティングを使用)。
大部分の情報は、非同期で呼び出す Web サービスから取得されるため、その操作の IAsyncResult を取得します。
では、CLR ThreadPool スレッドに「この IOCP を待機する」ように指示して、スレッドプール スレッドが他の呼び出しに参加できるようにする方法はありますか?
これはよく説明されていないように感じます。質問の内容が明確でない場合はお知らせください。
よろしく。
PS: 報奨金は終了しましたが、その方法を誰かが知っている場合は、新しい方法を作成して著者に付与します。
c# - 高パフォーマンスでの .NET ソケットと C++ ソケットの比較
私の質問は、同僚と C++ と C# の議論を解決することです。
大量の UDP ストリームを受信するサーバーを実装しました。このサーバーは、完了ポートを使用して非同期ソケットとオーバーラップ I/O を使用して C++ で開発されました。5 つのスレッドで 5 つの完了ポートを使用します。このサーバーは、ギガビット ネットワークで 500 Mbps のスループットをパケットの損失やエラーなしで簡単に処理できます (500 Mbps を超えるテストは行いませんでした)。
C# で同じ種類のサーバーを再実装しようとしましたが、同じ受信スループットに到達できませんでした。ReceiveAsync
メソッドとプールを使用した非同期受信を使用してSocketAsyncEventArgs
、受信呼び出しごとに新しいオブジェクトを作成するオーバーヘッドを回避しています。それぞれSAEventArgs
にバッファが設定されているため、受信ごとにメモリを割り当てる必要はありません。プールは非常に大きいため、100 を超える受信要求をキューに入れることができます。このサーバーは、240 Mbps を超える受信スループットを処理できません。その制限を超えると、UDP ストリームでいくつかのパケットが失われます。
私の質問は次のとおりです。C++ ソケットと C# ソケットを使用して同じパフォーマンスを期待する必要がありますか? 私の意見では、.NET でメモリが正しく管理されていれば、同じパフォーマンスになるはずです。
副次的な質問: .NET ソケットが内部で I/O 完了ポートをどのように使用するかを説明している良い記事/リファレンスを知っている人はいますか?