web-dev-qa-db-ja.com

pthreadスケジューリング(システムおよびプロセス)

私は、abraham silberschatzによって書かれたオペレーティングシステムの概念の第8版を読みました。ただし、Pthread Schedulingは理解できません。


  • スレッドライブラリは、LWP(軽量プロセス)でユーザーレベルのスレッドをスケジュールします。

    同じプロセスに属するスレッド間で競合が発生するため、これはプロセス競合スコープ(PCS)です。


  • OSは、CPUのカーネルスレッドをスケジュールします。

    これは、システムに属するすべてのスレッド間で競合が発生するため、システム競合スコープ(SCS)です。


enter image description here


PCSはユーザーレベルのスレッドに対応し、SCSはカーネルレベルのスレッドに対応していると思いました。

しかし、次のコードはスレッドモードをユーザーモードとして設定しています。

pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);

カーネルモードではなく、なぜユーザーモードなのかわかりません。これを知っている人に教えてください、読んでくれてありがとう。

6
Danny_Kim

プロセス間(ユーザー)スペース、プロセス内スレッド、およびシステムスペースを混乱させていると思います。それでは、いくつかの定義から始めましょう。

スレッドはプロセスに属しています。プロセスは、ユーザー空間とシステム空間内で実行できます。プロセスがどのスペースに属しているかは、それがどのように呼び出されるかによって決まります。

システム空間は最低レベルになる傾向があり、保護されたプロセスまたはカーネルプロセスが実行される場所です。通常、これらはシステム自体が所有しています。

ユーザー空間はより高いレベルになる傾向があり、特権プロセスが少なくなります。

プロセス間(ユーザー)スペースのスレッドは、個別のプロセスに属するスレッドと考えることができます。

プロセス内スレッドは、単一のプロセスに属するスレッドと考えることができます。そして、そのプロセスはユーザーまたはシステム空間で実行されている可能性があります。


だからあなたが呼び出すとき:

pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);

実際に行っているのは、スレッドをその呼び出しプロセスの残りの部分から移動させ、ユーザー空間に移動させることです。事実上、それはスレッドを新しいプロセスにし、forkと同等ですが、私はその点について肯定的ではないので、引用しないでください。

あなたの混乱は_SYSTEMその定義の一部。ただし、オペレーティングシステムは、プロセスがユーザー空間からシステム空間に移動できることを必ずしも必要とはしません。これは、そのプロセスに望ましくない特権昇格が発生する可能性があるためです。カーネルは(カーネルの観点から)歴史的にゴミであることが証明されているため、ユーザー空間プロセスを信頼しません。

別の言い方をすると、それはpthread_attr_setscope呼び出しでは、PCSからSCSに移動できません。


man page は、これを理解するのに少し役立ちます。

PTHREAD_SCOPE_SYSTEM
スレッドは、リソースと競合します同じスケジューリング割り当てドメインにあるシステム上のすべてのプロセスの他のすべてのスレッド(1つ以上のプロセッサのグループ)。 PTHREAD_SCOPE_SYSTEMスレッドは、スケジューリングポリシーと優先順位に従って、相対的にスケジュールされます。

強調を追加

私が強調した部分の最後の節に注意してください: "同じスケジューリング割り当てドメインにあります"。また、別のスケジューリング割り当てドメインに切り替えることができることについては触れていません。

3
user53019

マニュアルページによると:

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 からコピーされました。コメントを書いた直後に見つかりました。

0
mLstudent33