ここで質問に対する答えを見つけました。しかし、私は答えのいくつかのアイデアを理解していません。たとえば、軽量プロセスは、その論理アドレス空間を他のプロセスと共有すると言われています。どういう意味ですか?2つのスレッドで同じ状況を理解できます。どちらも1つのアドレス空間を共有しているため、両方ともbssセグメントから任意の変数を読み取ることができます(たとえば)。しかし、bssセクションが異なる多くの異なるプロセスがあり、それらすべてを共有する方法がわかりません。
8 に答える
ここで答えが正しいかどうかわからないので、私のバージョンを投稿させてください。
プロセスには違いがあります-LWP(軽量プロセス)とユーザースレッド。プロセス定義は多かれ少なかれ知られているので脇に置いておき、に焦点を当てますLWP vs user threads
。LWPは、本質的に今日のスレッドと呼ばれるものです。もともと、ユーザースレッドとは、アプリケーション自体によって管理されるスレッドを意味し、カーネルはそれについて何も知りません。一方、LWPは、カーネルによるスケジューリングと実行の単位です。
例:システムで他に3つのプロセスが実行されており、スケジューリングが優先順位のないラウンドロビンであると仮定します。そして、1つのプロセッサ/コアがあります。
オプション1。1つのLWPを使用する2つのユーザースレッドがあります。つまり、OSの観点からは、1つのスケジューリングユニットがあります。合計で4つのLWPが実行されています(他の3つとあなたの1つ)。LWPは合計CPU時間の1/4を取得し、2つのユーザースレッドがあるため、それぞれが合計CPU時間の1/8を取得します(実装によって異なります)
オプション2。2つのLWPがあります。OSの観点からは、2つのスケジューリングユニットがあります。合計で5つのLWPが実行されています。LWPはそれぞれ合計CPU時間の1/5を取得し、アプリケーションはCPUの2/5を取得します。
もう1つの大まかな違い-LWPにはpid(プロセスID)がありますが、ユーザースレッドにはありません。
何らかの理由で、名前付けはほとんど混乱せず、LWPをスレッドと呼びます。
間違いなくもっと違いがありますが、スライドを参照してください。 http://www.cosc.brocku.ca/Offerings/4P13/slides/threads.ppt
編集:
投稿した後、私はすべてをより詳細に説明し、私が書くよりも英語が上手な良い記事を見つけました。 http://www.thegeekstuff.com/2013/11/linux-process-and-threads/
MSDN、スレッドとプロセスから:
プロセスはオペレーティングシステムに存在し、ユーザーがプログラムまたはアプリケーションとして見るものに対応しています。一方、スレッドはプロセス内に存在します。このため、スレッドは軽量プロセスと呼ばれることもあります。各プロセスは、1つ以上のスレッドで構成されます。
Tanenbaumの著書「DistributesSystems」に基づいて、軽量プロセスは一般に、ユーザーレベルのスレッドとカーネルレベルのスレッドのハイブリッド形式と呼ばれます。LWPは単一のプロセスのコンテキストで実行され、プロセスごとに複数のLWPが存在する可能性があります。さらに、各LWPは独自の(ユーザーレベルの)スレッドを実行できます。マルチスレッドアプリケーションは、(スレッドライブラリパッケージを使用して)スレッドを作成し、続いて各スレッドをLWPに割り当てることによって構築されます。
このハイブリッドアプローチを使用する最大の利点は、スレッドの作成、破棄、および同期が比較的安価であり、カーネルの介入を必要としないことです。さらに、プロセスに十分なLWPがある場合、システムコールをブロックしてもプロセス全体が中断されることはありません。
IMO、LWPは、ユーザーコンテキストで作成および実行できるカーネルスレッドバインディングです。
私が間違っていなければ、ユーザースレッドを単一のLWPに接続して、システムコールを伴わずに同時実行性のレベルを上げることができます。
スレッドは基本的に、特定のタスクを実行するために1つの目標と十分な情報が割り当てられたタスクです。プロセスは、その作業を可能な限り高速に実行するために複数のスレッドを作成できます。たとえば、プログラムの一部には入出力が必要な場合があり、一部にはアクセス許可が必要な場合があります。
ユーザーレベルのスレッドは、スレッドライブラリで処理できるスレッドです。
一方、カーネルレベルのスレッド(hadrwareを処理する必要がある)は、システムを最大限に活用するためにLWP(軽量プロセス)とも呼ばれるため、システムは1回のシステムコールで停止しません。
スレッドはプロセス内で実行されます。
各プロセスには、1つ以上のスレッドが含まれる場合があります。
カーネルがプロセスで実行されているスレッドについて何も知らない場合、ユーザースペースで実行されているスレッドがあるため、マルチプロセッシング機能は利用できません。
一方、カーネルスペースでスレッドを実行することもできます。これは、各プロセスが異なるCPUで実行されることを意味します。これによりマルチプロセッシングが可能になりますが、ご想像のとおり、オペレーティングシステムのリソースの点でより高価です。
最後に、真ん中のどこかにある解決策があります。スレッドをLWPにグループ化します。各グループは異なるCPUで実行されますが、グループ内のスレッドを複数処理することはできません。これは、このバージョンのカーネルはグループ(マルチプロセス)についてのみ認識し、グループに含まれるスレッドについては何も認識しないためです。それが十分に明確であることを願っています。
ここから。各LWPは、カーネルプール内のカーネルリソースであり、スレッドごとにスレッドにアタッチおよびデタッチされます。これは、スレッドがスケジュールされるか、作成および破棄されるときに発生します。
プロセスには1つ以上のスレッドが含まれており、スレッドはプロセスが実行できるすべてのことを実行できます。また、プロセス内のスレッドは同じアドレススペースを共有します。これは、同じコードセクション、データセクション、およびOSリソースを使用しているため、スレッド間の通信コストが低いため、スレッドのこれらすべての機能によって「軽量プロセス」になります。