Состояние процессов, которые готовы и запланированы на ожидание, «S»?

Реальная команда phpinfo() (без подчеркивания).

6
22.05.2015, 14:53
4 ответа

В меню 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.

9
27.01.2020, 20:22

означает холостый. S для «сна» - единственный способ для того, чтобы процесс был простаил, должен ждать некоторого события, чтобы разбудить его. Процесс, который ждет, чтобы быть запланированным, не простаивает: причина, по которой она должна быть запланирована, это то, что у него есть вещи.

r означает Runnable, I.e. Процесс в очереди планировщика, выполняющий код пользователя LALD (I.E. CODE из самого процесса). Процесс проводится, работает ли он в данный момент или нет. Вы не можете наблюдать, что разница между «в данный момент работает» и «запланировано для запуска» изнутри системы, потому что в любой момент времени процесс, который делает наблюдение (и, следовательно, в состоянии d или, возможно, в состоянии r в зависимости от Операционная система и способ, которым процесс использует для наблюдения состояния). Чтобы наблюдать разницу между «в настоящее время» и «запланировано для запуска», вам понадобится отладчик ядра.

Третье важное состояние D, что означает «устройство». Это состояние, который находится в процессе, пока он занят, но в системном вызове. Процесс, который занят, выполняющий свой собственный код, находится в состоянии R; Процесс, который находится в системном вызове и ожидает некоторого события, чтобы вернуться с этого вызова, находится в состоянии S. D является состоянием процесса, который находится в системном вызове и что-то, что не может быть прервано, например, манипулирование структурами данных ядра или передача данных из / на аппаратное устройство. Обычно государство D недолговечно жил, поэтому вы не будете наблюдать его многое, если что-то не пойдет не так.

2
27.01.2020, 20:22

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 ( = ожидает, что планировщик поместит их в ядро ​​процессора).

У вас будет всего несколько действительно «запущенных» процессов, и их количество будет ограничено количеством имеющихся у вас ядер ЦП.

1
27.01.2020, 20:22

Планировщику все равно, почему процесс в данный момент не запускается.

Состояние S используется всякий раз, когда процесс вызвал системный вызов, который требует завершения внешнего события; на этом этапе не имеет значения, вызвал ли сам системный вызов внешнее событие (например, вызов read ), или он просто ждет (например, select или poll ) ).

Вы можете узнать, какой системный вызов ожидает процесс, включив столбец WCHAN в вверху .

Состояние D в наши дни становится немного редкостью, оно обычно использовалось, если текущий системный вызов нельзя было легко остановить без потенциального повреждения данных. Печально известным примером был клиент NFS, который переходил в состояние D во время каждой операции с файлом, потому что нет способа прервать запрос, который мог или не мог быть получен сервером. При более агрессивном кэшировании слой кеша теперь будет видеть запрос, в то время как пользовательский процесс делает что-то еще.

2
27.01.2020, 20:22

Теги

Похожие вопросы