В меню top
дается ответ (в описании "Состояние процесса"):
w: S -- Статус процесса
Статус задачи, которая может быть одной из:
- 'D' = непрерывный сон
- 'R' = запуск
- 'S' = sleep
- 'T' = traced or stop
'Z' = зомби
Задачи, показанные как запущенные, должны быть более корректно восприняты как 'готовые к запуску' -- их task_struct просто представлен на run-queue Linux. Даже без настоящей машины SMP вы можете увидеть множество задач в этом состоянии в зависимости от верхнего интервала задержки и хорошего значения.
Процессы, которые готовы к выполнению, отображаются как R
. По-настоящему незадействованные процессы, т.е. процессы, которые не заблокированы в ожидании ввода/вывода (обычно), отображаются как S
; процессы, ожидающие ввода/вывода, отображаются как D
. (Это не является исчерпывающим, некоторые другие ожидания также отображаются как D
.)
Я не знаю, как различать запущенные и готовые к работе процессы.
Строго говоря, тип сна связан с возможной доставкой сигналов: если процесс не запущен или остановлен, он спит; если сигнал может быть доставлен немедленно, то это "стандартный" сон, в противном случае это бесперебойный сон. Подробнее см. https://stackoverflow.com/questions/223644/what-is-an-uninterruptable-process.
означает холостый. S для «сна» - единственный способ для того, чтобы процесс был простаил, должен ждать некоторого события, чтобы разбудить его. Процесс, который ждет, чтобы быть запланированным, не простаивает: причина, по которой она должна быть запланирована, это то, что у него есть вещи.
r означает Runnable, I.e. Процесс в очереди планировщика, выполняющий код пользователя LALD (I.E. CODE из самого процесса). Процесс проводится, работает ли он в данный момент или нет. Вы не можете наблюдать, что разница между «в данный момент работает» и «запланировано для запуска» изнутри системы, потому что в любой момент времени процесс, который делает наблюдение (и, следовательно, в состоянии d или, возможно, в состоянии r в зависимости от Операционная система и способ, которым процесс использует для наблюдения состояния). Чтобы наблюдать разницу между «в настоящее время» и «запланировано для запуска», вам понадобится отладчик ядра.
Третье важное состояние D, что означает «устройство». Это состояние, который находится в процессе, пока он занят, но в системном вызове. Процесс, который занят, выполняющий свой собственный код, находится в состоянии R; Процесс, который находится в системном вызове и ожидает некоторого события, чтобы вернуться с этого вызова, находится в состоянии S. D является состоянием процесса, который находится в системном вызове и что-то, что не может быть прервано, например, манипулирование структурами данных ядра или передача данных из / на аппаратное устройство. Обычно государство D недолговечно жил, поэтому вы не будете наблюдать его многое, если что-то не пойдет не так.
Ps
дает аналогичное описание состояний процесса
КОДЫ СОСТОЯНИЯ ПРОЦЕССА Вот различные значения, которые s, stat и спецификаторы вывода состояния (заголовок "STAT" или "S")будет отображаться для описания состояния процесса: D непрерывный спящий режим (обычно ввод-вывод) R работает или может быть запущен (в очереди выполнения) {{1} } S прерываемый сон (ожидание завершения события) T остановлен либо сигналом управления заданием, либо потому, что он отслеживается Z несуществующий ("зомби") процесс, завершен, но не получен его родительским
(я пропустил устаревшие)
ps -ax -o state,wchan,cmd,pid | tail -n+1| sort |less
должен дать вам хороший снимок ваших процессов, отсортированных по состоянию.
Поле wchan
показывает канал ожидания, который более точно определяет состояние
процесса.
Если вы сделаете:
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
( = ожидает, что планировщик поместит их в ядро процессора).
У вас будет всего несколько действительно «запущенных» процессов, и их количество будет ограничено количеством имеющихся у вас ядер ЦП.
Планировщику все равно, почему процесс в данный момент не запускается.
Состояние S
используется всякий раз, когда процесс вызвал системный вызов, который требует завершения внешнего события; на этом этапе не имеет значения, вызвал ли сам системный вызов внешнее событие (например, вызов read
), или он просто ждет (например, select
или poll
) ).
Вы можете узнать, какой системный вызов ожидает процесс, включив столбец WCHAN
в вверху
.
Состояние D
в наши дни становится немного редкостью, оно обычно использовалось, если текущий системный вызов нельзя было легко остановить без потенциального повреждения данных. Печально известным примером был клиент NFS, который переходил в состояние D
во время каждой операции с файлом, потому что нет способа прервать запрос, который мог или не мог быть получен сервером. При более агрессивном кэшировании слой кеша теперь будет видеть запрос, в то время как пользовательский процесс делает что-то еще.