电子商务网站建设与管理 技能实训,滨州做网站的科技公司,做网站卖别人的软件可以吗,微信公众平台官方网目录 一、僵尸进程#xff08;僵死状态#xff09;1.概念2.进程PID与退出码3.僵尸进程举例4.僵尸进程的危害5.僵尸进程的解决方案 二、孤儿进程1.概念2.特点3.孤儿进程解决僵尸进程 一、僵尸进程#xff08;僵死状态#xff09;
1.概念
僵死状态形象点说有点像是没死透的… 目录 一、僵尸进程僵死状态1.概念2.进程PID与退出码3.僵尸进程举例4.僵尸进程的危害5.僵尸进程的解决方案 二、孤儿进程1.概念2.特点3.孤儿进程解决僵尸进程 一、僵尸进程僵死状态
1.概念
僵死状态形象点说有点像是没死透的死亡状态
进程在死亡后需要将进程的资源给父进程回收
简单说就是父进程既然创建了子进程后定然会给子进程布置了任务子进程完成任务后需要将任务的完成情况报备给父进程否则父进程怎么知道你有没有好好完成任务呢
因此进程在退出后却没有把进程的资源给父进程回收此时的进程就处于僵死状态此时的进程又被称作僵尸进程
2.进程PID与退出码
在系统中每个进程在创建时都会给进程分配一个PID子进程的PID是父进程用来识别和操作子进程的唯一标识符
在退出时会返回给父进程的一个值用于表示子进程的退出状态或执行结果。父进程通过读取子进程的退出码来获取子进程的结束信息 父进程回收子进程时会用wait函数回收子进程的PID并将子进程的退出状态保存在通过第二个参数传递的地址中如果提供了该参数
3.僵尸进程举例
#includestdio.h
#includesys/types.h
#includeunistd.h
#includestdlib.h
#includesys/wait.hint main()
{pid_t pidfork();//创建父子进程if(pid0) //子进程进{//.......printf(I am child, pid: %d, ppid: %d\n, getpid(), getppid());exit(0);//返回退出码//子进程结束}//父进程sleep(15);int status;pid_t pwait(status);printf(I am father, pid: %d, ppid: %d\n, getpid(), getppid());}在sleep(15)前子进程结束但是还没有被父进程回收显示的是Z僵死状态 休眠15秒过后父进程对子进程进行回收子进程的僵死状态结束
4.僵尸进程的危害
如果一个父进程一直不去不去回收已经退出的子进程的信息就会造成内存泄露
进程一般退出的时候它的代码和相关数据会被释放但是它的task_struct对象依然还在内存中仍然占用内存占用进程表这些僵尸进程会累积起来占用大量的进程表项。 进程表是有限资源当进程表被填满后系统可能无法再创建新的进程导致系统资源泄露和性能下降。
5.僵尸进程的解决方案
首先自然就是在子进程结束后让父进程用wait、waitpid回收让父进程忽略 SIGCHLD信号这样子进程结束后会被自动回收不会变成僵尸进程杀死父进程让子进程成为孤儿进程由 init 进程接管并回收
二、孤儿进程
1.概念
前面我们知道僵尸进程是能够恢复的只要被父进程回收就行
可万一子进程好好地父进程出事了呢
父进程如果提前退出子进程后退出变成僵尸进程之后那该如何处理呢这种情况下的进程就称作孤儿进程
孤儿进程不再拥有原来的父进程因为父进程已经终止
2.特点
但其实这种情况比僵尸进程要好的多因为在Linux系统中存在init进程
孤儿进程会被init进程收养。这意味着这些进程将以init进程作为它们的父进程继续运行当孤儿进程结束时其占用的资源如内存、文件描述符等会被正常回收就像任何其他进程一样
#include stdio.h
#include unistd.h
#include stdlib.h
int main()
{pid_t id fork();if (id 0) {perror(fork);return 1;}else if (id 0) {//childprintf(I am child, pid : %d\n, getpid());sleep(10);}else {//parentprintf(I am parent, pid: %d\n, getpid());sleep(3);exit(0);}return 0;
}3.孤儿进程解决僵尸进程
甚至于如果出现了僵尸进程我们还可以将僵尸进程的父进程杀掉这样僵尸进程就会变成孤儿进程这样就能正常被init进程回收
孤儿进程的存在通常不是一个问题因为系统能够自动处理它们。然而在某些情况下如果系统中产生了大量的孤儿进程并且这些进程长时间运行而不结束那么它们可能会占用系统资源影响系统性能