<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[个人原创]在实践中发现一条PHP代码在Linux下的进程是D状态的探究]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Fri, 21 Oct 2011 04:59:14 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	Linux下运行一个PHP程序去执行一项艰巨的串口查询任务，读出串口值，但从来不推出，Ps进程时，发现进程出现两个状态，如下：<br/><textarea name="code" class="html" rows="15" cols="100">
root 1373 0.0 0.2 36968 8852 tty1 D 04:52 0:00 /usr/local/webserver/php/bin/php /home/admin/com/php/dio_open.php 
root 1373 0.0 0.2 36968 8852 tty1 S&nbsp;&nbsp;04:52 0:00 /usr/local/webserver/php/bin/php /home/admin/com/php/dio_open.php </textarea><br/>上面两行，出现了D，和S的进程状态，于是查询网络上的解释如下：<br/>D Uninterruptible sleep (usually IO)<br/>不可中断的深度睡眠，一般由IO引起，同步IO在做读或写操作时，此进程不能做其它事情，只能等待，这时进程处于这种状态，如果程序采用异步IO，这种状态应该就很少见到了<br/><br/>S Interruptible sleep (waiting for an event to complete)<br/>可接收信号的睡眠状态，sleep函数可演示这种状态<br/><br/>主要是想对D进程做下研究，如下：<br/>&nbsp;&nbsp;S其实很正常，但是那个D，有一类垃圾却并非这么容易打扫，那就是我们常见的状态为 D (Uninterruptible sleep) ，这些垃圾进程要么是求而不得，像怨妇一般等待资源(D)，这种垃圾进程偏偏是刀枪不入的，不管换哪种枪法都杀不掉它们。无奈，只好reboot，像剿灭禽流感那样不分青红皂白地一律扑杀！<br/>怨妇 D，往往是由于 I/O 资源得不到满足，而引发等待，在内核源码 fs/proc/array.c 里，其文字定义为“ &quot;D (disk sleep)&quot;, /* 2 */ ”（由此可知 D 原是Disk的打头字母），对应着 include/linux/sched.h 里的“ #define TASK_UNINTERRUPTIBLE 2 ”。举个例子，当 NFS 服务端关闭之时，若未事先 umount 相关目录，在 NFS 客户端执行 df 就会挂住整个登录会话，按 Ctrl+C 、Ctrl+Z 都无济于事。断开连接再登录，执行 ps axf 则看到刚才的 df 进程状态位已变成了 D ，kill -9 无法杀灭。正确的处理方式，是马上恢复 NFS 服务端，再度提供服务，刚才挂起的 df 进程发现了其苦苦等待的资源，便完成任务，自动消亡。若 NFS 服务端无法恢复服务，在 reboot 之前也应将 /etc/mtab 里的相关 NFS mount 项删除，以免 reboot 过程例行调用 netfs stop 时再次发生等待资源，导致系统重启过程挂起。<br/><br/>&nbsp;&nbsp;ps 的手册里说D状态是uninterruptible sleep，Linux进程有两种睡眠状态，一种interruptible sleep，处在这种睡眠状态的进程是可以通过给它发信号来唤醒的，比如发HUP信号给nginx的master进程可以让nginx重新加载配置文件而 不需要重新启动nginx进程；另外一种睡眠状态是uninterruptible sleep，处在这种状态的进程不接受外来的任何信号，这也是为什么之前我无法用kill杀掉这些处于D状态的进程，无论是”kill”, “kill -9″还是”kill -15″，因为它们压根儿就不受这些信号的支配。<br/><br/>&nbsp;&nbsp;进程为什么会被置于uninterruptible sleep状态呢？处于uninterruptible sleep状态的进程通常是在等待IO，比如磁盘IO，网络IO，其他外设IO，如果进程正在等待的IO在较长的时间内都没有响应，那么就很会不幸地被 ps看到了，同时也就意味着很有可能有IO出了问题，可能是外设本身出了故障，也可能是比如挂载的远程文件系统已经不可访问了。<br/><br/>&nbsp;&nbsp;正是因为得不到IO的相应，进程才进入了uninterruptible sleep状态，所以要想使进程从uninterruptible sleep状态恢复，就得使进程等待的IO恢复，比如如果是因为从远程挂载的NFS卷不可访问导致进程进入uninterruptible sleep状态的，那么可以通过恢复该NFS卷的连接来使进程的IO请求得到满足，除此之外，要想干掉处在D状态进程就只能重启整个Linux系统了。<br/><br/>&nbsp;&nbsp;看到有人说如果要想杀掉D状态的进程，通常可以去杀掉它的父进程（通常是shell，我理解的这种情况是在shell下直接运行的该进程，之后该进 程转入了D状态），于是我就照做了，之后就出现了上面的状态：他们的父进程被杀掉了，但是他们的父进程PID都变成了1，也就是init进程，这下可如何 是好？此时我这些D状态的进程已经影响到其他一些进程的运行，而已经无法访问的NFS卷又在段时间内无法恢复，那么，只好重新启动了，root不是玉皇大 帝，也有无奈的时候。<br/><br/>&nbsp;&nbsp;跟czhang说起这个事，觉得Linux如果有这么一个专用的垃圾回收进程就好了：系统自动或者用户手动把僵尸进程，和比如之前我遇到的D状态进程的PPID设为这个垃圾回收进程，那么通过干掉这个垃圾回收进程来清理这些僵尸们，这样该有多美好…<br/>总结：我估计是我的PHP代码正在等待串口的温度数据返回罢，一直没有等着吧，就等呀等，其实是那一瞬间给我用Ps命令监控到了，呵呵。EOF<br/>来源：<br/>http://www.blogjava.net/fhtdy2004/archive/2009/07/05/285515.html<br/>http://hi.baidu.com/xuwanbest/blog/item/45f18f3dbce0aece9e3d6255.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [个人原创]在实践中发现一条PHP代码在Linux下的进程是D状态的探究]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>