【Linux】スレッドの概念とプロセスとの違い

目次

背景知識

スレッドとは何ですか?   

プロセスとスレッドの違い 

スレッドのメリットとデメリット


背景知識

スレッドを理解する前に、 OS がプロセスを細かい部分に分割できること        をまず知っておく必要があります

        たとえば、プロセス アドレス空間のヒープ領域と呼ばれるものには、ヒープ領域全体の開始位置と終了位置を示すためにプロセス PCB の mm_structz に開始と終了がありますが、malloc がスペースに適用されるたびに、ヒープ上には、このスペースを表す vm_area structという名前の構造体が存在します        。この構造体には開始と終了も含まれていますが、要求されたスペースの開始位置と終了位置を表します。その後、複数のスペースを申請した後、二重リンクリストを使用して整理されます。ちょうど下の写真のようになります。


        私たちが通常実行する exe 実行可能プログラムは本質的にファイルであり、その内部は次の規則に従っていることを知っておく必要があります。

       実行可能プログラムは、上図の右側に示すように、プロセスのアドレス空間に従ってコンパイルされます。つまり、コンパイル時に各コードのアドレスが決定されます。

        実行可能プログラムは内部で4KBのブロックに分割されており、各ブロックはページ フレームと呼ばれます。

        物理メモリ4KB のメモリブロックに分割されており、各メモリブロックはページフレームと呼ばれ、各メモリブロックの属性は struct page 構造体で記述されます。

        仮想メモリ管理では、プログラムは通常、仮想メモリ アドレスを使用してデータにアクセスします。また、仮想アドレス空間は固定サイズのページ (通常は 4KB、またはページ フレーム) に分割され、必要に応じてディスクから物理メモリにロードされ、連続したメモリを形成します。物理ページ フレーム(ページ フレーム)。プログラムが仮想メモリ ページにアクセスして、ページ テーブルを介して物理メモリにアクセスするとき、そのページが現在物理メモリに存在しない場合、ページ フォールト割り込みがトリガーされます。

       このとき、オペレーティング システムは物理メモリ内のスペースを申請し、ディスク内のデータをメモリ内のページ フレームに読み取り、ページ テーブルを更新して仮想メモリとメモリ間のマッピング関係を更新します。物理ページフレーム。このようにして、プログラムは実行を継続でき、オペレーティング システムは必要に応じてページ置換とメモリ管理を実行して、システムのパフォーマンスと可用性を確保できます。

        詳細なプロセスを次の図に示します。


スレッドとは何ですか?   

        プロセス:プロセスは、プログラムの実行中のインスタンスです。これは、プログラムのコード、データ、実行ステータスを含む、独立したメモリ空間を持つ独立した実行環境です。各プロセスは独立したメモリ空間で実行され、相互にメモリを直接共有しません。              

        スレッド: スレッドはプロセスの一部であり、プロセス内の実行単位です。コード セグメント、データ セグメント、開いているファイルなど、プロセスのメモリ空間とリソースを共有します

        

         Linux ではプロセスの PCB 構造 (task_struct) を使用してシミュレートされるため、実際のスレッドは存在しません。

        Linux の CPU から見た PCB はこのプロセスの実行フローのみであり、このプロセスは複数の実行フロー、つまり複数のスレッド (複数の PCB) を持つ可能性があるため、より軽量になります。他の OS では 1 つのプロセスが独立したリソースを利用しますが、Linux では複数のスレッドがリソースを共有します。        

        したがって、プロセスとスレッドは総称して軽量プロセスと呼ばれます。

        軽量プロセスと総称しますが、他のスレッドが存在する前にスレッド(プロセス)が存在する必要があり、このスレッドをメインスレッドと呼び、このメインスレッドをプロセスとして捉えることができます。

        メイン スレッドはプロセス内の特別なスレッドであり、通常はプロセスの作成時にオペレーティング システムによって自動的に作成される最初のスレッドです。これは、実行プログラムのエントリ ポイントを担当し、プロセスの初期化を担当します。メインスレッドのコンテキスト情報は、プロセスに対応する PCB に記録されます。この処理のPCB(task_struct)には、メインスレッドのコンテキスト情報に加えて、他のスレッドのコンテキスト情報も含まれる。

ユーザー        の観点からは、プロセス (メイン スレッド) のみが見え、各プロセスには独立したアドレス空間、コード データなどが含まれています。

        しかし、カーネルの観点から見ると、プロセスは内部に複数の実行フロー (スレッド [task_struct]) を持ち、タスク構造のみを認識するため、これがOS 操作スケジューリングの基本単位であり、以前に書いたコードは内部で実行されるのは 1 つだけです。ストリーム (task_struct) であるため、カーネルの観点から見ると、これはプロセスの特殊なケースにすぎません。

        Linux では、プロセスの実行フローは 1 つだけであり、他の OS のプロセスと同等です。

                プロセスには複数の実行ストリームがあり、これは他の OS でのマルチスレッドに相当します。


要約すれば:

        スレッドはプロセスの一部であり、プロセス リソースを共有します。しかし、データには独自の部分もあります。

        プロセスはリソース割り当ての基本単位であり、スレッドは OS の実行とスケジューリングの基本単位です。


        これは非常に抽象的で、説明するのは簡単ではありませんが、以下にインターネットとの違いを調べてみましたが、スレッドとプロセスの区別を理解するのがより役立つと感じます。

        したがって、Linux では、プロセスとスレッドの区別は、ユーザー空間内の実行環境と共有リソースに基づいています。

  1. 実行環境:プロセスは、独自のアドレス空間と、グローバル変数、ファイル記述子テーブルなどのその他のリソースを持つ独立した実行環境です。システムコール ( やfork()など) を呼び出すことにより、 記述をexec()使用し、独自のアドレス空間を持つ新しいプロセスを作成できます 。task_struct

            スレッドは、同じプロセス内で作成された実行フローであり、メイン スレッドと同じアドレス空間とほとんどのリソースを共有します。スレッドは clone() システム コールを呼び出すことによって作成され、 task_struct メイン スレッドが所有するデータ構造を共有します。各スレッドには独自のスタック領域とスケジューリング情報がありますが、コードセグメント、グローバル変数、ファイル記述子テーブルなどを共有します。

  2. リソース共有: スレッドは同じアドレス空間と、グローバル変数、ヒープ メモリ、開いているファイルなどを含むほとんどのリソースを共有します。これは、スレッド間の通信がプロセス間の通信よりも効率的であることも意味します。スレッドは、プロセス間通信メカニズムを介してデータをコピーしたり渡したりすることなく、共有メモリに直接アクセスできるからです。


プロセスとスレッドの違い 

プロセスとスレッドの違いを要約してみましょう。

  • プロセスはリソース割り当ての基本単位であり、スレッドはオペレーティング システムの実行とスケジューリングの基本単位です。
  • プロセスには独立したアドレス空間があり、スレッドには独立したアドレス空間がありません (同じプロセス内のスレッドはプロセスのアドレス空間を共有します)。
  • スレッド間の通信メカニズムがより便利になり、データ空間がスレッド間で共有されるため、あるスレッドのデータを他のスレッドで直接使用できます。プロセス間は独立した空間であり、さまざまな通信方法で共有する必要があります。

スレッドのメリットとデメリット

アドバンテージ:

  • 作成: 別のメモリ空間を作成する必要がないため、新しいスレッドを作成するコストは、新しいプロセスを作成するよりもはるかに低くなります。
  • リソースの占有: スレッドが占有するリソースはプロセスよりもはるかに少なくなります。
  • 効率: スレッドは、メモリ空間、グローバル変数などを含む、同じプロセス内の同じリソースを共有します。これにより、リソースの繰り返し割り当てが減り、リソースの使用率が向上します。
  • 同時実行性: スレッドの同時実行により、複数のタスクを同時に実行できるため、アプリケーションの同時実行性とパフォーマンスが向上します。

欠点:

  • アクセス制御の欠如: プロセスはアクセス制御の基本的な粒度であり、スレッド内で一部の OS 関数を呼び出すとプロセス全体に影響します。
  • パフォーマンスのペナルティ: 外部イベントによってめったにブロックされないスレッドは、他のスレッドと同じプロセッサを共有できないことがよくあります。つまり、利用可能なリソースは変わりませんが、同期とスケジューリングのオーバーヘッドが追加されます。
  • プログラミングの難しさ: マルチスレッド プログラムの作成とデバッグは、シングルスレッド プログラムよりもはるかに困難です。

ここでは、スレッドの概念とプロセスとスレッドの違い、具体的な用途、スレッド制御などについて一般的に説明します。次の章で説明します。

おすすめ

転載: blog.csdn.net/weixin_47257473/article/details/132215643