プロセスを理解する前に知っておくべきいくつかの知識
フォンノイマンアーキテクチャ
1:データとプログラムを入力するための入力デバイス;
2:プログラムとデータを格納するためのメモリ;
3:データ処理を完了するためのコンピューティングユニット;
4:プログラムの実行を制御する;
5:出力デバイスは処理結果を出力します。
オペレーティングシステム
どのコンピュータシステムにも、オペレーティングシステム(OS)と呼ばれる基本的なプログラムのセットが含まれています。
つまり、オペレーティングシステムには、
カーネル(プロセス管理、メモリ管理、ファイル管理、ドライバー管理)と
その他のプログラム(関数ライブラリ、シェルプログラムなど)が含まれます。
オペレーティングシステムは、管理専用のソフトウェアとして理解することもできます。
システム呼び出しとライブラリ関数
オペレーティングシステムの実装によって提供されるすべてのシステム呼び出しのセットは、プログラムインターフェイスまたはアプリケーションプログラミングインターフェイス(API)です。これは、アプリケーションとシステムの間のインターフェースです。
システム呼び出しの使用では、機能は比較的基本的であり、ユーザーの要件は比較的高いため、意図的な開発者は、一部のシステム呼び出しを適切にカプセル化してライブラリを形成できます。ライブラリを使用すると、高レベルのユーザーにとって非常に有益です。開発者は二次開発を行います。
プロセスおよびプロセス管理
プロセスの概念:実行中のプログラム、プログラムのインスタンスプロセス情報
はどのように保存されますか?
プロセス情報は、プロセス制御ブロックと呼ばれるデータ構造に配置されます。これは、プロセス属性のコレクションとして理解でき、まとめて次のように呼ばれます。 PCB制御ブロック(pid、プログラムカウンター、プロセスステータス、メモリポインター、コンテキストデータ、プロセス優先度、IO情報、およびアカウンティング情報を含む)の場合、Linuxの下ではpcbはtask_structという名前の構造です
。task_structはリンクされたリストを介して行われます。フォームはLinuxカーネルに保存されます
プロセスを表示する方法
は、/ proc /システムファイルの下、または上部のpsコマンドから表示できます。
各プロセスには、プロセス識別子(pid)である一意の識別子があります。
プロセスpidはgetpidを介して表示でき、親プロセスpidはgetppidを介して表示されます。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
fork()を1回呼び出し、システム呼び出しによって提供される** fork()**を介して2回戻り、プロセスを作成できます。これら2つの戻りは、それぞれの戻り値関数、つまり子プロセスと親プロセスを返します。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
if(ret < 0){
//小于0,创建失败
perror("fork");
return 1;
}
else if(ret == 0){
//==0,child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else{
//father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
return 0;
}
このプログラムを実行すると、他の場合に問題があるかのように、プログラムの結果が2つあることがわかりますが、そうではありません。
フォークを実行すると、元のプロセス情報をコピーして新しいプロセスを生成します。 、これは子プロセスです(つまり、他に2回実行する場合、1回はオリジナル、1回はコピー)、それらの間でデータを共有するコードは独立しています。
プロセスステータスプロセスに
は多くの状態があり、以下に一般的なものをリストします。プロセスステータスは、psコマンドを使用して
R実行ステータス(実行中)を表示できます。これは、プロセスが実行中である必要があることを意味するのではなく、プロセスが実行中または実行キューにあることを示します。
Sスリープ状態(スリープ):プロセスがイベントの完了を待機していることを意味します(ここでのスリープは、割り込み可能スリープと呼ばれることもあります)。
Dディスクスリープは、中断不可能なスリープと呼ばれることもあります。この状態のプロセスは通常、IOの終了を待ちます。
T停止状態(停止):SIGSTOP信号をプロセスに送信することにより、プロセスを停止(T)できます。中断されたプロセスは、SIGCONTシグナルを送信することで実行を継続できます。
Xデッド状態(デッド):終了したプロセス。この状態は単なる戻り状態であり、タスクリストにこの状態は表示されません。
Z(ゾンビ)-
ゾンビプロセス:ゾンビ状態(ゾンビ)は特別な状態です。プロセスが終了し、親プロセス(後述のwait()システム呼び出しを使用)が子プロセス終了の戻りコードを読み取らない場合、ゾンビ(死体)プロセスが発生します。ゾンビプロセスは終了状態でプロセステーブルに残り、親プロセスが終了ステータスコードを読み取るのを待っていました。したがって、子プロセスが終了している限り、親プロセスは実行中ですが、親プロセスは子プロセスのステータスを読み取らず、子プロセスはZ状態になります。
したがって、ゾンビプロセスはメモリリークの害をもたらすため、回避する必要があります。
孤児プロセス
の子プロセスの前に出ると、親プロセスは、子プロセスが孤立したプロセスになりますが、それはかゆみが子initプロセスとして、あるプロセスが、initになりますしませんリソースリークの原因。
環境変数
環境変数(環境変数)一般に、一時フォルダの場所やシステムフォルダの場所など、オペレーティングシステムのオペレーティング環境を指定するためにオペレーティングシステムで使用されるいくつかのパラメータを指します。
これらのパラメータは、特定の機能を持っている。たとえば、パスは、システムがそれをプログラムが置かれている完全なパスを告げずにプログラムを実行する必要がある場合には、カレントディレクトリ内のプログラムを検索に加えて、システムはまた見つけるためにどのディレクトリに行く必要があることをシステムに指示
し、環境変数に関連するいくつかのコマンド
- エコー:環境変数の値を表示します
- エクスポート:新しい環境変数を設定します
- env:すべての環境変数を表示します
- 未設定:環境変数をクリア
- set:ローカルで定義されたシェル変数と環境変数を表示します。
次のコードから環境変数を取得することもできます。
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
/*argc:命令行参数的个数
argv:命令行参数
env:某一个环境变量的值*/
int i = 0;
for(; env[i]; i++){
//环境变量指针数组以null结束
printf("%s\n", env[i]);
}
return 0;
}
環境変数の値を取得する
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n", getenv("PATH")); //getenv(const char* name)
//获取名为PATH环境变量的值
return 0;
}