1

我正在做一些实验来了解更多关于 Linux 进程状态的信息。

所以,有一个目录(名为big_dir),里面有超过十亿个文件(该目录递归有很多子目录),然后我运行tar -cv big_dir | ssh anotherServer "tar -xv -C big_dir",通过执行top发现,tar进程保持在D状态。同时,tar 命令不断输出文件的路径。

我知道,进程处于D状态是因为它正在做磁盘I/O,但是为什么它的状态没有在D和R之间不断切换呢?打印目录下的文件名肯定需要一些 CPU 计算,不是吗?否则 find 命令怎么知道它应该打印一些东西呢?

如果我运行dd if=/dev/zero of=/dev/null,则dd进程状态从top输出中保持为 R 状态。但是为什么不是D状态呢?它不是一直在做 I/O 吗?

4

2 回答 2

3

/dev/zero并且/dev/null伪设备。所以它们背后没有物理设备。

如果我做

dd if=/dev/zero of=/tmp/zeroes

然后top确实显示我dd处于D状态。然而,它确实在R中花费了大量时间(在 CPU 时间中)。top将简单地对进程表进行采样,因此您可能需要观察一段时间才能看到瞬态。

对于上面的 tar 示例,我怀疑输出到 stdout 的时间与磁盘时间相比可以忽略不计。另请注意,输出到标准输出还将涉及窗口系统写入,并且在执行此操作时进程将处于睡眠状态。例如,我现在正在运行yes,并且大部分工作都由我的 X 服务器执行。这个yes过程在我看它的大部分时间里都在休眠(通过top

于 2012-12-28T11:27:31.070 回答
2

我确定您的 tar 进程有时会转到 R,但它可能只持续很短的一段时间,因为它并没有做那么多 - 特别是因为您正在通过网络发送数据。除非那是一个 10Gb/s 的网卡[并且“另一个服务器”的其他所有东西都真正以 1GB/s 的速度工作],否则这将是链中最慢的部分。ssh 本身在加密数据时会花费一些开销。

tar 从磁盘请求一些数据可能需要几微秒,磁盘移动磁头并读取实际数据可能需要几毫秒。所以你有大约 0.1% 的时间在“R”中,其余的在“D”中。

于 2012-12-28T11:31:59.530 回答