私は、abraham silberschatzによって書かれたオペレーティングシステムの概念の第8版を読みました。ただし、Pthread Schedulingは理解できません。
スレッドライブラリは、LWP(軽量プロセス)でユーザーレベルのスレッドをスケジュールします。
同じプロセスに属するスレッド間で競合が発生するため、これはプロセス競合スコープ(PCS)です。
OSは、CPUのカーネルスレッドをスケジュールします。
これは、システムに属するすべてのスレッド間で競合が発生するため、システム競合スコープ(SCS)です。
PCSはユーザーレベルのスレッドに対応し、SCSはカーネルレベルのスレッドに対応していると思いました。
しかし、次のコードはスレッドモードをユーザーモードとして設定しています。
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
カーネルモードではなく、なぜユーザーモードなのかわかりません。これを知っている人に教えてください、読んでくれてありがとう。
プロセス間(ユーザー)スペース、プロセス内スレッド、およびシステムスペースを混乱させていると思います。それでは、いくつかの定義から始めましょう。
スレッドはプロセスに属しています。プロセスは、ユーザー空間とシステム空間内で実行できます。プロセスがどのスペースに属しているかは、それがどのように呼び出されるかによって決まります。
システム空間は最低レベルになる傾向があり、保護されたプロセスまたはカーネルプロセスが実行される場所です。通常、これらはシステム自体が所有しています。
ユーザー空間はより高いレベルになる傾向があり、特権プロセスが少なくなります。
プロセス間(ユーザー)スペースのスレッドは、個別のプロセスに属するスレッドと考えることができます。
プロセス内スレッドは、単一のプロセスに属するスレッドと考えることができます。そして、そのプロセスはユーザーまたはシステム空間で実行されている可能性があります。
だからあなたが呼び出すとき:
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
実際に行っているのは、スレッドをその呼び出しプロセスの残りの部分から移動させ、ユーザー空間に移動させることです。事実上、それはスレッドを新しいプロセスにし、fork
と同等ですが、私はその点について肯定的ではないので、引用しないでください。
あなたの混乱は_SYSTEM
その定義の一部。ただし、オペレーティングシステムは、プロセスがユーザー空間からシステム空間に移動できることを必ずしも必要とはしません。これは、そのプロセスに望ましくない特権昇格が発生する可能性があるためです。カーネルは(カーネルの観点から)歴史的にゴミであることが証明されているため、ユーザー空間プロセスを信頼しません。
別の言い方をすると、それはpthread_attr_setscope
呼び出しでは、PCSからSCSに移動できません。
man page は、これを理解するのに少し役立ちます。
PTHREAD_SCOPE_SYSTEM
スレッドは、リソースと競合します同じスケジューリング割り当てドメインにあるシステム上のすべてのプロセスの他のすべてのスレッド(1つ以上のプロセッサのグループ)。 PTHREAD_SCOPE_SYSTEMスレッドは、スケジューリングポリシーと優先順位に従って、相対的にスケジュールされます。
強調を追加
私が強調した部分の最後の節に注意してください: "同じスケジューリング割り当てドメインにあります"。また、別のスケジューリング割り当てドメインに切り替えることができることについては触れていません。
マニュアルページによると:
LinuxはPTHREAD_SCOPE_SYSTEM
をサポートしていますが、PTHREAD_SCOPE_PROCESS
はサポートしていません
そして、glibcの実装を見てみると:
0034 /* Catch invalid values. */
0035 switch (scope)
0036 {
0037 case PTHREAD_SCOPE_SYSTEM:
0038 iattr->flags &= ~ATTR_FLAG_SCOPEPROCESS;
0039 break;
0040
0041 case PTHREAD_SCOPE_PROCESS:
0042 return ENOTSUP;
0043
0044 default:
0045 return EINVAL;
0046 }
この回答は https://unix.stackexchange.com/questions/287568/pthread-scheduler-scope-variables からコピーされました。コメントを書いた直後に見つかりました。