sleep()
現在実行中のスレッドをスリープ状態にすることを読みました。これはマルチコア プロセッサにも有効ですか? よくわかりませんが、マルチコアプロセッサには複数の「現在実行中のスレッド」があると思います。
3 に答える
Sleep() は現在実行中のスレッドをスリープ状態にすることを読みました。これはマルチコア プロセッサにも有効ですか?
はい。sleep(...)
引数として渡された時間の間、実行スレッドをスリープ状態にします。
しかし、マルチコアプロセッサには複数の「現在実行中のスレッド」があると考えています。
真実。マルチコア プロセッサでは、同時に複数のスレッドが実行されます。
マルチコア プロセッサで現在実行中のスレッドは何ですか?
これを参照してください:マルチコア/マルチ プロセッサ システムでの Thread.currentThread() のセマンティクス?
Thread.CurrentThread()
特定のスレッドで実行されます。実行中のプロセッサに関係なく、同じスレッドが返されます。
sleepは、スレッドが呼び出されたときにスレッドをスリープ状態にするだけです。
そして、はい、それはマルチコアプロセッサにも当てはまります。マルチスレッドは必ずしもマルチコアPCを必要としないからです。単一のコアプロセッサでも複数のプロセスを処理できますね。
OSは、コアまたはそれ以上に「方向」を与えます。たとえば、Windowsは複数のコアに指示を与えることができます。Windowsは複数のプロセスを実行できます。タイムスライシングは、各プロセスにそのタスクを実行するための一定の時間を与えます。つまり、プロセスには、コアで計算を実行するための一定の時間が与えられます。Windows(この例では)はプリエンプティブであるため(Linuxも同様)、コアに配置するプロセスとその期間を決定します。これで、プロセスは複数のスレッドを持つことができます。各スレッドは、CPU上の単一の「プロセス」のようなものです。繰り返しになりますが、プリエンプティブOSは、どのスレッドをいつ実行するかを決定します。クアッド(4)コアでは、同時に実行できるプロセス/スレッドは4つだけです。シングルコアでは、4つのプロセスを実行することもできますが、一度に実行できるのは1つだけです。
例:
クアッドコアに2つのスレッドごとに4つのプロセスがある場合。Windowsは、各コアに1つのプロセスを配置することを決定できます。Windowsは、各コアがそのコアに割り当てられているプロセスの2つのスレッドを切り替えることを決定します。これで、これら2つのスレッドの1つをスリープ状態にすると、Windowsは、スレッドをスリープ状態にしたときにスレッドを切り替える必要がなくなり、1つのスレッドの実行にすべての時間を費やすことができます。同時に、他のコアにロードされた他の3つのプロセスでは、スレッドの切り替えが続行されます。
もちろん、上で要約したよりもはるかに複雑です。