
Когда я делаю 'top', я вижу мой процесс скрипта perl в состоянии 'S'. Есть ли способ узнать, что заставляет этот процесс perl переходить в состояние сна и способы его разбудить? Есть ли способ отладки, чтобы получить больше информации о строках в скрипте perl, которые переводят его в состояние 'S'.
решение1
Процесс в S
состоянии обычно находится в состоянии блокирующего системного вызова, например, чтения или записи в файл или сеть, или ожидания завершения другой вызванной программы.
Вы можете использовать strace -p <pid>
, чтобы узнать, какой системный вызов происходит в данный момент. Это даст вывод вроде
запись(1, "foobar"..., 4096
Это означает, что процесс пытается записать 4096 байт, начиная с «foobar», в стандартный вывод (fd #1), но то, куда он был перенаправлен, занято, а выходной буфер заполнен.
решение2
Процессы переходят в состояние сна, когда они чего-то ждут, обычно ввода-вывода.
Ваш процесс будет в S
состоянии, когда он выполняет чтение и, возможно, запись, которые блокируются. Также может произойти во время ожидания семафоров или других примитивов синхронизации.
Его нельзя «разбудить» — он продолжит работу только тогда, когда данные/ресурс, которые он ожидает, станут доступны.
Это все нормально и ожидаемо, и обычно не является проблемой. Обычно эта "программа" запускается в командной строке без файла:
while (<>) { print; }
большую часть времени будет находиться в состоянии сна, что хорошо — вы же не хотите, чтобы процессор загружался впустую, ожидая ввода данных от пользователя.
Если выдуматьэто проблема, попробуйте изменить способ выполнения ввода-вывода (чтение более крупных фрагментов, кратных размеру блока базового устройства, выполнение ввода-вывода с отображением в памяти и т. д.).