web-dev-qa-db-ja.com

IOを待機しているスレッドもコアをブロックしますか?

計算の同期/ブロッキングモデルでは、通常、実行スレッドはIOタスクが完了するのを待つ間待機します(ブロック)。

私の質問は、これにより通常、スレッドを実行しているCPUコアがアイドル状態になるのか、それともIOで待機しているスレッドがコンテキストスイッチアウトされ、IOまで待機状態になるのかということです。 _処理する準備はできていますか?

16
JamieP

CPUコアは通常、特定の実行スレッド専用ではありません。カーネルは、CPUの内外で実行されているプロセスを絶えず切り替えています。 CPUによって現在実行されているプロセスは、「実行中」の状態です。順番を待っているプロセスのリストは「準備完了」状態です。カーネルはこれらを非常に迅速に切り替えます。最新のCPU機能(マルチコア、同時マルチスレッディングなど)は、物理的に一度に実行できる実行スレッドの数を増やしようとします。

プロセスがI/Oブロックされている場合、カーネルはプロセスを脇に置いて(「待機中」状態にします)、CPUで時間を与えることさえ考慮しません。 I/Oが終了すると、カーネルはブロックされたプロセスを「待機中」状態から「準備完了」状態に移行し、CPUで順番(「実行中」)を実行できるようにします。

したがって、ブロックされた実行スレッドは、それだけをブロックします。実行スレッドです。 CPUとCPUコアは、引き続き他の実行スレッドを切り替えて切り替え、アイドル状態ではありません。

20
e0k

非同期ではないと仮定すると、その場合、スレッドを所有しているスレッドは確実に待機キューに入れられ、状態は「待機中」になります。

コンテキストスイッチに関しては、IMO、コンテキストスイッチという用語は多くのことを意味/関与する可能性があるため(スワップイン/アウト、ページテーブルの更新、レジスタの更新など)、もう少し説明が必要な場合があります。現在の実行状態によっては、IO操作でブロックされたスレッドがまだ待機している間に、同じプロセスに属する2番目のスレッドが実行されるようにスケジュールされる可能性があります。

たとえば、コンテキストスイッチングは、コアに関するCPUのレジスタ値の変更に制限される可能性があります(ただし、メモリがあまり残っていない場合は、所有プロセスがスワップアウトされる可能性もあります)。

0
stdout

標準的な方法で使用されるほとんどのプログラミング言語の場合、答えはスレッドをブロックしますが、CPUはブロックしないということです。

CPU全体をブロックするには、1つのスレッドの特定のスレッド(アフィニティ)用にCPUを明示的に予約する必要があります。より明確にするには、これを参照してください 質問

すべてのプロセスでSetProcessAffinityMaskを呼び出すことができますが、プロセスに「属する」コアのみを除外するマスクを使用して、このコアでのみ実行するように設定するためにプロセスで使用できます(または、さらに良いことに、SetThreadAffinityMaskだけタイムクリティカルなタスクを実行するスレッド上)。

0
DevShark