GNU/Linux >> Linux の 問題 >  >> Linux

プリエンプティブ スレッドと非プリエンプティブ スレッド

<オール>
  • いいえ、あなたの理解は完全には正しくありません。非プリエンプティブ (別名協調) スレッドは通常、手動で制御を譲り、他のスレッドが終了する前に実行できるようにします (ただし、yield() を呼び出すのはそのスレッド次第です)。 (または何でも) それを実現します。
  • スレッドのプリエンプトはより簡単です。協調スレッドはオーバーヘッドが少なくなります。
  • 通常はプリエンプティブを使用します。設計に多くのスレッド切り替えオーバーヘッドがある場合は、協調スレッドが最適化の候補になります。ただし、多くの (ほとんどの?) 状況では、これは最小限の利益しか得られないかなり大きな投資になります。
  • はい、デフォルトではプリエンプティブ スレッドを使用できますが、CThreads パッケージを調べてみると、協調スレッドがサポートされています。過去 10 年間に更新されたかどうかはわかりませんが、(現在) 協調スレッドを必要としている人はほとんどいません...

  • 非プリエンプティブ スレッドは、協調スレッドとも呼ばれます。これらの例は、POE (Perl) です。もう 1 つの例は、従来の Mac OS (OS X より前) です。協調スレッドは、CPU を放棄するまで、CPU を排他的に使用します。その後、スケジューラは実行する別のスレッドを選択します。

    プリエンプティブ スレッドは、協調スレッドと同様に自発的に CPU を放棄できますが、そうでない場合は CPU が奪われ、スケジューラは別のスレッドを開始します。 POSIX および SysV スレッドはこのカテゴリに分類されます。

    協調スレッドの大きな利点は、(少なくともシングルコア マシンでは) 効率が高く、同時実行の処理が簡単なことです。制御を明け渡したときにのみ存在するため、ロックは必要ありません。

    プリエンプティブ スレッドの大きな利点は、優れたフォールト トレランスです。1 つのスレッドが生成に失敗しても、他のすべてのスレッドの実行が停止することはありません。また、複数のスレッドが一度に実行されるため、通常はマルチコア マシンでより適切に機能します。最後に、常に屈服していることを心配する必要はありません。これは、内部で非常に厄介な場合があります (例:大量の計算ループなど)。

    もちろん、それらを混在させることもできます。 1 つのプリエンプティブ スレッドは、その内部で実行される多くの協調スレッドを持つことができます。


    ノンプリエンプティブを使用する場合 プロセスが I/O を待機しているときに、プロセスがコンテキスト切り替えを実行しないという意味ではありません。ディスパッチャは、スケジューリング モデルに従って別のプロセスを選択します。プロセスを信頼する必要があります。

    ノンプリエンプティブ:

    <オール>
  • コンテキストの切り替えが減り、オーバーヘッドが減ります 非プリエンプティブ モデルで賢明なことができます

  • シングルコアプロセッサで扱えるので扱いやすい

  • 先制 :

    利点:

    <オール>
  • このモデルでは、実行中のプロセスをより詳細に制御するのに役立つ優先順位があります

  • 並行性の向上は跳ね返りです

  • システム全体をブロックせずにシステム コールを処理する

  • 短所:

    <オール>
  • 同期にはより複雑なアルゴリズムが必要であり、クリティカル セクションの処理は避けられません。

  • それに伴うオーバーヘッド


  • Linux
    1. Linux のプロセスあたりの最大スレッド数は?

    2. スレッドには個別のヒープがありますか?

    3. NPTL スレッドと POSIX スレッドの違いは何ですか?

    1. Renice:すべてのスレッドを変更するには?

    2. Linux カーネル スレッドは本当にカーネル プロセスですか?

    3. ps は Linux でカーネル以外のプロセスのみを表示できますか?

    1. 非 SUSE ディストリビューション用の YaST のようなもの

    2. スレッドは Linux でプロセスとして実装されますか?

    3. スレッドの「バランスを取る」ことを試みる必要がありますか、それとも Linux がこれを行いますか?