問題タブ [iocp]
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.
client - マルチスレッドIOCPクライアントの問題
IO完了ポートを使用するマルチスレッドクライアントを作成しています。
WSA_FLAG_OVERLAPPED属性が設定されているソケットを作成して接続します。
IO完了ポートをソケットに関連付けます。
ソケットを介してデータを送信しようとするまで、すべてうまくいくように見えます。
最後のエラーがWSA_IO_PENDINGに設定されたSOCKET_ERRORを返す代わりに、WSASendはすぐに戻ります。
保留するIOが必要であり、その完了をワーカースレッドでもあるスレッド関数で処理する必要があります。
私は以前にこれを行ったことがありますが、この場合に何が問題になっているのかわかりません。この問題の解決にご協力いただければ幸いです。
winsock - IOCP ドキュメントの解釈に関する質問 - バッファ所有権のあいまいさ
私は英語のネイティブ スピーカーではないので、何かが足りないかもしれません。
MSDN でのWSASendの資料から引用:
lpBuffers [入力]
WSABUF 構造体の配列へのポインター。各 WSABUF 構造体には、バッファーへのポインターと、バッファーの長さ (バイト単位) が含まれています。Winsock アプリケーションの場合、WSASend 関数が呼び出されると、システムがこれらのバッファを所有し、アプリケーションはそれらにアクセスできなくなります。この配列は、送信操作の間有効である必要があります。
わかりました、太字のテキストが見えますか? そこがわかりにくいところ!
この行には 2 つの翻訳が考えられます (別の名前を付けてもかまいません):
翻訳 1 - 「バッファ」は、この関数を呼び出すときに渡す OVERLAPPED 構造体を指します。オブジェクトに関する完了通知を受け取った場合にのみ、オブジェクトを再利用できます。
翻訳 2 - 「バッファ」とは、送信しているデータを含む実際のバッファを指します。WSABUF オブジェクトが 1 つのバッファーを指している場合、操作が完了するまでこのバッファーにアクセスできません。
その行の正しい解釈を誰か教えてもらえますか?
そして..... 答えが 2 番目の場合、どのように解決しますか?
私にとっては、送信しているすべてのデータ/バッファについて、送信者側でそのコピーを保持する必要があることを意味するため、トラフィックの多いアプリケーションに多くの「保留中」のバッファ (さまざまなサイズ) があり、実際に「スケーラビリティ」を損なう。
ステートメント 1:
上記の段落 (「And....」) に加えて、SO_SNDBUFをゼロに設定しない限り、IOCP は送信するデータを独自のバッファーにコピーし、そこから送信すると考えました。
ステートメント 2:
スタックに割り当てられたバッファーを使用します (ご存知のとおり、char cBuff[1024];
関数本体のようなものです。主な質問への変換が 2 番目のオプションである場合 (つまり、バッファーは送信が完了するまでそのままにしておく必要があります)、その後...それは本当に物事を台無しにします! それを解決する方法を考えられますか? (私は知っています、言い換えれば上記で尋ねました)。
network-programming - 複数のバッファを使用するWSASend()-完全に不完全になる可能性がありますか?
次のWSASend呼び出しを投稿するとします(コールバック関数のないWindows I / O完了ポート):
完了ポートから「write_done」通知を受け取った場合、wsaBuff [1]は完全に(25バイト)送信されますが、wsaBuff [0]は部分的にのみ(たとえば7バイト)送信される可能性はありますか?
winsock - ConnectEx と IOCP の問題
テスト/プロファイリングの目的で、IOCP を使用して単純なダミー サーバー/ダミー クライアント プログラムを作成しました。(また、私は非同期ネットワーク プログラミングが初めてであることに注意したいと思います)
サーバーは元のクライアントとうまく動作しているように見えますが、ダミー クライアントが ConnectEx 関数を使用してサーバーに接続しようとすると、IOCP ワーカー スレッドは GetQueuedCompletionStatus 関数によってブロックされ、サーバーが接続の受け入れに成功するまで結果を返しません。
問題および/または理由は何ですか? また、この問題を解決するにはどうすればよいですか?
timer - オーバーラップ I/O をサポートするタイマー (IOCP 用)?
I/O Completion Ports (IOCP) に基づくアプリケーションにタイマーのサポートを追加する必要があります。タイマーを管理するために特定のスレッドを使用することは避けたいと思います。
Linux では、ファイル記述子 (timerfd.h man を参照) を介して有効期限通知を配信するタイマーを作成できるため、アプリケーションが epoll に基づいている場合、たとえば epoll で使用すると便利です。
Windows では、非同期プロシージャ コール (ACP) で「待機可能なタイマー」を使用できます ( http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspxを参照) 。
興味のある方は、kqueue (BSD、Mac OS) はデフォルトでタイマーをサポートしています (EVFILT_TIMER を参照)。
I/O Completion Ports では、オーバーラップ I/O をサポートするオブジェクトを使用する必要があります。それで、 IOCP 用のそのようなタイマーはありますか?
よろしくお願いします、
セドリック
windows - ジョブプールでの iocp の使用
ジョブ/タスク プールで iocp を使用してワーカーのウェイクアップを高速化する場合、ポートのシグナリングのオーバーヘッドを最小限に抑える最善の方法は何ですか?
void Worker()
{
while(1)
{
for(int spin = 0; spin < 5000; ++spin)
while(queue.Count > 0)
queue.PopFront()();
}
...
queue.PushBack(someWork);
// decide when to signal completion port but avoid doing it every queue operation ?
たとえば、上記の大まかなコード スケッチでは、キュー操作のたびにポートに信号を送ることを避けようとすると、キューに入れられている作業と開始されている待機の間に問題があります。
windows - I / O完了ポートは、ファイル書き込みの代わりにデータベースを支援できますか?
私はIOCPについて読んでいますが、これまでのところ、非同期書き込みはファイルへの書き込みのコンテキストでのみ適用されます。「ファイル」とは、ディスクファイルだけではなく、Windowsの「ファイル」タイプの出力デバイスを意味します。
クライアントからメッセージを受け取り、それらのメッセージをデータベース(MySQLまたはSQLite)に非同期で書き込むサーバーの実装にIOCPを何らかの方法で使用することを計画しています。しかし、私が理解していることから、IOCPでの非同期書き込みには、書き込まれるデータをデバイスドライバーに渡すことが含まれます。「デバイスドライバー」についての言及は、データベースでIOCPと非同期書き込みを使用する可能性を排除しているようです。アプリケーション作成者の観点から、データベースへの書き込みに関与する「デバイスドライバ」はありません。
では、IOCPは、データベースに書き込むサーバーの実装に実際に役立つのでしょうか。何かを誤解しているようなしつこい感じがします。
この場合、IOCPが役に立たない場合、Windows上のデータベースに非同期書き込みを行うサーバーを実装するために何を調べる必要があるかについての推奨事項はありますか?
c++ - IOCP サーバーを適切にシャットダウンするにはどうすればよいですか?
IOCP サーバーの起動に関する記事は山ほどありますが、適切なシャットダウンに関する記事はありません =/
終了時にサーバーをシャットダウンする適切な方法は何ですか? より具体的には、既にPostQueuedCompletionStatus()を使用してワーカー スレッドに終了を指示していますが、保留中の IO をすべてキャンセルし、終了する前にすべてのソケットを閉じる必要もありませんか?
MSDN でCancelSynchronousIo()を見つけました。終了の完了通知を受け取ったときに、各ワーカー スレッドにこの関数を呼び出させることができるようです...これは適切な方法ですか?
これについて助けてくれてありがとう。
sockets - Windows IOCP - シングル ソケット アプリケーションに利点はありますか?
Windows Server 2003/2008 および C++ プログラミングでの IOCP を理解しているので、選択の代わりに複数のソケットにサービスを提供するか、複数のスレッドを結び付けてそれらの要求にサービスを提供するための、多かれ少なかれ最高のパフォーマンスの方法です。
ただし、私のプログラムにソケットが 1 つしかなく、他の制約が与えられた場合、通常は 1 つのパケットを読み取り、動作してから別のパケットを待機すると、IOCP で何かが得られますか?
この特定のケースでは高速ではないにしても、recv() または同等のものに座っているだけで少なくとも同じくらい高速になるように感じますか?
windows - CancelIo() がいつ完了したかを調べる方法は?
CancelIo()は、呼び出しスレッドに関連付けられたすべての保留中のI/O 操作をキャンセルすることになっています。私の経験では、CancelIo() は将来のI/O 操作もキャンセルすることがあります。与えられた:
CancelIo(port)
読み取りの直前に呼び出すGetQueuedCompletionStatus()
と、読み取り操作を受け取ることはなく、永久にブロックされます。CancelIo(port)
読み取りの直後に呼び出すと、GetQueuedCompletionStatus()
0 が返されますGetLastError()==ERROR_OPERATION_ABORTED
- 私が呼び出し
CancelIo(port)
、保留中または後続の読み取りがない場合、GetQueuedCompletionStatus()
永遠にブロックされます。
ここで重要な点は、 のCancelIo()
実行がいつ終了したかを検出する方法がないことです。CancelIo()
実行が完了し、さらに読み取り要求を発行しても安全であることを確認するにはどうすればよいですか?
PS: http://osdir.com/ml/lib.boost.asio.user/2008-02/msg00074.htmlおよびhttp://www.boost.org/doc/libs/1_44_0/doc/html/を参照してください。 boost_asio/using.html CancelIo() は実際には使用できないようです。お客様は Windows XP のサポートを必要とする必要があります。私のオプションは何ですか?
注:シリアルポートから読んでいます。