4. Linuxのカーネルレベルのスレッドと、ユーザレベルスレッド
POSIXスレッドのスケジューリングは、ハイブリッドモデルは、カーネルレベルのスレッドのための両方のユーザー・レベルのサポートをサポートしています。あなたがスレッドcontentionscopeプロパティを作成するときに設定することができます。
- PTHREAD_SCOPE_PROCESS。それはそれの過程で他のスレッド、同等のユーザーレベルのスレッドと競合するために新たに作成されたスレッドプロセッサのリソースを表します。
- PTHREAD_SCOPE_SYSTEM。カーネルレベルのスレッドのような説明のスレッドは、新たに同じプロセッサシステム全体のスコープ内のリソースの競合を作成しました。
(1)カーネルレベルのスレッド
- スレッドの作成、撤退やハンドオーバ、我々はスレッドをスケジュールすることができるよう、各事業体のコア理解を実現するためにカーネルに指示する必要があります。
- これらのスレッドは、システム全体のリソースの競合することができます。
- スレッド制御ブロック(TCB)、制御ブロックに基づいてカーネルを設け、糸の存在を感知し、カーネル空間カーネルレベルのスレッドの各々に対する制御を行います。
- ユーザーモードから変換されたスレッドの切り替えは、モードをカーネルにカーネルによってカーネルを切り替える制御を行います。ユーザ・モード・カーネルモードへの完全な復帰の切り替え、マルチコアCPUを使用して、SMP、即ちの良い使用することができます。
プロセスはある程度似ている、ちょうどスケジューリングプロセスよりも少し高価なを作成します。誰かが1:10のコストに費やされた時間よりも、スレッドとプロセスを作成するための実験を行いました。カーネルレベルスレッド作成コード次のように:のpthread_attr_tのATTRと、pthread_attr_init(&ATTR); //カーネルレベルのスレッドを設定して、より高い応答速度pthread_attr_setscope(&ATTR、PTHREAD_SCOPE_SYSTEM)を得る; //スレッドRET =のpthread_create(&iAcceptThreadIdを作成し、&ATTR、AcceptThread 、NULL);
(2)ユーザレベルスレッド
利点
- カーネルリソースの割り当ては、まだプロセスに従って割り当てられ、各ユーザスレッドは、プロセスだけでリソースの競合することができます。
- ユーザレベルスレッドを切り替えると、(スレッドのスケジューリング非常に高速になりメモリキャッシュを、リフレッシュする必要はありません、コア、無コンテキストスイッチに陥る必要はありません)速い少なくとも一桁以上のカーネルに切り替えるなどスレッドとして、ユーザ空間で行われます。プロセスと手順は、ローカル・プロシージャ・コールであるため、スレッドを作成し、破壊し、そのようなスレッド管理のコストなどの費用を切り替えるスレッドがカーネルスレッド、保存のスレッドの状態よりもはるかに少ないです。
- カーネルとユーザーがスレッドを見ることができません。 - >重要な違い
- ユーザーレベルのスレッドがスケーラビリティを持って、スレッドがカーネルスレッドの数ならば、カーネルスレッドが、カーネル空間で、いくつかの固定テーブルスペースおよびスタックスペースを必要とするため、これは、カーネルレベルのスレッドよりも、テーブルスペースおよびスタックスペースを活用することができます非常に大きな問題があるでしょう。
- スレッドをサポートしていないオペレーティングシステムで実現することができます。
- 各プロセスは、独自のスケジューリングアルゴリズムをカスタマイズすることができ、より柔軟なスレッド管理。これは、カーネルスレッド間の差を、独自の管理手順を記述する必要があります。
- スケジュールは、カーネルに直接関与スレッド、単純な制御を必要としません。
短所:
- スレッドがブロックされ、プロセスは、すべての他のスレッドをブロックします。
- スレッドが実行されている場合、プロセス内の他のスレッドが最初のスレッド免除CPUれない限り実行されません。なぜなら、単一のプロセス内で、クロックを中断することなく、それがスレッドスケジューリングモード、マルチコアCPUのない良好な使用のラウンドロビン(回転)は使用されません。
ユーザーレベルのスレッド次のようにコードを作成するために:のpthread_attr_tのATTRと、pthread_attr_init(&ATTR ); // 設定されたユーザレベルスレッドpthread_attr_setscope(&ATTR、PTHREAD_SCOPE_PROCESS); // 作成スレッドRET =のpthread_create(&iAcceptThreadId、& ATTR、AcceptThread、NULL); だけLinuxThreadsのPTHREAD_SCOPE_SYSTEMを実現、すなわち、Linuxはカーネルレベルのスレッドを提供します。次の手順は、結果を観察することができます実行します。プログラムは、4つのユーザレベルスレッド(0-3)と4人のカーネルレベルのスレッド(4-8)が、ビューの動作結果、ほぼ等しい時間を実行している各スレッドを作成します。Linuxは、ユーザーレベルのスレッドを達成する場合は、スレッド(0-3)の実装は、より多くの時間を必要とします。可視は、Linuxでのユーザレベルスレッドを実装していません。
書式#include <stdio.hに> 書式#include <stdlib.h>に含ま 書式#include <pthread.hの> 書式#include <unistd.h> 書式#include <TIME.H> int型のn; // 共有変数、共有変数の使用は、設計を簡素化するために、相互に排他的であることが、 // このプログラムは、相互に排他的な問題とはみなされません。(未相互排他メカニズム)、 無効 *楽しい(ボイド *のID){ int型 I、J、I = 0、NUM = 0 ; time_tトン。 時間(&T)。 printf(" T%sの:[スタート] ... \ N "、(CHAR * )のid); 用(i = 0 ; iは< 100 ; iは++ ){ 用(J = 0 ; J < 10000000 ; J ++ ){ 和 + = 1 ; } } N ++ ; printf(" T%sは、時間:%LDを\ n "、(CHAR *)ID、時間(NULL) - T)。 } チャー時間[ 8 ] [ 2 ]。 INT(メインボイド){ がpthread_tのT [ 8 ]。 int型私は、 pthread_attr_t attrの、 pthread_attr_init( &ATTR); // ユーザレベルスレッドを設定します。 pthread_attr_setscope( &ATTR、PTHREAD_SCOPE_PROCESS)。 用(i = 0 ; iは< 4 ; iは++ ){ 時間[i]が[ 0 ] = 48 + iが、 pthread_create(&T [i]は、&ATTR、楽しい、&TID [I])。 } //は高い応答速度を得るために、カーネルレベルのスレッドを設定する (pthread_attr_setscopeを&ATTR、PTHREAD_SCOPE_SYSTEM)。 以下のための(I = 4 ; iは< 8 ; iは++ ){ 時間[i]が[ 0 ] = 48 + iが、 pthread_create(&T [i]は、&ATTR、楽しい、TID [I])。 } しばらく(!N = 8 ); リターン 0 ; }
gccのtest2.c -o test2と-lpthread
結果:
./ $のxianchenのTEST2 T1:スタート... T5:開始... T2:スタート... T7:[スタート... T0:[スタート... T4:[スタート... T6:[スタート... T3:[スタート... T2、時間:2 T5、時間:3 T6、時間:3 T3、時間:3 T4、時間:3 T7、時間:3 T1、時間:3 T0、時間:3 T0、時間:3