yield()
を呼び出すのはそのスレッド次第です)。 (または何でも) それを実現します。非プリエンプティブ スレッドは、協調スレッドとも呼ばれます。これらの例は、POE (Perl) です。もう 1 つの例は、従来の Mac OS (OS X より前) です。協調スレッドは、CPU を放棄するまで、CPU を排他的に使用します。その後、スケジューラは実行する別のスレッドを選択します。
プリエンプティブ スレッドは、協調スレッドと同様に自発的に CPU を放棄できますが、そうでない場合は CPU が奪われ、スケジューラは別のスレッドを開始します。 POSIX および SysV スレッドはこのカテゴリに分類されます。
協調スレッドの大きな利点は、(少なくともシングルコア マシンでは) 効率が高く、同時実行の処理が簡単なことです。制御を明け渡したときにのみ存在するため、ロックは必要ありません。
プリエンプティブ スレッドの大きな利点は、優れたフォールト トレランスです。1 つのスレッドが生成に失敗しても、他のすべてのスレッドの実行が停止することはありません。また、複数のスレッドが一度に実行されるため、通常はマルチコア マシンでより適切に機能します。最後に、常に屈服していることを心配する必要はありません。これは、内部で非常に厄介な場合があります (例:大量の計算ループなど)。
もちろん、それらを混在させることもできます。 1 つのプリエンプティブ スレッドは、その内部で実行される多くの協調スレッドを持つことができます。
ノンプリエンプティブを使用する場合 プロセスが I/O を待機しているときに、プロセスがコンテキスト切り替えを実行しないという意味ではありません。ディスパッチャは、スケジューリング モデルに従って別のプロセスを選択します。プロセスを信頼する必要があります。
ノンプリエンプティブ:
<オール>コンテキストの切り替えが減り、オーバーヘッドが減ります 非プリエンプティブ モデルで賢明なことができます
シングルコアプロセッサで扱えるので扱いやすい
先制 :
利点:
<オール>このモデルでは、実行中のプロセスをより詳細に制御するのに役立つ優先順位があります
並行性の向上は跳ね返りです
システム全体をブロックせずにシステム コールを処理する
短所:
<オール>同期にはより複雑なアルゴリズムが必要であり、クリティカル セクションの処理は避けられません。
それに伴うオーバーヘッド