⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 僵尸进程.txt

📁 本人收集的面试题:包含通信原理
💻 TXT
📖 第 1 页 / 共 2 页
字号:
僵尸进程- -
                                       


学习和理解一下僵尸进程。实验室的师兄在面试的时候,就被问到了这个问题。

基础还是很重要的。



      一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(

系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸

进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退

出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。

僵尸进程是怎么样产生的?

       一个父进程调用fork生成一个子进程,子进程执行完推出之后,如果父进程没有调用wait()去收集子进程的状态,那么子进程将成为

一个僵尸。

为什么要存在僵尸进程?

     僵尸进程中保存着很多对程序员和系统管理员非常重要的信息,首先,这个进程是怎么死亡的?是正常退出呢,还是出现了错误,还是被其它进

程强迫退出的?其次,这个进程占用的总系统CPU时间和总用户CPU时间分别是多少?发生页错误的数目和收到信号的数目。这些信息都被存储在僵

尸进程中,试想如果没有僵尸进程,进程一退出,所有与之相关的信息都立刻归于无形,而此时程序员或系统管理员需要用到,就只好干瞪眼了。

怎么样清除僵尸进程?

      如果父进程没有调用wait()来处理僵尸进程,那么僵尸进程将一直存在。僵尸进程虽然对其他进程几乎没有什么影响,不占用CPU时间,消耗的

内存也几乎可以忽略不计,但有它在那里呆着,还是让人觉得心里很不舒服。而且Linux系统中进程数目是有限制的,在一些特殊的情况下,如果存

在太多的僵尸进程,也会影响到新进程的产生。因此,有必要清除僵尸进程。

     清除僵尸进程很简单,只要杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过渡给1号进程init,

init始终会负责清理僵尸进程。



- 作者: yeqiwei 2004年11月2日, 星期二 21:39 加入博采 


=====================================================

僵尸进程- -
                                       


    ●Unix编程中所谓"僵尸进程"指什么,什么情况下会产生僵尸进程,如何杀掉僵尸进程:  在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽 略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill也不能杀死僵尸进程(僵死进程实际上是已死的进程,你当然不能杀死一个死人)
  ●在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。从这点来看,僵尸进程虽然有一个很酷的名字,但它的影响力远远抵不上那些真正的僵尸兄弟,真正的僵尸总能令人感到恐怖,而僵尸进程却除了留下一些供人凭吊的信息,对系统毫无作用。
  ●系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁。僵尸进程虽然对其他进程几乎没有什么影响,不占用CPU时间,消耗的内存也几乎可以忽略不计,但有它在那里呆着,还是让人觉得心里很不舒服。而且Linux系统中进程数目是有限制的,在一些特殊的情况下,如果存在太多的僵尸进程,也会影响到新进程的产生。
  ●如何清理僵尸进程:用wait()和waitpid()系统调用可以清理僵尸进程.或者杀死僵尸进程的父进程(僵尸进程的父进程必然 存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.
   
       下面这段比喻形容了进程的一生,也更容易看出僵尸进程所处的阶段:
       随着一句fork,一个新进程呱呱落地,但它这时只是老进程的一个克隆。
       然后随着exec,新进程脱胎换骨,离家独立,开始了为人民服务的职业生涯。
       人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一个"}",从容地离我们而去;也可以是自杀,自杀有2种方式,一种是调用exit函数,一种是在main函数内使用return,无论哪一种方式,它都可以留下遗书,放在返回值里保留下;它还甚至能可被谋杀,被其它进程通过另外一些方式结束他的生命。
      进程死掉以后,会留下一具僵尸,wait和waitpid充当了殓尸工,把僵尸推去火化,使其最终归于无形。
      这就是进程完整的一生。

- 作者: ducktang 2004年11月4日, 星期四 19:57 


--------------------------------------------------------------------------------------------------------------------------------------------------------------

Linux安全攻略—僵尸进程 
作者:Linux安全攻略—僵尸进程 来源: 最后修改于:2005-3-17 9:13:39 点击开始打印 

--------------------------------------------------------------------------------
页面地址是:http://www.xker.com/article/articleview/2005-3-17/article_view_665.htm 
--------------------------------------------------------------------------------
 
 微软系列的东西现在已经非常受人们的喜爱,尤其是他独特人性化操作才让大家爱不释手,但是他也以漏洞之王为称,所以政府、企业等大型服务器是绝对没人敢用windows系列产品的。相比之下Linux在安全方面就闲得非常强壮。 而且照以后的发展趋势来看Linux将在各各领域占有绝对的优势,这个年代要是不懂Linux很难立足。所以今天我就带大家步入Linux最基本的安全领域—"进程"。

    大家都知道Linux跟Win2K一样,都是多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果大家对硬件体系有一定了解的话,就会知道,我们使用的个人计算机(PC)的CPU是在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?这里Linux使用了一种称为"进程调度(process scheduling)"的武器,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。我们了解了完了Linux多进程概念后,先来看看什么是进程?

一、进程概念:
    当运行任何一个UNIX/Linux命令时,shell至少会建立一个进程来运行这个命令(这个进程也叫做父进程),所以可以把任何在UNIX/Linux系统中运行的程序叫做进程;但是进程并不是程序,进程是动态的,而程序是静态的,并且多个进程(这多个进程里除了父进程,其他的就是子进程)可以并发的调用同一个程序。图(1)显示的就是进程树。

    系统中每一个进程都包含一个task_struct数据结构,所有指向这些数据结构的指针组成一个进程向量数组,系统缺省的进程向量数据大小是512,表示系统中可同时容纳512个进程。进程的task_struct数据结构包括了进程的状态、调度信息、进程标识符等信息。
    由于UNIX系统是一个多进程的操作系统,所以每一个进程都是独立的,都有自己的权限及任务,所以当某一进程失败时并不会导致别的进程失败。系统通过进程标识符来区分不同的进程,进程标识符是一个非负正数,他在任何时刻都是唯一的,当某个进程结束时,他的进程标识符可以分配给另外一个新进程。系统将标识符0分配给调度进程,标识符1分配给初始化进程。下面我来给大家演示一下进程由出生到死亡的一个流程图。

进程一生流程图:

出生:编程中的一句fork(),爸爸妈妈(父进程)让小孩(子进程)出生了,并且继承里父母所有的东西,我们也可以把他看成克隆人。

生活:然后随着exec(),小孩长大(新进程)脱胎换骨,离家独立,开始了为人民服务的职业生涯。

死亡: 人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一个"}",从容地离我们而去;也可以是自杀,自杀有2种方式,一种是调用exit函数,  一种是在main函数内使用return,无论哪一种方式,它都可以留下遗书,放在返回值里保留下来;它还甚至能可被谋杀,被其它进程通过另外一些方式结束他的生命(这里跟人有些不一样,在进程里,如果父进程死了,那么他创建的所有子进程也一起跟着死去)。

死后安葬方式:这一过程也是必有的,不能说人在哪死后就不管他,也不把尸体搬走吧!:)进程死掉以后,会留下一具僵尸,wait()函数充当了殓尸工,把僵尸推去火化,使其最终归于无形。

这就是进程完整的一生。

    进程在运行期间,会用到很多资源,包括最宝贵的CPU资源,当某一个进程占用CPU资源时,别的进程必须等待正在运行的进程空闲CPU后才能运行,由于存在很多进程在等待,所以内核通过调度算法来决定将CPU分配给哪个进程。概念清晰后我们接下来看看Linux中,进程有哪几种状态。

二、Linux中的进程基本状态:
    1、执行(R)状态:CPU正在执行,即进程正在占用CPU。
    2、就绪(W)状态:进程已经具备的执行的一切条件,正在等待分配CPU的处理时间片。
    3、停止(S)状态:进程不能使用CPU。

    大家看到了在Linux中,正常来说进程有这么3种状态,但是在特殊情况下会多出一种状态,这就是我们要讲的"僵尸进程(Zombie)"。下面我们会仔细的讲解,接下来再介绍一下进程的管理。

三、Linux中的进程管理

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -