在 的输出中top
,状态S
表示可中断睡眠。
那些被调度程序调度为准备就绪并在 CPU 中等待执行的进程的状态如何?是它S
还是别的什么?
有状态意义吗idle
?如果是的话,是否与调度程序调度到CPU中等待执行的那些进程的状态相同?
答案1
这top
联机帮助页给出答案(在“进程状态”描述中):
瓦:S-- 进程状态
任务的状态可以是以下之一:
- 'D' = 不间断睡眠
- 'R' = 跑步
- “S”=睡觉
- 'T' = 跟踪或停止
“Z”=僵尸
显示为正在运行的任务应该更正确地被认为是“准备运行”——它们的 task_struct 简单地表示在 Linux 运行队列上。即使没有真正的 SMP 机器,您也可能会看到许多处于此状态的任务,具体取决于顶部的延迟间隔和好值。
准备运行的进程显示为R
。真正空闲的进程,IE未阻塞等待 I/O 的进程(通常)显示为S
;等待 I/O 的进程显示为D
。 (这并不详尽,其他一些等待也会出现D
。)
我不知道如何区分正在运行和准备运行的进程。
严格来说,睡眠类型与可能的信号传递有关:如果进程没有运行或停止,则它正在睡眠;如果可以立即向其传递信号,则为“标准”睡眠,否则为不间断睡眠。看https://stackoverflow.com/questions/223644/what-is-an-uninterruptable-process更多细节。
答案2
调度程序不关心为什么进程当前无法运行。
S
每当进程调用需要外部事件才能完成的系统调用时,就会使用该状态;此时,系统调用本身是否引起外部事件(例如调用read
),或者只是等待(例如select
或poll
)并不重要。
WCHAN
您可以通过启用中的列来找出进程正在等待哪个系统调用top
。
如今,该D
状态变得有点罕见,如果当前的系统调用无法轻松停止而不造成潜在的数据损坏,则通常使用该状态。一个臭名昭著的例子是 NFS 客户端在每次文件操作期间都会进入D
状态,因为无法中止服务器可能已收到或未收到的请求。通过更积极的缓存,缓存层现在将看到请求,而用户进程正在做其他事情。
答案3
S表示空闲。 S 代表“睡眠”——进程空闲的唯一方法是等待某个事件将其唤醒。等待调度的进程并不是空闲的:它被调度的原因是它有事情要做。
R 表示可运行,即调度程序队列上的进程,执行用户域代码(即来自进程本身的代码)。进程无论当前是否正在运行,都是可运行的。您无法从系统内部观察“当前正在运行”和“计划运行”之间的差异,因为在任何给定时间,进行观察的进程都在运行(因此处于状态 D,或者可能处于状态 R,具体取决于操作系统以及进程用来观察状态的方式)。为了观察“当前运行”和“计划运行”之间的差异,您需要一个内核调试器。
第三个重要状态是D,意思是“设备”。这是进程繁忙时但在系统调用中所处的状态。正忙于执行自己代码的进程处于状态 R;处于系统调用中并等待某个事件从该调用返回的进程处于状态 S。D 是处于系统调用中并正在执行无法中断的操作(例如操作内核数据结构)的进程的状态或从/向硬件设备传输数据。通常,状态 D 是短暂的,因此除非出现问题,否则您不会经常观察它。
答案4
Ps
给出了类似的进程状态描述
PROCESS STATE CODES Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process: D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped, either by a job control signal or because it is being traced Z defunct ("zombie") process, terminated but not reaped by its parent
(我跳过了过时的)
ps -ax -o state,wchan,cmd,pid | tail -n+1| sort |less
应该给你一个很好的流程快照,按状态排序。
该wchan
字段显示等待通道,它state
更密切地指定进程的状态。
如果你这样做:
ps -o state,wchan,cmd,pid | tail -n+1| sort |less
它将显示相同的信息,但仅适用于终端会话中的进程。您可以在当前终端会话的后台启动不同的进程,并检查它们处于什么状态以及它们正在等待哪个通道:
#this will be waiting on a timer (S hrtime)
sleep 200 &
touch file
#this will get the file lock to `file`, start start sleep and will be waiting on it to complete (S wait)
flock file -c "sleep 100" &
#this won't start sleep because it will be waiting on the file lock (S flock)
flock file -c "sleep 100" &
#ps will be running and the other guys will be waiting o pipe_w
ps -o state,wchan,cmd,pid | tail -n+1| sort |less
从技术上讲,不等待资源的进程将在内部运行,但它们仍然会显示为处于该S
状态(=等待调度程序将它们放入处理器核心)。
您将只有几个真正“运行”的进程,并且数量将受到您拥有的 CPU 核心数量的限制。