Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxマルチスレッドモデル

Linuxマルチスレッドモデル

  
 

プロセスはコンピュータ上のプログラムの実行アクティビティです。プログラムを実行すると、プロセスが始まります。明らかに、プログラムは死んで(静的)そしてプロセスは生きています(動的)。プロセスは、システムプロセスとユーザープロセスに分けられます。 オペレーティングシステム
のさまざまな機能を実行するために使用されるプロセスはシステムプロセスであり、オペレーティングシステム自体は実行状態にあり、ユーザープロセスはユーザーが開始したすべてのプロセスです。プロセスとは、オペレーティングシステムがリソースを割り当てる単位です。 Windows
の下では、プロセスはさらにスレッドに洗練されています。つまり、1つのプロセスの下で独立して実行できる複数の小さなユニットがあります。 Linuxのプロセスやスレッドに関する記事はたくさんありますが、これは最も古典的な方法と言えると思います------------------------------ --- I.基本的な知識:スレッドとプロセス教科書の定義によると、プロセスはリソース管理の最小単位で、スレッドはプログラム実行の最小単位です。オペレーティングシステムの設計、プロセスからのスレッドの進化、主な目的は、SMPをよりよくサポートし、(プロセス/スレッド)コンテキスト切り替えのオーバーヘッドを減らすことです。分割に関係なく、プロセスはその命令実行として少なくとも1つのスレッドを必要とし、プロセスはリソース(cpu、メモリ、ファイルなど)を管理し、特定のCPUにスレッドを割り当てます。この時点でプロセスがSMPマシン上で実行されている場合は、複数のCPUを使用して各スレッドを同時に実行し、最大の並列処理を実現して効率を向上させることができます。マシン上では、マルチスレッドモデルを使用してプログラムを設計し、シングルプロセスモデルの代わりにマルチプロセスモデルを使用するのと同様に、設計がより簡潔になり、機能が完成し、プログラムの実行効率が向上します。このとき、マルチスレッドモデルによって実現される機能は、実際にはマルチプロセスモデルによって実現されることができ、後者と比較すると、スレッド切り替えのオーバーヘッドはプロセスよりもはるかに少なく、意味的にはレスポンスは同時以上です。そのような関数を入力すると、実際にはcpu以外のすべてのリソースが共有されます。スレッドモデルの2つの主要な意味によると、コアスレッドとユーザースレッドの2つのスレッドモデルがそれぞれ開発されています分類の標準は、主にスレッドスケジューラがコア内にあるかカーネル外にあるかです。前者はマルチプロセッサリソースの同時使用を助長しますが、後者はコンテキスト切り替えのオーバーヘッドを重視します。現在の商用システムでは、通常2つを組み合わせて使用​​し、smpシステムのニーズを満たすコアスレッドを提供し、スレッドライブラリを使用してユーザー状態で別のスレッドメカニズムをサポートします。複数のユーザーモードスレッドのスケジューラになります。多くのテクノロジと同様に、「ハイブリッド」は通常より高い効率をもたらしますが、それは実装の難しさももたらしますシンプルなシンプルな設計のため、Linuxは最初から混在していません。モデルの計画ですが、実装には「混合」という別の考え方を使用します。スレッドメカニズムの具体的な実装では、スレッドはオペレーティングシステムのカーネル上で実装することも、コアの外側で実装することもできますが、後者は明らかに少なくともプロセスをコアで実装する必要があり、前者は通常プロセスをコアでサポートする必要があります。コアレベルのスレッディングモデルは明らかに前者のサポートを必要としますが、ユーザーレベルのスレッディングモデルは必ずしも後者に基づいていません。前述のように、この違いは、2つの分類方法の規格が異なるためです。サポートプロセスとスレッドの両方がカーネル内でサポートされるとき、スレッドプロセス「多対多」モデルを実装することができ、すなわち、プロセスの特定のスレッドをカーネルによってスケジュールし、同時にそれをユーザレベルスレッドプールとして使用することもできる。スケジューラは、そのスペースで実行するために適切なユーザーレベルのスレッドを選択します。これは、マルチプロセッサシステムのニーズを満たし、スケジューリングのオーバーヘッドを最小限に抑える前述の「ハイブリッド」スレッドモデルです。ほとんどの商用オペレーティングシステム(Digital Unix、Solaris、Irixなど)は、POSIX 1003.1c規格を完全に実装したこのスレッドモデルを使用しています。カーネルの外部に実装されたスレッドは、「一対一」、「多対一」の2つのモデルに分けることができます。前者は、1つのスレッドにコアプロセス(おそらく軽量プロセス)を使用し、スレッドスケジューリングは次のようになります。プロセスのスケジューリングはコアに渡され、後者はコアの外側で完全にマルチスレッド化され、スケジューリングはユーザーモードで行われます。後者のスレッドは、前述の単純なユーザーレベルのスレッドモデルの実装ですが、明らかに、この余分なコアスレッドスケジューラは、実際にはスレッド実行スタックの切り替えを完了するだけで十分です。同期か非同期かは、プロセスに基づいているためスレッドに配置できないため、この実装はマルチプロセッサシステムでは使用できず、この要件はますます大きくなっています。純粋なユーザーレベルのスレッドの実装は、アルゴリズムの研究目的を除いて、ほとんど姿を消しました。 Linuxカーネルは軽量プロセスのサポートしか提供していないため、より効率的なスレッドモデルの実装が制限されていますが、Linuxはプロセスのスケジューリングオーバーヘッドの最適化に重点を置いており、ある程度この欠陥を補っています。現在、最も普及しているスレッド機構であるLinuxThreadsは、コアに引き渡されるスレッドプロセス「1対1」モデルを採用し、ユーザーレベルでの信号処理を含むスレッド管理機構を実装している。 Linux-LinuxThreadsの動作メカニズムがこの記事の焦点です。 2つ目は、Linux 2.4カーネルでの軽量プロセスの実装初期プロセス定義には、プログラム、リソース、および実行の3つの部分が含まれていますプログラムは通常コードを参照し、リソースには通常オペレーティングシステムレベルのメモリリソース、IOリソース、信号処理などが含まれます。プログラムの実行は通常、CPUの占有を含む実行コンテキストとして理解され、後でスレッドに展開されます。スレッドの概念が登場する前は、プロセス切り替えのオーバーヘッドを減らすために、オペレーティングシステムの設計者はプロセスの概念を徐々に見直し、プロセスによって占有されていたリソースを徐々に削除していました。軽量なプロセスの概念を発展させます。 Linuxカーネルは、バージョン2.0.xで軽量プロセスを実装しました。アプリケーションは、統合されたclone()システムコールインタフェースを介して、異なるパラメータで軽量プロセスまたは通常のプロセスを指定できます。カーネルでは、clone()呼び出しはパラメータの受け渡しと解釈の後にdo_fork()を呼び出しますこのカーネル関数は、fork()とvfork()システムコールの最後の実装でもあります:< linux-2.4.20 /kernel /fork < int do_fork(符号なしlong clone_flags、符号なしlong stack_start、構造体pt_regs * regs、符号なしlong stack_size)。ここでclone_flagsは、次のマクロの"または"値から取得されます。< linux-2.4.20 /include /linux /Sched.h> #define CSIGNAL 0x000000ff /*終了時に送信されるシグナルマスク* /#define CLONE_VM 0x00000100 /* VMがプロセス間で共有する場合に設定* /#define CLONE_FS 0x00000200 /* fs情報がプロセス間で共有する場合に設定* /#define CLONE_FILES 0x00000400 /*開いているファイルがプロセス間で共有されている場合に設定* /#define CLONE_SIGHAND 0x00000800 /*シグナルハンドラとブロックされている信号が共有されている場合に設定* /#define CLONE_PID 0x00001000 /* pidと共有されている場合* /

Copyright © Windowsの知識 All Rights Reserved