准备好并计划等待的进程的状态是否为“S”?

准备好并计划等待的进程的状态是否为“S”?

在 的输出中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),或者只是等待(例如selectpoll)并不重要。

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 核心数量的限制。

相关内容