进程生命周期

来源:互联网 发布:p2p借贷系统源码 编辑:程序博客网 时间:2024/06/06 06:52



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



对于一个进程,基本概念我觉得就是一个资源分配单位。对于每一个进程都有对应的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);#endifdo {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左右。

原创粉丝点击