Linuxでのpthreadの実装について質問があります。
プロセスに5つのスレッドがあるとします。ここで、スケジューラーはこれらのスレッドをどのように認識しますか(またはまったく認識しません)。たとえば、スケジューラーが呼び出されると、メインプロセスのみをスケジュールし、次に各スレッド間でスケジュールするメインプロセスの責任を果たしますか。
または、その逆の場合、スケジューラーは各スレッドを個別のプロセスであるかのようにスケジュールします。
Linuxでのpthreadの実装について質問があります。
プロセスに5つのスレッドがあるとします。ここで、スケジューラーはこれらのスレッドをどのように認識しますか(またはまったく認識しません)。たとえば、スケジューラーが呼び出されると、メインプロセスのみをスケジュールし、次に各スレッド間でスケジュールするメインプロセスの責任を果たしますか。
または、その逆の場合、スケジューラーは各スレッドを個別のプロセスであるかのようにスケジュールします。
最新のLinux(NPTL pthread実装)の場合、スケジューラーはスレッドをスケジュールします。スレッドは「軽量プロセス」と見なされます。pthread_createは、cloneシステムコールの観点から実装されています。
Linuxは、スコープがPTHREAD_SCOPE_SYSTEMのプロセスであるかのように、すべてのスレッドをスケジュールします。nptl実装は、複数のCPUを利用できます。
Loganが言ったように、すべてのスレッドは独立してスケジュールされます。
ただし、必要に応じて、Linuxプロセス制御グループを使用してスレッドのグループをスケジュールすることもできます。
プロセス制御グループは、スケジューリングを少し非効率的にしますが、はるかに公平になる可能性があります。
非常に人気のある用途の1つは、各TTYによって作成されたすべてのプロセスとスレッドをTTYごとのコントロールグループに入れることです。これにより、ユーザーのすべてのグラフィカルアプリケーションは、ターミナルウィンドウで起動した24スレッドのカーネルコンパイルと同じレベルでスケジュールされます。グラフィックアプリケーションは50%を取得し、コンパイルは50%を取得します。彼が別のターミナルウィンドウを開き、別の24スレッドでglibcのコンパイルを開始すると、33%のデスクトップアプリケーション、33%のカーネルコンパイル、33%のglibcコンパイルに移行します。