スレッドのみが予約されている場合、プロセスはどのように状態を持つことができますか(WindowsおよびLinux)。
- プロセスを作成するとしましょう。人
- ワイヤーT1今割り当てられました
- T1これで実行可能な状態です。
- スケジューラの選択T1そして動作するように設定人
- 新しいスレッドT2実行可能に作成および表示
- スケジューラの選択T2別のCPUコアに引き渡してください
- T1これでユーザー入力を待ちます。T2それでも他のコアで実行中
状態は何ですか人ブロック/実行?
プロセスの状態を決定するロジックは何ですか?
答え1
スレッドは既存のプロセスと同じ継承属性を共有しません。
少なくともPOSIXでは、スレッドは互いにピア*と見なされます。単一のプロセスでスレッドを作成すると、P1というコンテナの同じメモリ領域(およびアカウントスペース)にバインドされた2つのスレッドT1とT2があります。
これは実際にプログラム設計者に混乱を招く可能性があります。特に、信号が到着すると、最初に生成された最初のスレッドだけでなく、すべてのスレッドまたはすべてのスレッドが階層内で同じ「同じ」レベルにあるため、信号を受信できるためです。その他。
提示した例には、実際には3つのスレッドがあります。 T1(つまり、P1)、T2、およびT3(2つの生成されたスレッド)
P1(T1)の状態は、実行可能、スリープ、実行中、または他のスレッドを特に待たない限り、他の状態である可能性があるため、定義されません。
スレッドとプロセスの関係を理解するには、下の図を参照してください。
pthread_create()
┌──Pid┼P1──┐ ┌──Pid┼P1──┐
│ │ clone(...CLONE_THREAD...) │ │
│ Thread T1│ clone(...CLONE_THREAD...) │ Thread T1│
│ │ ... │ Thread T2│
│ │ clone(...CLONE_THREAD...) │ ... │
│ │ ─────────────────────────────► │ Thread TN│
└──────────┘ └──────────┘
─────────────────────────────────────────────────────────────────
fork()
┌──Pid┼P1──┐ ┌──Pid┼P1──┐
│ │ clone() │ Thread T1│ ...
│ Thread T1│ clone() └──────────┘
│ │ ...
│ │ clone() ┌──Pid┼P2──┐ ┌──Pid┼PN──┐
│ │ ───────────► │ Thread T1│ │ Thread T1│
└──────────┘ └──────────┘ └──────────┘
PIDは、実際には内部で同じリソースを共有するすべてのスレッドを記録して記述するコンテナです。 **
実行するほとんどのPIDには、内部にスレッド(技術的には実行可能なコンテキスト)があります。新しいスレッドを作成したら、同じPIDコンテナ内で2つの実行可能なコンテキストを宣言するだけです。
これにより、fork()
新しいコンテナとその中に新しいスレッドが作成されます。
*完全なPIDの動作を再説明する特定の呼び出しのみを許可する「基本」スレッド(プロセスの初期スレッド)があります。これは階層に最も近いものです。
**説明を明確にするために、スレッドとプロセスの基本的な特性を説明するために、スレッドの他の多くの属性と共有項目、プロセス階層、および共有項目を無視しました。