1

私の第 1 の質問: タイトルのとおりです。

StackExchange の質問に出くわしたので、これを尋ねています。単一のスレッドではできない複数のスレッドでできることは何ですか?

そのリンクで提供されているソリューションの1つでは、マルチスレッドでできることは何でも、シングルスレッドでも実行できると述べています。

しかし、これは真実ではないと思います。私の主張は次のとおりです。ソケット プログラミングを使用して単純なチャット プログラムを作成し、コマンド コンソールを介して実行する場合。チャット プログラムがシングル スレッドの場合。チャット プログラムは実際には半二重です。つまり、聞くことと話すことを同時に行うことはできず、毎回片方だけが話すことができ、もう一方は聞く必要があります。両方の当事者が同時にメッセージを送受信できるようにするには、マルチスレッドで実装する必要があります。

私の2番目の質問:私の議論は正しいですか?それとも、ここでいくつかの点を見逃したので、単一のスレッドでマルチスレッドが行うすべてのことを実行できますか?

4

3 に答える 3

4

コンピューターを全体として考えてみましょう。より正確には、チャット アプリケーションはカーネル (または OS 全体) と結び付けられており、"ソフトウェア" と呼ばれる部分です。

ここで、この「ソフトウェア」が単一のコア (i386 など) で実行されると考えてください。

次に、スレッドを使用してチャット アプリケーションを作成したとしても (これはおそらく非常にやり過ぎです)、ソフトウェア全体が単一の CPU コアで実行されることを理解できます。並行して起こっているようです。

これは単なるチューリング マシンです (単一のテープを使用) https://en.wikipedia.org/wiki/Turing_machine

並列処理はカーネルによって引き起こされる錯覚です。カーネルはタスク間を十分に高速に切り替えることができるからです。映画が画面上で連続した画像のように見えるのと同じように、実際には 1 秒間に 24 枚の画像しかなく、これは私たちの脳を欺くのに十分です。

したがって、マルチスレッド プログラムが行うことはすべて、シングル スレッド プログラムで実行できると言えます。

それにもかかわらず、現在、私たちは皆、特定の時点で同時に複数のコンピューターで実行されているように見えるマルチコア CPU を使用しています (並列コンピューティング)。シングルスレッドのもの。良い例は、(カーネル内の) デバイス ドライバーです。非プリエンプティブ カーネルでは、実装が不十分な場合、イベントを無期限に待機するビジー ループを作成できます。これは通常、シングルコアでデッドロックします (カーネルが別のタスクにスケジュールされないようにするため、イベントが送信されなくなります)。ただし、イベントは通常、別のコアで実行されている別のスレッドによって最終的に送信されるため、これはマルチコアで機能します (うまくいけば)。

于 2015-11-27T10:33:07.987 に答える
2

既存の回答を修正したい(+1):

単一のスレッドで複数の並列 IO を絶対に実行できます。IO は、カーネルのデータ構造に他なりません。IO を開始すると、OS はハードウェアと通信し、何かを行うように指示します。その後、CPU は自由にやりたいことを実行できます。完了すると、ハードウェアは OS にコールバックします。完了通知を処理するために CPU コアを乗っ取る割り込みを発行します。

これは async IO と呼ばれ、すべての OS で提供されています。

実際、これが多くの接続を持つソケット プログラムの実行方法です。非同期 IO を使用して、大量の接続をスレッドの小さなプールに多重化します。

于 2015-11-27T20:48:41.907 に答える
1

この議論が正しくない主な理由は微妙です。単一のスレッド、単一のコア、または単一のネットワーク インターフェイスだけでは、その特定のコンポーネントが常に送信または受信を処理できるのは事実ですが、それがクリティカル パスでない場合、説明するのは意味がありません。システム全体を半二重にします。

全二重で、データのチャンクを一方の端から他方の端に移動するのに 1 ミリ秒かかるネットワーク リンクを考えてみましょう。ここで、リンクにデータを配置したり、リンクからデータを削除したりするデバイスがあるとしますが、両方を同時に行うことはできません。送信または受信の処理にかかる時間が 1 ミリ秒未満である限り、両方向のデータが通過しなければならないこの単一のファイル パスによってリンクが半二重になることはありません。同時に両方向に移動するデータは依然として存在します。

現実的なチャット アプリケーションでは、CPU が制限要因になることはありません。したがって、一度に複数のことを行うことができないため、システムを半二重にすることはできません。同時に両方向にデータが移動する可能性があります。

典型的な負荷の下での典型的なチャット アプリケーションの場合、システムの動作は、実装が単一のスレッドを使用するか、無限の CPU リソースを持つ複数のスレッドを使用するかにかかわらず、大きく異なりません。CPU が制限要因になることはありません。

于 2015-11-27T20:55:17.810 に答える