2

1つのスレッド(1つのソケット)について知っていますが、read()またはwrite()を同時に実行することはできませんか?

しかし、2つのスレッドを作成し、それぞれがread()とwrite()を別々に処理するとどうなりますか?低レベルのビューではわかりませんが、read()とwrite()はソケットロックを取得するので、一度に実行できる操作は1つだけですか?しますか?

プラットフォームとしてWindowを使用していますが、Unixマシンに違いがあることも知りたいですか?

私は混乱しているので、この質問をします。2つのスレッドでread()とwrite()を同時に実行できるのに、なぜ非ブロッキングIOが必要なのですか?

4

4 に答える 4

5

1つのスレッド(1つのソケット)について知っていますが、read()またはwrite()を同時に実行することはできませんか?

もちろん違います。スレッドは一度に1つのメソッドしか呼び出すことができません。質問は意味がありません。

しかし、2つのスレッドを作成し、それぞれがread()とwrite()を別々に処理するとどうなりますか?低レベルのビューではわかりませんが、read()とwrite()はソケットロックを取得するので、一度に実行できる操作は1つだけですか?しますか?

彼らはロックを必要としません。TCPは全二重です。同じソケットで読み取りと書き込みを行うことができます。同時に。

プラットフォームとしてWindowを使用していますが、Unixマシンに違いがあることも知りたいですか?

いいえ。

私は混乱しているので、この質問をします。2つのスレッドでread()とwrite()を同時に実行できるのに、なぜ非ブロッキングIOが必要なのですか?

決心しなさい。最初にあなたはそれが可能かどうか尋ねました、今あなたは(正しく)それが可能であると言います。

NIOを使用すると、同じスレッドで複数のソケットを処理できます。これの目的は、たとえば、数十万の接続を処理する必要があるサーバーでのスレッドの保存です。

于 2012-09-11T02:38:02.453 に答える
2

スレッドは非常に高価なリソースです。それらを最大限に活用するために、それらを慎重かつ効率的に使用するように努める必要があります。

NIOを使用すると、同じスレッドで複数のソケットを開くことができます。基本的に、1000スレッドではなく、1つのスレッドで1000ソケット接続になる可能性があります。

実際の例としてTomcatを取り上げましょう。Tomcatは、JSP/サーブレットコンテナを備えたWebサーバーです。ブロッキングIOと非ブロッキングIOの両方をサポートします。ブロッキングIOを使用すると、最大で5K HTTP接続になりますが、NIOを使用すると、十分なRAMメモリが使用可能な場合に20KHTTP接続に到達できます。

于 2012-09-11T02:37:52.847 に答える
1

何千ものスレッドを作成すると、JVMとシステムリソースに負担がかかるためです。非同期IOを使用すると、多数の接続を監視するいくつかのスレッドを使用でき、はるかに効率的です。

于 2012-09-11T02:28:24.343 に答える
0

1つのスレッド(1つのソケット)の場合、read()またはwrite()を同時に実行することはできません。

読み取りと書き込みを同時に行うことができますが、同じスレッドで読み取りと書き込みを行うことができます。既知の量のデータまたはメッセージを書き込むことを期待し、既知の量のデータまたはメッセージを取り戻すことを期待する場合は、同じスレッドで書き込みを行ってから読み取ることができます。

たとえば、単純なサーバープロセスがある場合は、単一のスレッドを使用して要求を読み取り、応答を書き込むことができます。

ブロッキングIOは、数百を超える接続には使用しません。接続数が数十以下の場合、非ブロッキングIOはさらに複雑にする価値がない可能性があります。

于 2012-09-11T07:18:11.257 に答える