Linuxカーネルから、プロセスとスレッドの類似点と相違点を確認します

 「Linuxカーネルの設計と実装」の第3章では、プロセス管理について説明しています。プロセスとスレッドの概念の違いはまだあいまいです。本は言う:

    プロセスは、実行期間中のプログラムです。ただし、プロセスは実行可能プログラムコードの一部に限定されません。通常、このプロセスには、開いているファイル、保留中の信号、内部カーネルデータ、デバイスステータス、メモリマッピングを含む1つ以上のメモリアドレス空間、1つ以上の実行スレッドなどの他のリソースも含まれます。もちろん、データセグメントの保存も含まれます。グローバル変数などの

    ただし、各スレッドには、独立したプログラムカウンター、プロセススタック、および一連のプロセスレジスタがあります。次の文:カーネルスケジューリングのオブジェクトはスレッドであり、プロセスではありません。実際、この文の前提は、プロセスに含まれるスレッドが1つだけであるということです。現在のオペレーティングシステムでは、プロセスに複数のスレッドが含まれています。

    タスク(タスク)は最も抽象的なものであり、一般的な用語であり、ソフトウェアによって完了するアクティビティを指します。タスクは、プロセスまたはスレッドのいずれかです。要するに、それは集合的に特定の目的を達成する一連の操作を指します。たとえば、データを読み取り、データをメモリに入れます。このタスクは、プロセスまたはスレッド(または割り込みタスク)として実装できます。

  プロセスは、多くの場合、プログラムの実行として定義されます。プロセスは、完全なデータスペースとコードスペースがメモリ内にある独立したプログラムと見なすことができます。プロセスが所有するデータと変数は、それ自体にのみ属します。

  スレッドは、特定のプロセスでずっと独立して実行されるプログラムです。つまり、スレッドはプロセス内に存在します。プロセスは1つ以上のスレッドで構成され、各スレッドは同じコードとグローバルデータを共有しますが、それぞれに独自のスタックがあります。スタックはスレッドごとに1つであるため、ローカル変数は各スレッドにプライベートです。すべてのスレッドは同じコードとグローバルデータを共有するため、プロセスよりも近く、個別のプロセスよりも相互作用する傾向があります。スレッド間の相互作用は、通信用の共有メモリがあるため簡単です。:プロセスのグローバルデータ。

  プロセスとスレッドの最も重要な違いは、スレッドが独自のグローバルデータを持っていることです。プロセスにはスレッドが存在するため、プロセスのグローバル変数はすべてのスレッドで共有されます。スレッドは同じシステム領域を共有するため、オペレーティングシステムによってプロセスに割り当てられたリソースは、グローバルデータがすべてのスレッドで利用できるのと同じように、そのプロセスのすべてのスレッドで利用できます。

つまり、プログラムには少なくとも1つのプロセスがあり、プロセスには少なくとも1つのスレッドがあります。スレッドの分割スケールはプロセスの分割スケールよりも小さいため、マルチスレッドプログラムの同時実行性は高くなります。さらに、プロセスには実行中に独立したメモリユニットがあり、複数のスレッドがメモリを共有するため、プログラムの効率が大幅に向上します。スレッドは、実行プロセスのプロセスとはまだ異なります。独立した各スレッドには、プログラムエントリ、順次実行シーケンス、およびプログラム終了があります。ただし、スレッドを個別に実行することはできず、アプリケーションプログラムに格納する必要があり、アプリケーションプログラムは複数のスレッドの実行制御を提供します。論理的な観点から、マルチスレッドの意味は、アプリケーションでは、複数の実行部分を同時に実行できるということです。ただし、オペレーティングシステムは、プロセスのスケジューリングと管理、およびリソース割り当てを実装するために、複数のスレッドを複数の独立したアプリケーションとは見なしません。これは、プロセスとスレッドの重要な違いです。

スレッドは別のスレッドを作成およびキャンセルできます。同じプロセス内の複数のスレッドを同時に実行できます。

プロセスとスレッドの主な違いは、それらが異なるオペレーティングシステムのリソース管理方法であるということです。プロセスには独立したアドレス空間があります。プロセスがクラッシュした後は、プロテクトモードの他のプロセスには影響せず、スレッドはプロセス内の別の実行パスにすぎません。スレッドには独自のスタックとローカル変数がありますが、スレッド間に個別のアドレス空間はありません。1つのスレッドが停止すると、プロセス全体が停止します。したがって、マルチプロセスプログラムは、マルチスレッドプログラムよりも堅牢ですが、プロセスを切り替えるとコストが高くなります。リソースが大きくなり、効率が低下します。ただし、同時実行を必要とし、特定の変数を共有する一部の並行操作では、スレッドのみを使用でき、プロセスは使用できません。

 

プロセスの概念 
   プロセスは、リソース割り当ての基本単位であり、スケジューリング操作の基本単位です。たとえば、ユーザーが独自のプログラムを実行すると、システムはプロセスを作成し、さまざまなテーブル、メモリスペース、ディスクスペース、I / Oデバイスなどのリソースをそのプロセスに割り当てます。次に、プロセスをプロセスの準備完了キューに入れます。プロセススケジューラはそれを選択し、CPUおよびその他の関連リソースを割り当て、プロセスは実際に実行されます。したがって、プロセスはシステムでの同時実行の単位です。 
マイクロカーネル構造を採用しているMac、Windows NT、およびその他のオペレーティングシステムでは、プロセスの機能が変更されています。これは、リソース割り当ての単位であり、スケジューリング操作の単位ではありません。マイクロカーネルシステムでは、実際のスケジューリング操作の基本単位はスレッドです。したがって、並行性の単位はスレッドです。


スレッドの概念 
  スレッドは、プロセスで操作を実行する最小単位、つまり実行プロセッサのスケジューリングの基本単位です。プロセスがオペレーティングシステムによって完了された論理タスクとして理解されている場合、スレッドはタスクを完了するための多くの可能なサブタスクの1つを表します。たとえば、ユーザーがウィンドウでデータベースアプリケーションを起動すると、オペレーティングシステムはデータベースへの呼び出しをプロセスとして表します。ユーザーがデータベースから給与計算レポートを生成してファイルに転送したい場合、これはサブタスクです。給与計算レポートを生成するプロセスで、ユーザーは別のサブタスクであるデータベースクエリ要求を入力できます。このように、オペレーティングシステムは、各要求-給与レポートと新しい入力データクエリをデータベースプロセスの独立したスレッドとして表します。

     スレッドは、プロセッサでの実行を個別にスケジュールできるため、マルチプロセッサ環境では、複数のスレッドを別々のプロセッサで実行できます。オペレーティングシステムは、この同時実行性を便利かつ効果的に実現するためのスレッドを提供します。


スレッドを導入する利点
(1)スケジュールが簡単。
(2)並行性を改善します。並行性は、スレッドを介して簡単かつ効果的に実現できます。プロセスは、同じプログラムの異なる部分を実行するために複数のスレッドを作成できます。
(3)オーバーヘッドが少ない。スレッドの作成はプロセスの作成よりも高速で、オーバーヘッドはほとんど必要ありません。
(4)マルチプロセッサの機能を十分に発揮するのに役立ちます。マルチスレッドプロセスを作成することにより(つまり、プロセスは2つ以上のスレッドを持つことができます)、各スレッドはプロセッサ上で実行され、アプリケーションの同時実行性を実現し、各プロセッサを完全に実行できるようにします。 


プロセスとスレッドの関係
(1)スレッドは1つのプロセスにのみ属することができ、プロセスは複数のスレッドを持つことができますが、少なくとも1つのスレッドを持つことができます。
(2)リソースはプロセスに割り当てられ、同じプロセスのすべてのスレッドがプロセスのすべてのリソースを共有します。
(3)プロセッサはスレッドに割り当てられています。つまり、スレッドは実際にプロセッサ上で実行されています。
(4)スレッドは、実行中に調整および同期する必要があります。異なるプロセスのスレッドは、同期を実現するためにメッセージ通信を使用する必要があります。

    しかし、Linuxオペレーティングシステムの場合、スケジューリングの対象はプロセスではなくスレッドです。理由の大部分は、Linuxがスレッドとプロセスが同じであると見なしているためです。

プロセスとスレッドに関するもう1つの非常に適切な説明:http//www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

おすすめ

転載: blog.csdn.net/smilejiasmile/article/details/109389607