全文の文脈に沿ったマインドマップは次のとおりです。
1. プロセスとスレッドの簡単な説明
プロセス (Process) とスレッド (Thread) はオペレーティング システムの基本概念ですが、比較的抽象的で理解しにくいです。次の説明は、Ruan Yifeng 先生のブログ ( http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html )からのものです。あまり厳密ではありませんが、イメージとしては十分です。読んだ後は、プロセスとスレッドをよく理解している 非常に直感的な印象で、次の文章を理解するのにも便利です。
① コンピュータの核となるのはすべての計算処理を担う CPU であり、工場のように常に稼働しています。
②工場の電力は限られており、一度に 1 つの作業場のみが使用できると仮定します。つまり、ワークショップが開始されると、他のワークショップは停止されなければなりません。その背後にある意味は、CPU の 1 つのコアが一度に 1 つのタスクしか実行できないということです。
③ プロセスは工場のワークショップのようなもので、CPU が処理できる単一のタスクを表します。CPU は常に 1 つのプロセスを実行しており、他のプロセスは非実行状態にあります。
④ 作業場には多数の作業員がいる場合があります。彼らは協力してタスクを完了します。
⑤ スレッドは作業場の労働者のようなものです。プロセスには複数のスレッドを含めることができます。
⑥ 作業場スペースは作業者間で共有されており、例えば各作業者が複数の部屋にアクセスできます。これは、プロセスのメモリ空間が共有され、各スレッドがこれらの共有メモリを使用できることを象徴しています。
⑦ ただし、各部屋の広さが異なり、トイレなど最大1人しか宿泊できない部屋もあります。中に人がいると他の人は入ることができません。これは、スレッドが共有メモリを使用する場合、他のスレッドはそのメモリを使用する前に共有メモリの終了を待つ必要があることを意味します。
⑧ 他人の侵入を防ぐ簡単な方法は、ドアに鍵を付けることです。先に到着した人はドアに鍵を掛け、後から到着した人は鍵を見てドアの前に並び、鍵が開かれるのを待って入場しました。これを「相互排他」(Mutual exclusion、略してMutex)といい、複数のスレッドが特定のメモリ領域を同時に読み書きできないようにするものです。
⑨ キッチンなど一度にn人が宿泊できる部屋もあります。つまり、人数がn人より多い場合、余った人は外で待つしかありません。これは、固定数のスレッドのみが使用できる特定のメモリ領域のようなものです。
⑩ 現時点での解決策は、ドアに鍵を掛けておくことです。入った人は鍵を受け取り、出るときに鍵を元の場所に戻します。後から到着した人たちは、鍵が空であることに気づき、ドアのところで列に並ばなければならないことを悟りました。このアプローチは「セマフォ」(セマフォ)と呼ばれ、複数のスレッドが互いに競合しないようにするために使用されます。
相互排他ロック Mutex がセマフォ セマフォ (n = 1) の特殊なケースであることを理解するのは難しくありません。言い換えれば、前者は後者に置き換えることができます。ただし、Mutex は比較的シンプルで効率的であるため、リソースの排他性を保証する必要がある場合には、この設計が依然として採用されています。
2. プロセスの基本リテラシー
①プロセスとは
上記の簡単な説明と組み合わせると、プロセスの科学的定義は次のようになります。
プロセスは、特定のデータ セット上でプログラムを実行するアクティビティであり、リソースの割り当てとオペレーティング システムの保護の基本単位でもあります。
平たく言えば、プロセスはプログラムの実行プロセスです。
プログラムは静的であり、システム内のリソースとして永久に存在します。
プロセスは動的であり、動的に生成、変更、消滅し、独自のライフサイクルを持ちます。
たとえば、3 つの QQ 番号を同時にハングすると、それらは 3 つの QQ プロセスに対応し、1 つを終了すると、対応するプロセスが強制終了されます。しかし、たとえ 3 つの QQ をすべてやめたとしても、QQ プログラムは終わってしまったのでしょうか? 明らかに違います。
プロセスには、実行中のプログラム エンティティだけでなく、CPU、メモリ、ネットワーク リソースなど、実行中のプログラムによって占有されるすべてのシステム リソースも含まれます。多くの小規模パートナーは、プロセスの概念に答えるとき、それが実行中のエンティティであるとだけ答え、プロセスが占有するリソースを無視することがよくあります。たとえば、同じプログラムが同時に 2 回実行される場合、それらは 2 つの独立したプロセスになります。
② 工程の構成
このプロセスは主に次の 3 つの部分で構成されます。
1)プロセス制御ブロック PCB には、次の部品が含まれます。
- プロセスの説明情報
- プロセス制御および管理情報
- リソース割り当てチェックリスト
- CPU関連情報
2)データセグメント。つまり、プロセス実行中のさまざまなデータ(プログラム内で定義された変数など)
3)プログラムセグメント。プログラムコード(命令のシーケンス)です。
例: 3 つの QQ アカウントが同時に登録され、3 つの QQ プロセスに対応します。それらの PCB とデータ セグメントは異なりますが、プログラム セグメントの内容は同じです(すべて同じ QQ プログラムを実行しています)。
PCB はオペレーティング システムに提供され、プログラム セグメントとデータ セグメントはプロセス自体によって使用されます。
プロセス制御ブロック PCB
各プロセスには、プロセス制御ブロック (プロセス制御ブロック、PCB) またはプロセス記述子が 1 つだけあります。プロセス記述子は、プロセスの存在を示す一意の識別子であり、オペレーティングシステムがプロセスを記録および記述するために使用するデータ構造です。ステータスおよび環境情報. これは、オペレーティング システムがプロセスをマスターするための唯一のデータ構造でもあり、プロセスを管理するための主な基盤でもあります。したがって、PCB はオペレーティング システムが使用するために提供されます。
一般的な説明: オペレーティング システムは各プロセスを管理する必要がありますが、管理に必要な情報はすべて PCB に配置され、PCB はプロセスの存在を示す唯一の兆候です。プロセスの作成とプロセスのキャンセルはすべて PCB 上の操作を指します。プロセスが作成されると、オペレーティング システムによってその PCB が作成され、プロセスが終了すると、その PCB がリサイクルされます。
一般に、PCB には次の 4 種類の情報が含まれます。
1)プロセス記述情報: オペレーティング システムが各プロセスを区別できるようにするために使用されます。
- プロセスが作成されると、オペレーティング システムは、重複しない一意の「ID 番号」をプロセスに割り当てます - PID (ProcessID、プロセス ID)
- さらに、プロセス記述情報には、プロセスが属するユーザー ID ( UID )も含まれます。
2)プロセス制御および管理情報: プロセスの実行ステータスを記録します。たとえば、CPU 使用時間、ディスク使用量、ネットワーク トラフィック使用量などです。
3)リソース割り当てリスト: どのリソースがプロセスに割り当てられているかを記録します。割り当てられているメモリの量、どの I/O デバイスが使用されているか、どのファイルが使用されているかなど。
4) CPU関連情報:プロセスがCPUを解放する際、各種レジスタの値など、プロセスの様々な情報をCPU内に保存する必要があります。これはプロセス切り替えを実装するために使用され、プロセスが再度実行されるときに CPU サイトが復元され、ブレークポイントから実行が継続されるようにします。これをシーン情報の保存といいます。
③ 工程の状況
各プロセスは独自の PCB と内部状態を持つ独立したエンティティですが、多くの場合、プロセス間の相互作用が必要になります。あるプロセスの出力が別のプロセスの入力になる場合があります。プロセス A の入力がプロセス B の出力に依存すると仮定すると、プロセス A はプロセス B の出力が出力されるまで実行できず、ブロックされます。これはプロセスのブロック状態です。
古典的なプロセスの 3 状態モデルは次のとおりです。
- 実行中: プロセスは CPU を占有して実行中です。
- 準備完了状態(準備完了): プロセスには実行条件があり、システムが実行用の CPU を割り当てるのを待っています。
- ブロッキング状態/待機状態 (wait): プロセスには実行条件がなく、イベントの完了を待っています。
上の図のタイム スライスは使い果たされています。これは次のように理解できます。
プロセスは同時に実行され、巨視的には複数のプログラムが一定期間同時に実行されますが、実際には微視的には交互に実行されます。つまり、CPU では通常、一度にプロセスを実行することはできません。すべてのプロセスを公平にスケジュールできるようにするために、CPU 時間はタイム スライスに分割され、これらのタイム スライスが各プロセスに割り当てられます。振り向く。プロセスのタイム スライスが使い果たされると、プロセスは準備完了状態になり、タイム スライスに割り当てられた他のプロセスは実行状態になります。準備完了状態のプロセスは、プロセス スケジューラの次のスケジュールを待つ必要があり、CPU タイム スライスを割り当てた後に実行を再開できます。
必要なリソースが不足しているため、ブロッキング状態は実行状態から変換されますが、このリソースには CPU タイム スライスが含まれておらず、CPU タイム スライスが不足すると実行状態から準備完了状態に変換されることに注意してください。
多くのシステムは新しい状態 (new) と終了状態 (exit) を追加し、5 つの状態モデルを形成しています。
- 新しい状態(new):プロセス作成中の状態
- 終了状態(exit):プロセスがシステムから消滅しつつある状態
上図から、相互に変換できるのは準備完了状態と実行状態のみで、その他は一方向の変換であることがわかります。
さまざまな状態にあるこれらのプロセス オペレーティング システムはどのように管理されますか?
前述したように、PCB はオペレーティング システムに提供され、オペレーティング システムがプロセスを管理するための主な基盤となります。そう、これらの状態の異なるプロセスをPCB経由で管理するという操作なのです。
プロセス PCB は特定の方法で編成されます。一般に、オペレーティング システムはすべてのプロセスの PCB を同じ状態にリンクします。このデータ構造はプロセス キューと呼ばれます。
④ プロセス管理
いわゆるプロセス制御とは、システム内のすべてのプロセスを効率的に管理し、プロセス状態変換機能を実現することです。
作成プロセス、ブロックプロセス、ウェイクアッププロセス、終了プロセスなどが含まれます。これらの機能はプリミティブによって実現され、オペレーティングシステムはプリミティブを使用して、プロセスの同期と相互排他、プロセスの通信と管理を含むプロセス原則を完了します。
プリミティブとは何ですか?
プリミティブは、実行がアトミックである特別な種類のプログラムです。言い換えれば、このプログラムの操作は中断することなく一度に実行する必要があります。プリミティブは、オペレーティング システム カーネル内のプログラムです。
考えてみてください。なぜプロセス制御のプロセス (プロセスの状態遷移) は一度に完了し、中断できないのでしょうか?
回答: プロセス状態遷移のプロセスを一度に完了できない場合、オペレーティング システム内の一部の主要なデータ構造情報に不整合が生じる可能性があり、オペレーティング システムの他の管理タスクの実行に影響を及ぼします。
プロセスの作成
オペレーティング システムが最初に起動されると、システム リソースの割り当てと制御管理を行うためにいくつかのシステム プロセスが作成され、同時にすべてのユーザー プロセスの祖先が作成され、その他のユーザー プロセスはアプリケーションの実行中に作成されます。
オペレーティング システムでは、あるプロセスが別のプロセスを作成することを許可し、子プロセスが親プロセスが所有するリソースを継承することを許可します。子プロセスが終了すると、親プロセスで継承したリソースは親プロセスに返される必要があります。同時に、親プロセスが終了すると、そのすべての子プロセスも終了します。
プロセスの作成手順、つまりプリミティブの作成内容は以下のとおりです。
- プロセス リストに項目を追加し、PCB プールから空き PCB を申請し (PCB には制限があり、アプリケーションが失敗すると作成は失敗します)、新しいプロセスに一意のプロセス ID を割り当てます。
- 新しいプロセスにアドレス空間を割り当て、プロセス管理プログラムによってプロセスのアドレス空間にロードされるプログラムを決定します。
- 新しいプロセスにさまざまなリソースを割り当てます。
- プロセス識別子、CPU 初期状態などの PCB を初期化します。
- 新しいプロセスの状態を準備完了に設定し、準備完了キューに移動して、実行がスケジュールされるのを待ちます。
プロセスの作成をトリガーするイベントは何ですか? 状況としては以下の4つが考えられます。
- ユーザーログイン: タイムシェアリングシステムでは、ユーザーがログインに成功すると、システムはそのユーザー用の新しいプロセスを作成します。
- ジョブのスケジューリング: マルチチャネルのバッチ処理システムでは、新しいジョブがメモリに置かれると、そのジョブに対して新しいプロセスが作成されます。
- サービスの提供: ユーザーがオペレーティング システムに何らかのリクエストを行うと、そのリクエストを処理するための新しいプロセスが作成されます。
- アプリケーションリクエスト: ユーザープロセスが積極的に子プロセスの作成をリクエストします。
プロセスの終了
プロセスの終了は取り消しとも呼ばれ、プロセスは特定の作業を完了するか、重大なエラーが発生した後に終了する必要があります。プロセスの終了を引き起こすイベントには、次の 3 種類があります。
- 正常終了:プロセス自身が終了要求(システムコール終了)
- 異常終了:整数の0除算、特権命令の不正使用、OSによる強制終了など
- 外部介入: Ctrl + Alt + delete でプロセス マネージャーが開き、ユーザーが手動でプロセスを強制終了します。
処理を終了(アンドゥ)する処理、つまりアンドゥプリミティブの内容は以下のとおりです。
- PCB コレクションからプロセスを終了した PCB を見つけます。
- プロセスが実行状態にある場合は、直ちにその CPU を奪い、プロセスの実行を終了し、CPU リソースを他のプロセスに割り当てます。
- 子プロセスがある場合は、すべての子プロセスを終了する必要があります。
- プロセスが所有するすべてのリソースを親プロセスまたはオペレーティング システムに返します。
- PCB をリサイクルし、PCB プールに戻します。
プロセスのブロックとウェイクアップ
プロセスのブロックとは、プロセスが CPU リソースを放棄し、リソースの待機、I/O 操作の完了の待機などのイベントを待機することを意味します。
プロセスは通常、ブロッキング プリミティブを使用して自身をブロックします。そのため、ブロッキングはプロセスの自律的な動作であり、同期イベントです。待機イベントが完了すると、割り込みが生成され、オペレーティング システムが起動され、ブロックされたプロセスがシステムの制御下でウェイクアップされます (ウェイクアップ プリミティブ)。
プロセスのブロックとウェイクアップは、明らかにプロセスの切り替えによって行われます。
プロセスのブロック ステップ、つまりブロック プリミティブの内容は次のとおりです。
- ブロックするプロセスに対応する PCB を見つけます。
- プロセス実行サイトを保護し、PCB ステータス情報をブロック状態に設定し、実行中のプロセスを一時的に停止します。
- 対応するイベントのブロッキング キュー (待機キュー) に PCB を挿入します。
プロセスのウェイクアップ ステップ、つまりウェイクアップ プリミティブの内容は次のとおりです。
- イベントのブロッキング キューで、対応するプロセスの PCB を見つけます。
- ブロッキング キューから PCB を削除し、プロセスの状態を準備完了に設定します。
- PCB を準備完了キューに挿入し、スケジューラによるスケジュールを待ちます。
ブロッキング プリミティブとウェイクアップ プリミティブはまったく逆のことを行います。
ブロッキング プリミティブは、プロセスを実行状態からブロッキング状態に変更します。
ウェイクアップ プリミティブにより、プロセスがブロック状態から準備完了状態に移行します。
プロセスがブロッキング プリミティブを使用して自身をブロックする場合、ウェイクアップ プリミティブを使用して自身をウェイクアップし、ブロックされたものによってウェイクアップする必要があります。そうしないと、ブロックされたプロセスは永久にブロックされた状態のままになります。したがって、ブロッキング プリミティブとウェイクアップ プリミティブはペアで提供されます。
⑤ プロセスコンテキストの切り替え
いわゆるプロセス コンテキストの切り替えとは、各プロセスが CPU リソースを共有することを意味します。プロセスが永遠に CPU リソースを占有することは不可能です。異なるタイミングでプロセスを切り替える必要があるため、異なるプロセスに CPU リソースが割り当てられます。このプロセスはprocessあるプロセスが別のプロセスに切り替えて実行するコンテキスト スイッチ。
プロセスはカーネルによって管理およびスケジュールされるため、プロセスのコンテキスト切り替えはカーネル状態で発生する必要があります。
プロセス コンテキストの切り替えも、スイッチング プリミティブと呼ばれるプリミティブな操作であり、その内容は次のとおりです。
- まず、プロセスAの実行環境情報をプロセスのコンテキスト(Context)であるPCBに格納します。
- 次に、PCB を対応するプロセス キューに移動します。
- 実行する別のプロセス B を選択し、実行する PCB のステータスを更新します。
- プロセス A が再開されると、PCB に従ってプロセス A が必要とする動作環境を復元します。
プロセス コンテキストの切り替えを引き起こすイベント、つまり、実行するために CPU リソースを占有している現在のプロセスが CPU から追い出される理由は次のとおりです。
- 現在のプロセスのタイムスライス
- より優先度の高いプロセスが到着する
- 現在のプロセスはアクティブにブロックします
- 現在のプロセスが終了しました
3. スレッドの基本的なリテラシー
①スレッドとは
この記事の冒頭の簡単な説明と組み合わせると、プロセス内に複数のスレッドが存在し、それらのスレッドがこのプロセスのリソースを共有することができます。
たとえば、QQ と Chrome ブラウザは 2 つのプロセスです。Chrome プロセスには、HTTP リクエスト スレッド、イベント応答スレッド、レンダリング スレッドなど、多くのスレッドが存在します。スレッドの同時実行により、ブラウザで新しいリンクをクリックすると開始されます。 HTTP リクエストが行われると、ブラウザはユーザーからの他のイベントに応答することもできます。
②なぜスレッドを導入するのか
初期のオペレーティング システムでは、プロセスを独立した動作の基本単位として使用していましたが、その後コンピューター科学者が独立して実行できる小さな基本単位、つまりスレッドを提案するまで使用されていました。これは物質の組成を研究する物理学者に似ています。最初に分子を発見し、次に原子を細分化して発見し、次に原子核、電子、クォークなどを発見します。
では、なぜスレッドを導入するのでしょうか? この文を覚えておく必要があります。スレッドはミニプロセスとも呼ばれますが、プロセスよりも作成と取り消しが簡単です。
上記のことから、プロセスはリソースを備えた基本単位であり、独立してスケジュールすることもできることがわかります。これは、兵士がいつでも食料や草を運ぶのと同じで、必然的に兵士の命令の実行速度が向上します (戦闘)。したがって、簡単なアイデアは次のとおりです。同じ命令を実行するために 2 人の兵士を割り当てます。1 人はいつでも必要な食料と物資を運ぶ責任があり、もう 1 人の兵士は命令の実行 (戦闘) を担当します。これが糸の考え方であり、身軽に旅をする兵士は糸である。
厳密な言語の説明では、次のようになります。
プロセスが作成または取り消されると、システムはそのプロセスにメモリ空間や I/O デバイスなどのリソースを割り当てたり再利用したりする必要があり、これには大きな時空オーバーヘッドが必要となり、同時実行性のさらなる向上が制限されます。 。
プロセス切り替えのオーバーヘッドを削減するために、リソース割り当て単位とスケジューリング単位としてのプロセスの2 つの属性は別々に扱われます。つまり、プロセスは引き続きリソース割り当ての基本単位として使用されますが、リソース割り当ての基本単位としては使用されません。スケジューリング (スケジュールまたは切り替えはめったにありません)、およびスケジューリング 実行と切り替えの責任はスレッドに引き渡されます。つまり、スレッドは独立したスケジューリングの基本単位となり、プロセスよりも作成および取り消しが簡単 (高速) になります。。
この文を覚えておいてください!スレッドが導入される前は、プロセスがリソース割り当てと独立したスケジューリングの基本単位でした。スレッドの導入後は、 プロセスがリソース割り当ての基本単位となり、スレッドが独立スケジューリングの基本単位になります 。
③スレッドのメリット・デメリット
スレッドの特性はプロセスの特性と似ており、基本的に次のようないくつかのプロセスがあります。
- スレッドには、準備完了、ブロック済み、実行中の 3 つの基本状態があり、状態間の遷移関係もあります。
- スレッドは同時に実行可能
- マルチ CPU 環境では、各スレッドを異なる CPU に割り当てて並列実行することもできます。
スレッドの利点:
- プロセス内には複数のスレッドが同時に存在でき、これらのスレッドはプロセスのリソースを共有します。プロセス間通信ではオペレーティング システム サービスを要求する必要があり (CPU がカーネル モードに切り替える必要があるため)、多くのオーバーヘッドが発生します。同一プロセス下のスレッド間通信はオペレーティングシステムの介在を必要とせず、オーバーヘッドが小さい。
ただし、異なるプロセスに属するスレッド間の通信では、オペレーティング システム サービスも要求する必要があることに注意してください。 - スレッド間の同時実行のオーバーヘッドがプロセスに比べて小さくなり、システムの同時実行性が向上します。
同様に、異なるプロセスに属するスレッド間を切り替える場合もプロセス切り替えが発生するため、オーバーヘッドが大きくなる点に注意してください。
スレッドの欠点:
- プロセス内のスレッドがクラッシュすると、そのスレッドが属するプロセスのすべてのスレッドがクラッシュします。
たとえば、ゲームのユーザー設計では、マルチスレッドを使用すべきではありません。そうしないと、ユーザーが電話を切った場合に、同じプロセスの他のスレッドに影響を及ぼします。
4. まとめ
プロセスとスレッドの観点から見たオペレーティング システムの設計は、次の 3 つの点に要約できます。
- マルチプロセスの形式では、複数のタスクを同時に実行できます。
- マルチスレッドの形式では、単一のタスクを異なる部分に分割して実行できます。
- 調整メカニズムは、一方ではプロセスとスレッド間の競合を防止し、他方ではプロセスとスレッド間でリソースを共有できるようにするために提供されます。
ソース: