1、プロセスの概念
プロセスは、プログラム実行の活動の独立した機能であるが、システムは、リソースの割り当てとスケジューリングの最小単位です。
ショートプログラムでは、プログラムの実行中のプロセスまたはインスタンスを実行します
2、プロセスを説明
プロセスデータ構造内の情報、プロセス制御ブロックと呼ばれます。制御システムは、プログラム同時にPCB(プログラム制御ブロック)によって記述されます。いわゆる作成プロセスは、PCBのプロセスイメージを作成することで、失効プロセスは、PCBをキャンセルすることです。
3、プロセスおよび手順の間の差
1>動的:プロセスが作成、活動、懸濁液、終結および他のプロセスと動的であり、特定のライフサイクルがあり、このプロセスは、コンピュータ間で移行することはできません。プログラムは、静的な命令の集合体であると、対応するファイルをコピーして貼り付けることができます。ダイナミックなプロセスは、最も基本的な機能のプロセスです。
2>並行性:導入プロセスの目的は、メモリの使用率を改善するために行われ、他のプロセスとプログラムの並行にプログラムを有効にすることです。複数のプロセスを持つエンティティが同時に実行されている、メモリに格納することができます。同時実行プロセスの最も重要な特性でなく、オペレーティングシステムの最も重要な機能です。
3>独立:エンティティは、プロセスが独立して実行することが可能であり、独立した分配システムとリソーススケジューリングの基本単位。しかし、ないものを独立してPCBプログラム参加の実行を構築することができない人。
4>構造:構造上の観点からは、プロセスによってそれを制御するために説明とPCB。主プログラムセグメント、データセグメント、三つの部分セグメントのプロセス制御による。
、4プロセスを作成します。
親プロセスは、自身のコピー後にコピーにフォーク()関数を呼び出して、新しいプロセスのうち、このコピーが正常に作成プロセスを完了し、子プロセスです。
Linuxの()、のvfork()、クローンで**フォーク主要プロバイダ ()** 最初の集計フォーク()3つのプロセスの作成方法、
プロセスが作成されるフォーク、親のリソースの子プロセスのみ完全なコピー、子プロセスのコピー・アウト独自のtask_struct構造とPIDを持っているが、親プロセスの他のすべてのリソースをコピーします。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret=fork();
if(ret<0)
{
perror("Fail");
return -1;
}
else
{
printf("hello proc:%d\n!,getpid(),ret);
}
sleep(1);
return 0;
}
5、ゾンビプロセス
なぜゾンビプロセスがでしょうか?子供はその理由を保存し、終了するためには、出口へ親プロセスよりも優先されますので、そのリソースが完全に解放されないため。場合は、子プロセスが終了すると、オペレーティングシステムは、親プロセスが終了理由子プロセス取得するので、親に通知した後、子プロセスのすべてのリソースを解放する、親が待機と呼ばれていない子供は、/ waitpidの注意の状態を終了していない場合は、その後、子プロセスはゾンビプロセスになります。
そのゾンビプロセスが長い死者のプロセスですが、それはまだプロセステーブルの位置を占めている注目すべきことです。
6、ゾンビプロセスソリューション
親プロセスがハングすることができ、待機/ waitpidのその他の機能を経由して親プロセスの子プロセスの終了について(1)待機、。子供はすぐにすぐにノードを削除するシステムの終了後に親に返されるデータのプロセステーブルに入れます。
親がビジー状態の場合(2)、あなたは信号機能SIGHLDハンドラをインストールすることができます。子供の終わりには、親が信号を受信するには、ハンドラでwait関数を呼び出すことができ
、親は子のプロセスを気にしていない場合(3)停止するとき、あなたはカーネルを伝えることができ、彼のサブプロセスの終了を信号(SIGCLD、SIG_IGN)または信号(SIGCHLD、SIG_IGN)を使用してに興味を持っていませんし、子プロセスの終了後、回復するカーネルは、親プロセスがシグナルを送る与えるものではありません。
親プロセスが子プロセスをforkして、孫の後に仕事、フォークの子プロセスが終了するまで継続する(4)フォークは二回、孫はinitによって引き継がれた、Sunは、プロセスの終了後に、initは回復します。しかし、子プロセスの必要性の回復は自分自身を行います。
7、孤立
親プロセスが終了すると、その1つまたは複数のサブプロセスがまだ続い子供が孤立するだろう、実行されている場合、親プロセスは、複数のサブプロセスを作成します。孤児の養子縁組プロセスは、コレクションの彼らの完了状況のためのinitプロセスにより、初期化プロセスになります。
ゾンビプロセスは、資源の浪費につながりますが、プロセスがない孤児
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid id=fork();
if(id < 0)
{
perror("fork ");
return 1;
}
else if(id==0)
{//子进程
printf("I am child,pid:%d\n",getpid());
sleep(10);
}
else
{//父进程
printf("I am parent,pid:%d\n",getpid());
sleep(3);
exit(0);
}
return 0;
}
以下のための結果出力
I親AM、PID:4416
I AM子供、PID:4417