プロセスを理解する前に、まずオペレーティングシステムの基本原則を理解する必要があります。
オペレーティング・システム
オペレーティングシステムは、コンピュータのハードウェアとソフトウェアのリソースを管理するコンピュータプログラムであり、コンピュータシステムの中核であり基盤です。簡単に理解すると、オペレーティングシステムにはカーネルと他のプログラムの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をコピーするため、親プロセスの環境変数は子プロセスに継承できます。