Java、C#、またはその他の言語では、ソケットなどの非ブロッキングIO機能があります。
したがって、コールバック関数を非ブロッキングIOに渡すことができ、非ブロッキングIOが何かを受信すると、コールバックが呼び出されます。
それらがどのように実装されているのか疑問に思います。舞台裏でノンブロッキングIOを作成した場合、JavaまたはC#はそれらのバックグラウンドスレッドを作成するだけですか?または、基盤となるOSはそれらをネイティブでサポートしていますか?
Java、C#、またはその他の言語では、ソケットなどの非ブロッキングIO機能があります。
したがって、コールバック関数を非ブロッキングIOに渡すことができ、非ブロッキングIOが何かを受信すると、コールバックが呼び出されます。
それらがどのように実装されているのか疑問に思います。舞台裏でノンブロッキングIOを作成した場合、JavaまたはC#はそれらのバックグラウンドスレッドを作成するだけですか?または、基盤となるOSはそれらをネイティブでサポートしていますか?
Windows では、ノンブロッキング I/O に対する基本的な OS サポートがあり、Microsoft の CLR はそれを利用しています。他の CLR 実装 (mono) もおそらく同様ですが、確かなことはわかりません。Microsoft CLR で非同期 I/O を実行する場合、保留中の非同期 I/O 操作と、それらの I/O 操作の完了を待機しているスレッド (または少なくともマネージド スレッド) との間に 1 対 1 の相関関係はありません。
Win32 レイヤーの詳細については、http://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85) .aspxを参照してください。I/O 完了ポートに関する情報もここにあります: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx
私の理解はこれです:
上記の注意事項:
私はこれの一部が間違っていると確信していますが、全体的な要点は正しいと信じています。エリックか誰かが入ってきて、私が間違っているところを正してくれます。
.NET には、複数の I/O 完了ポート スレッドがあります。さまざまな I/O 完了ポート間で非同期 I/O 要求がどのように割り当てられているかわかりません。これは、オペレーティング システムの機能である可能性があります (アプリケーションが開いている任意のポートで I/O が返される場合があります)。
Java の場合、JVM の実装と特定の OS に依存していると確信しています。それを超えて推測するのに十分なほど、私はそれをほとんどよく知りません。
編集:歴史的な更新、詳細はこちら