`
haiouc
  • 浏览: 118898 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Linux的僵尸进程及其解决方法

阅读更多

   1. 产生原因:

    在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。

    但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。

 

    2. 原理分析:

    每个Unix进程在进程表里都有一个进入点(entry),核心进程执 行该进程时使用到的一切信息都存储在进入点。当用 ps 命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个 进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。

    子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。那么会不会因为父进程太忙来不及 wait 子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢?不会。因为UNIX提供了一种机制可以保证,只要父进程想知道子进程结束时的状态信息,就可以得到。这种机制就是:当子进程走完了自己的生命周期后,它会执行exit()系统调用,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出码exit code,退出状态the terminationstatus of the process,运行时间the amount of CPU time taken by the process等),这些数据会一直保留到系统将它传递给它的父进程为止,直到父进程通过wait / waitpid来取时才释放。

 

    3.解决方法:

    (1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。

    执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

    (2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler。在子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。

    (3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号

    (4)fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。

分享到:
评论

相关推荐

    Linux 僵尸进程产生原因及解决方法

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。如果子进程已经终止,那么,...

    linux中的僵尸进程

    ### Linux中的僵尸进程详解 ...了解僵尸进程的产生机制及如何避免僵尸进程的发生对于开发高质量的系统软件非常重要。通过合理的信号处理和进程管理策略,可以有效地避免僵尸进程问题,提高系统的稳定性和性能。

    僵尸进程介绍以及防范

    了解僵尸进程及其影响后,开发者在设计多进程程序时应充分考虑进程生命周期的管理,避免僵尸进程的产生。通过合理使用系统调用和信号处理,可以有效地防止僵尸进程问题,提升系统的稳定性和效率。在遇到相关问题时,...

    在Linux系统中查看进程及杀死僵尸进程的方法.docx

    ### 在Linux系统中查看进程及杀死僵尸进程的方法 #### 一、引言 在Linux操作系统中,进程管理是一项重要的任务,它涉及到系统性能优化、故障排查等多个方面。本文将详细介绍如何使用`ps`命令来查看系统中的进程...

    特殊进程之僵尸进程测试代码

    总之,理解并掌握僵尸进程的性质及其管理对于进行Linux系统编程至关重要。合理地处理僵尸进程能确保系统的稳定性和效率。通过阅读和分析提供的僵尸进程测试代码,我们可以实际操作,进一步巩固这些概念。

    Linux守护进程的编程方法.pdf

    #### 一、守护进程及其特性 守护进程(Daemon)是一种特殊的进程,它运行在后台,独立于控制终端,并且周期性地执行特定任务或等待处理某些事件。Linux系统中许多重要的服务都是通过守护进程实现的,例如Internet...

    linux系统进程管理

    理解Linux系统中的进程及其管理方法对于系统管理员和开发者来说至关重要。通过掌握进程的基础知识、状态管理及查看工具,可以有效地管理和优化Linux系统的性能。此外,熟悉Proc文件系统可以帮助深入分析和解决问题。

    谈谈守护进程和僵尸进程

    #### 守护进程与僵尸进程的概念及应用场景 在深入探讨守护进程和僵尸进程之前,我们先简要回顾一下这两种进程的基本概念及其应用场景。 - **守护进程**(Daemon Process):是在后台运行的服务程序,通常用于执行...

    Linux进程调度策略分析

    本文旨在深入探讨Linux进程调度策略及其背后的实现原理。 #### 2. Linux进程调度原理 ##### 2.1 Linux进程模型 在Linux中,每个进程都由`task_struct`结构来描述。`task_struct`实际上就是通常所说的进程控制块...

    Shell脚本实现查杀子进程、僵尸进程

    通过这种方式,这个Shell脚本能有效地定位并处理那些导致僵尸进程问题的底层子进程,从而更彻底地解决进程僵死的问题,而不只是简单地杀除父进程。在服务器管理中,这样的脚本对于保持系统健康和资源的有效利用非常...

    Linux进程结构及组织方式研究.pdf

    《Linux进程结构及组织方式研究》这篇文献主要探讨了Linux操作系统中进程的结构和组织方式,对于理解Linux内核的工作原理和源码分析具有重要意义。Linux进程作为操作系统的核心组成部分,其结构和组织方式直接影响到...

    Linux进程结构

    然而,这并不妨碍我们以此为引,详细解析Linux下进程的组织方式及其核心结构。Linux中的进程由`struct task_struct`表示,这一结构体是理解Linux进程管理的关键。 #### 1. `struct task_struct`: Linux的进程结构 ...

    Linux进程之如何查看进程详情.doc

    `ps`命令是Linux下查看进程状态的基础工具,它可以提供关于进程的各种信息,包括进程的状态、是否存活、是否存在僵尸进程以及资源占用情况等。\n\n1、`ps`命令介绍:`ps`命令用于显示瞬间进程的状态,但它并不持续...

    Linux进程编程技术.doc

    Linux 进程编程技术 Linux 进程编程技术是指在 ...这些技术包括进程的基本概念、相关函数的应用、守护进程的概念、进程控制程序的编写、进程创建和管理、僵尸进程的避免、守护进程的实现、进程间通信和进程同步等。

    linux之进程管理二头歌.zip

    11.僵尸进程与孤儿进程:僵尸进程是已结束但其父进程未收集其退出状态的进程,占用系统资源。孤儿进程则由init接管,不会成为僵尸。 "项目说明.zip"可能包含更具体的关于如何在实际项目中应用这些概念的文档,例如...

    linux--进程

    僵尸进程是已终止但其父进程尚未收集其状态信息的进程,占用系统资源较少,但过多的僵尸进程会影响系统性能。孤儿进程是其父进程先于自身退出的进程,会被init进程收养。 十、实时进程 实时进程是需要在严格时间内...

    Linux进程编程介绍 Linux进程编程介绍.TXT

    本文详细介绍了Linux进程的基本概念、状态及其转换过程,并提供了进程控制的相关方法。理解这些基础是进行高效进程编程的前提,也是进一步学习多线程编程和并发控制的基础。希望本文能为您的学习之路提供帮助。

Global site tag (gtag.js) - Google Analytics