18

Java、C#、またはその他の言語では、ソケットなどの非ブロッキングIO機能があります。

したがって、コールバック関数を非ブロッキングIOに渡すことができ、非ブロッキングIOが何かを受信すると、コールバックが呼び出されます。

それらがどのように実装されているのか疑問に思います。舞台裏でノンブロッキングIOを作成した場合、JavaまたはC#はそれらのバックグラウンドスレッドを作成するだけですか?または、基盤となるOSはそれらをネイティブでサポートしていますか?

4

1 に答える 1

19

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

私の理解はこれです:

  1. いくつかのアプリケーション スレッドで非同期 I/O 操作を開始します。
  2. まだキューが作成されていない場合は、キューが作成されます (実際には、I/O 完了ポートと呼ばれるカーネルレベルの構造であり、アプリケーションのカーネル空間のキューに関連付けられています)。.NET の世界では、I/O 完了ポート スレッドと呼ばれる特別に指定されたスレッドが、そのキューで I/O 完了の通知を待機し始めます。ここで注意すべき重要なことは、I/O 完了ポートの数を増やすことなく、任意の数の非同期 I/O 要求を行うことができるということです。
  3. OS は、I/O 完了メッセージをキューに入れることによって、I/O が完了するとアプリケーションに通知します。I/O 完了ポート スレッドは、.NET アプリケーションで I/O 完了コールバックを呼び出して、そのメッセージを処理します。その間、他の I/O が完了すると、その結果は現在処理中の結果の後ろにエンキューされます。

上記の注意事項:

  1. 私はこれの一部が間違っていると確信していますが、全体的な要点は正しいと信じています。エリックか誰かが入ってきて、私が間違っているところを正してくれます。

  2. .NET には、複数の I/O 完了ポート スレッドがあります。さまざまな I/O 完了ポート間で非同期 I/O 要求がどのように割り当てられているかわかりません。これは、オペレーティング システムの機能である可能性があります (アプリケーションが開いている任意のポートで I/O が返される場合があります)。

Java の場合、JVM の実装と特定の OS に依存していると確信しています。それを超えて推測するのに十分なほど、私はそれをほとんどよく知りません。

編集:歴史的な更新、詳細はこちら

于 2012-05-10T16:51:26.080 に答える