进程生命周期

 

 

--------------------------------------------

 

 

对于一个进程,基本概念我觉得就是一个资源分配单位。对于每一个进程都有对应的PCB(进程控制块),在linux下的PCB是task_struct。  对于task_struct,一开始我看源码的时候也是非常痛苦,看了这忘了那,一直都模模糊糊。所以总结之后,觉得得需要根据一个进程,需要有什么东西,大概就能有个印象了。对于一个进程,首先需要的就是他的内存,所以有个指mm的指针,对于一个进程,还必须要有相关的信号处理,所以又有一个指针指向signal,类似的还有fs,files之类的指针,而一些细微的小碎块,则到用到的时候再去查看。...

那对于一个进程,首先就是一副进程生命周期图。  

就绪态->运行态->等待态   暂停 , 僵死。

 

对于僵尸进程,相关的内存已经释放,就是他已经死亡,但是父进程没有对他调用wait,wait4 (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\n", (long) getpid());
		pause();
		_exit(0);
	} else {
#if 0 /* define 1 to make child process always a zomie */
		printf("ppid:%d\n", 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\n", WEXITSTATUS(status));

			if(WIFSIGNALED(status))
				printf("child process is killed by signal %d\n", WTERMSIG(status));

			if (WIFSTOPPED(status))
				printf("child process is stopped by signal %d\n", WSTOPSIG(status));

			if (WIFCONTINUED(status))
				printf("child process resume running....\n");

		} while (!WIFEXITED(status) && !WIFSIGNALED(status));

		exit(0);
	}
}

 

 

 

 

 

 

 

 

 

 

 

对于一个进程,fork出来后,他首先处于就绪态。等待到他拿到CPU开始运行的时候,他就进入了运行态。那什么时候他又会从运行态变成等待态和就绪态呢?有2,1为时间片用完了,否则就是被抢占了。那对于进程什么时候进入等待态? 很自然,你在运行的时候,如果是为了等待某个事件的发生,或者说是等待获取某种资源,那你这段时间其实除了等之外啥也做不了,那岂不是很浪费。。。所以他就会进入一个等待状态,等待到我的资源了,那我才被唤醒。那到这里,等待又分为两种情况,一种是interruptible,另一种是uninterruptible.字面上就很容易理解,一个是可被打扰,另一种是不可被打扰。那什么是可被打扰呢,就是你给我一个信号我就会被打扰,不管我等没等到资源。不可被打扰就是,我只有等到了我想要的资源,我才可以被唤醒,信号对我来说不起作用。

 

 

 

那停止态是什么?  我没有等到资源,也没有被抢占,那我怎么停止这个在运行的进程?  给他发一个停止的信号不就完了吗。类似CTRL Z//作业控制,gdb attach debug//调试。那他怎么继续呢,很简单,给他发一个继续的信号也不就完事了吗。 这里有个fg/bg,对应的就是frontground前台 和  background后台的意思了。fg切换到前台,ctrlz又到了后台。这有什么好处呢,也很容易想。你在用迅雷下载一个文件,但是下载占网速啊。你下到不耐烦了,想玩一会网络游戏,这个时候你可以暂停下载,打完了一把网络游戏,自己也准备出去了,这时候继续下载,下载会从头开始吗?不会,他又会接着刚刚还没下载完的那点继续下载。

 

那我都能暂停一个进程,然后又让他运行了,那我自然很容易的可以操控一个进程的CPU占用率了。//一段时间内暂停和运行的比率来操控       这里有一个cpulimit的命令 可以达到这个效果。

 

 

 

这里cpul的%CPU为93.4

 

这时候变成了20左右。

你可能感兴趣的:(Linux)