1

私は winsock を使用しておりconnect、ノンブロッキング ソケットを呼び出しています。CPU が他のプロセスによって占有されている場合、関数が戻る前に遅延 (最大 200 ミリ秒) が発生することがあります。私が知っていることから、connectノンブロッキングソケットの a はすぐに返されるはずですが、おそらくconnectコンテキストスイッチが発生し、CPU が一生懸命働いているため、スレッドが再び CPU 時間を取得して関数を終了するまでに時間がかかります。

ブロッキングソケットではコンテキストスイッチが発生することを知っています(または少なくともかなり確実です)が、非ブロッキングソケットでconnectはコンテキストスイッチが発生しますか?connect

4

3 に答える 3

1

非ブロッキング呼び出しは、その定義によってコンテキスト スイッチを引き起こしません。ただし、コンテキストの切り替えがすぐに発生する可能性があります。

ここで何を意味するのかわかりません。「私の知る限り、ノンブロッキング ソケットへの接続はすぐに返されるはずです。」一方では、はい、接続が完了したかどうかに関係なく、後続のコード行が実行されるため、その意味ではすぐに戻ります。戻る前にコンテキストの切り替えが発生しないという点ですぐに戻るという意味であれば、それは間違いです。

于 2009-01-15T03:16:04.027 に答える
1

コンテキストの切り替えは、非ブロック接続、ブロック接続、または接続前後の任意の時点に関係なく、いつでも可能です。接続プロセスがまだ完了していないときに、非ブロッキング接続が返される可能性があるだけです。

最新のオペレーティング システムでは、通常のプログラムが実行されているすべての段階でコンテキストの切り替えが可能です。特定のコードが中断されずに実行されるという保証はありません。(システムにとって非常に重要な人だけがそのような特権を得るでしょう)

于 2009-01-15T04:23:38.087 に答える
1

また、この呼び出しはカーネルに到達する必要がありますが、これはすでにある程度の時間が費やされていることを意味します。他の人が指摘しているように、コンテキストの切り替えはいつでも発生する可能性があります。いくつかのトリックを実行できますが (優先度を少し高くするなど)、実際には、非リアルタイム OS を使用すると、割り当てられたタイムスライス、特定の操作を完了するのにかかる時間などについて保証されません。

于 2009-01-15T10:51:35.620 に答える