一連の記事
第1章オペレーティングシステムの概要
第2章プロセスのスケジューリング
第2章プロセスの説明と制御
2.1プロセスとは
プログラムコード+関連データ+プログラム制御ブロックPCB
プロセッサがプログラムのコードの実行を開始すると、実行するエンティティはプロセスと呼ばれます
2.1.1プロセスおよびプロセス制御ブロックPCB
PCB(プロセス制御ブロック)
- PCBはプロセス中断の基礎であり、実行を再開した後は中断されたことがないようです
- PCBはOSによって作成および管理されます
- 複数のプロセスをサポートするツール
PCBはプロセス管理のためのデータ構造です
PCBエレメント | 効果 |
---|---|
id | 識別子 |
状態 | 状態 |
PC | プログラムカウンター |
メモリポインタ | メモリポインタ |
環境 | 環境 |
I / Oステータス | I / Oステータス |
…… | …… |
2.1.2プロセスVSプログラム
プログラムはスクリプトであり、プロセスはパフォーマンスです
プロセスの基本的な特徴:
- 動的(本質的な特性):プロセスにはライフサイクルがあります
- 並行性(重要な機能):他のプロセスで進めることができます
- 独立性:各プロセスのアドレス空間は互いに独立しています(論理アドレス)
- 非同期:プロセスは予測できない速度で進行します
プログラムとの比較:
1. 进程是正在计算机执行的实例
2. 进程=PCB+程序代码+数据
3. 程序是静态的,没有生命周期
4. 进程与程序并无一一对应关系,如一个dad()程序中涉及多个PV进程
5. 引入进程的概念是为了容易正确解释多道程序并发
2.2プロセスステータス
プロセスの軌跡
プロセスに対して実行される一連の命令。単一の命令の動作を説明します(ガイド)
発車係
CPUをあるプロセスから別のプロセスに切り替えます
2.2.12状態モデル
2.2.2プロセスの作成と終了
プロセスの作成
OSはプロセスを管理するためのPCBを作成します
。OSはプロセスにメモリを割り当てます。
作成の理由
- 新しい割り当て<-古い完了
- ユーザーログイン<-文字通り
- ユーザーがサービスを要求する<-印刷の要求など
- プロセススポーン<-fork()など
関連
プロセスの生成:プロセスは、プロセス(子プロセス)の作成を明示的に要求します
親プロセス:元の
プロセス子プロセス:新しく生成されたプロセス
終了の理由
- 宿題が完了しました
- タイムアウト
- 使用可能なメモリがありません
- アクセスなし
- 使用可能なメモリが不足しています
- 保護されたファイルへのアクセス
- 操作できません
- タイムアウト(待つことができません)
- 読み取りおよび書き込み障害などのI / O障害
- ……
- 親プロセスが終了します
5状態モデル
キューイングモデル
- 単一のブロッキングキュー:すべてのブロッキングキューは同じキューにあり、イベント後にキュー全体をトラバースする必要があります。
- マルチブロッキングキュー:異なるブロッキング条件は異なるキューに対応します。
同様に、異なる優先順位に従って複数のレディキューを維持できます。
2.2.4中断されているプロセス
メモリ制限の問題を解決するために、一時的にブロックされたプロセスの一部またはすべてが外部メモリの一時停止キューにスワップアウトされます
停止後
- OSは新しいプロセスをスケジュールします
- 中断されたキューから新しいプロセスをフェッチします
ハング
ブロックされている、準備ができている、またはメモリ内で実行されているプロセスは、外部メモリに解放され、CPU競合に参加しなくなります。
7状態モデル
中断されたプロセス
すぐに実行できない、外部ストレージで、それ自体でスワップインしない、待機している、または条件を待機していない可能性がある
停止の理由
- 交換(部屋を空けるため)
- ユーザーリクエスト
- 親プロセス要求
- OSリクエスト
- タイミング:タイミング実行、待機中にぶら下がる
2.3プロセスの説明
2.3.1OSの制御構造
OSはテーブルを使用してリソースを維持および管理します
-
メモリテーブル:メモリと外部メモリを追跡するために使用されます
-
プロセスに割り当てられたメモリと外部ストレージ
-
保護された情報をメモリから保存する
-
外部ストレージ情報を管理する
-
I/O表
-
I / Oステータス(使用可能/ XXプロセスに割り当て済み)
-
I / Oデータソースおよび宛先メモリ
-
ファイルテーブル
-
ファイルは存在しますか
-
ファイルの保存場所
-
現在の状態
-
その他の属性
-
プロセステーブルの特性
-
プロセスの管理に使用されます
-
メモリ、I / O \ filesへの間接的な参照があります
-
それ自体はOSからアクセスできます(ナンセンス-_-)
2.3.2プロセス制御構造
プロセスイメージ:プログラム、データ、スタック(呼び出し元アドレスを保存)およびPCBのコレクション
PCBの情報
-
プロセス識別情報:プロセスに保存されているデジタル識別子
- プロセスID
- 親プロセスID
- ユーザーID
-
プロセッサー状況情報:CPUレジスターの内容
- ユーザーに見えるレジスタ
- 制御およびステータスレジスタ(PC、PSW、割り込みイネーブル/ディセーブルフラグ、実行モード)
- スタックポインタ(プロセスのスタックの最上位を指す)
-
プロセス制御情報:プロセスをスケジュールするためにオペレーティングシステムが必要とするその他の情報
- プロセス状態の状態:「実行中」.....。
- プロセス優先度優先度
- イベントID:イベントを待機しているプロセス
- 関連情報のスケジューリング:異なるスケジューリングアルゴリズムでは、データを格納するためのスペースが必要になる場合があります
- データ構造:キュー、リング、ポインターをサポートするために使用されます
- プロセス通信:無関係なプロセス間の通信
- プロセス特権
- ストレージ管理:仮想メモリセグメントテーブルまたはページテーブルへのポインタ
- リソースの所有権と使用法
2.4プロセス制御
2.4.1実行モード
カーネルモード機能
- プロセス管理
- PCB
- 作成、削除、スケジュール
- シフト
- 同期する
- ストレージ管理
- 分布
- 両替
- ページのセグメンテーション
- I / Oデバイス管理
- I / Oバッファ
- I / Oを割り当てます
カーネルサポート機能
- 割り込み処理
- クロック割り込み
- 簿記
OSがサポートする2つのモードとその特徴
ユーザーモード
- 優先度が低い
- ユーザープログラムの実行
システムモード/カーネルモード
- 優先度が高い
- カーネルで実行
- 特権命令
- 特権メモリスペースアクセス
注:現在のモードはPSWの特別なビットによって識別され、2つのモードはOSデータ構造が改ざんされないように保護するためのものでもあります。
2.4.2プロセスの作成
OSの動作:
IDの割り当て->スペースの割り当て-> PCBの初期化(ID、スタック、状態、優先度...)->準備完了/一時停止キューの挿入->他のデータ構造の初期化
2.4.3プロセスの切り替え
割り込み
- 通常の割り込み
- タイムアウト:プロセスタイムスライスが使い果たされました
- I / O割り込み:I / Oの準備ができており、OSがウェイクアップするプロセスを決定します
- メモリ障害(ページがありません):現在のプロセスをブロックしています
- トラップ
- プロセスエラーまたは例外
プロセス切り替えの理由
- 通常の割り込み:外部イベントへの反応
- 落とし穴:例外の処理
- システムコール:カーネルプログラムを呼び出す
割り込みプロセス
コンテキストの保存(P1)–> pcb(P1)の更新–> pcb(P1)のキューへの移動–>プロセスの変更(P1-> P2)–> pcb(P2)の更新–>ストレージの更新、データ構造–>コンテキストの再読み込み( P1)
注:中断は必ずしもプロセスの切り替えにつながるとは限りません
- 例:I / Oが中断された後、システムは前のプロセスによる実行を継続することを決定します(たとえば、プロセスの優先度が高いため)
モードスイッチ
ユーザーモード<==>カーネルモード
理由
- システムコール:カーネルサービスを呼び出す
- 割り込み:割り込みハンドラーを呼び出す
モード切り替えとプロセス切り替え
モード切り替えは必ずしもプロセス切り替えにつながるとは限りません。プロセス切り替えはモード切り替えである必要があります
2.4.4OSの実行
- プロセスのないカーネル:カーネルはプロセスから独立しています(個別のカーネル)
- ユーザープロセスのオペレーティングシステム:プロセスとカーネル機能が同時に実行されます(OS機能はプロセスとともに実行されます)
- プロセスベースのオペレーティングシステム:カーネル関数は同じレベルの別個のプロセスで実行されます(OS関数は別個のプロセスで実行されます)
2.5 UNIXSVR4プロセス管理
fork()は、プロセスを作成するために使用されます。pid= fork();
3つの点に注意してください:
- fork()が子プロセスを作成した後、親プロセスと子プロセスは引き続き別々に実行されます
- 子プロセスのfork()はpid = 0を返し、親プロセスのfork()は作成された子プロセスのIDを返します。
- 父と息子のプロセスの進歩の順序は予測できません
理解に役立つ3つの例を挙げてください。
例1:次のコードで出力されるHello Worldの数はいくつですか?
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
for (i=0;i<3;i++)
fork();
printf("hello, world\n");
return 0;
}
fork()は次のように理解されます:古いプロセスは変更されず、実行を継続し、新しいプロセスが生成されます
3 fork()、2 ^ 3プロセスがあるため、8 helloworldが出力されます
例2:次のコードの出力は何ですか?
void main(void) {
int i;
static char buffer[10];
if (fork()==0)
strcpy(buffer, “Child\n”);
else
strcpy(buffer, “Parent\n”);
for (i=0; i < 5; ++i) {
sleep(1);
write(1, buffer, sizeof(buffer));
}
}
5子、5親、ただし順序は必ずしも必要ではありません
例3:次のコードの出力は何ですか?
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int global = 4;
void main(void) {
int pid;
int vari = 5;
printf(“before fork\n”);
if ((pid = fork()) < 0) {
printf(“fork error\n”);
exit(0);
} else if (pid == 0) {
global++;
vari--;
}
printf(“global=%d,vari=%d\n”, global, vari);
}
親プロセス:global = 4、vari = 5
子プロセス:global = 5、vari = 4
2.6スレッド
プロセスは2つのコンポーネントに分かれています
- スケジューリングの基本単位
- リソースの独立した単位
スレッドは基本的なスケジューリング単位として独立しており、OSによってスケジュールされます
マルチスレッド
単一のプロセス内で複数の並行パスをサポートする機能
シングルスレッド
プロセスにはスレッドが1つしかありません
スレッドはプロセス内のエンティティであり、独立したスケジューリングとディスパッチの単位です。
2.6.1プロセスとスレッド
プロセスは1つ以上のスレッドを持つことができますプロセスを
一時停止または終了します=内部のすべてのスレッドを一時停止または終了します
糸
- 実行状態の状態:派生、ブロック、ブロック解除、終了
- 環境
- スタック
- ローカル変数
- 共有リソースとメモリ
マルチスレッドは、シングルスレッドよりも1つ多いtcb(スレッド「pcb」)です。
スレッドの利点
- 短い作成時間
- 時間のかかる短時間の終了
- 短い切り替え時間(同じプロセスで)
- 異なる実行プログラム間の通信効率を向上させます
スレッドの同期
- プロセス内のすべてのスレッドは、プロセスデータとスペースを共有します
- 1つのスレッドによるデータの変更は、他のスレッドに影響します
2.6.2スレッドの分類
ユーザーレベルのスレッドULT(ユーザーレベルのスレッド)
- スレッドコアは表示されず、アプリケーションによって管理されません
- プロセスがブロックされています。スレッドは必ずしもブロックされていません。プロセスは実行中です。スレッドもブロックされている可能性があります。
- 利点
- スレッドの切り替えは、カーネルモードを切り替える必要はありません
- スケジューリング戦略はアプリケーションごとにカスタマイズできます
- あらゆる種類のOSで実行できます
- 不利益
- スレッドシステムが呼び出されると、プロセスのすべてのスレッドがブロックされます
- マルチコアシステムには適していません
- 不利な点を改善する方法
- ジャケット技術:システムコールをアプリケーションレベルの呼び出しに置き換えます
カーネルレベルのスレッドKLT(カーネルレベルのスレッド)
- カーネルはスレッドを管理し、アプリケーションはスレッドを管理しません
- 利点
- 複数のスレッドを複数のCPUに割り当てることができます
- スレッドがブロックされると、同じプロセス内の他のスレッドはブロックされません
- カーネル自体もマルチスレッドを使用できます
- 不利益
- スレッド切り替えにはモード切り替えが必要です
ハイブリッド方式(ULT + KLT)
- スレッドはユーザーレベルで作成されます
- スレッドのスケジューリングと同期はアプリケーションによって完了します
- 1つ以上のユーザースレッドがカーネルスレッドにマップされます(カーネルスレッドが少なくなります)