当前位置: > 系统教程 > 僵尸进程简介“僵尸”进程是什么?(一)

僵尸进程简介“僵尸”进程是什么?(一)

发布时间:2021-04-07 19:05:35 文章来源:Linux系统下载站 浏览量:

[导读] : 僵尸进程简介“僵尸”进程是什么?通常情况下,造成僵尸进程的成因是因为该进程本应该已经执行完毕,但是该进程的父进程却无法完整的将该进程结束掉,而造成该进程一直存在于内存中。那么如何查看一个进程是否为僵尸进程呢?也可以通过top指令来查看是否存在僵尸进程光标处即目前的僵尸进程数量。这是一个维持30秒的僵尸进程如何防止僵尸进程的产生这样就避免了僵尸进程的产生。还能避免所有的僵尸进程嘛?

僵尸进程简介“僵尸”进程是什么?(一)

僵尸进程简介

什么是“僵尸”进程?在正常情况下,僵尸进程的原因是该进程应该已经执行,但是该进程的父进程无法完全终止该进程,并且该进程始终存在于内存中。

那么如何检查一个进程是否是僵尸进程

ps:将某个时间点的进程运行状态选取下来
ps aux    //查看系统所有的进程数据
-A:所有的进程均显示出来
-a:不与terminal有关的所有进程
-u:有效用户相关的进程
-x:通常与a一起使用,可以列出较完整的信息
-l:较长、较详细地将该PID的信息列出

如图所示:

这里写图片描述

如上所示

1、 F:进程标志,指示该进程的权限,常用数字为:

如果为4,则权限为root

如果为1,则只能复制(叉),而不能实际执行(exec)

2、 S:代表进程的状态

R(正在运行):正在运行的进程

僵尸进程s_僵尸进程 英文_僵尸进程

S(睡眠):一个正在休眠但可以唤醒的进程

D:无法唤醒的睡眠状态,通常正在进行数据I / O

T:停止状态

Z(僵尸):僵尸状态,进程已终止,但无法从内存中删除

您还可以使用top命令检查是否存在僵尸进程

top:动态查看进程的变化
top:参数
-d:后面接秒数,表示显示整个进程界面更新的秒数,如top -d 5
-b:以批次的方式执行top
-n:与-b搭配,意思是需要几次top输出的结果
-p:指定某个特定的PID进行检测

如图所示:

这里写图片描述

当前僵尸进程数位于光标处。

示例

这是一个僵尸过程,持续30秒

僵尸进程_僵尸进程s_僵尸进程 英文

#include
#include
int main(int argc,char** argv[])
{
    int id = fork();
    if(id>0)
    {
        printf("Parent is sleeping\n");
        sleep(30);
    }
    if(id == 0)
    printf("Child process is done\n");
    exit(EXIT_SUCCESS);
}

用外行人的术语说,僵尸进程意味着子进程在父进程之前死亡,但是父进程没有正确回收子进程的资源。

流程管理

当您得知这是一个僵尸进程时,您将如何杀死它?首先,您必须了解流程的管理。

程序之间的相互管理通过发出信号进行管理

检查信号(信号):

1、 man 7信号

2、 kill -l <​​/ p>

这里写图片描述

通常,我们只需要记住一些特别重要的信号即可。

1:启动终止的进程,允许PID重新读取其配置文件

僵尸进程 英文_僵尸进程_僵尸进程s

9:在中间部分强制执行一个进程。如果进程运行一半(例如vim),将生成.filename.swap的半成品文件

15:正常结束进程

18:继续运行该过程

19:暂停进程

例如,要强制终止一个进程:

这里写图片描述

在实际情况下,如果有时我们无法直接杀死僵尸进程,我们可以找到它的父进程并将其杀死,从而杀死僵尸进程

通常僵尸进程,当系统不稳定或代码不完善,或者用户的不当操作可能会产生僵尸进程,而僵尸进程是一个漫长的死进程,但在进程表(processes table)中仍然占据1个位置(插槽)。由于进程表的容量有限,因此它占用内存资源并影响系统性能。

补充:如何防止僵尸进程的产生

如上所述,当子进程首先退出而父进程没有对其进行回收时,将生成一个僵尸进程。我们可以等待进程让父进程等待子进程退出然后回收。

这里将不再重复特定的等待过程。您可以在过程控制中引用过程等待部分。

僵尸进程 英文_僵尸进程s_僵尸进程

这里主要要提一下以后学习的信号部分的知识。当子进程退出时僵尸进程,操作系统将发送SIGCHLD信号,并且该信号的默认处理动作是忽略。父进程可以自定义SIGCHLD信号的处理功能。这样,父进程就可以处理自己的事务,而不必担心子进程的退出,并且可以在父进程的处理函数中调用wait来清理子进程。