浅议Unix进程中defunct

系统 其他OS
我们在Unix进程中,1个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来Unix进程表中的数据会被该进程的退出码.

我们在Unix系统管理中,当用ps命令观察Unix进程的执行状态时,经常看到某些Unix进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于Unix进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。

我们知道,每个Unix进程在进程表里都有一个进入点(entry),核心程序执行该Unix进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。

当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。

当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来Unix进程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进程终止后,但是父进程尚未读取这些数据之前。利用这一点我们可以用下面的程序建立一个defunct 进程:
 

  1. CODE:#include  
  2. #include  
  3. main(){  
  4. if(!fork()){  
  5. printf(“child pid=%d\n”, getpid());  
  6. exit(0)  
  7. }  
  8. sleep(20);  
  9. printf(“parent pid=%d \n”, getpid());  
  10. exit(0);  
  11. }  

当上述程序以后台的方式执行时,第8行强迫程序睡眠20秒,让用户有时间输入ps -e指令,观察进程的状态。当父进程执行终止后,再用ps -e命令观察时,我们会发现defunct进程也随之消失。这是因为父进程终止后,init 进程会接管父进程留下的这些“孤儿进程”(orphan process),而这些“孤儿进程”执行完后,它在进程表中的进入点将被删除。

如果一个程序设计上有缺陷,就可能导致某个Unix进程的父进程一直处于睡眠状态或是陷入死循环,那么当该子进程执行结束后就变成了defunct进程,这个defunct 进程可能会一直留在系统中直到系统重新启动。

如果我们将上述程序略作修改,在第8行sleep()系统调用前执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在Unix进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

由于调度程序无法选中Defunct 进程,所以不能用kill命令删除Defunct 进程,惟一的方法只有重启系统。

【编辑推荐】

  1. Unix系统top记录知识学习
  2. 简单介绍Unix系统中打印知识
  3. Unix操作系统打印问题解决
  4. 当Unix系统遇到病毒时
  5. Unix操作系统知识讲解
责任编辑:小霞
相关推荐

2015-09-08 14:42:17

Android性能优化

2011-07-15 14:46:18

PHP

2010-04-16 18:19:32

Unix操作系统

2012-06-13 13:25:16

UNIX操作系统

2010-04-14 13:59:45

Unix操作系统

2015-07-31 14:11:01

内滚动布局

2010-04-30 17:27:59

Unix操作系统

2010-04-14 16:45:15

Unix操作系统

2010-05-11 19:16:03

Unix系统

2010-04-19 16:47:40

Unix操作系统

2010-04-14 13:20:29

Unix操作系统

2010-04-19 09:08:20

Unix操作系统

2010-05-06 16:15:04

Unix系统进程

2010-04-09 17:25:13

Unix操作系统

2010-04-14 15:58:25

Unix操作系统

2009-06-17 09:06:59

Unix系统资源进程

2022-08-09 18:08:36

Firefox浏览器多账户容器

2010-04-07 17:55:12

Unix命令

2010-05-04 15:33:41

Unix系统

2010-04-14 14:52:14

Unix操作系统
点赞
收藏

51CTO技术栈公众号