記事ディレクトリ
1. プロセスの基本的な考え方
-
ノイマン型コンピュータの実行中、多くのプログラム (データ + 演算命令セット) がメモリにプリロードされますが、CPU一度に実行できるプログラムは 1 つだけです(複数のプログラムが CPU リソースを競合します)、この時点ではオペレーティング システムが必要ですメモリ内で多数のプログラムを管理、CPU リソースが合理的に割り当てられるように、プロセスの概念があります。
- process: プログラムを記述する構造体オブジェクト (プリント基板の構造)そしてそれが指すプログラム(データと演算命令セット)
- PCB 構造は、Linux では task_struct という名前になります。
-
プロセスの PCB 構造はオペレーティング システム内でさまざまなデータ構造に編成され、同じ PCB 構造オブジェクトが複数のデータ構造で同時に、例えば:
-
オペレーティング·システムプロセスを管理する終わっていますPCB 構造オブジェクト用に形成されたデータ構造行為クラッド達成
-
Linux のプロセスの PCB は、PID (数値) によって一意に識別されます。
プロセス間の基本的な関係:親子関係
- Linux システムでは、プロセスはライブラリ関数を通じて子
fork()
プロセスを作成できます。pid_t fork(void);
- プロセスが fork 関数を通じて子プロセスを作成した後、親プロセスと子プロセスは共有します。fork() 関数が配置されているコード ステートメントそして次のコードスニペット
- fork関数の戻り値の説明: if子プロセスが正常に作成されましたの場合、frok 関数は親プロセスの子プロセスの PID を返し、子プロセスの場合は 0 を返します。子プロセスの作成に失敗しました、フォーク関数は親プロセスで -1 を返します
- 子プロセスが作成されたばかりの場合、親プロセスのすべてのデータを共有する、後続の子プロセスは親プロセスのデータを処理します。コピーオンライト
- によると親プロセスと子プロセスのfork()の戻り値の違い、親子プロセスのフォローアップを行うことができます。異なるコードセグメントを実行する
int main()
{
printf("hello world\n");
size_t childPid = fork();//创建子进程
if(childPid == 0)
{
//子进程执行的代码段
while(1)
{
printf("我是子进程,Pid:%d,PPid:%d\n",getpid(),getppid());
sleep(1);
}
}
else
{
//父进程执行的代码段
while(1)
{
printf("我是父进程,Pid:%d,PPid:%d\n",getpid(),getppid());
sleep(1);
}
}
return 0;
}
- 動作状況:
- 親プロセスあなたは持っているかもしれません複数の子プロセス、そして子プロセス唯一の親プロセス、オペレーティング システムでは、親プロセスと子プロセス間の関係に従って、PCB 構造オブジェクトはツリー データ構造を形成します。
- つまり、オペレーティング システムでは、PCB 構造オブジェクトは多くのデータ構造のネットワーク内にあります。
2. 処理状況
- プロセスステータスの概要 (Linux オペレーティングシステム):
(1) プロセス R の実行状態
- CPU一度に 1 つのプロセスのみを実行する、CPU対応する実行キューのみ(Linux の場合)本質的にはハッシュバケット)、実行中のプロセスPCB 構造は実行キューにリンクされ、オペレーティング システムは順次スケジュールキュー内の PCB 構造体が指すプログラムを実行し、計算のために CPU に渡します。
- プロセス PCB はプロセスの記録を記録します。スケジュールの優先順位(整数)、プロセスのスケジューリング優先度はそのプロセスに影響します。実行キューの位置。
- Linux におけるプロセスの優先順位は次のように分類されます。140レベル、0 から 99 までのグレードが割り当てられます。リアルタイムプロセス、100 から 139 までの等級が与えられます。非リアルタイムプロセス
- 140 レベルは 140 項目に対応します実行キューブランチ(140 個の実行キュー ブランチがハッシュ バケット構造で結合されます)
task_struct
で処理する実行キューでの位置動的な優先順位付け
Linux プロセス スケジューリングの Big O(1) アルゴリズム データ構造モデル (実行キュー ハッシュ バケット):
- Linux カーネルには、160 ビットサイズのビットマップ録音用ハッシュバケットを実行するハッシュ バケット内の各キューが空であるかどうかに関係なく、実行ハッシュ バケット内のキューがすべて空になったら、交換します。run と tem の 2 つの配列へのポインター、プロセス スケジューリングの実行を続行します。
- 上の図に示すデータ構造のおかげで、Linux オペレーティング システムは次のことを行う必要がありません
task_struct
。優先順位によるクイックソート、いつでも O(1) の時間計算量で特定の優先度のプロセスが配置されているブランチ実行キューをすばやく見つけます (O(1) キューを空にする際)、task_struct 構造体オブジェクトエンキューおよびデキュー操作これは、Linux オペレーティング システムの効率的なプロセス スケジューリング メカニズムを実現する O(1) の時間計算量でもあります。
プロセスのタイムスライス
- 各プロセスには実行タイム スライス (20 ナノ秒など) があり、プロセスのタイム スライスによって CPU の実行時間が決まります。単一の最大時間、CPU内でプロセスが完了しますタイムスライス操作後意思実行キューを一時的に終了します次の発送を待ちます
- タイムスライスの制限により、一定時間内(例えば20ms)、すべての実行キュー内プロセスは CPU によって 1 回実行され、プロセスの同時実行、CPUリソースはこうして取得されます合理的な分配そして十分に活用する
- 私たちはコンピュータが複数のプログラムを同時に実行しているように感じますが、実際には CPU が実行しています。プロセスのタイムスライスに応じて各プロセスを非常に高速に横断して実行することで形成されますプロセスの同時実行結果として。
(2) プロセスのスリープ状態(S、D)
- Linuxシステムの場合プロセスのスリープ状態対応するオペレーティングシステム規律理論で処理するブロックされた状態
- CPU動作速度そしてデータフロー速度は等しくないため、データ対話のプロセスは多くの場合、フィードバックを待っています状態
- プロセスが入っているときリソースを待っています、その PCB 構造は次のようになります。ランキューを終了しますそしてブロッキングキューに入れるたとえば、プロセスがキーボード入力データを必要とする場合、プロセスはキーボードのブロッキング キューに入ります。
- オペレーティング システムでは、ブロック キューの数は不確実であり、システム内の通信プロセスと同数の種類のブロック キューが存在します。
- Linux は次の場所にあります。ブロックキューのプロセス中断可能なスリープ状態(S 状態)、システム メモリが不十分な場合、オペレーティング システムはプロセスに対応する一部のプログラム (データと命令セット) をスワップ ディスク パーティションのブロッキング キューに一時的に保存し、プロセスが開始されます。一時停止状態
- Linux オペレーティング システムのメモリが不足すると、一部のメモリも選択的に強制終了されます。ブロッキングキュー内のプロセス、プロセスが非常に重要なタスク (重要なデータをディスクに書き込むときにディスク フィードバックを待つなど) を実行する場合、そのプロセスを次のようにマークする必要があります。無中断スリープ状態 (D 状態)、 で中断できないスリープ状態のプロセス処刑される前にオペレーティング システムの要求に応答しません
(3) プロセスのゾンビ状態と死亡状態
- Linux システムでは、親プロセスの子プロセスが終了すると、子プロセスはゾンビ状態 (Z 状態) に入ります。、Zステートプロセス親プロセスがリサイクルするのを待ちます。PCB 構造内の終端情報(正常終了か異常終了かを判断するため)親プロセスが終了情報を処理した場合のみ、子プロセスはZ状態から死亡状態(X状態)へ、このとき、オペレーティング システムは子プロセスが占有しているメモリ リソースを使用します。完全にリサイクルされた
- もし親プロセス対処されていないゾンビの子プロセスの終了情報では、ゾンビの子プロセスのPCB 構造と関連データメモリ内に永久に残り、メモリ リークを引き起こす
- 親子プロセスの場合親プロセスが先に終了する子プロセスはオペレーティング システムに委託され、オペレーティング システムの子プロセスになります。このようなプロセスは孤立プロセスと呼ばれます。