🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
电脑在没有联网的情况下关机之后,为什么电脑还能够正确的显示时间?
僵尸状态(zombie)
僵尸进程是指已经终止执行但父进程尚未调用
wait()
或waitpid()
来获取其终止状态的进程。这种状态下,进程已经释放了所有的资源,但其进程描述符仍然存在于系统中,直到其父进程获取了其终止状态后才会被完全清除。僵尸进程通常是由于父进程没有正确处理其子进程的终止状态而导致的。这可能是因为父进程已经退出,但没有释放其子进程的资源,或者是因为父进程忙于其他任务而没有及时处理子进程的终止状态。
你(一般指的是退出进程的父进程,一般父进程是bash,bash广义就是操作系统)怎么知道进程把任务完成的怎么样?
进程退出的时候,要有一些退出信息,表明自己把任务完成的怎么样!(例如,函数中的main函数结尾要return 0)
当一个进程在退出的时候,退出信息会由OS写入到当前退出进程的PCB中,可以允许进程的代码和数据空间释放,但是不能允许进程的pcb被立即释放!!
要让OS或者父进程,读取退出进程的退出信息,得知子进程退出的原因!
进程退出了,但是还没有被父进程或者OS读取,Os必须维护退出进程的pcb结构!!
此时,进程算退出了吗?退出了,因为在内存中代码和数据释放了
此时的状态:Z(zombie僵尸状态)
父进程或者OS读取之后,得知进程退出的原因,PCB状态先被改成X(dead死亡状态)状态,才会被释放
如果一个进程Z状态了,但是父进程就是不释放(回收)他,pcb就要一直存在
如果我们不及时释放他,可能造成内存泄漏
事例
[BCH@hcss-ecs-6176 10_12]$ cat proc.c #include<stdio.h> #include<unistd.h> #include<stdlib.h> int main() { pid_t id=fork(); if(id<0)return 0; else if(id==0) { //子进程 int cnt=5; while(cnt) { printf("I am child, run times:%d\n",cnt--); sleep(1); } printf("I am child,dead!:%d\n",cnt--); exit(2); } else { //父进程 while(1) { printf("I am father,running ang times!\n"); sleep(1); } } return 0; } [BCH@hcss-ecs-6176 10_12]$ ./myproc I am father,running ang times! I am child, run times:5 I am father,running ang times! I am child, run times:4 I am father,running ang times! I am child, run times:3 I am father,running ang times! I am child, run times:2 I am father,running ang times! I am child, run times:1 I am father,running ang times! I am child,dead!:0 I am father,running ang times! I am father,running ang times! [BCH@hcss-ecs-6176 10_12]$ while :; do ps ajx | head -1&&ps ajx | grep myproc ;sleep 1;echo "##############"; done//每个两秒监视myproc的进程状态 PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 3218 9935 9935 2439 pts/0 9935 S+ 1000 0:00 .