WindowsとDebian / Red Hatが最近のバージョンでどのようなスレッド管理を使用しているか知る必要があります。
私は彼らが1対1のスレッド管理モデルを使用していたことを知っています。彼らは今でもこのモデルを使用していますか?または、彼らはそれを変えましたか?
WindowsとDebian / Red Hatが最近のバージョンでどのようなスレッド管理を使用しているか知る必要があります。
私は彼らが1対1のスレッド管理モデルを使用していたことを知っています。彼らは今でもこのモデルを使用していますか?または、彼らはそれを変えましたか?
回答:
win32 APIは、1対1モデルと多対多モデルの両方をサポートしています(それぞれスレッドライブラリとファイバーライブラリで)。
Windows 7は、すべてのNTファミリと同様に、win32 APIをサポートしています。
Windows 7はカーネルスレッドをサポートしています。したがって、1対1モデルまたは多対多モデルでなければなりません。しかし、実際には両方のモデルをサポートするハイブリッドです。デフォルトでは、従来の1対1のスケジューリングを使用しますが、OSで使用可能なスケジューリングエンティティの数(プロセッサーとコアの数に基づく)に応じて、多対多のスケジューラーに強制できます。オペレーティングシステム自体が自動的にシフトすることはありません。明示的に指示する必要があります。
Windows 7の32ビットバージョンはM:Nスケジューリングをサポートしていないことに注意してください。64ビットバージョンのみ。
Linuxは、WindowsがファイバーAPIを介して行うのと同様に、RIBS2などのライブラリを介してM:Nもサポートできます。
以前は選択肢が1つしかなかったのに対し、スレッドスケジューリングを最適化するオプションがあるため、ハイブリッドは常に優れています。しかし、多対多のスケジューラを実際に活用することは、まったく別の問題です。非常に多くのスレッドの必要性と実際に何をしているのかに大きく依存します。ただし、非常に多数のスレッドを作成する必要がある高性能プロジェクトには関与したことがないため、正確な詳細はわかりません。ただし、スレッドのプログラミングは簡単になりますが、スレッドの管理は難しくなります。特に、テスト段階で多くの時間を費やして、より複雑なスケジューラーに合わせてスレッドを最適化しようとしています。
Windows 7より前は、Windowsは1対1のユーザースレッドとカーネルスレッドの関係を使用していました。もちろん、大まかな1対1のユーザースケジューラーをつなぐことは常に可能でした(これは、ほとんどすべてのOSでユーザーレベルのタイマー割り込みを使用して実行できます)が、システムコールがユーザースレッドのいずれかでブロックされると、ブロックされますカーネルスレッドに応じて、同じスケジューラ上の他のすべてのユーザースレッドをブロックします。当然、多対1モデルではSMPを利用できません。
Windows 7では、Microsoftはユーザーモードスケジューリングのサポートを導入しました。プログラムは、1つまたは複数のカーネルスレッドをスケジューラとして構成し(必要な論理プロセッサごとに1つ)、これらのUMSを引き出すことができるユーザーモードスレッドプールを作成できます。カーネルは、カーネルスレッドをブロックせずにUMSの実行を継続できる未処理のシステムコールのリストを保持しています。この構成は、多対一または多対多として使用できます。