プロセスとプロセス関連のプロパティ

1. プロセスとは何ですか?

実行中のプログラムをプロセスと呼びます。

1.1 プロセス基板

プロセス情報は、プロセス制御ブロックと呼ばれるデータ構造に配置されます。プロセス制御ブロックは、プロセス属性の集合として理解できます。
Linux でのプロセス PCB は task_struct 構造です。
task_struct は、RAM (メモリ) にロードされ、プロセス情報を含む Linux カーネルのデータ構造です。

1.2 task_構造体

task_ struct コンテンツ分類:
識別子: このプロセスを説明する一意の識別子。他のプロセスを区別するために使用されます。
ステータス: タスクのステータス、終了コード、終了信号など。
優先度: 他のプロセスとの相対的な優先度。
プログラム カウンター: 実行されるプログラム内の次の命令のアドレス。
メモリ ポインタ: プログラム コードおよびプロセス関連データへのポインタ、および他のプロセスと共有されるメモリ ブロックへのポインタが含まれます。
コンテキスト データ: プロセス実行時のプロセッサのレジスタ内のデータ。
I/O ステータス情報: 表示される I/O リクエスト、プロセスに割り当てられた I/O デバイス、プロセスで使用されるファイルのリストなど。
請求情報: プロセッサー時間の合計、使用されたクロックの合計、時間制限、請求先アカウント番号などが含まれる場合があります。
その他の情報。

1.3 閲覧プロセス

プロセス情報は、/proc システム フォルダーから表示できます。
例: PID 123 のプロセス情報を取得するには、/proc/123 フォルダーを表示する必要があります。
ほとんどのプロセス情報は、top や ps などのユーザーレベルのツールを使用して取得することもできます。

2. システムコール - フォークを通じてプロセスを作成します

ここに画像の説明を挿入

3. 処理状況

static const char * const task_state_array[] = {
    
    
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R 実行ステータス (実行中): プロセスが実行中である必要があるという意味ではなく、プロセスが実行中であるか、実行キュー内にあることを示します。

S スリープ状態 (スリープ): プロセスがイベントの完了を待っていることを意味します (ここでのスリープは、割り込み可能なスリープ (割り込み可能なスリープ) と呼ばれることもあります)。

D ディスクスリープ状態 (Disk sleep) は、無中断スリープ状態 (uninterruptible sleep) とも呼ばれ、通常、この状態のプロセスは IO の終了を待ちます。

T 停止状態 (停止): プロセスは、SIGSTOP シグナルをプロセスに送信することによって停止できます (T)。中断されたプロセスは、SIGCONT シグナルを送信することで再開できます。

X デッド状態 (デッド): この状態は単なる復帰状態であり、タスク リストにはこの状態は表示されません。

3.1 Z(ゾンビ) – ゾンビプロセス

ゾンビは特別な状態です。プロセスが終了し、親プロセスが子プロセスの終了コードを読み取れなかった場合、ゾンビ(死体)プロセスが生成され、プロセステーブル内に終了状態で残り、常に終了を待ちます。親プロセスは終了ステータス コードを読み取ります。したがって、子プロセスが終了する限り、親プロセスは引き続き実行されますが、親プロセスは子プロセスの状態を読み取らず、子プロセスは Z 状態に入ります。親プロセスは、wait() システム コール インターフェイスを使用してゾンビ プロセスのリソースを処理する必要があります。
ここに画像の説明を挿入
ここに画像の説明を挿入

3.2 ゾンビプロセスの害

プロセスの終了ステータスは維持する必要があります。なぜなら、プロセスを気にするプロセス (親プロセス) に、あなたが私に託したタスク、そして私がどのようにしているかを伝えたいからです。しかし、親プロセスが一度も読み込まない場合、子プロセスは常に Z 状態になるのでしょうか? はい!

終了ステータス自体の維持には、プロセスの基本情報にも該当するデータの維持が必要となるため、task_struct (PCB) に格納されます。つまり、Z ステートは終了しておらず、PCB はすべて維持される必要があります。時間は?はい!

その親プロセスは多数の子プロセスを作成しますが、それらがリサイクルされないとメモリ リソースの無駄が発生しますか? はい!データ構造オブジェクト自体がメモリを占有するため、C 言語で構造変数 (オブジェクト) を定義することを考えると、メモリの特定の場所にスペースを空ける必要があります。
メモリリーク? はい。

4. オーファンプロセス

親プロセスが早期に終了し、子プロセスが後で終了して Z に入った場合、どうすればよいでしょうか?
親プロセスが先に終了し、子プロセスを「孤立プロセス」と呼びますが、孤立プロセスは1番のinitプロセスに採用されるため、当然initプロセスは再利用する必要があります。
ここに画像の説明を挿入
ここに画像の説明を挿入

5. プロセスの優先順位

5.1 基本概念

CPU リソースの割り当ての順序は、プロセスの優先順位を指します。
優先度の高いプロセスが最初に実行する権利を持ちます。プロセス優先度の構成は、マルチタスク環境の Linux に役立ち、システムのパフォーマンスを向上させる可能性があります。
指定した CPU でプロセスを実行することもでき、重要でないプロセスを特定の CPU に割り当てることで、システム全体のパフォーマンスを大幅に向上させることができます。

5.2 PRI和NI

PRIも比較的わかりやすい、プロセスの優先度、平たく言えばCPUがプログラムを実行する順番であり、値が小さいほどプロセスの優先度が高くなります。
NI についてはどうでしょうか? これは、私たちが話している素晴らしい値であり、実行可能なプロセスの優先順位の変更された値を表します。
PRI 値が小さいほど、実行が速くなります。nice 値を追加すると、PRI は PRI(new)=PRI(old)+nice になります。このように、
nice 値が負の場合、プログラムはtake priority レベル値が小さくなる、つまり優先度が高くなり、より早く実行されます。したがって、Linux ではプロセスの優先度を調整するには、プロセスの nice 値を調整することになりますが、nice の値の範囲は -20 ~ 19 の合計 40 段階です。

プロセスのnice値はプロセスの優先度ではなく、概念ではありませんが、プロセスのnice値はプロセスの優先度の変更に影響を与えることに注意してください。このnice値が処理優先度の補正データであることが分かる。

6. プロセス優先度のコマンドを表示する

既存のプロセスの適切性を変更するには、top コマンドを使用します。
top
top と入力した後、「r」を押します –> プロセス PID を入力 –> nice 値を入力します。

7. プロセスに関するその他の概念

競争力: システム プロセスは多数ありますが、CPU リソースは少量か 1 つしかないため、プロセスは競争力があります。タスクを効率的に完了し、関連リソースをより合理的に獲得するために、タスクには優先順位があります。
独立性: マルチプロセス操作ではさまざまなリソースを排他的に使用する必要があり、マルチプロセス操作中に相互に干渉しません。
並列処理: 複数のプロセスが複数の CPU で同時に個別に実行されます。これを並列処理と呼びます。
同時実行性: 複数のプロセスは、1 つの CPU の下でプロセス スイッチングを使用して、一定期間内に複数のプロセスを進めることができます。これを同時実行性と呼びます。

八、プロセスの全体的な理解の枠組み

ここに画像の説明を挿入
以上が今日私が皆さんにお伝えしたい内容です、もう理解できましたか?Linux に関するコンテンツは今後も更新していきますので、何か得をしたと感じたら、ぜひ心に火をつけて注目してください。

おすすめ

転載: blog.csdn.net/weixin_70056514/article/details/131713540