私はLinuxスケジューラのスケジューリングプロセスについて何度も読みました。私はマルチスレッドプログラミングプロセスを教えていますが、用語を知りたいです。私は(以下に書かれた)一つのことを言いたいと思います。誰かが私が最悪のエラーを解決するのに役立つことを願っています。
これはスケジューラがスケジュールしたプロセスではありません。ワイヤー プロセスに関連しています。プロセスはメモリマップされたセグメントの束なので、静的です。私たち
pthread_create()
または(ほとんどは正確ではありませんが)プロセスに複数のスレッドがあり、予約済みのスレッドである場合は、これをはっきりと見ることができますclone()
。それ以外の場合は、他のスレッドよりもプロセススレッド(PID = TID)を予約するだけです。あいまいさは、すべてのプロセスに少なくとも1つの実行スレッドがあるという事実によって引き起こされます。
これが正しい(簡単ですが)絵ですか?
答え1
次のようにしてみてください。
すべてのプロセスは1つのスレッドで始まりますpthread_create
。 (この方法で作成されたすべてのプロセスのスレッドは同じアドレス空間を共有します。)カーネルのスケジューラは、プロセスの「デフォルト」/初期スレッドであれ他のスレッドであっても、これらのスレッドで動作します。本質的にスケジューラと同じです。違いはありません。コメント。
Linuxには元のスレッドが全くなく、プロセスだけがありました。したがって、歴史的な理由で「CPUジョブ」をスケジュールするオペレーティングシステムの部分は、しばしばプロセススケジューラと呼ばれます。 (これはLinuxに限定されておらず、ほとんどの(すべての)Unix型システムに当てはまります。スレッドスケジューラはまったく一般的な用語ではありません。)
名前空間全体をすでに説明していない限り、この時点では言及しませんclone
。vfork
答え2
Linuxカーネルでは、Linuxはすべてのスレッドを標準プロセスとして実装するため、スレッドの概念はありません。
Linuxカーネルは、スレッドを表す特別なスケジューリングの意味やデータ構造を提供しません。
一方、スレッドは特定のリソースを他のプロセスと共有するプロセスにすぎません。各スレッドには独自のtask_structがあり、通常のプロセスのようにカーネルに表示されます。スレッドは、アドレス空間などのリソースを他のプロセスと共有することが発生します。
Linuxの場合、スレッドはプロセス間でリソースを共有する方法です。たとえば、4つのスレッドで構成されるプロセスがあるとします。 Linuxには4つのプロセスしかないので、一般的なtask_struct構造も4つあります。これら 4 つのプロセスは、特定のリソースを共有するように設定されます。
カーネルスレッド(カーネルスペースにのみ存在)の場合、カーネルスレッドと通常のプロセス/スレッドの唯一の違いは、カーネルスレッドにアドレススペースがないことです。カーネル空間でのみ実行され、ユーザー空間にコンテキストを切り替えません。