私が受講したオペレーティングシステムのコース(このプロセスで扱ったオペレーティングシステムはLinuxでした)で、次のようなことを聞きました。
プロセスには、どのプロセスが実行されるかを決定する優先順位の値があります。
優先順位の値は、プロセススケジューリングアルゴリズムによって決定されます。
スレッドには優先順位の値はなく、アルゴリズムによって予約されていません。
一方、各スレッドにはスレッド優先順位、識別子、予約パラメータ、スタックサイズなどの属性があることがわかりました。さらに、マルチスレッドシステムにはスレッドスケジューリングアルゴリズムがあります。
どちらが本当ですか?
答え1
まあ、定義によって異なります。異なるシステムは異なるルールを持つことも、同じ名前が異なる場合もあります。
これPOSIX定義はプロセスですアドレス空間(プロセスに表示されるメモリ)として識別され、ほとんどのオペレーティングシステムリソースはプロセスに属します。 (プロセスID(当然)、ユーザーID、作業ディレクトリ、ファイル記述子...)
一方、スレッドを定義しますランタイム環境(CPUレジスタ、浮動小数点状態)を含むプロセス内の「制御フロー」として、そしてたとえば、予約の優先順位です。
したがって、通常はプロセス<->リソース、スレッド<->スケジューリングです。
しかし、必ずしもそうする必要はありません。 Linuxでは、プロセスとそのサブプロセスが共有するリソースには、次の方法でアクセスできます。clone(2)
システムコールしたがって、少なくともファイルディスクリプタを共有するがアドレス空間が異なる2つのプロセスがあるようです。あるいはその逆も。
また、過去には、Linuxは実際にプロセスとスレッドを正確に区別できず、カーネルレベルのプロセスのみを区別していました。 (技術的に私たちが一般的にスレッドだと思うものをカーネルでは依然として「プロセス」といい、一般的な意味のプロセスを「プロセスグループ」といいます。)
特定の種類のスレッドは、オペレーティングシステムのサポートなしでユーザースペースでのみ実装できます。この場合、オペレーティングシステムスケジューラはスレッドが存在するかどうかわからないので、スレッドはプロセスと同じシステムによって予約されません。ただし、この場合でも、ユーザー空間の実装には実行するスレッドを決定する方法が必要です。 (ユーザー空間スレッドの実装は、適切なスレッドを実装するシステムでは使用されなくなりましたが、これが私が考えることができる唯一のケースであり、3番目の点に近いです。)