Linux ---プロセスの基本概念

プロセスを理解する前に、まずオペレーティングシステムの基本原則を理解する必要があります。

オペレーティング・システム

オペレーティングシステムは、コンピュータのハードウェアとソフトウェアのリソースを管理するコンピュータプログラムであり、コンピュータシステムの中核であり基盤です。簡単に理解すると、オペレーティングシステムにはカーネルと他のプログラムの2つの部分が含まれています。

  • カーネルには、プロセス管理、メモリ管理、ファイル管理などが含まれます。
  • その他のプログラム:ライブラリ関数、シェルプログラムなど。

オペレーティングシステムの設計は、ユーザーとハードウェア間の相互作用を促進し、ユーザーがソフトウェアとハ​​ードウェアのリソースを管理できるようにすることです。それで、それをどのように管理するのですか?
例:生徒、分隊長、校長、生徒は分隊長によって管理され、分隊長は校長によって段階的に管理されます。
一般に、オペレーティングシステムは、ソフトウェアとハ​​ードウェアのリソースを最初に記述し、次にそれらを整理および管理することによって管理します。

  • 構造体構造で記述されています。
  • 編成は、いくつかのデータ構造を介して行われます。
    オペレーティングシステムカーネルにはプロセス管理が含まれているため、オペレーティングシステムはプロセスも管理します。最初に記述してから整理します(複数のプロセスを整理します)。

処理する

概念

プロセスは実行中のプログラムですが、オペレーティングシステムは実行中のプログラムを記述し、記述を通じてプログラムの実行スケジューリングを実現します。この記述情報は、オペレーティングシステムがプログラムの実行をスケジュールするエンティティです。

  • ユーザーの視点:実行中のプログラム。
  • オペレーティングシステムの観点:実行中のプログラムの記述情報は、まとめてpcb(プロセス制御ブロックとも呼ばれる)と呼ばれるtask_struct構造体によって記述されます。

task_structに含まれるコンテンツ(PCBのコンテンツ)

  • プロセス識別子
  • メモリポインタ
  • コンテキストデータ
  • プログラムカウンター
  • 優先度
  • 会計情報
  • I / Oステータス情報
  • その他の情報

オペレーティングシステムがプロセスを編成する方法:task_struct構造体は、リンクリストの形式でカーネルに格納されます。

cpuのタイムシェアリングメカニズム(タイムスライスローテーション)
各プロセスのcpuの処理時間は非常に短く、処理が完了すると次のプロセスが切り替えられ、ポーリングプロセスが継続的に実行されます。

プロセスのビュー

  • ps -ef / -aux
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ps -auxは、ps-efよりも多くの情報を表示できます。

このプロセスは、
既存のプロセスから新しいプロセスを作成するフォーク関数を作成します。新しいプロセスは子プロセスと呼ばれ、元のプロセスは親プロセスと呼ばれます。

#include <stdio.h>
#include <unistd.h>
int res = fork();

フォークの戻り値:

  • 子プロセス:== 0
  • 親プロセス:> 0は子プロセスのpidを返し、<0は子プロセスの作成に失敗しました。

フォークが子プロセスを作成した後、通常はifを使用して迂回します

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
    
    
        //创建一个子进程
        int ret = fork();
        if(ret<0)
        {
    
    
                perror("创建失败“);
                return -1;
        }
        else if(ret == 0)
        {
    
    
                printf("子进程 进程ID = %d ret = %d",getpid(),ret);
        }
        else
        {
    
    
                printf("父进程 进程ID = %d ret = %d",getpid(),ret);
        }
        return  0;
}

forkを使用して子プロセスを作成します。新しいプロセス(子プロセス)は親プロセス(コード共有、一意のデータ)をコピーし、forkで作成された子プロセスは、fork関数の背後にあるデータをコピーするだけです。前のプロセスはコピーされません。 。

プロセス状態プロセスの状態には、
準備完了状態、実行状態、およびブロッキング状態が含まれます。
Linuxでのプロセスのステータス:

  • R実行状態は、プロセスが実行されている必要があることを意味するのではなく、プロセスが実行キューにある可能性があります。
  • 休止状態とは、プロセスが特定のイベントの完了を待機しており、中断できることを意味します。
  • Dディスクスリープ状態:中断することはできません。この状態では、プロセスは通常、IO操作の終了を待ちます。
  • T停止状態
  • X死の状態

プロセスステータスの表示方法:ps -aux / -axj
ここに画像の説明を挿入します

孤立したプロセス

原因:親プロセスが早期に終了し、子プロセスは「孤立プロセス」と呼ばれ、子プロセスはバックグラウンドプロセスになり、子プロセスはプロセス番号1に採用され、その親プロセスはプロセス番号1になります。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
    
    
        //创建一个子进程
        int ret = fork();
        if(ret<0)
        {
    
    
                perror("创建失败“);
                return -1;
        }
        else if(ret == 0)
        {
    
    
                printf("子进程 进程ID = %d",getpid());
                sleep(10);
        }
        else
        {
    
    
                printf("父进程 进程ID = %d",getpid());
                sleep(5);
                exit(0); //父进程退出
        }
        return  0;
}

ゾンビプロセス

子プロセスが終了した後、リソースは解放されず、デッド状態になります。
原因:子プロセスは親プロセスの前に終了します。親プロセスは他の操作を実行しており、子プロセスの終了に注意を払っていません。現時点では、オペレーティングシステムは保護のために子プロセスのリソースを解放しません。子プロセスが終了し、子プロセスが実行されていない、終了しなかった、デッド状態のゾンビプロセスになりました。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
    
    
        //创建一个子进程
        int ret = fork();
        if(ret<0)
        {
    
    
                perror("创建失败“);
                return -1;
        }
        else if(ret == 0)
        {
    
    
                printf("子进程 进程ID = %d",getpid());
                exit(0); //子进程退出
        }
        else
        {
    
    
                printf("父进程 进程ID = %d",getpid());
                sleep(10);
        }
        return  0;
}

ここに画像の説明を挿入します
ゾンビプロセスの害

  • 親プロセスが子プロセスの終了に注意を払っていない場合、子プロセスは常にゾンビプロセスになります。
  • 子プロセスが終了しなかったため、pcbは解放されていません。
  • メモリリークがあります。

ゾンビプロセスを回避する方法

  • 親プロセスを閉じます。親プロセスを閉じると、子プロセスはその終了情報を保存する必要がなくなります。
  • プロセスを待機するように設定し、子プロセスが終了するのを待って、親プロセスに通知します。

環境変数

オペレーティングシステムにおいて、オペレーティングシステムの動作環境を指定するために使用されるパラメーター。

一般的な環境変数

  • HOME:ホームディレクトリ。
  • PATH:コマンドの検索パスを指定します。
  • シェル

環境変数を表示する

  • echo $ nameは、変数名を介して、指定された変数を表示します。
  • env:すべての環境変数を表示
  • エクスポート:環境を宣言します
  • 設定解除:一時変数を削除します

ここに画像の説明を挿入します
すべてのプログラムには環境テーブルがあります。環境テーブルは、環境パラメータが格納されている配列へのポインタに似ています。

環境変数を表示する方法:

#include<stdio.h>

int main(int agv,char *argv[])
{
    
    
        extern char **environ;
        int i = 0;
        for(;environ[i];i++)
        {
    
    
                printf("%d -- %s\n",i,environ[i]);
        }
        return 0;
}

ここに画像の説明を挿入します

#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    
	char * env = getenv("MYENV"); //getenv访问特定环境变量的接口
	if(env){
    
    
		printf("%s\n", env);
	}
	return 0;
}

子プロセスは親プロセスのPCBをコピーするため、親プロセスの環境変数は子プロセスに継承できます。

おすすめ

転載: blog.csdn.net/qq_42708024/article/details/104349058