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