进程生命周期

2019-07-14 12:38发布

    --------------------------------------------     对于一个进程,基本概念我觉得就是一个资源分配单位。对于每一个进程都有对应的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 ", (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为时间片用完了,否则就是被抢占了。那对于进程什么时候进入等待态? 很自然,你在运行的时候,如果是为了等待某个事件的发生,或者说是等待获取某种资源,那你这段时间其实除了等之外啥也做不了,那岂不是很浪费。。。所以他就会进入一个等待状态,等待到我的资源了,那我才被唤醒。那到这里,等待又分为两种情况,一种是interruptible,另一种是uninterruptible.字面上就很容易理解,一个是可被打扰,另一种是不可被打扰。那什么是可被打扰呢,就是你给我一个信号我就会被打扰,不管我等没等到资源。不可被打扰就是,我只有等到了我想要的资源,我才可以被唤醒,信号对我来说不起作用。       那停止态是什么?  我没有等到资源,也没有被抢占,那我怎么停止这个在运行的进程?  给他发一个停止的信号不就完了吗。类似CTRL Z//作业控制,gdb attach debug//调试。那他怎么继续呢,很简单,给他发一个继续的信号也不就完事了吗。 这里有个fg/bg,对应的就是frontground前台 和  background后台的意思了。fg切换到前台,ctrlz又到了后台。这有什么好处呢,也很容易想。你在用迅雷下载一个文件,但是下载占网速啊。你下到不耐烦了,想玩一会网络游戏,这个时候你可以暂停下载,打完了一把网络游戏,自己也准备出去了,这时候继续下载,下载会从头开始吗?不会,他又会接着刚刚还没下载完的那点继续下载。   那我都能暂停一个进程,然后又让他运行了,那我自然很容易的可以操控一个进程的CPU占用率了。//一段时间内暂停和运行的比率来操控       这里有一个cpulimit的命令 可以达到这个效果。       这里cpul的%CPU为93.4   这时候变成了20左右。