web-dev-qa-db-ja.com

Javaスレッドとコア数

プロセッサとスレッドがどのように機能するかについて簡単な質問がありました。私の現在の理解によると、コアは一度に1つのプロセスしか実行できません。ただし、所有するコアの数(4と言う)よりも大きい数のスレッドプール(30とする)を生成し、それらを同時に実行させることができます。コアが4つしかない場合、これはどのように可能ですか?また、ローカルコンピューターで30スレッドのプログラムを実行し、映画の視聴やインターネットの閲覧など、コンピューターで他のアクティビティを実行し続けることもできます。

私はどこかでスレッドのスケジューリングが発生し、これらの30のスレッドが4つのコアによって同時に実行されているという錯覚を与えていると読んでいます。これは本当ですか?もしそうなら、誰かがこれがどのように機能するかを説明し、これに関する良い読書をお勧めできますか?

助けてくれてありがとう。

21
user5765683

プロセスとスレッド

昔は、各プロセスの実行は正確に1つthreadだったため、プロセスはコアに直接スケジュールされていました(そして、この昔は、スケジュールするコアはほとんど1つしかありませんでした)。ただし、スレッド化をサポートするオペレーティングシステム(ほとんどすべての最新のOS)は、threadsであり、スケジュールされたプロセスではありません。したがって、この説明の残りの部分では、スレッドについてのみ説明します。実行中の各プロセスには1つ以上の実行スレッドがあることを理解する必要があります。

並列性と並行性

2つのスレッドがparallelで実行されている場合、それらは両方とも同時にで実行されています。たとえば、AとBの2つのスレッドがある場合、それらの並列実行は次のようになります。

CPU 1:A ------------------------->

CPU 2:B ------------------------->

2つのスレッドが同時に実行されている場合、それらの実行overlaps。オーバーラップは、次の2つの方法のいずれかで発生する可能性があります。スレッドが同時に実行されている(つまり、上記のように並列に実行されている)か、次のようにプロセッサで実行がインターリーブされている

CPU 1:A -----------> B ----------> A -----------> B -------- ->

したがって、この目的のために、並列処理は並行性の特別なケースと考えることができます*

スケジューリング

ただし、所有するコアの数(4と言う)よりも大きい数のスレッドプール(30とする)を生成し、それらを同時に実行させることができます。コアが4つしかない場合、これはどのように可能ですか?

この場合、CPUスケジューラがこれらの30個のスレッドのそれぞれにCPU時間の一部を割り当てているため、それらは同時に実行できます。一部のスレッドwillは並行して実行されます(4つのコアがある場合は、4つのスレッドが同時に並行して実行されます)が、30のスレッドすべてが同時に実行されます。その後、ゲームをプレイしたりWebを閲覧したりできるのは、これらの新しいスレッドがスレッドプール/キューに追加され、CPU時間の配分も与えられるためです。

論理コアと物理コア

私の現在の理解によると、コアは一度に1つのプロセスしか実行できません

これはquite trueではありません。非常に巧妙なハードウェア設計と、ここに入るには長すぎるパイプライン(さらにはわかりません)により、1つの物理コアが実際に実行される可能性があります2つの完全に異なる実行スレッド同じ時間。必要に応じてその文を少しかみます-それはまだ私の心を吹き飛ばします。

この驚くべき偉業は同時マルチスレッディングと呼ばれます(または一般的にハイパースレッディングですが、それはそのようなテクノロジーの特定のインスタンスの専有名ですが)。したがって、実際のハードウェアCPUコアである物理コア論理コア。これは、ソフトウェアが使用可能であるとオペレーティングシステムが通知するコアの数です。論理コアは本質的に抽象化です。典型的な最新のIntel CPUでは、各物理コアは2つの論理コアとして機能します。

誰かがこれがどのように機能するかを説明し、これに関するいくつかの良い読書を推奨できますか?

プロセス、スレッド、およびスケジューリングがすべてどのように連携するかを本当に理解したい場合は、オペレーティングシステムの概念をお勧めします。

  • parallelおよびconcurrentという用語の正確な意味は、 ここでは独自のスタックオーバーフロー でさえも、活発に議論されています。これらの用語が意味するものは、アプリケーションドメインに大きく依存します。
35
gardenhead

つまり、コアの理解は正しいです。コアは、一度に1つのスレッド(プロセス)を実行できます。

ただし、プログラムはreally一度に30スレッドを実行しません。これらの30のスレッドのうち、一度に実行されるのは4つだけで、残りの26は待機しています。 CPUはスレッドをスケジュールし、各スレッドにコアで実行するための時間のスライスを与えます。そのため、CPUはすべてのスレッドを順番に実行させます。

一般的な誤解:

スレッドを増やすと、プログラムの実行が速くなります。

FALSE:スレッドを増やすと[〜#〜] not [〜#〜]が常にプログラムの実行を高速化します。 CPUがより多くの切り替えを行う必要があることを意味し、実際には、スレッドが多すぎると、切り替えによって引き起こされるオーバーヘッドのためにプログラムが実行されますslowerすべての異なるプロセスを削除します。

4
Andy Guibert

Javaはスレッドスケジューリングを実行せず、スレッドスケジューリングを実行するためにオペレーティングシステムのままにします。

計算負荷の高いタスクの場合、使用可能なコアの数と同じスレッドプールサイズにすることをお勧めします。しかし、I/Oバウンドタスクの場合、スレッドの数を増やす必要があります。両方のタイプのタスクが使用可能であり、CPUタイムスライスが必要な場合、他にも多くのバリエーションがあります。

コアは一度に1つのプロセスしか実行できません

はい、しかし、彼らはmultitaskを作成し、一度に複数のプロセスを処理するillusionを作成できます

コアが4つしかない場合、これはどのように可能ですか?また、ローカルコンピューターで30スレッドプログラムを実行し、コンピューターで他のアクティビティを実行し続けることもできます。

これは、マルチタスク並行処理)が原因で可能です。 30個のスレッドを開始し、OSも50個のスレッドを実行しているとしましょう。80個すべてのスレッドは、CPUタイムスライスを1つずつ取得することで4つのCPUコアを共有します(コアごとに1つのスレッド)。つまり、各コアは平均して80/4 = 20スレッドを同時に実行します。そして、すべてのスレッド/プロセスが同時に実行されていると感じるでしょう。

誰かがこれがどのように機能するか説明できますか

これらはすべてOSレベルで発生します。プログラマーなら、これについて心配する必要はありません。しかし、もしあなたがOSの学生なら、OSの本を選んで、OSレベルでのマルチスレッディングの詳細を学ぶか、詳細な研究論文を見つけてください。各OSがこれらのことを異なる方法で処理することを知っておく必要があること(ただし、一般的には概念は同じです)

Erlangのようないくつかの言語があり、グリーンスレッド(またはプロセス)を使用します。これにより、独自のOSを排除してスレッドをマップおよびスケジュールできるようになります。そのため、興味がある場合は緑色のスレッドについても調査してください。

注:また、actorsを調べることもできます。これは別のabstractionスレッドを超えています。 Erlang、Scalaなどのような言語は、アクターを使用してタスクを実行します。1つのスレッドは数百のアクターを持つことができ、各アクターは異なるタスクを実行できます(Javaのスレッドに類似)).

これは非常に広範かつ活発な研究トピックであり、学ぶべきことがたくさんあります。

3
user4774371