第 2 章 プロセスとスレッド
プロセスやスレッドについて学ぶべきことはたくさんあります。ブロガーは徐々に内容を整理して更新していきます。現在、20,000 ワード以上の写真とテキストが更新されています...
2.1 プロセス
2.1.1 プロセスの概念
プロセスに関しては、プロセスをプログラムと接続する必要があります。プロセスはプログラムの実行プロセスであり、システムにおけるリソースの割り当てとスケジューリングの基本単位であるためです。
注: 現時点では、スレッドの概念は導入されていません。
プログラムとは、ハードディスクに保存されている実行可能ファイル、つまり一連の命令であることがわかっています。マルチプログラミングでは、オペレーティング システムはプログラムの同時実行を許可します。その結果、これらのプログラム間のクロージャが失われます。プログラムの同時実行をより適切に記述および制御するために、オペレーティング システムは プロセス の概念を導入します。
プロセスと手順の例:
アプリケーションAを起動すると、コントロールパネルに対応するプロセスが表示されますが、複数のアプリケーションAを起動すると、対応するプロセスが複数表示されます。複数のアプリケーション A が起動される場合、それらの命令セットは同じですが、対応する各プロセスには独自のデータがあります (この部分はプロセスの構成に関連します。次の章で詳しく説明します)。同じアプリケーションを複数回実行すると、複数の異なるプロセスに対応します。
セクションの概要
2.1.2 プロセスの特徴
プロセスは複数のプログラムの同時実行から派生した概念であるため、プロセスの基本的な特性は単一プログラムの逐次実行と比較され、プロセス管理の基本要件でもあります。
プロセスの特性には、ダイナミクス、同時実行性、独立性、非同期性が含まれます。
-
動的
プロセスとはプログラムの実行であり、作成、活動、一時停止、終了などのプロセスがあり、一定のライフサイクルを持ち、動的に生成、変更、破棄されます。したがって、ダイナミクスはプロセスの最も基本的な特性です。
-
同時実行性
これは、複数のプロセスがメモリ内に同時に存在し、一定期間同時に実行できることを意味します。プロセスを導入する目的は、複数のプロセスを同時に実行できるようにすることです。同時実行性は、プロセスおよびオペレーティング システムの重要な特性です。
-
独立
これは、プロセスが、独立して実行でき、独立してリソースを取得し、独立してスケジューリングを受け入れることができる基本単位であることを意味します。
-
非同期性
プロセスの相互制約により、プロセスは独立した予測不可能な速度で実行されます。非同期により実行結果が再現できなくなるため、対応するプロセス同期メカニズムをオペレーティング システムで構成する必要があります。
プロセスのこれら 4 つの特徴を理解するだけで十分です。
セクションの概要
2.1.3 プロセスの構成
プロセスの構成を紹介する前に、プロセス エンティティ (プロセス イメージ) という新しい概念を紹介します。
プロセス エンティティは、プロセス制御ブロック、プログラム セグメント、およびデータ セグメントの 3 つの部分で構成されます。プロセス エンティティの概念を導入した後、プロセスは「プロセス エンティティの実行プロセスであり、システムによるリソース割り当てとスケジューリングのための独立した単位である」と定義することもできます。つまり、プロセス エンティティは静的であり、プロセスは動的です。特別な区別がない場合、通常、プロセス エンティティを プロセス と呼びます。したがって、プロセスは独立した実行単位であり、オペレーティング システムによるリソース割り当てとスケジューリングの基本単位とも言え、プロセス制御ブロック、プログラム セグメント、データ セグメントの 3 つの部分で構成されます。
2.1.3.1 プロセス制御ブロック
-
意味
プロセス制御ブロック (PCB) は、プロセス用に特別に構成されたデータ構造であり、プロセスの基本的な状況と実行ステータスを記述するために使用されます。
-
プロセスとの関係
プロセスが作成されると、オペレーティング システムはそのプロセス用の PCB を作成し、この PCB がメモリに配置されます。プロセスが実行されると、システムはプロセスの PCB を通じてプロセスの現在のステータス情報を理解できます。したがって、オペレーティング システムを制御および管理できます。プロセスが終了すると、オペレーティング システムはメモリから PCB を削除し、プロセスは終了します。このことから、 PCB がプロセスの存在を示す唯一の兆候であることがわかります。
-
プロセス制御ブロックに含まれる主な情報
PCB には主に、プロセス記述情報、プロセス制御および管理情報、リソース割り当てリスト、およびプロセッサ関連情報が含まれています。
プロセス記述情報 プロセス制御および管理情報 リソース割り当てリスト プロセッサー関連情報 プロセス、ユーザー識別子 (PID、UID) プロセスの現在のステータス、プロセスの優先度 コード実行エントリアドレス、プログラム外部メモリアドレスおよびその他のコードセグメント、データセグメント、スタックセグメントポインタ、ファイル記述子、キーボード、マウスなど。 汎用、アドレス、コントロール、フラグレジスタ値、ステータスワードなど -
プロセス記述情報
プロセス識別子: 各プロセスを識別し、各プロセスには一意の ID があります。
ユーザー識別子: 各プロセスが属するユーザーを識別します。
-
プロセス制御および管理情報
プロセスの現在のステータス: プロセッサの割り当てとスケジューリングの基礎となるプロセスのステータス情報を説明します。
プロセス優先度: プロセッサを確保するプロセスの優先度を示し、優先度が高いプロセスほどプロセッサを確保しやすくなります。
-
リソース割り当てリスト
メモリ アドレス空間または仮想アドレス空間のステータス、開いているファイルのリスト、および使用されている I/O デバイス情報を記述するために使用されます。
-
プロセッサー関連情報
プロセッサのコンテキストとも呼ばれ、主にプロセッサ内の各レジスタの値を指します。プロセスが実行されているときは、プロセッサに関する多くの情報がレジスタにあります。プロセスが一時停止されているときは、プロセッサのステータス情報が格納されます。プロセッサーの必須情報は対応する PCB に保存されるため、プロセスが再実行されたときに、最後の実行位置から実行を継続できます。
-
-
システムが PCB を使用してプロセスを制御する方法
- オペレーティング システムがプロセスの実行をスケジュールする場合、プロセスの PCB から現在のステータスと優先順位を確認する必要があります。
- オペレーティング システムがプロセスを正常にスケジュールすると、PCB に保存されているプロセッサ ステータス情報と、プログラムとデータのメモリ開始アドレスに基づいて、プロセスが実行を再開する (最後に中断された場所から実行を継続する) ように設定する必要があります。 PCB でプログラムとデータを見つけます。
- プロセスの実行中に、連携するプロセスと同期、通信、またはファイルにアクセスする必要がある場合は、PCB にもアクセスする必要があります。
- プロセスが何らかの理由で実行を一時停止した場合、そのブレークポイントのプロセッサ コンテキストを PCB に保存する必要があります。
上記のプロセスから、プロセスのライフサイクル全体を通じて、システムは PCB を通じてプロセスを制御します。つまり、システムは PCB を通じてのみプロセスの存在を認識できることがわかります。
-
PCB の構成方法
オペレーティング システムには多くのプロセスが存在することが多いため、一部は準備完了状態、一部はブロック状態にあり、ブロックされる理由は異なります。プロセスのスケジューリングと管理を容易にするためには、各プロセスの PCB を適切な構造で編成する必要があります。一般的な方法としては、リンク方式とインデックス方式の 2 つがあります。(進捗状況は次項で紹介します)
リンク方式は PCB をキューに接続します。異なる状態は異なるキューに対応します。それらは、準備完了キューやブロッキング キューなど、プロセスの異なる状態に応じて異なるキューに分割されます。さらに、条件に応じて異なるブロッキング キューに分割されます。ブロックするさまざまな理由。
インデックス方法は、PCB をインデックス テーブルに配置することであり、準備完了インデックス テーブルやブロッキング インデックス テーブルなど、異なる状態が異なるインデックス テーブルに対応します。
2.1.3.2 プログラムセグメント
プログラムセグメントとは、プロセススケジューラによってCPUで実行されるようにスケジュールされたプログラムコードセグメント、すなわち、CPU内のプロセスによって実行されるコードセグメントである。
注: プログラムは複数のプロセスで共有できます。つまり、複数のプロセスが同じプログラムを実行できます。
2.1.3.3 データセグメント
プロセスのデータ セグメントには、プロセスに対応するプログラムによって処理された元のデータと、プロセスの実行中に生成された中間/最終結果が含まれます。
セクションの概要
2.1.4 プロセスの状態と遷移
2.1.4.1 プロセスの 5 つの状態
プロセスには完全なライフサイクルがあり、主に 5 つの状態 (作成状態、準備完了状態、実行状態、ブロック状態、および終了状態)が含まれます。
-
作成された状態
プロセスが作成されるとき、プロセスは作成状態にあり、この段階でオペレーティング システムはさまざまなリソースをプロセスに割り当て、PCB を初期化します。
プロセスを作成する場合、複数のステップに分割されます
- 空の PCB を要求し、プロセスを制御および管理するための情報を PCB に入力します。
- プロセスの実行に必要なリソースを割り当てます。
- プロセスを準備完了状態に移行し、準備完了キューに入れます。この時点でプロセスが必要とするリソースが満たされない場合、準備完了状態に移行できません。この時点では、プロセスの作成は完了していません。完了し、プロセスは作成中です。
-
準備完了状態
プロセスは、CPU 以外の必要なリソースをすべて獲得した後、準備完了状態に移行し、この状態のプロセスが CPU から呼び出されると、すぐに実行されます。シングルコア CPU は一度に 1 つのプロセスしか実行できないため、システム内には多数の準備完了プロセスが存在し、これらのプロセスは準備完了キューと呼ばれるキューに配置されます。
-
運転状態
CPU 上でプロセスが実行されているときのプロセスが実行されている状態が実行状態です。
-
ブロッキング状態
実行中のプロセスがイベントを待つ必要があり、中断されている場合、そのプロセスはブロック状態になります。この状態のプロセスはリソースを待ち続けます (I/O デバイスの待機など)。この状態のプロセスは、CPU がアイドル状態であっても実行されません。システム内の多くのリソースは排他的に共有されるため、システム内には複数のブロックされたプロセスが存在し、これらのプロセスはキューに配置されます。このキューはブロッキング キューと呼ばれ、システムはこれらを配置することもできます。異なるブロックキュー内のブロックされたプロセス。
-
終了状態
プロセスを終了する必要がある場合、システムはプロセスを終了状態に移行します。
-
準備完了状態とブロック状態の違い
準備完了状態のプロセスは、CPU 以外の必要なリソースをすべて備えており、CPU リソースを取得するだけですぐに実行されますが、ブロック状態のプロセスは、CPU リソースが取得されても、CPU 以外のリソースを待ち続けます。が現在アイドル状態である場合、プロセスは実行されません。
知らせ:
準備完了状態、実行状態、およびブロック状態は、プロセスの 3 つの基本状態と呼ばれます。
2.1.4.2 プロセスの状態遷移
次の図は、プロセスの 5 つの状態間の遷移を表しています。
このうち、より重要な状態遷移は、3つの基本状態の遷移である。
-
準備完了状態 -> 実行状態
準備完了状態のプロセスは、CPU によってスケジュールされ、CPU リソースを取得した後、実行状態になります。
-
実行状態 -> 準備完了状態
実行状態のプロセスは、割り当てられたタイム スライスが使い果たされた後、準備完了状態に移行します。
-
実行状態 -> ブロック状態
実行状態のプロセスは、特定のリソースの使用を要求したり、特定のイベントの発生を待ったりすると、実行状態からブロッキング状態に遷移します。プロセスは、システム コールを通じてオペレーティング システムにサービスを提供するよう積極的に要求します。つまり、実行状態からブロック状態への変換は、プロセスのアクティブな動作です。
-
ブロック状態 -> 準備完了状態
ブロック状態のプロセスによって要求されたリソース、またはプロセスが待機しているイベントが到着すると、割り込みハンドラーはプロセスをブロック状態から準備完了状態に移行します。
知らせ:
プロセスの実行状態からブロック状態への移行はプロセスの能動的動作ですが、ブロック状態から準備完了状態への移行は受動的動作であり、他のプロセスと割り込みハンドラーの支援が必要です。
セクションの概要
2.1.5 プロセス制御
2.1.5.1 定義と実装方法
-
プロセス制御の定義
プロセス制御の主な機能は、システム内のすべてのプロセスを効率的に管理することであり、新しいプロセスの作成、既存のプロセスのキャンセル、プロセスの状態遷移の実現などの機能があります。つまり、プロセス制御とはプロセスの状態遷移を実現することです。
-
プロセス制御の実装方法
このように、プロセス制御はプロセス状態の変換を実現します。プロセス状態の変換プロセスは「一度に」完了する必要があります。したがって、第 1 章で紹介したプリミティブを使用してプロセス制御を実装できます。(プリミティブの概要については、セクション 1.3.5.3 を参照してください)
プロセスの状態遷移が「一度に」完了することを確認する必要があるのはなぜですか?
次に、例を示します。この時点で準備完了状態のプロセスがあるとします (つまり、プロセスの PCB が準備完了キュー内にあります)。次に、そのプロセスをブロッキング状態に変換したいとします。今回、プロセス制御を担当するカーネル プログラムは、少なくとも次の 2 つのことを実行する必要があります。
- プロセスの PCB のステータスをブロッキング状態に設定します。
- プロセスの PCB をブロッキング キューに配置します
もちろん、上記 2 つのステップは一度に完了する必要がありますが、最初のステップが完了した後など、上記 2 つのステップが一度に完了できない場合、CPU は割り込み信号を受信し、対応する割り込みハンドラを実行します。この時点で、プロセスの PCB のステータスはブロックされていますが、PCB は準備完了キュー内にあります。これにより、オペレーティング システム内の主要なデータ構造情報の不一致が生じ、オペレーティング システムの後続の管理作業に影響を及ぼします。
2.1.5.2 プロセスの作成
プロセスの作成に対応するプロセス状態は次のように変換されます。
- なし -> 作成された状態
- 作成済み状態 -> 準備完了状態
プロセスの作成は、次の手順を含む作成プリミティブによって行われます。
- 新しいプロセスに一意のプロセス識別番号 (PID) を割り当て、空の PCB を申請します。PCB 申請が失敗すると、作成は失敗します (PCB は制限されています)。
- プロセスの実行に必要なリソース(メモリ、ファイル、CPU 時間、I/O デバイスなど)を割り当てます。リソースが不足している場合、この時点でプロセスは作成状態になり、必要なリソースを待ちます。
- PCB の初期化には、主に初期化フラグ情報、プロセッサーのステータス情報、プロセッサーの制御情報、およびプロセスの優先順位の設定が含まれます。
- PCB をレディ キューに挿入し (レディ キューがいっぱいでない場合)、PCB ステータスをレディ状態に設定すると、プロセスがレディ状態に変換されます。
プロセスの作成を引き起こすイベントには通常、次のようなものがあります。
- ユーザー ログイン: タイムシェアリング システムでは、ユーザーが正常にログインすると、システムはそのユーザー用のプロセスを作成します。
- ジョブのスケジューリング。マルチチャネルのバッチ処理システムでは、新しいジョブがメモリに置かれると、そのジョブ用のプロセスが作成されます。
- サービスの提供: ユーザーがオペレーティング システムに特定のサービスを提供すると、そのリクエストを処理するためのプロセスが作成されます。
- アプリケーション要求により、ユーザー プロセスは子プロセスの作成を積極的に要求します。
オペレーティングシステムには親子プロセスという概念があり、あるプロセスが別のプロセスを作成することができます。このとき、作成者が親、作成されたプロセスが子プロセスになります。子プロセスが取り消されると、親プロセスから取得したリソースが親プロセスに返されます。
2.1.5.3 プロセスの終了
プロセスの終了に対応するプロセス状態は次のように変換されます。
- 実行状態/ブロック状態/準備完了状態→終了状態
プロセスの終了は、次の手順を含む終了プリミティブによって実現されます。
- 終了したプロセスの PID に従って、PCB コレクションからプロセスの PCB を見つけ、プロセスのステータスを読み取ります。
- プロセスが実行状態にある場合、プロセスの実行は直ちに終了され、CPU が他のプロセスに割り当てられます。
- プロセスに子孫プロセスがある場合、その子孫プロセスはすべて終了します。
- プロセスが所有するすべてのリソースをオペレーティング システムまたはその親プロセスに返します。
- PCB をキューから削除します。
プロセスの終了を引き起こす可能性のあるイベントには、一般に次のようなものがあります。
- 正常に終了するということは、プロセスのタスクが完了し、終了する準備ができていることを意味します (exit システム コールなど、プロセス自体が終了を要求します)。
- 異常終了とは、プロセスの実行中に異常な事象が発生し、プログラムの実行を継続できなくなること(整数の0による除算、特権命令の不正使用、実行タイムアウト、I/O障害など)を意味します。
- 外部介入とは、ユーザーまたはオペレーティング システムの介入、親プロセスの要求、親プロセスの終了など、外部の要求によってプロセスが終了することを意味します。
2.1.5.4 プロセスのブロック
プロセスのブロックに対応するプロセス状態は次のように変換されます。
- 実行状態 -> ブロック状態
プロセスのブロックは、ブロック プリミティブによって実現されます。これには次の手順が含まれます。
- プロセスの PID を通じて、PCB コレクションからプロセスの PCB を見つけ、プロセスのステータスを読み取ります。
- プロセスが実行状態にある場合は、実行サイトを保護し、ブロック状態に変換して、実行を停止します。
- PCB を対応する待機キューに挿入し、CPU を準備完了状態の他のプロセスにスケジュールします。
プロセスのブロックを引き起こす可能性のあるイベントには、一般に次のようなものがあります。
- プロセスは、I/O デバイス リソースの待機など、特定のシステム リソースの要求に失敗しました。
- プロセスは何らかの操作の完了を待ちます。
2.1.5.5 プロセスのウェイクアップ
プロセスのウェイクアップに対応するプロセス状態は次のように変換されます。
- ブロック状態 -> 準備完了状態
プロセスのウェイクアップはウェイクアップ プリミティブによって実現されます。プロセスのウェイクアップは特定のイベントに基づいており、特定のイベントを待っているブロックされたプロセスをウェイクアップすることを目的としています。これには次の手順が含まれます:
- プロセスの PID を介して、イベントの待機キューから対応するプロセスの PCB を見つけます。
- 待機キューから削除し、準備完了状態に設定します。
- PCB を準備完了キューに挿入し、CPU スケジューリングを待ちます。
プロセスのウェイクアップを引き起こす可能性のあるイベントには、一般に次のようなものがあります。
- ブロックされたプロセスによって要求されたシステム リソース (I/O デバイス リソースなど) は解放され、プロセスに割り当てられます。
- ブロックされたプロセスが何らかの操作の完了を待機した後。
注: プロセスのブロッキング プリミティブとウェイクアップ プリミティブは、まったく逆の効果を持つプリミティブのペアであり、ペアで使用する必要があります。ブロッキング プリミティブがプロセスで呼び出される場合は、連携するプロセスまたはその他の関連プロセスで使用する必要があります。ブロックされたプロセスをウェイクアップするには、対応するウェイクアップ プリミティブをプロセス内に配置します。そうでない場合、ブロックされたプロセスはウェイクアップされず、永久にブロックされます。
2.1.5.6 プロセスの切り替え
プロセスの切り替えに対応するプロセスの状態は次のとおりです。
- 実行状態 -> ブロック状態/準備完了状態
- 準備完了状態 -> 実行状態
プロセスの切り替えは、プリミティブの切り替えによって実現されます。これには次の手順が含まれます。
- プロセスの PID に従って、対応する PCB が PCB コレクションから検索され、現在の実行環境情報がPCB に保存されます。
- PCB を対応するキューに移動します。
- 別のプロセスを選択して実行し、その PCB を更新します。
- PCB に従って新しいプロセスを復元するために必要な動作環境。
プロセスの切り替えを引き起こす可能性のあるイベントには、一般に次のようなものがあります。
- プロセスのタイム スライス時間が期限切れになりました。
- 優先度の高いプロセスで到着。
- 現在のプロセスはアクティブにブロックされています。
- 現在のプロセスはアクティブに終了されます。
プロセスを切り替えるときは、実行環境情報を PCB に保存するという重要な手順があります。
ここでいう実行環境情報とは、CPU の実行コンテキスト (Context) として理解できますが、これまでの検討により、CPU 内にはさまざまなレジスタ (CPU の状態切り替えに使用される PSW レジスタなど) が存在することがわかりました。はコンピュータの構成です。原理に関する知識はここでは詳しく紹介しません)プロセスが実行されると、多くの情報がレジスタに生成されます。この情報は、現在のプロセスが実行されているコンテキストです。 CPU が他のプロセスによって占有されている場合、その CPU は再び使用されます。現在のプロセスが実行されると、CPU 内のレジスタ情報が他のプロセスの情報によって上書きされる可能性があります。そのため、プロセスが実行し続けるためには、エラーがなければ、プロセスの実行コンテキスト情報を PCB に保存する必要があります。CPU がプロセスを再度実行するとき、プロセスの実行中に、プロセスの実行環境情報が PCB から読み取られ、プロセスを続行できます。実行する。
プロセス制御に関連する 5 つの基本要素の上記の紹介から、さらに要約することができます。
プロセスのプリミティブに関係なく、実行される内容は次の 3 つに含まれます。
- プロセスの PCB 情報を更新します (プロセスのステータスを変更し、プロセスの実行環境情報を保護/復元します)。
- PCB を適切なキュー (ブロッキング キュー、レディ キュー) に挿入します。
- 資源の配分・リサイクル
注: コンテキストの切り替えとモードの切り替えは異なります。モードの切り替え時、CPU は論理的に同じプロセスを実行している可能性があります。ユーザー プロセスは最初はユーザー モードで実行されます。プロセスが割り込みまたは例外によりコア モードに入った場合、プロセスは で実行されます。実行後はコアモードになり、ユーザーモードに戻り、中断されたばかりのプロセスを実行します。ユーザー モードとカーネル モードの間の切り替えは、 モード切り替え と呼ばれます。現在のプロセスは変更されません。コンテキスト切り替えは、カーネル モードでのみ発生します。これは、マルチタスク オペレーティング システムで必要な機能です。
セクションの概要
このセクションには内容が多すぎるため、ブロガーはマインド マップをいくつかの小さな画像に分割しました
2.1.6 プロセス間の通信
2.1.6.1 はじめに
-
プロセス間通信とは何ですか?
プロセス通信とは、プロセス間の情報の交換 (データ交換)を指します。プロセス間通信は、オペレーティング システムによって提供されるサポートに依存します。
-
プロセス間通信がオペレーティング システムのサポートに依存するのはなぜですか?
上記の研究から、プロセスはオペレーティング システムがシステム リソースを割り当てるための基本単位であり、各プロセスが所有するメモリ アドレスは互いに独立していることがわかります。したがって、さまざまなプロセス間でデータ交換を実行する場合は、オペレーティング システムのサポートに依存する必要があります。
-
各プロセスが所有するメモリ アドレスはなぜ互いに独立している必要があるのでしょうか?
システムセキュリティの観点から、各プロセスが所有するメモリアドレスが互いに独立していない場合、これは各プロセスが互いのデータにアクセスできることを意味します。これは非常に危険です。例えば、アプリの中にはあなたの個人情報 (銀行口座、ID カード情報など) が保存されている場合があります。このとき、悪意のあるアプリをインストールし、それを同時に実行すると、これら 2 つのアプリを使用すると、この悪意のあるアプリが個人情報を保存しているアプリのデータに自由にアクセスでき、個人情報が漏洩する危険があります。
したがって、セキュリティを確保するために、あるプロセスが別のプロセスのメモリ アドレスに直接アクセスすることはできません。
2.1.6.2 プロセス通信の分類
プロセス間通信は、共有ストレージ、メッセージ パッシング、およびパイプライン通信の 3 つのカテゴリに分類できます。
2.1.6.3 共有ストレージ
2.1.6.3.1 はじめに
共有ストレージとは、通信が必要な複数のプロセスがオペレーティングシステムから共有空間を申請し、これらのプロセスが直接共有空間にアクセスすることができ、この共有空間への読み書き操作によりプロセス間の情報交換が実現されます。オペレーティング システムは、この共有スペースを、対応するプロセスの仮想アドレス スペースにマップします。(次の章で紹介します)
平たく言えば、AとBという2人がいて、ブラックボックスを介してアイテムを交換する必要があり、AはBがブラックボックスに入れたアイテムをブラックボックスから取得することしかできず、Bから直接アイテムを取得することはできません。同様に、B が A にアイテムを渡したい場合、最初にアイテムをブラック ボックスに入れることしかできませんが、A に直接渡すことはできません。
2.1.6.3.2 機能
- エラーを回避するには、共有スペースプロセスで読み取り/書き込み操作を行うときに、同期相互排他ツール(P/V 操作など) を使用して読み取り/書き込みを制御する必要があります。
- オペレーティング システムは、通信プロセスに共有スペースと同期相互排他ツールを提供することのみを担当し、データ交換はユーザー独自の読み取り/書き込み命令の配置によって完了します。
2.1.6.3.3 分類
共有ストレージは、データ構造ベースの共有とストレージベースの共有にさらに分類できます。
-
データ構造ベースの共有(低レベル)
オペレーティング システムは、プロセスごとに使用するメモリ内に特定のデータ構造の共有スペースを定義します。たとえば、共有スペースはサイズ 10 の配列しか拡大できません。この共有方法は時間がかかり、多くの制限があります。
-
バケットベースの共有 (上級)
オペレーティングシステムは、データ構造を指定せずにメモリ上の共有記憶領域を分割し、データの記憶形式と位置はプロセスによって制御され、高速な共有方法です。
2.1.6.4 メッセージの配信
2.1.6.4.1 はじめに
メッセージ パッシングとは、フォーマットされた情報の単位でプロセス間でデータを交換することを指します。通信するプロセス間に共有スペースがない場合は、オペレーティング システムが提供するメッセージ パッシング方式を使用してプロセス通信を実現できます。
フォーマットされた情報には、情報ヘッダーと情報本体が含まれます。
-
情報ヘッダー
送信プロセスID、受信プロセスID、メッセージ長などの情報が含まれます。
-
情報本体
プロセスが交換したいもの。
2.1.6.4.2 機能
-
メッセージ パッシングは、メッセージの送信と受信のためにオペレーティング システムによって提供される2 つのプリミティブとのデータ交換に依存します。
メッセージ送信プリミティブ: send(pid,msg)
メッセージ受信プリミティブ:receive(pid,&msg)
-
通信実装の詳細が隠蔽され、(2 つのプリミティブに依存して) 通信プログラムの設計が簡素化されるため、現在最も広く使用されているプロセス間通信メカニズムです。
2.1.6.4.3 分類
メッセージングはさらに、直接コミュニケーションと間接コミュニケーションの 2 つのタイプに分類できます。
-
直接コミュニケーション
送信プロセスは、送信プリミティブを介して受信プロセスの PID を介してメッセージを受信プロセスに直接送信し、受信プロセスのメッセージ バッファ キューにメッセージをハングし、受信プロセスはキューから情報を取得します。
-
間接的なコミュニケーション方法
送信プロセスはメッセージを中間エンティティに送信し、受信プロセスは中間エンティティから情報を取得します。この中間実体を一般に「メールボックス」と呼ぶため、間接通信方式はメールボックス通信方式とも呼ばれる。
一般的に理解されているのは、A と B という二人の人間がいる、A が B に手紙を書きたい、A が書いた手紙を配達員に手渡す、というものです。1 つ目の方法は、配達員が手紙を B の手に直接手渡すというものです。つまり、配達人は手紙をBの郵便受けに入れ、Bは郵便受けから手紙を受け取ります。
2.1.6.5 パイプライン通信
2.1.6.5.1 はじめに
パイプ通信とは、パイプなどの特別な共有ファイルを介したプロセス間の情報交換を指します。
パイプとは、読み込み処理と書き込み処理を接続して通信するための共有ファイル(パイプファイル)のことです。ファイルにデータを書き込む処理を書き込み処理、ファイルからデータを読み取る処理を読み取り処理と呼びます。
2.1.6.5.2 機能
- パイプライン内のデータはFIFO方式を採用しています。
- パイプは半二重通信のみを使用できます。つまり、同じ時間内では一方向の送信のみが可能です。双方向の送信を行う場合は、パイプが 2 つ必要です。
- オペレーティング システムは、パイプラインへのさまざまなプロセスの相互排他的アクセスを制御します。
- パイプがいっぱいになると、読み取りプロセスがパイプからデータを削除してパイプに空き領域ができるまで、書き込みプロセスはブロックされます。
- パイプが空の場合、書き込みプロセスがパイプにデータを書き込み、パイプが空でなくなるまで、読み取りプロセスはブロックされます。
- パイプ内のデータは一度読み込むと完全に消えてしまうため、複数のプロセスが同じパイプからデータを読み込むと混乱が生じる可能性があり、この場合の解決策は通常 2 つあります。
- パイプでは複数の書き込みプロセスと 1 つの読み取りプロセスが可能です。
- パイプでは複数の書き込みプロセスと複数の読み取りプロセスが可能で、オペレーティング システムは各読み取りプロセスが順番にパイプからデータを読み取ることができます (Linux オペレーティング システム ソリューション)
2.1.6.5.3 Linux のパイプ
Linux では、パイプは非常に頻繁に使用される通信メカニズムです。パイプを使用すると、通信にファイルを使用する場合の次の 2 つの問題を解決できます。
- パイプラインのサイズを制限します。実際、パイプは固定サイズのバッファであり、Linux ではパイプのサイズは 4KB なので、チェックせずに増加する可能性のあるファイルとは異なります。固定サイズのバッファを使用すると問題が発生します。たとえば、データの書き込み時にパイプがいっぱいになる可能性があり、このとき、パイプへの write() 呼び出しはブロックされます。
- 読み取りプロセスは、書き込みプロセスよりも高速に動作する場合もあります。すべてのデータが読み取られると、パイプは空になり、パイプへの read() 呼び出しはブロックされます。
2.1.6.5.4 共有ストレージとの違い
- 共有ストレージへの相互排他的アクセスは通信プロセスによって実装され、パイプライン通信への相互排他的アクセスはオペレーティング システムによって実装されます。
- 共有ストレージでは、プロセスは共有空間内のどこからでもデータの読み取り/書き込みが許可されますが、パイプライン通信では、一方からのデータの書き込みともう一方の側からの読み取りのみが許可されます。
- 共有ストレージでは、プロセスが共有スペースにアクセスしたい場合、他のプロセスは共有スペースで書き込み操作を実行する必要はありません。そうしないと、アクセス動作がブロックされます。パイプライン通信では、パイプラインにデータがある限り、書き込み操作を行うことができます。他のプロセスがパイプに書き込みを行っているため、ブロックされることを心配することなくデータを読み取ることができます。
セクションの概要
2.2 スレッド
2.2.1 スレッドの基本概念とプロパティ
2.2.1.1 はじめに
スレッドは、CPU の基本的な実行単位であり、プログラム実行フローの最小単位です。スレッド ID、プログラム カウンタ、レジスタ セット、スタックで構成されます。プロセス内の実体であり、プロセスによって独立してスケジュールおよびディスパッチされる基本単位です。システム。これは「軽量プロセス」として理解できます。
2.2.1.2 なぜスレッドを導入する必要があるのでしょうか?
プロセスを導入する理由は、複数のプログラムの同時実行を可能にし、リソースの使用率を向上させるためであることは前に学びました。プロセスは複数のタスクを同時に実行する必要がある場合があります (たとえば、QQ はビデオ チャット、ファイル転送などを同時に実行する必要があります)。これらの機能は 1 つのプロセスの逐次処理では解決できません。このとき、スレッドの概念が導入され、プロセスがさらに分割されます。プロセスは複数のスレッドを持つことができます。これらのスレッドは、プロセスが所有するリソースを共有します。各スレッドは、CPU によって独立してスケジュールできます。これらのスレッドは、異なる処理を担当できます。それぞれの機能。たとえば、上記の QQ の例では、2 つのスレッド (ビデオ チャットとファイル転送) に対応する QQ プロセスにすることができます。
上記のことから、スレッドを導入すると、オペレーティング システムの同時実行パフォーマンスがさらに向上することがわかります。スレッドの導入後はプロセスの意味が変わり、現在ではプロセスはCPU以外のシステムリソースの割り当て単位としてのみ使用され、スレッドはCPUの割り当て単位として使用されます。
2.2.1.3 スレッドの主な属性
- スレッドはシステム リソースを所有せず、所属するプロセスのリソースを共有します。
- 異なるスレッドで同じプログラムを実行できます。
- スレッドは CPU に依存しないスケジューリングの基本単位であり、複数のスレッドを同時に実行できます。
- スレッドが作成されると、スレッドは終了するまでライフ サイクルを開始し、ライフ サイクル中に、スレッドはブロック状態、準備完了状態、実行状態などのさまざまな状態変化を経験します。
セクションの概要
2.2.2 スレッドのステータス
プロセスと非常によく似ていますが、スレッドにも、新規状態、準備完了状態、実行中状態、ブロック状態、および終了状態の 5 つの状態があります。
スレッドはプロセスをさらに分割したものとして理解できるため、これら 5 つの状態と 5 つの状態間の遷移も基本的にはプロセスと同じです (詳細は 2.1.4 節を参照)
2.2.3 スレッドの構成と制御
2.2.3.1 スレッド制御ブロック
プロセスと同様に、オペレーティング システムにもスレッドごとにスレッド制御ブロック TCB が装備されており、スレッドの制御と管理に関する情報を記録するために使用されます。
TCB の主な内容を下図に示します。
2.2.3.2 スレッドの構成
プロセスと同様に、オペレーティング システムは、さまざまな状態に応じて TCB をさまざまなスレッド テーブルに分割し、スレッド テーブルを通じてスレッドを編成します。
2.2.3.3 スレッド制御
-
スレッドの作成
オペレーティング システムは、スレッドを作成するためのシステム コールを提供します。ユーザー プログラムが開始されると、通常、「初期化スレッド」と呼ばれるスレッドが 1 つだけ実行されます。その主な機能は、新しいスレッドを作成することです。新しいスレッドを作成するときは、 Create a thread システム コールを使用し、対応するパラメータを指定する必要があります。
-
スレッドの終了
スレッドがタスクを完了するか、スレッドが実行中に例外に遭遇して強制終了されると、終了スレッドは対応する終了スレッド システム コールを呼び出してスレッドを終了します。
注意: スレッドが終了した後、スレッドが占有しているリソースはすぐには解放されません。終了したスレッドは、プロセス内の他のスレッドがデタッチ関数を実行した後でのみリソースを解放します。
セクションの概要
2.2.4 スレッドとプロセスの比較
-
スケジュール設定
スレッドが導入される前は、プロセスがリソースの割り当てとスケジューリングの基本単位であり、スケジューリングのたびにコンテキストの切り替えが必要であり、コストがかかりました。
スレッドの導入後、プロセスは CPU 以外のリソース割り当ての基本単位になります。スレッドは CPU スケジューリングの基本単位です。同じプロセス内では、スレッド切り替えのオーバーヘッドは非常に小さく、プロセス切り替えのトリガーにはなりません。ただし、あるプロセスのスレッドから別のプロセスのスレッドに切り替える場合、プロセス切り替えは引き続きトリガーされます。
-
同時実行性
スレッドが導入される前は、プロセスは同時に実行できました。
スレッドの導入後は、プロセスを同時に実行できるだけでなく、スレッドも同時に実行できるようになり、オペレーティング システムの同時実行パフォーマンスがさらに向上します。
-
リソースがある
プロセスは、CPU を除く、システム内のリソース割り当ての基本単位です。スレッドはシステム リソースを所有しません。スレッドは、所属するプロセスのシステム リソースにアクセスできます。
-
独立
各プロセスは独立したアドレス空間とリソースを持ち、異なるプロセス間のスレッドは互いに見えず、同じプロセスの複数のスレッドがプロセスのリソースを共有します。
-
マルチCPUシステム
スレッドが導入される前は、CPU の数に関係なく、プロセスは 1 つの CPU 上でしか実行できませんでした。
スレッドを導入した後、プロセス内の複数のスレッドを異なる CPU に割り当てて実行できます。
-
実装
スレッドが導入される前のプロセスが「実行状態」にあるとは、そのプロセスが CPU によって実行されていることを意味します。
スレッドの導入後、プロセスが「実行状態」にあるとは、プロセス内のスレッドがCPUによって実行されていることを意味します。
セクションの概要
2.2.5 スレッドの実装
スレッドの実装は、ユーザー レベル スレッド (ULT)とカーネル レベル スレッド (KLT)の 2 つのカテゴリに分類できます。
2.2.5.1 ユーザーレベルのスレッド
-
コンセプト
ユーザーレベルのスレッドを使用する場合、スレッド管理に関するすべての作業は、スレッド ライブラリを通じてアプリケーションによって実装されます。
スレッド ライブラリとは、プログラマがスレッドを作成および管理するためにプログラミング言語によって提供される API ライブラリを指します。スレッド ライブラリを実装するには、主に 2 つの方法があります。
- ユーザー空間でカーネル サポートなしの API ライブラリを提供します。API ライブラリ内のすべてのコードとデータ構造はユーザー空間にあります。ライブラリ内の関数を呼び出すと、ユーザー空間のローカル関数のみが呼び出されます。
- オペレーティング システムによって直接サポートされるカーネル レベルの API ライブラリを実装します。API ライブラリ内のすべてのコードとデータ構造は、カーネル空間に配置されます。ライブラリ内の関数を呼び出すと、カーネルへのシステム コールが発生します。
現時点では、オペレーティング システムのカーネルはスレッドの存在を感知できず、プロセスの存在のみを感知します。つまり、ユーザーの観点からは複数のスレッドが同時に実行されていますが、オペレーティング システムのカーネルにとっては 1 つのプロセスだけが実行されています。ユーザーレベルスレッドを使用したシステムの構造図を次の図に示します。
上記の構造を持つオペレーティング システムを使用すると、CPUスケジューリング ユニットは依然としてプロセスであり(オペレーティング システムのカーネルはユーザー レベルのスレッドを感知できないため)、各プロセスは順番にタイム スライスを実行します。たとえば、システム内のプロセス A には 1 つのタイム スライスが含まれています。ユーザーレベルのスレッドであり、プロセス B には 10 個のユーザー スレッドが含まれています。このとき、プロセス A のスレッドの実行時間は、プロセス B の各スレッドの実行時間の 10 倍になります。
-
アドバンテージ
- ユーザーレベルのスレッドの管理と保守はアプリケーション プログラムに実装されているため、スレッド間の切り替えにはカーネル状態への変換が必要なく、CPU の状態切り替えのオーバーヘッドが節約されます。
- 各プロセスのスケジューリング アルゴリズムは専用にすることができ、異なるプロセスは、それぞれのニーズに応じて異なるスケジューリング アルゴリズムを選択して、独自のスレッドをスケジュールできます。
- アプリケーション内のユーザーレベルのスレッドの実装と管理に関連するコードは、オペレーティング システム プラットフォームに依存しません。
-
欠点がある
- 同じプロセスのユーザーレベルのスレッドのいずれかのスレッドでシステム コール関連のブロック問題が発生すると、同じプロセス内の他のスレッドに影響があり、他のスレッドもブロックされます。
- 複数のコアを利用できないため、オペレーティング システム カーネルはプロセスに一度に 1 つの CPU しか割り当てないため、プロセス内で同時に実行できるスレッドは 1 つだけです。
2.2.5.2 カーネルレベルのスレッド
-
コンセプト
カーネル レベルのスレッドを使用する場合、スレッド管理に関連するすべての作業は、オペレーティング システムのカーネル プログラムによって実装されます。オペレーティング システムは、カーネル レベルのスレッドを管理するために、各カーネル レベルのスレッドに TCB を設定します (前の章では、 TCB関連の知識を紹介しました)。カーネルレベルのスレッドを使用したシステムの構造図を次の図に示します。
上記の構造を持つオペレーティング システムを使用すると、CPU のスケジューリング単位はカーネル レベルのスレッドになります。
-
アドバンテージ
- マルチコアを利用でき、同じプロセスの複数のスレッドをスケジュールして、異なる CPU で実行できます。
- 同じプロセス内のスレッドがブロックされても、プロセス内の他のスレッドには影響せず、システムは他のスレッドに CPU を占有させます。
- カーネル レベルのスレッドは、データ構造とスタックが小さく、スレッドの切り替えが速く、オーバーヘッドが低いです。
-
欠点がある
同じプロセス内でユーザーレベルのスレッドを切り替えるには、ユーザー モードからカーネル モードへの変換が必要となり、大きなシステム オーバーヘッドが必要になります。
2.2.5.3 混合形式
-
コンセプト
ハイブリッド形式とは、ユーザー レベルのスレッドとカーネル レベルのスレッドの組み合わせを指します。この実装では、カーネルは複数のカーネル レベルのスレッドの作成、スケジューリング、および管理をサポートし、ユーザー プログラムによる作成、スケジュール、および管理も可能にします。ユーザーレベルのスレッドを管理します。1 つのカーネル レベル スレッドは、複数のユーザー レベル スレッド (これらのユーザー レベル スレッド、時分割多重カーネル レベル スレッド) に対応できます。この実装を使用したシステムの構成図を次の図に示します。
上記の構造を持つオペレーティング システムを使用すると、CPU のスケジューリング単位はカーネル レベルのスレッドですが、アプリケーションはスレッド ライブラリを通じてユーザー レベルのスレッドを管理できます。
-
長所と短所
このアプローチは、ユーザーレベルのスレッドとカーネルレベルのスレッドの利点を組み合わせたものです。
セクションの概要
2.2.6 マルチスレッドモデル
オペレーティング システムがユーザー レベルのスレッドとカーネル レベルのスレッドの両方をサポートする場合、つまり上記で紹介したハイブリッド方式が使用される場合、ユーザー レベルのスレッドとカーネル レベルのスレッドの接続方法が異なるため、次のように分類できます。 3 つの異なるマルチスレッド モデル: 1 対 1 モデル、多対 1 モデル、および多対多モデル。
2.2.6.1 1対1モデル
-
コンセプト
各ユーザー レベルのスレッド マッピングは、異なるカーネル レベルのスレッドにマッピングされ、その構造図を次の図に示します。
上の図からわかるように、このマルチスレッド モデルは実際には、カーネル レベルのスレッドを有効にするときに上で紹介したスレッド実装方法です。
-
アドバンテージ
スレッドがブロックされると、CPU は強力な同時実行機能を使用して、別のスレッドの実行をスケジュールできます。
-
欠点がある
ユーザー スレッドが作成されるたびに、対応するカーネル スレッドを作成する必要があり、これには大きなシステム オーバーヘッドが必要になります。
2.2.6.2 多対一モデル
-
コンセプト
複数のユーザー レベルのスレッドを 1 つのカーネル レベルのスレッドにマップします。これらのユーザー スレッドは 1 つのプロセスに属します。スレッドのスケジューリングと管理はユーザー空間で完了します。ユーザー レベルのスレッドがカーネルにアクセスする必要がある場合にのみ、それらは 1 つのカーネルにマップされます。レベル スレッド。一度に 1 つのスレッドのみをマッピングできます。構造図を次の図に示します。
上の図からわかるように、このマルチスレッド モデルは実際には、上で紹介した純粋なユーザーレベルのスレッドの実装です。
-
アドバンテージ
スレッド管理はユーザー空間で実行され、非常に効率的です。
-
欠点がある
- カーネルへのアクセス中にスレッドがブロックされると、プロセス全体がブロックされます。
- 同時にカーネルにアクセスできるスレッドは 1 つだけです。
- 複数のスレッドをスケジュールして、複数の CPU で同時に実行することはできません。
2.2.6.3 多対多モデル
-
コンセプト
n 個のユーザーレベルのスレッドを m 個のカーネルレベルのスレッドにマップします (n は m 以上)構造図は次の図のようになります。
上の図からわかるように、このマルチスレッド モデルは、実際には上で紹介したハイブリッド実装方法です。
このマルチスレッド モデルでは、ユーザー レベルのスレッドは「コード ロジック」のキャリアとして理解でき、カーネル レベルのスレッドは「実行機会」のキャリアとして理解できます。つまり、カーネル レベルのスレッドがユニットです。 CPU のスケジューリング。カーネル レベルのスレッドは、マップされたユーザー レベルのスレッドでコードを実行できます。
-
特徴
これは、多対 1 モデルの同時実行性の低さという欠点を克服するだけでなく、1 対 1 モデルで 1 つのユーザー プロセスがあまりにも多くのカーネル レベルのスレッドを占有することによって生じる過剰なオーバーヘッドという欠点も克服します。
セクションの概要
2.3 CPU スケジューリング
2.3.1 スケジュール関連の概念
2.3.1.1 スケジューリングとは
同時に処理したいものが複数ある場合、リソースが限られているため同時に処理することはできず、その際に一定のルールに従って処理の順番を決める必要があります。それが「スケジューリング」です。
マルチプログラミングシステムでは、プロセス数が CPU 数よりも多いため、複数のプロセスが CPU を競合することがよくありますが、このとき、レディキューから特定のプロセスを選択する必要があります。特定のルールに従ってプロセスを実行し、プロセスが実行できるように CPU をプロセスに割り当てます。
2.3.1.2 7 状態モデル
2.1.4 節ではプロセスの 5 つの状態について学習しましたが、ここで CPU スケジューリングを学習するには、プロセスの特殊な状態であるサスペンド状態 (サスペンド状態) をさらに学習する必要があります。これは、レディ サスペンドとブロッキング サスペンドの2 つの状態に細分されるため、プロセスの5 状態モデルをさらに7 状態モデルに拡張できます。
では、一時停止されたプロセスはいつ表示されるのでしょうか?
メモリが限られているため、一部のプロセスのデータは一時的に外部メモリに転送する必要があります。これらのプロセスを実行する必要があり、メモリに空きがある場合、データはメモリに戻されます。一時的に保存されるプロセスのステータス外部メモリに書き込み待機中はサスペンド状態です。一時停止状態にあるプロセスの PCB は一時停止キューに編成されます。
7 状態モデルの遷移図を以下に示します。
ブロックとサスペンドの比較
同じことです。それらはすべて、CPU が一時的に利用できないサービス内にあります。
違い: ブロック状態のプロセス イメージはまだメモリ内にありますが、サスペンド状態のプロセス イメージは外部メモリ内にあります。
2.3.1.3 3 レベルのスケジューリング
オペレーティング システムのスケジューリングは、高レベルから低レベルまで、高レベル スケジューリング -> 中レベル スケジューリング -> 低レベル スケジューリングの 3 つのレベルに分かれています。
-
高度なスケジューリング
アドバンスト スケジューリング (ジョブ スケジューリング とも呼ばれます) は、外部ジョブ バックアップ キューからジョブを選択し、特定の原則に従ってそれをメモリに転送し、CPU を競合できるように対応するプロセスを作成することを指します。各ジョブは 1 回だけロードされ、1 回ロードされます。ジョブが呼び出されるときに PCB が作成され、呼び出されるときにその PCB が破棄されます。
ジョブとは特定のタスクを指します。ジョブをシステムに送信するということは、ユーザーがオペレーティング システムにプログラムの開始 (特定のタスクを処理するため) を要求することを意味します。
メモリ空間は限られているため、メモリ空間がいっぱいで別のユーザーがオペレーティング システムにジョブを送信すると、これらのジョブはメモリの外のジョブ バックアップ キューに配置されます。
-
中間スケジューリング
中間スケジューリング (メモリ スケジューリングとも呼ばれます) は、特定のルールに従って、中断されたプロセスをメモリに読み戻すことを決定することを指します。プロセスは複数回呼び出され、メモリに取り込まれることがあります。メモリ スケジューリングの頻度は、ジョブ スケジューリングの頻度よりも高くなります。
-
低レベルのスケジューリング
プロセス スケジューリングとも呼ばれる低レベル スケジューリングは、特定のルールに従ってレディ キューからプロセスを選択し、そのプロセスに CPU を割り当てることを指します。
プロセス スケジューリングは、オペレーティング システムにおける最も基本的な種類のスケジューリングであり、非常に高い頻度で (通常は数十ミリ秒に 1 回) 行われます。
2.3.1.4 3 レベルのスケジューリングの接続と比較
やる事 | 起こったシーン | 頻度 | プロセスステータスへの影響 | |
---|---|---|---|---|
高度なスケジューリング | 一定のルールに従って、バックアップキューから適切なジョブを選択し、メモリに転送し、プロセスを作成します | 外部ストレージ -> メモリ (ジョブ指向) | 最低 | なし -> 作成済み状態 -> 準備完了状態 |
中間スケジューリング | 特定のルールに従って、一時停止キューから適切なプロセスを選択し、そのデータをメモリに転送します。 | 外部メモリ -> メモリ (プロセス指向) | 中くらい | レディサスペンド→レディ状態(ブロッキングサスペンド→ブロッキング状態) |
低レベルのスケジューリング | 特定のルールに従って、準備完了キューからプロセスを選択して CPU を割り当てます | メモリ -> CPU | 最高 | 準備完了状態 -> 実行状態 |
セクションの概要
2.3.2 スケジューリングの実装
2.3.2.1 スケジューラとアイドルプロセス
-
スケジューラ
オペレーティング システムでは、CPU はスケジューラによってスケジュールされ、割り当てられます。スケジューラは通常、キュー、ディスパッチャ、コンテキスト スイッチャの 3 つの部分で構成されます。
-
キューワー
スケジューラによる選択を容易にするために、特定のルールに従ってオペレーティング システム内のすべての準備完了プロセスを 1 つ以上のキューに入れるために使用されます。
-
発車係
スケジューラで選択されたプロセスに応じて、レディキューからプロセスが呼び出され、CPUが割り当てられます。
-
コンテキストスイッチャー
CPU がプロセスを切り替えると、2 つのプロセスの実行環境が保護され、コンテキスト スイッチャーを通じて復元されます。
コンテキスト スイッチャーでは、2 組のコンテキスト (実行環境) 切り替え操作が発生します。
- 現在のプロセスの実行環境を対応する PCB に保存し、ディスパッチ プログラムが実行できるようにディスパッチ プログラムの実行環境をロードします。
- ディスパッチャの実行環境を削除し、新しいプロセスの実行環境を CPU の各レジスタにロードします。
スケジューラの構造図を以下に示します。
-
-
ハングアウトプロセス
システム内に準備完了のプロセスがない場合、CPU はアイドルプロセスを実行しますが、他に準備完了のプロセスがない場合、CPU は常にアイドルプロセスを実行し、アイドルプロセスの実行時に割り込みをテストします。
CPUがアイドル状態の場合、アイドルプロセスを実行することで継続的にパトロールを行っていることがわかります。
アイドルプロセスの優先度は最も低く、準備が完了したプロセスが存在すると、すぐに CPU を放棄します。
2.3.2.2 スケジューリングと切り替えタイミング
セクション 2.3.1.3 では、プロセス スケジューリングの関連概念を紹介しましたが、プロセスのスケジューリングと切り替えはいつ行われるのでしょうか?
まず、セクション 2.3.2.1 でスケジューラについて説明しましたが、プロセスのスケジューリングはオペレーティング システムのカーネル プログラムであるスケジューラを通じて完了することがわかります。スケジューリングを要求するイベントが発生すると、スケジューラを実行できますが、新しい準備完了プロセスがスケジュールされるまでプロセスの切り替えは発生しません。ただし、すべての場合において、スケジューリングが要求された後にプロセスのスケジューリングと切り替えが確実に行われるわけではありません。
-
プロセスのスケジューリングと切り替えが可能な状況
- 現在のプロセスは積極的にCPU を放棄します
- プロセスが正常に終了すると、プロセスのスケジューリングと切り替えが行われます。
- プロセスの実行中に例外が発生して終了すると、プロセスのスケジューリングと切り替えが発生します。
- プロセスが積極的にブロッキングを要求する (I/O の要求など) 場合、プロセスのスケジューリングと切り替えが発生します。
- 現在のプロセスは受動的にCPU を放棄します
- 現在のプロセスに割り当てられたタイム スライスが使い果たされると、プロセスのスケジューリングと切り替えが発生します。
- 実行する優先度の高いプロセスがある場合、プロセスのスケジューリングと切り替えが発生します。
- より緊急に対処する必要がある場合 (I/O 中断など)、プロセスのスケジューリングと切り替えが発生します。
- 現在のプロセスは積極的にCPU を放棄します
-
プロセスのスケジューリングや切り替えができない状況
-
割り込み処理中は、プロセスのスケジューリングや切り替えはできません。割り込み処理は非常に複雑なため、実装時に処理を切り替えることは困難です。
-
このプロセスはオペレーティング システム カーネルのクリティカル セクションにあるため、スケジュールしたり切り替えたりすることはできません。プロセスがオペレーティング システム カーネルのクリティカル セクションに入ると、そのクリティカル セクションをロックする必要があり、他のプロセスはそのアクセスを許可されません。クリティカル セクションのロックを解除できなくなるのを避けるために、ロックを解除する前に他のプロセスに切り替えないでください。
クリティカル リソース: 一定期間内に 1 つのプロセスのみが使用を許可されるリソース。各プロセスはクリティカル リソースに対して相互排他的にアクセスできる必要があります。
クリティカルセクション: 重要なリソースにアクセスするコードフラグメント。
カーネル クリティカル セクション: 通常、プロセスのレディ キューなど、特定のオペレーティング システムのカーネル データ構造にアクセスするために使用されます。したがって、カーネル クリティカル セクションはできるだけ早くロックを解放する必要があります。そうしないと、カーネルの他の管理タスクに影響を与える可能性があります。オペレーティングシステムのカーネル。
上記の説明に基づくと、プロセスはオペレーティング システム カーネルのクリティカル セクションではプロセスのスケジューリングとスイッチングを実行できませんが、プロセスが通常のクリティカル セクションにある場合は、プロセスのスケジューリングとスイッチングを実行できます。
-
アトミック (プリミティブ) 操作を実行する場合、プロセスのスケジューリングと切り替えは実行できません。アトミック操作を実行する場合は、割り込みもマスクする必要があり、プロセスのスケジューリングや切り替えは実行しないでください。
-
2.3.2.3 スケジューリング方法の分類
プロセス スケジューリング方法とは、プロセスが CPU 上で実行されているときに、処理する必要があるより重要なプロセスがあるときに CPU を割り当てる方法を指します。一般に、プロセス スケジューリングには、ノンプリエンプティブ スケジューリングとプリエンプティブ スケジューリングの 2 つの方法があります。
-
非プリエンプティブなスケジューリング
CPU を自発的に放棄できるのはプロセスのみです。つまり、プロセスが CPU 上で実行されている場合、優先度の高いプロセスが準備完了キューに入ったとしても、実行中のプロセスは、プロセスが自発的に放棄するまで実行を継続できます。 CPUを諦めます。
ノンプリエンプティブ スケジューリングの利点は、実装が簡単でシステム オーバーヘッドが低いことですが、バッチ処理システムには適していますが、タイムシェアリング システムやリアルタイムシステムには適していません。
-
プリエンプティブなスケジューリング
プロセスが受動的に CPU を放棄できるようにします。つまり、CPU 上でプロセスが実行されているときに、より高い優先度を持つプロセスが準備完了キューに入ると、実行中のプロセスは即座に一時停止され、準備完了状態に変換され、 CPU は、より高い優先度で Ready プロセスに割り当てられます。
プリエンプティブ スケジューリングの利点は、システムのスループットと応答効率を向上させることができ、タイムシェアリング システムやリアルタイム システムに適していることです。
2.3.2.4 スレッドのスケジューリング
オペレーティング システムには、ユーザー レベルのスレッド スケジューリングとカーネル レベルのスレッド スケジューリングの 2 種類のスレッド スケジューリングがあります。
-
ユーザーレベルのスレッドスケジューリング
カーネルはユーザーレベルのスレッドの存在を知らないため、現時点ではカーネルのスケジューリングの単位は依然としてプロセスです。
-
カーネルレベルのスレッドスケジューリング
カーネルはカーネル レベルのスレッドの存在を認識しているため、この時点で、カーネルは実行する特定のスレッドを選択し、それにタイム スライスを割り当てます。タイム スライスが終了すると、スレッドは強制的に中断されます。
セクションの概要
2.3.3 スケジューリングアルゴリズム
2.3.3.1 スケジューリングアルゴリズムの評価指標
誰もが異なる利点を持っているように、異なるスケジューリング アルゴリズムにも異なる特性があり、スケジューリング アルゴリズムのパフォーマンスを評価するために、人々は多くの評価基準を提案してきました。主な評価基準は、CPU 使用率、システム スループット、所要時間、待機時間、応答時間です。
-
CPU使用率
CPU 使用率は、CPU がビジーである時間の割合を指します。
CPU 使用率 = CPU 実効稼働時間/(CPU 実効稼働時間 + CPU アイドル待機時間)
-
システムのスループット
システム スループットは、単位時間あたりに CPU によって完了されるジョブの数を指します。
-
ターンアラウンドタイム
ターンアラウンドタイムとは、ジョブがシステムに送信されてから完了するまでにかかる時間、つまり、ジョブの待機時間、準備完了キューのキューイング時間、CPU での実行時間、および I/O に費やした時間の合計を指します。オペレーション。
ターンアラウンドタイム = ジョブ完了時間 – ジョブ送信時間
オペレーティング システムの場合、全体的なジョブ ターンオーバー パフォーマンスがより重要視されるため、別の評価基準である平均ターンオーバー時間が拡張されました。平均ターンオーバー時間とは、複数のジョブ ターンオーバー時間の平均を指します。
平均所要時間 = 各ジョブの所要時間の合計/ジョブ数
ジョブごとに、ジョブのターンアラウンドタイムが大きいほどターンアラウンドタイムが長く、ジョブの小さいジョブほどターンアラウンドタイムが短いため、評価指標を拡張した加重ターンアラウンドタイムとします。実際の実行時間のこと。
加重所要時間 = ジョブ所要時間/ジョブの実際の実行時間
加重所要時間に基づいて、別の評価基準である平均加重所要時間が自然に拡張されます。
平均加重所要時間 = 各ジョブの加重所要時間 / ジョブの数
-
待ち時間
待機時間とは、プロセスが確立されてから処理されるまで待機する時間の合計を指します。
注: この待機時間には、I/O デバイスの操作が完了するまでの待機時間は含まれません。これは、この間、プロセスが I/O デバイスによって処理されるためです。
待ち時間 = 所要時間 - 実行時間 -
反応時間
応答時間とは、ユーザーがシステムにリクエストを送信してから最初の応答が生成されるまでにかかる時間を指し、応答時間が短いほど、ユーザー エクスペリエンスは向上します。
セクションの概要
2.3.3.2 先着順スケジューリング アルゴリズム
-
適用範囲
ジョブのスケジューリングとプロセスのスケジューリングに使用可能
-
アルゴリズムの紹介
日常生活で物を買うために列に並ぶのと同様に、先着順 (FCFS) スケジューリング アルゴリズムにより、ジョブやプロセスが到着した順序に従ってサービスが提供されます。
ジョブのスケジューリングでは、FCFS はバックアップ ジョブ キューから最初にキューに入る 1 つまたは複数のジョブを選択し、実行のためにメモリに転送します。
プロセスのスケジューリングでは、FCFS はキューに入る最初のプロセスをレディキューから選択し、それに CPU を割り当てて実行させます。
-
プリエンプティブルですか?
FCFS は非プリエンプティブなスケジューリング アルゴリズムです
-
事例分析
システム内に 4 つのプロセス (純粋な計算プロセス、つまり I/O 操作のないプロセス) があると仮定すると、それらの到着時間と推定実行時間は次の表に示すようになります。
プロセス 到着時刻 推定実行時間 P1 0 8 P2 4 6 P3 5 2 P4 6 6 FCFS スケジューリング アルゴリズムを使用すると、上記の各プロセスのスケジューリング プロセスはP1->P2->P3->P4になります。セクション 2.3.3.1 の各指標の計算規則に従って、上記の各プロセスの指標は次のようになります。以下の表のように計算されます。
プロセス 完了時間 ターンアラウンドタイム 権利のターンアラウンドタイム 待ち時間 P1 0+8=8 8-0=8 8/8=1 8-8=0 P2 6+8=14 14-4=10 10/6=1.67 10-6=4 P3 14+2=16 16-5=11 11/2=5.5 11-2=9 P4 16+6=22 22-6=16 16/6=2.67 16-6=10 平均所要時間=(8+10+11+16)/4=11.25
平均加重所要時間 = (1+1.67+5.5+2.67)/4=2.71
平均待ち時間=(0+4+9+10)/4=5.75
プロセス P3 の特権ターンアラウンド タイムの値は 5.5 で、他の 3 つのプロセスよりもはるかに高いことがわかります。したがって、プロセス P3 は明らかに短時間実行するだけで十分ですが、実行する必要があることを意味します。長い間待ってください。
-
長所と短所
- 利点: 公平でシンプルなアルゴリズム
- 短所: 長いジョブ (プロセス) の後ろに位置する短いジョブは長時間待機する必要があり、所要時間が非常に長いため、短いジョブには非常に不向きです。つまり、長いジョブには適していますが、短いジョブには適していません。 。
-
飢餓につながるか (ジョブ/プロセスが長期間提供されない)
キューに入れられたジョブ/プロセスは順番にスケジュールされるため、スタベーションは発生しません。
2.3.3.3 短いジョブの優先順位スケジューリング アルゴリズム
-
適用範囲
ジョブのスケジューリングとプロセスのスケジューリングに使用可能
-
アルゴリズムの紹介
FCFS スケジューリング アルゴリズムの欠点に基づいて、ショート ジョブ ファースト (SJF) およびショート プロセス ファースト (SPF) スケジューリング アルゴリズム、つまり短いジョブ (プロセス) の優先スケジューリングが提案されています。
SJF は、推定実行時間が最も短い 1 つまたは複数のジョブをバックアップ キューから選択し、実行のためにメモリに転送します。
SPF は、推定実行時間が最も短いプロセスを準備完了キューから選択し、それに CPU を割り当てて実行させます。
また、最短残り時間優先アルゴリズム SRTN と呼ばれる短いジョブ優先スケジューリング アルゴリズムもあります。このアルゴリズムは、プロセスがレディ キューに参加するか、プロセスが完了するたびにスケジュールする必要があります。新しく到着したプロセスの残り時間が短い場合は、このアルゴリズムをスケジュールする必要があります。現在実行中のプロセスの残り時間 が経過すると、新しいプロセスが CPU を占有し、現在実行中のプロセスを準備完了状態に変更します。
-
プリエンプティブルですか?
SJF と SPF は非プリエンプティブ アルゴリズムであり、SRTN はプリエンプティブ アルゴリズムです。
-
事例分析
システム内に 4 つのプロセス (純粋な計算プロセス、つまり I/O 操作のないプロセス) があると仮定すると、それらの到着時間と推定実行時間は次の表に示すようになります。
プロセス 到着時刻 推定実行時間 P1 0 8 P2 4 6 P3 5 2 P4 6 6 SPF スケジューリング アルゴリズムを使用すると、上記の各プロセスのスケジューリング プロセスはP1->P3->P2->P4となり、セクション 2.3.3.1 の各指標の計算規則に従って、上記の各プロセスのさまざまな指標が計算されます。以下の表のように計算できます。
プロセス 完了時間 ターンアラウンドタイム 権利のターンアラウンドタイム 待ち時間 P1 0+8=8 8-0=8 8/8=1 8-8=0 P2 10+6=16 16-4=12 12/6=2 12-6=6 P3 8+2=10 10-5=5 5/2=2.5 5-2=3 P4 16+6=22 22-6=16 16/6=2.67 16-6=10 平均所要時間=(8+12+5+16)/4=10.25
平均加重所要時間 = (1+1.67+5.5+2.67)/4=2.0425
平均待ち時間=(0+4+9+10)/4=4.75
SRTN スケジューリング アルゴリズムを使用すると、上記の各プロセスのスケジューリング プロセスは次のようになります (Pn(m) は現在のプロセス Pn の残り時間 m を表します)。
時間 0 (P1 到着): P1(8)
時間 4 (P2 到着): P1(4)、P2(6)
時刻5(P3到着):P1(3)、P2(6)、P3(2)
タイム 6 (P4 到着): P1(3)、P2(6)、P3(1)、P4(6)
7 つの瞬間 (P3 完了): P1(3)、P2(6)、P4(6)
時間 10 (P1 完了): P2(6)、P4(6)
タイム 16 (P2 完了): P4(6)
時刻 22 (P4 完了)、終了
2.3.3.1項の各指標の計算ルールに従って、上記の各プロセスの指標は以下の表のように計算できます。
プロセス 完了時間 ターンアラウンドタイム 権利のターンアラウンドタイム 待ち時間 P1 10 10-0=10 10/8=1.25 10-8=2 P2 16 16-4=12 12/6=2 12-6=6 P3 7 7-5=2 2/2=1 2-2=0 P4 22 22-6=16 16/6=2.67 16-6=10 平均所要時間=(10+12+2+16)/4=10
平均加重所要時間 = (1.25+2+1+2.67)/4=1.73
平均待ち時間 = (2+6+0+10)/4=4.5
FCFS、SPF、および SRTN アルゴリズムの平均売上高、平均加重売上高、および平均待ち時間を比較すると、費やされた時間は FCFS>SPF>SRTN であることがわかります。
-
長所と短所
-
アドバンテージ
「最短」の平均待ち時間、平均所要時間
-
欠点がある
このアルゴリズムは、長いジョブには有害ですが、短いジョブには有利です。短いジョブが引き続き到着すると、長いジョブは長期間スケジュールされない可能性があります。
ジョブの推定実行時間はユーザーによって提供されるため、推定実行時間は実際の実行時間を表すものではないため、このアルゴリズムは必ずしも短いジョブの優先スケジューリングを実現するとは限りません。
-
-
飢餓につながるか (ジョブ/プロセスが長期間提供されない)
長期にわたる仕事の飢餓につながる可能性があります。
2.3.3.4 高応答率スケジューリングアルゴリズム
-
適用範囲
ジョブのスケジューリングやプロセスのスケジューリングに適しています
-
アルゴリズムの紹介
FCFS と SJF のスケジューリング アルゴリズムの長所と短所のバランスをとり、各ジョブの待機時間と推定実行時間を考慮します。各ジョブをスケジュールするときは、まずバックアップ ジョブ キュー内の各ジョブの応答率を計算し、応答率が最も高いジョブが実行されます。
応答率 = (待ち時間 + サービス所要時間) / サービス所要時間
-
プリエンプティブルですか?
非プリエンプティブアルゴリズム
-
事例分析
システム内に 4 つのプロセス (純粋な計算プロセス、つまり I/O 操作のないプロセス) があると仮定すると、それらの到着時間と推定実行時間は次の表に示すようになります。
プロセス 到着時刻 推定実行時間 P1 0 8 P2 4 6 P3 5 2 P4 6 6 高応答率優先スケジューリング アルゴリズムを使用すると、上記の各プロセスのスケジューリング プロセスは次のようになります (Pn(m) は、現在のプロセス Pn の応答率が m であることを示します)。
時刻 0 では、P1 のみが準備完了キューに到着し、P1 が実行されます。
8 時に、P1 は実行を終了し、CPU を積極的に放棄します。この時点で、レディ キューでは P2 (1.67)、P3 (2.5)、P4 (1.33)、および P3 が実行されています。
10 時に P3 が操作を完了し、CPU を積極的に放棄します。この時点で、レディ キューでは P2(2)、P4(1.67)、および P2 が実行されています。
16 時に P2 が操作を完了し、積極的に CPU を放棄しますが、この時点ではレディ キューには P4 のみが存在し、P4 は実行中です。
22:00、P4運用が完了し終了。
-
長所と短所
FCFS アルゴリズムと SJF アルゴリズムの間の妥協点では、待機時間と実行時間が考慮されます。
-
飢餓につながるか (ジョブ/プロセスが長期間提供されない)
飢えを引き起こさない
2.3.3.5 タイムスライスローテーションスケジューリングアルゴリズム
-
適用範囲
プロセスのスケジューリングに使用されます
-
アルゴリズムの紹介
タイム スライス ローテーション スケジューリング アルゴリズムは、主にタイム シェアリング オペレーティング システムで使用されます。システムは、FCFS ポリシーに従って、すべてのレディ プロセスをレディ キューに配置します。スケジューラは常に、レディ キュー内の最初のプロセスを選択して実行しますが、このプロセスは固定タイム スライスは 1 つだけ実行できます。タイム スライスが終了し、プロセスの実行が完了していない場合、プロセスは CPU 使用権を剥奪され、レディ キューの最後に再度キューに入れられます。
-
プリエンプティブルですか?
これはプリエンプトすることができ、クロック デバイスはクロック割り込みを発行して、タイム スライスが到着したことを CPU に通知します。
-
事例分析
システム内に 4 つのプロセス (純粋な計算プロセス、つまり I/O 操作のないプロセス) があると仮定すると、それらの到着時間と推定実行時間は次の表に示すようになります。
プロセス 到着時刻 推定実行時間 P1 0 8 P2 4 6 P3 5 2 P4 6 6 使用时间片轮转调度算法进行调度,按照时间片大小分别为2和8来进行分析。
时间片大小为2时,调度过程如下(Pn(m)表示进程Pn的剩余运行时间m,就绪队列(队头…队尾)):
时刻 就绪队列中的进程情况 CPU分配情况 0 P1(8) P1 2 P1(6) P1 4 P2(6),P1(4) P2 5 P1(4),P3(2) P2 6 P1(4),P3(2),P4(6),P2(4) P1 8 P3(2),P4(6),P2(4),P1(2) P3 10 P4(6),P2(4),P1(2) P4 12 P2(4),P1(2),P4(4) P2 14 P1(2),P4(4),P2(2) P1 16 P4(4),P2(2) P4 18 P2(2),P4(2) P2 20 P4(2) P4 22 空闲 空闲 上面的表格的文字描述版本:
0时刻,就绪队列中的进程情况为(P1(8)),此时让P1运行。
2时刻,时间片用完,此时就绪队列中的进程情况为(P1(6)),此时继续让P1运行。
4时刻,P2到达,且时间片刚好用完,此时就绪队列中的进程情况为(P2(6),P1(4)),此时让P2运行。
5时刻,P3到达,但是时间片没有用完,此时就绪队列中的进程情况为(P1(4),P3(2)),此时P2继续运行。
6时刻,P4到达,且时间片刚好用完,此时就绪队列中的进程情况为(P1(4),P3(2),P4(6),P2(4)),此时让P1运行。
8时刻,时间片用完,此时就绪队列中的进程情况为(P3(2),P4(6),P2(4),P1(2)),此时让P3运行。
10时刻,P3执行结束,且时间片用完,此时就绪队列中的进程情况为(P4(6),P2(4),P1(2)),此时让P4运行。
12时刻,时间片用完,此时就绪队列中的进程情况为(P2(4),P1(2),P4(4)),此时让P2运行。
14时刻,时间片用完,此时就绪队列中的进程情况为(P1(2),P4(4),P2(2)),此时让P1运行。
16时刻,P1执行结束,且时间片用完,此时就绪队列中的进程情况为(P4(4),P2(2)),此时让P4运行。
18时刻,时间片用完,此时就绪队列中的进程情况为(P2(2),P4(2)),此时让P2运行。
20时刻,P2执行结束,且时间片用完,此时就绪队列中的进程情况为(P4(2)),此时让P4运行。
22时刻,P4执行结束,至此所有进程执行完毕。
时间片大小为8时,调度过程如下(Pn(m)表示进程Pn的剩余运行时间m,就绪队列(队头…队尾)):
时刻 就绪队列中的进程情况 CPU分配情况 0 P1(8) P1 4 P2(6) P1 5 P2(6),P3(2) P1 6 P2(6),P3(2),P4(6) P1 8 P2(6),P3(2),P4(6) P2 14 P3(2),P4(6) P3 16 P4(6) P4 22 空闲 上面的表格的文字描述版本:
0时刻,就绪队列中的进程情况为(P1(8)),此时让P1运行。
4时刻,P2到达,时间片没有用完,此时就绪队列中的进程情况为(P2(6)),此时继续让P1运行。
5时刻,P3到达,时间片没有用完,此时就绪队列中的进程情况为(P2(6),P3(2)),此时继续让P1运行。
6时刻,P4到达,时间片没有用完,此时就绪队列中的进程情况为(P2(6),P3(2),P4(6)),此时继续让P1运行。
8时刻,P1执行结束,且时间片用完,此时就绪队列中的进程情况为(P2(6),P3(2),P4(6)),此时让P2运行。
14时刻,P2执行结束,此时就绪队列中的进程情况为(P3(2),P4(6)),此时让P3运行。
16时刻,P3执行结束,此时就绪队列中的进程情况为(P4(6)),此时让P4运行。
22时刻,P4执行结束,至此所有进程执行完毕。
当时间片为8时,可以看出这四个进程的执行顺序为P1->P2->P3->P4,此种情况与使用FCFS调度算法时的结果是一致的。
由此,可以知道如果时间片太大,使得每个进程都可以在一个时间片内完成,则时间片轮转调度算法会退化为FCFS调度算法,并且会增大进程响应时间。因此时间片不能太大。
所谓的增大进程响应时间,在此举例说明,若系统中有10个进程在并发执行,且时间片为1秒,则一个进程被响应可能需要等待9秒,即,如果用户在自己的进程的时间片外通过键盘发出调试命令,可能需要等待9秒才能被系统响应,这种用户体验就是极其糟糕的了。
与此同时,由之前的章节我们已经了解到,进程调度与切换是有时间代价的,因此如果时间片太小,进程调度切换太过于频繁,系统就会花费大量的时间来处理进程切换,就会导致实际用于处理用户进程的时间比例减少,因此时间片也不能太小。
一般来说,时间片要让切换进程的开销占比不超过1%
-
优缺点
-
优点
公平、响应快,适用于分时系统
-
缺点
由于高频率的切换进程,因此有一定的系统开销
无法区分任务的紧急程度
-
-
是否会导致饥饿
不会
2.3.3.6 优先级调度算法
-
适用范围
适用于作业调度以及进程调度。
-
算法介绍
优先级调度算法中的优先级用于描述作业/进程的紧急程度。
在作业调度中,每次从后备作业队列中选择优先级最高的一个或几个作业,将它们调入内存。
在进程调度中,每次从就绪队列中选择优先级最高的一个或几个进程,为其分配CPU。
-
是否可抢占
既有抢占式的也有非抢占式的。
抢占式优先级调度算法,当一个进程正在运行时,若有优先级更高的进程进入就绪队列,则将当前进程暂停,将CPU分配给优先级更高的进程。
非抢占式优先级调度算法,当一个进程正在运行时,即使有优先级更高的进程进入就绪队列,依旧让当前进程继续运行,直至由于当前进程自身原因让出CPU后,才会将CPU分配给优先级更高的进程。
-
案例分析
假设系统中有4个进程(纯计算进程,即没有I/O操作的进程),它们的到达时间、预估运行时间以及优先级如下表所示。
进程 到达时间 预估运行时间 优先级 P1 0 8 3 P2 4 6 2 P3 5 2 1 P4 6 6 2 使用非抢占式优先级调度算法时,运行情况如下:
0时刻,只有P1到达,此时运行P1
8时刻,P1运行完毕,此时就绪队列中有P2、P3、P4。P3优先级最高,让P3运行。
10时刻,P3运行完毕,此时就绪队列中有P2、P4,此时虽然P2和P4的优先级一致,但是P2比P4更早进入就绪队列,因此让P2运行。
16时刻,P2运行完毕,此时就绪队列只有P4,让P4运行。
22时刻,P4运行完毕,所有进程执行结束。
使用抢占式优先级调度算法时,运行情况如下(Pn(m)表示进程Pn的剩余运行时间m):
0时刻,只有P1(8)到达,此时运行P1
4时刻,P2(6)到达,且优先级比P1高,此时就绪队列中进程情况为(P2(6))此时让P2运行,将P1重新放回就绪队列。
5时刻,P3到达,此时就绪队列中进程情况为(P1(4)、P3(2)),由于P3的优先级比P2的优先级高,因此让P3运行。
6时刻,P4到达,此时就绪队列中进程情况为(P1(4),P2(5),P4(6)),由于此时P3的优先级依旧是最高的,因此继续让P3运行。
7时刻,P3运行结束,此时就绪队列中进程情况为(P1(4),P2(5),P4(6)),由于此时P2与P4的优先级相同,并且比P1高,并且P2先到达就绪队列,因此让P2运行。
12时刻,P2运行结束,此时就绪队列中进程情况为(P1(4),P4(6)),由于此时P4的优先级最高,让P4运行。
18时刻,P4运行结束,此时就绪队列中进程情况为(P1(4)),让P1运行。
22时刻,P1运行结束,所有进程执行结束。
-
优缺点
-
优点
用优先级区分紧急程度,适用于实时操作系统。
-
缺点
若不断地有高优先级的进程到来,可能会导致饥饿
-
-
是否会导致饥饿
可能会导致饥饿
-
优先级
-
优先级分类
优先级可分为两种:动态优先级、静态优先级。
动态优先级是指在进程运行过程中,根据进程情况的变化动态调整优先级,主要依据有CPU的占用时长,就绪进程等待CPU的时长等。
静态优先级是指在创建进程时就确定了,且在进程的整个运行期间保持不变,主要依据有进程类型、进程对资源的要求、用户要求等。
-
优先级设置的原则
- 系统进程>用户进程,系统进程作为系统的管理者,应该拥有更高的优先级
- 交互型进程>非交互型进程(前台进程>后台进程)
- I/O型进程>计算机型进程,I/O型进程是指会频繁使用I/O设备的进程,计算机型进程是指会频繁使用CPU的进程(很少使用I/O设备),由于I/O设备可以与CPU并行运行,因此若将I/O型进程的优先级设置得更高,就可以使I/O设备更多地和CPU并行,提高系统的整体效率。
-
2.3.3.7 多级反馈队列调度算法
-
适用范围
用于进程调度
-
算法介绍
多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合与发展,在该算法中,通过动态地调整进程优先级和时间片的大小,来达到兼顾多个方面的系统目标。
具体思想:
-
设置多个就绪队列,为每个队列赋予不同的优先级,第1级队列的优先级最高,第2级的队列优先级次之,以此类推至后续队列。
-
为每个队列的进程赋予不同大小的时间片,优先级越高的队列,时间片越小。
-
在每个队列中采用FCFS调度算法,当新进程进入内存后,首先将它放入第1级队列的末尾,按照FCFS原则等待调度。当轮到该进程执行时,如果它能够在给予的时间片内完成,则该进程就正常的执行完毕,否则,调度程序会将它转入第2级队列的末尾继续按照FCFS原则等待调度,若它在第2级队列的时间片内依旧未完成,就会被转入第3级队列,以此类推,当该进程被转入最后的第n级队列后,在第n级队列中便采用时间片轮转调度算法进行调度(因为此时已经没有更低优先级的队列了)。
-
按队列的优先级进行调度,只有第1级队列为空时,才会调度第2级队列中的进程,即,仅当第k级队列为空时,才会调度第k+1级队列中的进程。如果正在执行第k级队列中的某个进程时,系统有一个新的进程进入了更高优先级的队列时,就会立即把正在运行的进程放回到第k级队列中,把CPU分配给新进入的进程。
具体规则稍微有些复杂,各位同学最好结合后面的案例分析来进行理解。
-
-
是否可抢占
是抢占式算法
-
案例分析
假设系统中有4个进程(纯计算进程,即没有I/O操作的进程),它们的到达以及预估运行时间如下表所示。
进程 到达时间 预估运行时间 P1 0 8 P2 4 6 P3 5 2 P4 6 6 并且,在系统中设置了三个优先级队列,分别是第1级队列、第2级队列、第3级队列,其时间片大小分别是1、2、4。
使用多级反馈队列调度算法后,这些进程的执行情况如下(Pn(m)表示进程Pn的剩余运行时间m):
0时刻,P1(8)进入第1级队列,执行P1。
此时队列中的进程情况为:第1级队列[P1(8)],第2、3级队列为空。
1时刻,P1(7)时间片用完,此时P1会进入第2级队列的队尾,此时由于第1级队列中没有任何进程,系统继续执行P1。
此时队列中的进程情况为:第1、3级队列为空,第2级队列[P1(7)]。
3时刻,P1(5)时间片用完,此时P1会进入第3级队列的队尾,此时由于第1、2级队列中没有任何进程,系统继续执行P1。
此时队列中的进程情况为:第1、2级队列为空,第3级队列[P1(5)]。
4时刻,P1(4)时间片没有用完,但是,这是P2(4)进入第1级队列,因此P1被重置到第3级队列队尾,系统执行P2。
此时队列中的进程情况为:第1级队列[P2(4)],第2级队列为空,第3级队列[P1(4)]。
5时刻,P2(5)时间片用完,且P3(2)进入第1级队列,此时P2进入第2级队列,执行P3。
此时队列中的进程情况为:第1级队列[P3(2)],第2级队列[P2(5)],第3级队列[P1(4)]。
6时刻,P3(1)时间片用完,且P4(6)进入第1级队列,此时P3进入第2级队列队尾,执行P4。
此时队列中的进程情况为:第1级队列[P4(6)],第2级队列[P2(5),P3(1)],第3级队列[P1(4)]。
7时刻,P4(5)时间片用完,进入第2级队列队尾,此时第1级队列为空,第2级队列的队头为P2,系统执行P2。
此时队列中的进程情况为:第1级队列为空,第2级队列[P2(5),P3(1),P4(5)],第3级队列[P1(4)]。
9时刻,P2(3)时间片用完,进入第3级队列队尾,此时第1级队列为空,第2级队列的队头为P3,系统执行P3。
此时队列中的进程情况为:第1级队列为空,第2级队列[P3(1),P4(5)],第3级队列[P1(4),P2(3)]。
10时刻,P3执行完毕,此时第1级队列为空,第2级队列的队头为P4,系统执行P4。
此时队列中的进程情况为:第1级队列为空,第2级队列[P4(5)],第3级队列[P1(4),P2(3)]。
12时刻,P4(3)时间片用完,进入第3级队列队尾,此时第1、2级队列为空,第3级队列队头为P1,系统执行P1。
此时队列中的进程情况为:第1、2级队列为空,第3级队列[P1(4),P2(3),P4(3)]。
16时刻,P1执行完毕,此时第1、2级队列为空,第3级队列队头为P2,系统执行P2。
此时队列中的进程情况为:第1、2级队列为空,第3级队列[P2(3),P4(3)]。
19:00 に P2 が実行されますが、この時点では 1 段目と 2 段目のキューは空で、3 段目のキューの先頭は P4 であり、システムは P4 を実行します。
このとき、キュー内のプロセスのステータスは、第 1 段と第 2 段のキューは空、第 3 段のキューは [P4(3)] になります。
22:00にP4が完了し、すべてのプロセスが実行されます。
-
長所と短所
-
アドバンテージ
- あらゆる種類のプロセスに対して比較的公平 (先着順のスケジューリング アルゴリズムの利点)
- 新しく到着した各プロセスは迅速に応答を取得できます (タイム スライス ラウンドロビン スケジューリング アルゴリズムの利点)
- 短いプロセスをより短い時間で完了できる (短いプロセス優先スケジューリング アルゴリズムの利点)
-
欠点がある
アルゴリズムの実装がより複雑になる
-
-
飢えを引き起こすのでしょうか
飢餓が発生します (短いプロセスが常に到着すると、優先度の低いキュー内の長いプロセスが飢餓状態になります)。
2.3.3.8 さまざまなスケジューリングアルゴリズムの比較と概要
アルゴリズム名 | プリエンプティブルですか? | アドバンテージ | 欠点がある | 適用範囲 | デフォルトの決定モード |
---|---|---|---|---|---|
早い者勝ち | 非プリエンプティブ | 公平かつ簡単に実装できる | 時短勤務には向かない | バッチ処理システム | 非プリエンプティブ |
まずは短い仕事から | プリエンプティブと非プリエンプティブの両方 | 平均待ち時間は最も短く、効率は最も高くなります(ここでは、残り時間の短い優先アルゴリズムがデフォルトで含まれています) | 長時間のジョブは枯渇し、推定実行時間を決定するのは困難です。 | ジョブスケジューリング、バッチ処理システム | 非プリエンプティブ |
高応答率優先 | 非プリエンプティブ | 長い課題と短い課題のバランスをとる | 応答率の計算にはコストがかかります | タイムシェアリングシステム | 非プリエンプティブ |
タイムスライスの回転 | 先制攻撃 | タイムシェアリングシステムに適した、公平かつ迅速な応答 | プロセスを頻繁に切り替えると追加のオーバーヘッドが発生します | タイムシェアリングシステム | 先制攻撃 |
優先スケジューリングアルゴリズム | プリエンプティブと非プリエンプティブの両方 | 優先順位を使用して緊急性を区別し、リアルタイム オペレーティング システムに適しています。 | 飢餓を引き起こす可能性がある | リアルタイムシステム | 非プリエンプティブ |
マルチレベルフィードバックキュー | プリエンプティブ (必ずしも各キュー内で行う必要はありません) | 長いタスクと短いタスクの両方を考慮し、優れた応答時間と高い実現可能性を備えています | アルゴリズムはより複雑です | ユニバーサル | 先制攻撃 |
セクションの概要
つづく…
参考文献
「2023年オペレーティングシステム大学院入試審査ガイド」-Wangdao Forum
この記事がお役に立ちましたら、いいね、転送、保存していただければ幸いです~