BBS水木清华站∶精华区

发信人: thhsieh.bbs@bbs.phys.ntu.edu.tw (居士), 看板: Linux 
标  题: zombie 又来了 
发信站: 台大物理 冷月流苏BBS驿站 (Tue Dec  3 14:17:42 1996) 
转信站: sobee!netnews.ntu!news.phys.ntu!chdrv2 
 
唉! 刚刚才弄完 et2bdf 的程式, zombie process 居然又来了,我把我 
的情况描述如下,请大家帮忙看一看: 
 
    之前我一直在测试 et2bdf 的程式,不断地产生与搬移那些大字型档, 
所以 I/O 量应该满大的吧? 但实际上我却感觉不出硬碟有明显的动作,可 
能是读写动作大部分在 buffer 中进行。 
 
    程式完程後,我想要把它放到 1.44 MB 的软碟中带回家,那软碟原本 
已 mount 在 /mnt 下,当我将档案 cp 到软碟去,然後要 umount 软碟, 
由於那时我不是 root ,但却可以执行 sudo ,於是我就下 
 
    sudo umount /mnt 
 
结果这个 process 居然当住不动了! 当时我是在 X-win (XFree86 3.1.2), 
crxvt 底下,於是我开了另一个视窗用 ps -aux 来看,发现那个 umount  
process 的 stat 是 D (uninterrupted process) ,我心□想,大概完了, 
现在系统虽然看起来还满正常的,但也许 kernel 内部的 catch buffer 已 
经乱掉了 (只是猜想)。於是我用 ctrl+alt+F2 切到文字模式下用 root login 
( 我不敢直接离开 X-win ,因为照以往的经验,这麽一来所有 X-win 底下 
的 process 全部都会变成 zombie! ) ,当然,以 root 的身分也无法用 
kill -9 将那 umount process 杀掉,然後我试著 logout ,果然,这个 
console 当了,我再开别的 console (alt+F3) 进去,ps 来看,适才那个 
console 的 bash 已成了 zombie。 
 
    现在我已确定已到了非用 reset 键重开机不可的地步了。根据我最近看 
书得来的知识,我推测很可能是当时 kernel 正在进行关键的 buffer link-list 
调整的动作,理论上在进行此动作时,是不可以经由一般中断或 swap 等加以干扰, 
而该 buffer head 是被锁住的,要一直等到整个动作完成後,该 buffer head 
才会解锁,然後 kernel 才会去做别的事。但很不幸的是,万一在那过程中发生 
了严重错误,像是硬体错误中断,则正在进行 buffer I/O 的 process 被强迫 
停了下来,则该 buffer head 便永远无法解锁,而其他正等待使用那 buffer 
的 process 便进入了永久睡眠状态,上述问题就产生了。 
 
    我的猜想是,当那 umount 动作正在进行时,很可能是发生了硬体的错误, 
导至整个动作被迫中断。硬体错误的来源可能有两个,一个就是这几天大家正在 
讨论的 Intel Pentium CPU 的 Bug ,我的 CPU 是 Pentium 120 , /proc/cpuinfo 
的资料如下 (按: 这是开机时加了 mem=nopentium 参数之後的资料): 
 
processor       : 0 
cpu             : 586 
model           : Pentium 75+ 
vendor_id       : GenuineIntel 
stepping        : 5        <====== 可能有问题 
fdiv_bug        : no 
hlt_bug         : no 
fpu             : yes 
fpu_exception   : yes 
cpuid           : yes 
wp              : yes 
flags           : fpu vme de pse tsc msr mce cx8 
bogomips        : 47.82 
 
但我之前一直认为我的机器没有当 server ,平常只有我一个人在用,最近也很 
少跑大型的程式,因此不必要加 mem=nopentium 的参数。我不知道是否因为这 
个原因造成了硬体的错误。另一个硬体错误来源很可能是在那当儿我的磁片突然 
坏掉了 (我得承认我的磁片品质不太好) ,结果 umount 无法正确读写而至。因 
为 mount / umount 所用到的 buffer 是牵扯到整个系统的 filesystem ,一旦 
那些 buffer 无法解锁,那诸如 shutdown, sync 等命令一执行便会进入无限 
期的睡眠状态 (至於为什麽 logout 会有问题? 我还不知道) 
 
    最後没办法,我试著执行 shutdown -nh now ,结果系统不经由 init 的程 
序直接 shutdown 。结果,出现了以下讯息 
 
   Killing all process .     (原文记不太清楚,但大概是这个意思)  
 
就停住不动了,整个系统好像锁死了一样,大概是 umount, sync 等 process  
kill 不掉吧? 於是,我只好按下 reset 键,祈求上天保佑 .... 
 
系统重开之後 (幸好没什麽损失,好在,好在 ....) ,我回去检查那片软碟, 
在 fdformat 它之後,在进行 check 时,出现了一长串的错误讯息,内容大概 
是 SuperBlock 读写错误,但速度太快了,实在是看不清楚,直到我按下了 
ctrl+c 後才停下来。看来这片软碟是不能用了。 
 
    由此我学到一个教训, linux 必须在品质确保的硬体下 run 才能快速稳 
定。尤其是常用软碟的使用者要注意,除了不能用品质不良的磁片以外,千万 
不能一直将软碟一直 mount 在档案系统上,因为有可能你在 mount 它时它好 
好的,等到你要 unmount 它时它却坏掉了,结果你的系统可能就要按 reset 
重开了。但也有可能在你 mount / umount 快完成时才坏掉,那 .... 我就不 
知道要怎麽办了。 
 
    另外,我想知道的是,这个 Pentium CPU Buge 会造成什麽样情况的系 
统当掉? 当不下 mem=nopentium 参数时 kernel 会用到 Pentium CPU 那些 
资源? 怎麽去用? 用了结果又如何? 不知道有没有人有这样的经验,或者是 
那位了解 kernel 运作的高手可以说明一下? 或是高诉我去看那些文件? 
 
 
    不知道我以上的讨论有没有人感兴趣,或是有其他意见的,或是我有些 
地方说得不正确的,或是需要补充的,请大家尽量提出来。我是诚肯地希望 
这个版能多一些技术性的讨论,这样大家才能学得更多。 
 
 
-- 
 
                          ————  居 士  ———— 
                                  台大物理系 
                    Email: thhsieh@twclx.phys.ntu.edu.tw 
 
※ 来源:.冷月流苏BBS驿站 bbs.phys.ntu.edu.tw.[FROM: twclx.phys.ntu.] 

BBS水木清华站∶精华区