プロセスライフサイクル

3245 ワード


 
--------------------------------------------
 
 
プロセスについて、基本的な概念はリソース割り当て単位だと思います.各プロセスに対応するPCB(プロセス制御ブロック)があり、linux下のPCBはtask_struct. task_の場合struct、最初はソースを見ていたときもとても苦しくて、それを見て忘れて、ずっとぼんやりしていました.だからまとめてみると、一つのプロセスによって、何か必要なものがあれば、たぶん印象に残ると思います.1つのプロセスについては、まず彼のメモリが必要なので、mmを指すポインタがあります.1つのプロセスについては、関連する信号処理が必要です.だから、signalを指すポインタがあります.fs、filesなどのポインタもあります.細かい小さなブロックは、使うときに見てください....
それはプロセスに対して、まずプロセスライフサイクル図です. 
準備状態->運転状態->待機状態一時停止、硬直.
 
ゾンビプロセスでは、関連するメモリが解放され、彼が死んだが、親プロセスは彼にwaitを呼び出していない.wait 4(wait関数には、サブプロセスが何によって殺されたかが表示される).ゾンビプロセスにはどんな危害があるのでしょうか.何の危害もないように見えますが、メモリも解放されています.何の資源も占めていません.つまり、メモリの漏れはありません.しかし、ゾンビプロセスが多すぎるとpid番号が多すぎて、新しいプロセスが生成されません.この上限がいくらなのか、調べられます.
コマンド:cat/proc/sys/kernel/pid_max         -> 32768.
 
私はここでwaitpidを呼び出して、waitがサブプロセスがどんな信号で殺されたかをはっきり見ることができます.
 
int main(void)
{
	pid_t pid,wait_pid;
	int status;

	pid = fork();

	if (pid==-1)	{
		perror("Cannot create new process");
		exit(1);
	} else 	if (pid==0) {
		printf("child process id: %ld
", (long) getpid()); pause(); _exit(0); } else { #if 0 /* define 1 to make child process always a zomie */ printf("ppid:%d
", getpid()); while(1); #endif do { wait_pid=waitpid(pid, &status, WUNTRACED | WCONTINUED); if (wait_pid == -1) { perror("cannot using waitpid function"); exit(1); } if (WIFEXITED(status)) printf("child process exites, status=%d
", WEXITSTATUS(status)); if(WIFSIGNALED(status)) printf("child process is killed by signal %d
", WTERMSIG(status)); if (WIFSTOPPED(status)) printf("child process is stopped by signal %d
", WSTOPSIG(status)); if (WIFCONTINUED(status)) printf("child process resume running....
"); } while (!WIFEXITED(status) && !WIFSIGNALED(status)); exit(0); } }

 
 
 
 
 
 
 
 
 
 
 
プロセスに対してforkが出た後、彼はまず準備状態にある.彼がCPUを手に入れて運転を開始すると、彼は運転状態に入った.では、いつ彼は運転状態から待機状態と準備状態に変わりますか?2,1はタイムスライスが切れて、さもなくば奪われました.プロセスはいつ待機状態に入りますか?もちろん、あなたが実行している間に、あるイベントの発生を待つために、あるいはあるリソースの取得を待つために、あなたはこの时間を待つ以外に何もできません.それは無駄ではありませんか.のだから彼は待機状態に入って、私の資源を待っていて、それでは私はやっと呼び覚まされました.ここまで待つには2つの状況があります.1つはinterruptibleで、もう1つはuninterruptibleです.文字通り分かりやすいのは、邪魔されてもいいし、邪魔されてはいけないことです.では、何が邪魔されるのでしょうか.あなたが私に信号をくれたら、私は邪魔されます.私が資源を待っていても待っていなくても.邪魔されてはいけないのは、私が望んでいる資源を待ってこそ、私は呼び覚ますことができて、信号は私にとって役に立たないということです.
 
 
 
停止状態は何ですか?私はリソースを待っていないし、占領されていないので、どうやってこの実行中のプロセスを停止しますか?彼に停止の信号を送れば終わりではないか.CTRL Z//ジョブ制御、gdb attach debug//デバッグに似ています.では、彼はどのように続けますか.簡単です.彼に続けの信号を送っても終わりではありませんか.ここにfg/bgがあり、frontgroundフロントとbackgroundバックグラウンドの意味に対応しています.fgはフロントに切り替わり、ctrlzはまたバックグラウンドに着いた.これは何のメリットがあるのか、考えやすいです.迅雷でファイルをダウンロードしていますが、ダウンロードはネットの速度を占めています.あなたはうんざりして、しばらくネットゲームを游びたいですが、この时、ダウンロードを一时停止することができます.ネットゲームを终えて、自分も外に出るつもりです.この时、ダウンロードを続けて、ダウンロードは最初から始まりますか?いいえ、彼はまたダウンロードが終わっていないところからダウンロードを続けます.
 
私はすべて1つのプロセスを一時停止することができて、それからまた彼に実行させて、それでは私は自然に1つのプロセスのCPUの占有率を操作することができます.//しばらくの間、一時停止と実行の比率で、ここでcpulimitのコマンドを操作してこの効果を達成することができます.
 
 
 
ここでcpulの%CPUは93.4
 
この時は20くらいになりました.