0

非プリエンプティブ スレッドについて読んでいて、プリンストン大学のスライドを見つけました。次の図が示されています。 pdf )

ここに画像の説明を入力

私が理解したことから、実行されるスレッドは最初に準備完了キューに入れられます。キューからポップすると、実行中の状態になります。別のスレッドを呼び出したい場合は、yield 関数を呼び出します。これにより、スレッドの現在の状態が保存され、キューの末尾に挿入されます。そして、キューの先頭にあるスレッドが実行されます。

スレッドがブロックされた場合 (つまり、何らかのリソースを待機している場合) はどうなりますか? 非プリエンプティブ スレッドでは、リソースを待機してから実行を続行すると考えました。

しかし、下の図からは、ブロックされた状態になり、準備完了キューに入れられているように見えますか? 何故ですか?

4

1 に答える 1

0

コメントで述べたように、非プリエンプティブとは、別のスレッドが実行中のスレッドを中断 (プリエンプト) できないことを意味し、実行中のスレッドが何かを待たなければならないときに譲歩しないことを意味します。

スレッドがメモリからのデータを待機している場合 (たとえば)、スレッドはブロックされた状態にあると言われます。そのコンテキストは保存され、コンピューティング リソース (CPU コア) で別のスレッドが実行されます。CPU のキャッシュ メモリでデータが利用可能になると、最初のスレッドはその実行を再開する準備ができていると言われます(そして、次に実行されるスレッドになり、現在実行されているスレッドがコンピューティング リソースを解放するとすぐに再開されます)。

これにより、データ移動とスレッド実行の両方をオーバーラップできるため、リソースの使用を最適化して時間を節約できます。

于 2015-10-18T20:23:40.670 に答える