进程什么时候会进入“D”状态?

进程什么时候会进入“D”状态?

我正在使用“Linux 主机名 2.6.28-15-generic #49-Ubuntu SMP Tue Aug 18 18:40:08 UTC 2009 i686 GNU/Linux”

所有客户端计算机都将使用瘦客户端,我将使用我的笔记本电脑进行工作,并将我的主目录从服务器安装到我的笔记本电脑。

如果我在笔记本电脑中打开 Firefox,则 Firefox 窗口将不会打开,因为该进程处于“D”状态,并且所有其他用户计算机都挂起并且 lockd 进程处于“D”状态,

PS ajx |火狐浏览器

1  6187  4313  4313 ?   -1 D<    1030   3:16 /usr/lib/firefox-3.5b4pre/firefox-3.5

   7610  7622  7621  7610 pts/3      7621 S+    1030   0:00 grep firefox

如果我检查系统日志

7 月 13 日 10:35:56 主机名内核:[222583.872059] lockd:无法监控笔记本电脑

7 月 13 日 10:35:57 主机名内核:[222583.872059] lockd:无法监控笔记本电脑

PS ajx | grep 锁定

根 9178 0.0 0.0 0 0 ? D< 13:35 0:00 [锁定]

根 11039 0.0 0.0 3340 796 点/3 S<+ 14:18 0:00 grep lockd

所有客户端计算机都有相同的消息。

进程什么时候会进入“D”状态?

lockd 进程何时会进入“D”状态?

lockd 进程的目的是什么。

答案1

意思是“不间断的睡眠”

D    Uninterruptible sleep (usually IO)

在这种状态下,进程不会立即唤醒来处理信号。在处理设备时,I/O这是唯一的方法(否则可能会导致数据损坏)。

答案2

D状态代码表示该进程处于不间断的睡眠

  • 通常这是由于 I/O 造成的。
  • lockd是管理 NFS 锁定的内核守护进程。

您的问题可能与 NFS 通信有关。

答案3

不管其他答案怎么说,D 状态并不一定意味着任务是不可中断的。例如,许多 D 状态进程实际上会在收到终端信号时退出。您可以阅读一些使用它进行测试的示例在本文中

在 Linux 中,许多 D 状态都是通过TASK_KILLABLE设置标志来进入的:

linux % git grep -ihc _killable | paste -sd+ | bc
539

TASK_KILLABLE之所以创建,是因为——虽然在某些情况下我们确实需要保护进程免受任何信号交互——但在某些情况下,只要我们知道进程将在不再执行用户空间指令的情况下终止就可以了。例如,在未执行 DMA 的 D 状态下(例如,vfork()),我们必须阻塞以防止出现某些不安全的操作情况,但如果我们要执行的下一件事,我们没有理由继续等待do 只是终止——这是浪费时间和进程。

与完全不可中断不同,TASK_KILLABLE当我们收到一个信号时,我们检查该信号是否是致命的(也就是说,它是一个不可捕获的致命信号,或者程序没有用于具有默认终端配置的信号的用户空间处理程序),如果是,我们终止该进程,不允许它执行任何更多的用户空间指令。

D 状态进程代表的是一个无法执行更多用户空间指令的进程,但阻止所有信号只是如何实现这一目标的一种解释,并不是在所有情况下都需要这样做。

相关内容