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

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

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

решение1

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

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

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

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

решение2

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

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

Его нельзя «разбудить» — он продолжит работу только тогда, когда данные/ресурс, которые он ожидает, станут доступны.

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

while (<>) { print; }

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

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

Связанный контент