Відповіді:
Процес у S
стані, як правило, блокує системний виклик, такий як читання або запис у файл чи мережу, або очікування завершення іншої викликаної програми.
Ви можете strace -p <pid>
дізнатися, який системний дзвінок зараз відбувається. Це дасть вихід, як
написати (1, «фобар» ..., 4096
це означає, що процес намагається записати 4096 байтів, починаючи з "foobar" до stdout (fd №1), але все, на що він був перенаправлений, зайнятий, а вихідний буфер заповнений.
Процеси переходять у стан сну, коли вони чогось чекають, як правило, вводу / виводу.
Ваш процес буде в S
стані, коли він читає і, можливо, пише, що блокує. Також може статися під час очікування на семафорах чи інших примітивах синхронізації.
Ви не можете "розбудити його" - він продовжиться лише тоді, коли дані / ресурс, який він чекає, стануть доступними.
Це все нормально і очікувано, і зазвичай це не проблема. Зазвичай ця "програма" працює в командному рядку без файлу:
while (<>) { print; }
витратить більшу частину свого часу в режимі сну, що добре - ви не хочете, щоб він витрачав процесор, поки він чекає на введення користувачем.
Якщо ви вважаєте, що це проблема, спробуйте змінити спосіб свого вводу / виводу (зчитуючи більші шматки, в приємні кратні розміри блоку базового пристрою, роблячи карту пам’яті вводу / виводу тощо).