まあ、。
そのスレッドは自由に行き、他のスレッドをプロセスに属しています。
スレッドを持たないプロセスについて話すのはほとんど意味がありません。これは、そのプロセスに対してコードが実行されていないことを意味しています。
たとえば、Linuxカーネルでは、プロセスの作成は新しいスレッドを作成する場合と少し異なります。これは、カーネルがプロセスではなくスレッドをスケジュールするためです。
プロセスは、同じスレッドグループID(TGID)を持つスレッドのグループとみなされます。そのTGIDは、そのプロセス用に作成された最初のスレッドのスレッドID(TID)です。
あなたfork
またはvfork
またはclone
(CLONE_THREAD
なし)、新しいTIDとTGIDを持つ新しいスレッドを得ることTIDに設定されている - それは、新しいプロセスです。
clone
にCLONE_THREAD
と入力すると、新しいTIDを持つ新しいスレッドが作成されますが、TGIDはクローンと同じままです。これは同じプロセス内の別のスレッドです。
Linux(例として)は、スケジューラを複雑にしなくてもプロセスとスレッドを区別する方法です。スケジューラは、必要に応じてスレッドグループを完全に無視することができます。それは実際に信じられないほど賢いです。
スケジューラの外側でコード化する場合、同じTGIDを持つスレッドのグループはプロセスと見なされます。
スレッドにプロセスがどのようにグループ化されているかなど、信号配信や終了コードなどに影響するため、これにはユーザスペースコードとのカーネルの他のビットが含まれます。
だから1つのタスクを行うには、スレッドが必要ですか?スレッドなしのプロセスのみを使用して単一のタスク(複数のタスクではない)を実行することはできません。右? – Harish
@ハリッシュ、はい、_something_が実行されている必要があります。 OSが実行可能プロセスと実行可能スレッドを区別する可能性はありますが、私はこれをユーザモードのスレッド(スレッド化がOSによってまったく行われていないスレッド)以外は見たことがありません。一般に、プロセスには1つ以上のスレッドがあります。 – paxdiablo
@ paxdiablo、私はこの部分について疑問を抱いていました。「スケジューラはスレッドグループを完全に無視することができます。スケジューラは、コンテキスト切り替え(正確には状態を保存する)のためスレッドグループを無視できないという印象を受けました。あなたはもう少し詳しく説明できますか? –