プロセスの関連概念を詳細に説明します(フォンノイマンシステム、オペレーティングシステム、PCB、プロセスステータス、プロセス作成)-非常に詳細な説明(写真とテキスト付き)


1.フォンノイマンアーキテクチャ

私たちの日常生活で一般的なコンピューター(ノートブック)と珍しいコンピューター(サーバー)のほとんどは、フォンノイマンアーキテクチャに従います。
ここに画像の説明を挿入します
特徴

  1. コンピュータによって処理されるデータと命令はすべて2進数で表されます
  2. シーケンス実行プログラム
  3. コンピュータハードウェアは、算術演算装置、コントローラ、メモリ、入力デバイス、出力デバイスの5つの主要部分で構成されています。

私自身の理解に基づいて、フォンノイマンアーキテクチャの重要な部分を説明しましょう。

ここに画像の説明を挿入します
古代皇帝の初期王朝を例にとると、主に3つの最も重要な機能のカテゴリについて話します。

  • CPUは皇帝を演じ、CPUはコンピュータシステムのコンピューティングと制御のコアであり、情報処理とプログラム操作の最終的な実行ユニットです。皇帝のように、CPUはコンピュータの「世界」を支配します。
  • メモリは大臣として機能します。コンピュータシステムのメモリデバイスです。さまざまなデータや情報のプログラムやメモリコンポーネントを格納します。初期に処理する必要のある情報をeunuch(レジスタ)に転送します。皇帝。」(CPU)
  • レジスターは宦官の役割を果たし、CPU(「皇帝」)内にデータを格納するために使用される小さなストレージ領域です。これは、操作に関連するデータと操作結果を一時的に保存するために使用されます。受け渡しを担当します。メモリまたはCPUへのキャッシュで処理する必要のある情報(「皇帝」)

2.オペレーティングシステム(オペレーティングシステム)

2.1基本概念

すべてのコンピュータシステムには、オペレーティングシステム(OS)と呼ばれる基本的なプログラムのセットが含まれています。複数のレベルから理解するために、OSはソフトウェアの一部であり、ソフトウェアはプログラムで構成されているため、プログラムであり、プログラムの実行時にプロセスを生成するため、プロセスになることもできます。一般的な理解では、オペレーティングシステムには次のものが含まれます。

  • カーネル(プロセス管理、メモリ管理、ファイル管理、ドライバー管理)
  • その他のプログラム(関数ライブラリ、シェルプログラムなど)

2.2機能

効果

  • OSは、ハードウェアとの対話、およびすべてのソフトウェアとハ​​ードウェアのリソースの管理を担当します
  • アプリケーション(ユーザープログラム)に適切な実行環境を提供する

最も重要な役割は管理です。
それで、それはどのように管理されますか?

  1. プログラムの内部的な観点から:

管理 = 描述 + 组织

C言語のアイデアで説明する

  • 説明:構造体構造などのカスタムデータ型です
  • 組織:二重リンクリストの形式の対応するストレージ

2.3OS関連の概念

  • 同時実行性:複数のプロセス、1つのプロセスのみが同時に計算するための1つのCPUを持つことができます
  • 並列:複数のプロセスには、同時に計算するための異なるCPUがあります
  • 4コアと8C:合計12個のCPU、つまり4個の物理CPU(4コア)と8個の論理CPU(8C)。
  1. コンピュータ全体の観点から:

写真が示すように
ここに画像の説明を挿入します

システムコール関数とライブラリ関数の違い

  • システムコール関数:プログラマー向けに特別に提供されたOSの関数。プログラマーはこれらの関数を呼び出して、OSが管理するコンピューターリソースをより適切に呼び出すことができます。(Linuxのmanマニュアルのシリアル番号2に対応)

  • ライブラリ関数:専用のプログラマーがいくつかのシステムコール関数を適切にカプセル化してライブラリを形成します。ライブラリを使用すると、高レベルのユーザーまたは開発者が二次開発を実行するのに非常に役立ちます。(Linuxのmanマニュアルのシリアル番号3に対応)

3.プロセス

3.1基本概念

プロセスは、プログラムの実行インスタンス、実行中のプログラムなどです。ただし、カーネルの観点からは、プロセスはOSがシステムリソース(CPU時間、メモリ)を割り当てるエンティティです。したがって、カーネルのソースコードにあります。システムで実行されているすべてのプロセスは、task_structリンクリストの形式でカーネルに格納されます。

プログラムの概念はソースコードからコンパイルされたファイルであり、プログラムは静的です。プロセスはプログラムの実行時に生成されるインスタンスですが、プロセスは動的です。

3.2プロセスの表示

まず、プロセス情報/procはシステムフォルダから表示できます。

ls /proc/表示するため使用するだけ
ここに画像の説明を挿入します
特定のプロセス情報を表示する場合は、フォルダーに直接cdし、フォルダー
のfdフォルダーに直接cdして、対応するI / Oストリームを表示できます。
ここに画像の説明を挿入します

次に、これらのユーザーレベルのツールを使用toppsて入手することもできます

まず、次のコードを最初に実行し
ここに画像の説明を挿入します
てからps aux | grep ./testコマンドを呼び出すと、実行中のプログラムによって生成されたプロセス情報を表示できます。
ここに画像の説明を挿入します

では、なぜ./testプロセス情報が2行あるのでしょうか。

  • 最初の行は、実行中のプログラムによって生成されたプロセスの情報です。
  • 2行目はps aux | grep ./test、操作の実行時にgrepによって生成されるプロセス情報です。結果が見つかるとすぐに返されるため、クエリによって生成された進行状況情報も保存されます。(Grepはクエリが完了した後に終了し、終了前に結果を返します)

4.プロセスを説明します:PCB(構造体構造に相当)

4.1基本概念

プロセス情報は、プロセス制御ブロックと呼ばれるデータ構造に配置されます。これは、プロセス属性のコレクションとして理解できます。教科書ではPCB(プロセス制御ブロック)と呼ばれ、LinuxオペレーティングシステムのPCBはtask_structです。

task_structは、Linuxカーネルのデータ構造体です。Linuxでプロセスを記述するために使用される構造体です。RAM(メモリ)にロードされ、プロセス情報が含まれます。

4.2コンテンツの分類

  1. プロセス識別子(PID)が:一意プロセスを識別OSにし、他のプロセスを区別するために使用されます。
  2. プロセスステータス:プロセスのタスクステータス、終了コード、終了シグナルなどを示すために使用されます
  3. プログラムカウンタ:プログラムで実行される次の命令のアドレス。(プログラムの現在のステートメントに対応するアセンブリステートメントの次のステートメントを記録するのと同じです)
  4. コンテキストデータ:プロセスの実行中のプロセッサのレジスタ内のデータ。
  5. メモリポインタ:対応するプロセスアドレス空間(ヒープ、スタック、コードセグメントなど)を指します。
  6. I / Oステータス情報:現在のプロセスで開かれたファイルの情報を保存します。
  7. アカウンティング情報:CPUが使用されている時間の長さと占有されているメモリのサイズを記録します。
  8. 優先度:他のプロセスと比較した優先度。
  9. その他の情報

4.3プロセスステータス

大きな観点から:プロセスには、準備完了、実行中、ブロック状態の3つの状態があります。
小さな観点からは、合計7つの状態があります。

  1. Rステータス:実行ステータス、CPUがリソースを割り当てるのを待っている、またはCPUリソースを取得しました
  2. S状態:スリープ状態を中断できます。たとえば、Ctrl + cを使用してプロセスを中断します。
  3. D状態:中断できないスリープ状態
  4. T状態:一時停止状態。たとえば、Ctrl + zを使用してプロセスを一時停止状態にしますが、Ctrl + cとは異なり、プロセスは直接終了します。
  5. t状態:追跡状態。この状態はgdbデバッグ中に生成されます
  6. X状態:デッド状態
  7. Z状態:ゾンビ状態(このセクションでは、ゾンビプロセスおよび孤立プロセスとともに後で説明します)

質問:プログラムの実行中にCtrl + zを押したときに復元するにはどうすればよいですか?
解決策:最初に、jobsコマンドを使用して現在中断されているプロセスのPID番号を表示できます。次に、それを使用fg [被挂起进程的PID]してフォアグラウンド実行bg [被挂起进程的PID]に復元し、を使用してバックグラウンド実行に復元できます。

4.4プロセスの作成

まず、3つのシステムコール関数を理解する必要があります

4.4.1getpid()機能

getpid()関数:現在のプロセスのPIDを取得するために使用されます。このプロセスは、どのプロセスのPID番号を取得するために呼び出します。

4.4.2getppid()機能

getppid()関数:現在のプロセスの親プロセスのPIDを取得ます。このプロセスは、プロセスの親プロセスのPID番号を呼び出します。

まず、これら2つの関数をコードでテストしてみましょう

コードは次の図のようになります。次の図のように
ここに画像の説明を挿入します
実行します。
ここに画像の説明を挿入します
無限ループであるため、後で実行されています
。次に、現在の実行可能プログラムのプロセス情報を確認し、次に
ここに画像の説明を挿入します
親プロセスのPIDを確認します。は28132で、これはBASH(コマンドラインインタープリター)プロセスIDです。

4.4.3fork()機能

fork()関数:プログラマーがコード内にサブプロセスを作成できるようにします

pid_t fork(void )

  • パラメータなし
  • pid_t:本質的に整数
  • 戻り値の意味:子プロセスの作成が失敗した場合、-1を返し、作成は、成功した場合、親プロセスのために、それは数> 0を返し子プロセスのために、それは数== 0を返します。
  • 原則:forkによって作成された子プロセスのPCBは、親プロセスのPCBとは別のPCBです(親プロセスのPCB情報のほとんどをコピーし、同じアドレス空間を共有しないでください。これはパスと同等です。値で)

次に、フォーク関数の使用について引き続き見ていきます。

コードは次の図のようになります。次の図のように
ここに画像の説明を挿入します
実行します。
ここに画像の説明を挿入します
次にコードを入力ps -ef | grep ./testして、親プロセスと子プロセスのPID番号を表示します。
ここに画像の説明を挿入します
最初の列は、現在のプロセスのPID番号であり、 2番目の列は、対応する親プロセスのPID番号です。

コードを注意深く見ると、間違いなく質問があると思います。

質問:作成された子プロセスは、frok関数の戻り値の後のコードから、またはfork関数の戻り値の前のコードから実行を開始しますか?

回答:まず、両方のケースを分析します

  1. fork関数が戻る前に実行:fork関数が戻る前に実行すると、プログラムは常に子プロセスを作成し、子プロセスを再帰的に作成することを意味します。上記のコードテストでは、1つの子プロセスのみが生成されたことがわかりました。この状況
  2. fork関数が戻った後に実行する:後で実行する場合は意味があります。プログラムは最初に子プロセスを作成します。作成が成功すると、親プロセスは0より大きい数値を取得し、子プロセスは等しい数値を取得します。 0に設定してから、これら2つのプロセスにそれぞれ対応するコードを実行します。テスト結果によると、この状況が当てはまるのは明らかです。

この質問に対する答えは、frok関数からの戻り値の後にコードの実行を開始することであることはすでにわかっていますが、なぜですか?詳細に分析しています。

  1. プログラムがfork関数の行まで実行され、fork関数に遭遇すると、システムは子プロセスを作成する必要があるため、現在のプロセスを一時停止して、プロセスの子プロセスを作成します。
  2. このとき、PCBの重要なプログラムカウンタが役割を果たします。これは、プログラムカウンタが現在のアセンブリ命令の次の命令を保存するためです。
  3. したがって、子プロセスにコピーされたPCBのプログラムカウンタは次の命令も保存します。したがって、これにより、子プロセスが子プロセスを再帰的に作成することを防ぎます。
  4. 次に、ダウンを続けると、fork関数は子プロセスが作成されたことを検出し、0より大きい数値を親プロセスに返し、0に等しい数値を子プロセスに返し、2つのプロセスが交互に回転します。 OSカーネルによると。実装。

5.ゾンビ状態、ゾンビプロセス、孤立プロセス

5.1ゾンビの状態とゾンビのプロセス

上記の内容から、ゾンビの状態はZ表されていることがわかりますが、どの程度正確に生成されているのでしょうか。

ゾンビプロセスの生成

まず、子プロセスが親プロセスの前に終了するという非常に重要な前提があります。つまり、子プロセスが終了すると、親プロセスは将来、子プロセスのリソースを再利用する時間があり、その結果、子プロセスのPCBが時間内に解放されない場合、プロセスはゾンビプロセスであり、プロセスの対応する状態はゾンビ状態です。

害:

子プロセスのPCBを解放できないため、メモリリークが発生します

解決する:

この時点で、次のコマンドのいずれかを直接使用できると考える人もいるかもしれません。

  • kill + PID:プロセスを強制終了するには
  • kill - q + PID:プロセスを強制的に強制終了します

実際、私たちの日常の状況のほとんどは、上記の2つのコマンドで解決できますが、ゾンビプロセスはこれらの2つのコマンドでは解決できません。
3つの実際の解決策があります。

  1. オペレーティングシステムを再起動します。この方法はコストがかかりすぎます-お勧めしません
  2. 対応する親プロセスを強制終了します。親プロセスは正常に実行されます。なぜ突然強制終了する必要があるのですか?この方法も高価です-お勧めしません
  3. プロセス待機、それはプロセス制御に属します、私はそれについて後の記事で話します、この記事はあまり詳細には立ち入りません-推奨

5.2孤立したプロセス

孤立したプロセスの生成

ゾンビプロセスと同様に、対応する前提条件もあります。親プロセスは子プロセスの前に終了します。つまり、プロセスは実行されます。親プロセスは子プロセスの前に終了します。この時点で、子プロセスは最初のプロセスによって採用されます。子プロセスのプロセスと終了。の場合、子プロセスの終了リソースは最初のプロセスによって再利用されます。

プロセス1

OS(オペレーティングシステム)によって開始される最初のプロセス(非常に重要なプロセス)。プロセスNo. 1は、OSがコンピューターリソースを管理するのに役立つ複数の子プロセスを生成します。

重要事項

  • プロセス状態では、孤立状態はなく、孤立プロセスのみが存在します

質問:親プロセスが最初に実行されますか、それとも子プロセスが最初に実行されますか?

回答:わからない、それはOSカーネルのスケジューリングに依存します(つまり、誰が最初にCPUによって割り当てられたリソースを取得するかに依存します)

  • CPUが1つしかない場合は、親プロセスが最初に実行されるか、子プロセスが最初に実行されます。
  • CPUが2つある場合、上記の場合、親プロセスと子プロセスが同時に実行される可能性があります

おすすめ

転載: blog.csdn.net/weixin_43937101/article/details/115026196