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