Как узнать причину перехода процесса в состояние сна и разбудить его?

19

Когда я делаю 'top', я вижу процесс сценария perl в состоянии 'S'. Есть ли способ узнать, что заставляет этот perl-процесс переходить в состояние сна и как его разбудить? Любой способ отладки, чтобы дать больше информации о строках в скрипте perl, переводя его в состояние «S».

хуг
источник

Ответы:

22

Процесс в Sсостоянии обычно находится в системном вызове блокировки, таком как чтение или запись в файл или сеть, или ожидание завершения другой вызванной программы.

Вы можете использовать, strace -p <pid>чтобы узнать, какой системный вызов происходит в данный момент. Это будет производить как

написать (1, "foobar" ..., 4096

Это означает, что процесс пытается записать 4096 байт, начиная с "foobar", в стандартный вывод (fd # 1), но все, на что он был перенаправлен, занято и буфер вывода заполнен.

BCoates
источник
5

Процессы переходят в состояние сна, когда они чего-то ждут, обычно это ввод-вывод.

Ваш процесс будет в Sсостоянии, когда он выполняет операции чтения и, возможно, записи, которые блокируют. Может также произойти во время ожидания на семафорах или других примитивах синхронизации.

Вы не можете "разбудить его" - оно будет продолжаться только тогда, когда данные / ресурсы, которые он ожидает, станут доступными.

Это все нормально и ожидаемо, и обычно это не проблема. Как правило, эта «программа» запускается из командной строки без файла:

while (<>) { print; }

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

Если вы считаете, что это проблема, попробуйте изменить способ ввода-вывода (чтение больших кусков, с кратными размерами блоков базового устройства, ввод-вывод с отображением в памяти и т. Д.).

Мат
источник