プロセス | 詳しい解説 ~プロセスとは何か、プロセス作成の原理とプロセス

1.プロセスとは

プロセスは実行中のプログラムです。

UNIX 標準では、プロセスを、1 つ以上のスレッドが実行されているアドレス空間と、これらのスレッドが必要とするシステム リソース (スレッドは、スレッドに割り当てられたシステム リソースを共有します) として定義します。

構成: プロセスは、プログラム コード、データ、変数 (システム メモリを占有)、開いているファイル (ファイル記述子)、および環境で構成されます。

2. プロセスの構造

PID: プロセス識別子 - 2 ~ 32768 の範囲の正の整数 (最大値はシステムごとに異なります)。プロセスが開始されると、システムは次に未使用の番号を連続してプロセス PID として使用します。サークルは再び開始されます。 2から。

3. プロセステーブル - PCB

プロセス テーブルは、プロセス制御ブロック (PCB) とも呼ばれ、現在メモリにロードされているすべてのプロセスに関する情報をテーブルに記録します。これには、プロセス PID、プロセス ステータス、コマンド文字列、その他のタイプの ps コマンド出力情報 (プロセスの説明情報、および管理情報)。各プロセスはテーブル エントリの 1 つを占有します。PID はプロセス テーブルのインデックスです。オペレーティング システムは PID を通じてプロセスを管理します。

一般的なシステムには、次のキー フィールドが含まれます。

3.1 プロセス管理関連

3 つの主要なカテゴリの情報が含まれます。

1) 識別情報: プロセスを一意に識別するために使用されます。プロセス ID、親プロセス、プロセス グループなどが含まれます。

2) サイト情報: プロセスの実行中にプロセッサ サイトに保存されるさまざまな情報を保持するために使用されます。これらは、プロセッサ コンテキストを保存し、プロセスの切り替え時にプロセッサ コンテキストを復元するために使用されます。汎用レジスタ、PSW、スタックポインタ、プログラムカウンタなどを含みます。

3) 制御情報: プロセスの管理とスケジュールに使用されます。プロセスの開始時間、CPU 使用時間などを含みます。

3.2 ストレージ管理関連

1) テキストセグメントポインタ

2) データセグメントポインタ

3) スタックセグメントポインタ

待って

3.3 ファイル管理関連

ルートディレクトリ、作業ディレクトリ、ファイル記述子、ユーザーID、グループIDなど。

4. プロセスを確認する

1. ps コマンドは、所有者が現在実行しているプログラム、他のユーザーが実行しているプログラム、およびシステム上で実行しているすべてのプログラムを表示できます。

UID: プロセスを実行するユーザー ID

PID: プロセス識別子

PPID: 親プロセスの識別子

C: CPU 占有率 (パーセント形式)

STIME: プロセスの開始時刻

TTY: 端末デバイス。プロセスがどの端末から開始されたかを示します。

TIME: プロセスがこれまでに CPU を占有した時間 (プロセスの実行時間)

CMD: プロセスの開始に使用されるコマンド/プロセスの名前または対応するパス

2.ps よく使用される組み合わせコマンド

ps -ef|grep プロセス名

 複数のプロセスを同時に実行すると、プロセスがバックグラウンドになる可能性があります     

./b& ./a&

5. プロセス作成の原則

Lnux で新しいプロセスを作成する方法: fork()+exec();

コピーオンライト技術を使用して、bash の一部をコピーして置き換えます。

bash: ユーザーがオペレーティング システムに実行するコマンドを入力できるようにするコマンド インタープリタ。

ターミナルを開くと、ターミナルを終了するときに bash が終了するまで、デフォルトで bash プロセスが実行されます。(注: PID はプロセスを一意に識別するため、同じプログラムの PID は実行するたびに同じになるわけではありません)

端末が異なれば、デフォルトの bash も異なります (PID が異なります)。

6. プロセス交換実行シリーズ

/*man execl看帮助手册*/
//path:新替换的程序的路径名称
//arg:传给新程序主函数的第一个参数,一般为“程序的名字”,还可以将替换的新程序改名字,同样会替换成功
//arg后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数以此来结尾
/*
...为可变参数,例如:printf函数有可变参数,printf("%d%d%s",m,p,q)参数可变
*/
int execl(const char* path, const char * arg,...);
int execlp(const char* file, const char * arg,...);//在环境变量PATH指定的路径里面搜索;
int execle(const char* path, const char * arg,...,char* const envp[]);

int execv(const char * path, char* const argv[]);//把参数都放在了一个数组中
int execvp(const char * file, char* const argv[]);
int execve(const char * path, char* const argv[],char* const envp[]); //系统调用

//前五个是库函数,最后一个是系统调用,所以本质上:前5个都是通过底层调用第六个系统调用实现的。

おすすめ

転載: blog.csdn.net/weixin_53472334/article/details/132327245