Як дізнатися причину переходу в стан сну і розбудити його?


19

Коли я роблю "зверху", я бачу процес написання Perl у "S" стані. Чи є спосіб дізнатись, що змушує цей процес перламутрового сплячого стану та способи його пробудження? Будь-який спосіб налагодження, щоб дати більше уявлень про рядки в сценарії Perl, змусивши його перейти у стан 'S'.

Відповіді:


22

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

Ви можете strace -p <pid>дізнатися, який системний дзвінок зараз відбувається. Це дасть вихід, як

написати (1, «фобар» ..., 4096

це означає, що процес намагається записати 4096 байтів, починаючи з "foobar" до stdout (fd №1), але все, на що він був перенаправлений, зайнятий, а вихідний буфер заповнений.


5

Процеси переходять у стан сну, коли вони чогось чекають, як правило, вводу / виводу.

Ваш процес буде в Sстані, коли він читає і, можливо, пише, що блокує. Також може статися під час очікування на семафорах чи інших примітивах синхронізації.

Ви не можете "розбудити його" - він продовжиться лише тоді, коли дані / ресурс, який він чекає, стануть доступними.

Це все нормально і очікувано, і зазвичай це не проблема. Зазвичай ця "програма" працює в командному рядку без файлу:

while (<>) { print; }

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

Якщо ви вважаєте, що це проблема, спробуйте змінити спосіб свого вводу / виводу (зчитуючи більші шматки, в приємні кратні розміри блоку базового пристрою, роблячи карту пам’яті вводу / виводу тощо).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.