14

Linux でデフォルトのスケジューリング ポリシーを使用して pthread (pthread_create) またはプロセス (fork) を作成した場合、スケジューラはプロセスとスレッドをスケジューリングする際に同じ優先度で処理しますか?

1 つのスレッドを持つプロセス P1 と 2 つのスレッドを持つプロセス P2 があるとします T1 T2

コアが 1 つしかないとします。スケジューリングは P1 T1 P1 T2 P1 T1 P1 T2 になりますか?

また

P1 T1 T2 P1 T1 T2

4

2 に答える 2

30

Linux はプロセスをまったくスケジュールしなくなりました。

カーネル内で、スレッドがスケジュールされます。プロセスの概念は、現在、主にカーネルの外側にある人工的な構造になっています。明らかに、カーネルはスレッドがどのように結び付けられているかを知る必要がありますが、スケジューリングの目的ではありません。

基本的に、カーネルは多数のスレッドを維持し、各スレッドにはスレッド グループ リーダーがあります。これは、プロセスとして外部から見られるものです。スレッドにはスレッド ID とスレッド グループ ID があります。これは、PID と PPID (プロセス ID と親プロセス ID) の関係によく似ています。

通常のスレッドを作成すると、カーネルは新しいスレッド ID を与えますが、そのスレッド グループ ID はそれを作成したスレッドのグループ ID と同じに設定されます。そうすることで、プロセス内のスレッドのように外の世界に見えます。

フォークすると、カーネルはまったく新しいスレッド ID を与え、そのスレッド グループ ID をそのスレッド ID と同じ値に設定します。そうすれば、外の世界にはプロセスのように見えます。

プロセスを報告するほとんどの非カーネル ユーティリティは、スレッド ID がスレッド グループ ID と同じであるスレッドを報告するだけです。

おそらく複雑すぎてここに入ることができない他の方法には微妙な点があります。私が上に書いたことは、(願わくば) 中レベルの優れた論文です。

P1さて、あなたの特定の質問については、スレッドが1つしかないため(ない)、どちらの場合にも当てはまりませんP1T2

カーネルでは、スレッドはP1T1P2T1ありP2T2、同じスケジューリング プロパティを持ち、同じように動作すると仮定すると(a)、そのようにスケジュールされます。


以下も参照してください。

詳細については。


(a) : スレッドが I/O でブロックを開始した場合 (カーネルは I/O が利用可能になるまでスレッドをスケジュールしません)、またはタイム カンタムを早期に解放した場合 (カーネルはおそらく、適切にプレイしたことに対する報酬として優先度を上げるでしょう) によって、明らかに変化します。しかし、彼らは同じように振る舞っていません。

于 2012-08-17T02:36:35.637 に答える