僵尸进程

为何要fork()两次来避免产生僵尸进程?

邮差的信 提交于 2020-04-08 06:12:58
为何要fork()两次来避免产生僵尸进程? 当我们只fork()一次后,存在父进程和子进程。这时有两种方法来避免产生僵尸进程: 父进程调用waitpid()等函数来接收子进程退出状态。 父进程先结束,子进程则自动托管到Init进程(pid = 1)。 目前先考虑 子进程先于父进程结束 的情况: 若父进程未处理子进程退出状态,在父进程退出前,子进程一直处于僵尸进程状态。 若父进程调用waitpid()(这里使用阻塞调用确保子进程先于父进程结束)来等待子进程结束,将会使父进程在调用waitpid()后进入睡眠状态,只有子进程结束父进程的waitpid()才会返回。 如果存在子进程结束,但父进程还未执行到waitpid()的情况,那么这段时期子进程也将处于僵尸进程状态。 由此,可以看出父进程与子进程有父子关系,除非 保证父进程先于子进程结束 或者 保证父进程在子进程结束前执行waitpid() ,子进程均有机会成为僵尸进程。那么如何使父进程更方便地创建不会成为僵尸进程的子进程呢?这就要用两次fork()了。 父进程一次fork()后产生一个子进程随后立即执行waitpid(子进程pid, NULL, 0)来等待子进程结束,然后子进程fork()后产生孙子进程随后立即exit(0)。这样子进程顺利终止(父进程仅仅给子进程收尸,并不需要子进程的返回值),然后父进程继续执行

Linux 僵尸进程、孤儿进程和守护进程

混江龙づ霸主 提交于 2020-03-18 17:32:40
1、僵尸进程 子进程退出,会在操作系统中残留一个僵尸进程的数据结构,如果父进程不调用wait()或者waitpid(),会一直占用进程id,则可能耗尽操作系统的进程号。 2、孤儿进程 父进程退出,子进程还在运行,这时子进程就变成孤儿进程。孤儿进程会被init进程,即进程号为1的进程收养,并负责回收残留资源。 3、守护进程 来源: https://www.cnblogs.com/yangwenhuan/p/12518280.html

linux shell中清理僵尸进程

自作多情 提交于 2020-03-02 08:51:01
今天登录到服务器上时,系统打印有6 zombie processes存在,于是用kill -9去清理掉这些僵尸进程,命令执行完后没有错误,可是再次查找时,发现僵尸进程仍然存在,不知道怎么清理了,上网找了一下,学习一下。 僵尸进程定义与查找 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。 如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程? #ps -ef | grep defunct 或者 #ps aux | grep defunct 或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思。 另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程。top命令中也统计了僵尸进程。 Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie top - 10:05:03 up 11 days, 1:17, 7 users, load average: 0.00, 0.01, 0.05

僵尸进程与孤儿进程

懵懂的女人 提交于 2020-03-01 05:52:47
什么是进程? 进程是计算机中的程序关于某个数据集合上的一次运行活动,是系统进行资源分配的基本单位。与之对应的概念是线程,线程是系统调度的基本单位。 什么是僵尸进程呢? 即子进程先与父进程退出后,子进程的PCB需要父进程释放,凡是父进程并没有释放子进程的PCB,这样的子进程就成为僵尸进程。僵尸进程实际上是一个已经死掉的进程。 一个进程在调用exit命令结束自己声明的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zoombie)的数据结构(系统调用exit,它会使进程退出,但也仅仅限于把正常的进程变成了僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它几乎放弃了所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留了一个位置,记录了该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间,这个进程需要它的父进程为它收尸,如果它的父进程没有处理这个僵尸进程的措施,那么它就一直保持僵尸状态,如果这时候父进程结束了,那么init进程会自动接手这个子进程,为它收尸,它还是能被清楚的,但是如果父进程是一个循环,不会结束,那么子进程就一直保持在僵尸状态,这就是为什么系统中有时候会有很多的僵尸进程。 如果有大量的僵尸进程驻在内存之中,必定造成大量的系统资源浪费。但是系统资源是有限的,因此当僵尸进程达到一定的数目时

孤儿进程与僵尸进程[总结]

早过忘川 提交于 2020-02-27 17:12:09
今天遇到一个linux进程启动时指定Max open files不对的问题,导致程序建立socket异常,进而导致fullgc问题,影响正常服务。所以顺带又温习了下linux下的父子进程的特性。 孤儿进程与僵尸进程[总结] 1、前言   之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。 2、基本概念   我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。   孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。   僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程

Linux杀死僵尸进程

落花浮王杯 提交于 2020-02-22 00:50:42
1.使用top命令查看是否有僵尸进程 top 可以看到目前系统中有两个僵尸进程 2.定位僵尸进程 ps -ao stat,ppid,pid,cmd | grep -e '^[Zz]' 从左到右各项值的意思分别是: Z:进程状态 3425:父进程ID 3457: 子进程ID [Xsession]: 命令 3.杀死僵尸进程 使用 kill -hup pid 杀死进程 使用 kill -hup ppid 杀死父进程,第一种不适用的情况下使用此方法 kill -hup 3457 # 通过pid杀死进程 # or kill -hup 3425 # 通过ppid杀死进程 4.检查 ps -ao stat,ppid,pid,cmd | grep -e '^[Zz]' # or top 参数解读 ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]' -a 参数列出所有进程 -o 自定义输出字段 stat(状态)、ppid(进程父id)、pid(进程id)、cmd(命令) 因为状态为z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程 来源: https://www.cnblogs.com/youpeng/p/11820085.html

CPU不可中断和僵尸进程

吃可爱长大的小学妹 提交于 2020-02-18 05:44:43
top时S列为进程的状态: R:运行状态 i:空闲状态 D:不可中断状态,进程正在和硬件交互,为了保护硬件,处于不可中断状态。 Z:僵尸状态,实际上进程已经结束,但父进程没有回收资源。 S:睡眠状态,可中断。 T:暂停状态,进程收到SIN_STOP信号暂停。调试加断点的时候,进程就处于这种状态。 X:进程已经挂掉。 大量不可中断状态,系统或硬件出现故障,可能会出现,检查IO问题。 僵尸状态: 1、父进程创建子进程后,没有调用wait等待, 2、子进程结束会给父进程发送sig_children,父进程没有接受此sig_children处理。 3、或者子进程结束太快,父进程没得及做以上2步操作。 当父进程结束,僵尸子进程会被init回收。 当父进程长期不结束,僵尸子进程也会长期存在。 dstat 查看系统的IO情况。 信号中断(软中断) 本质上是一种异步处理机制。 中断被分成上下两部分处理。 上部分:硬中断,直接处理硬件情况,反应很快。 下部分:软中断,为内核线程,反应相对不如上中断快。 每个CPU都有1个软中断内核线程,名字为ksoftirqd/0 。 硬中断一般对应各种IO问题。 软中断发生频率过高,内核线程会因为CPU使用率过高,导致软中断处理不及时,造成各种问题,像网络延时,调度缓慢等性能问题。 来源: CSDN 作者: 技术老虎Tiger 链接: https://blog

<转载>僵尸进程

ε祈祈猫儿з 提交于 2020-02-15 10:30:29
转载 http://www.cnblogs.com/scrat/archive/2012/06/25/2560904.html 什么是僵尸进程   僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程dead之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。    僵尸进程是怎么样产生   一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。   在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸。   如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号 [参见APUE 10.7] ,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。   但是如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态

僵尸进程

回眸只為那壹抹淺笑 提交于 2020-02-15 10:28:53
含义 僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程结束之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。 在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸。如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 如何避免僵尸进程 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,

进程

痴心易碎 提交于 2020-02-15 10:25:44
1、孤儿进程: 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。 2、僵尸进程: 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源 我们都知道进程的工作原理。我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。 进程停止后, 该进程就会从进程表中移除。在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,