Bagaimana cara mengetahui alasan suatu proses tidur dan membangunkannya?

19

Ketika saya melakukan 'top', saya melihat proses skrip perl saya dalam keadaan 'S'. Apakah ada cara untuk mengetahui, apa yang membuat proses perl ini dalam kondisi tidur dan cara untuk membangunkannya? Cara apa pun untuk debug untuk memberikan lebih banyak wawasan tentang baris dalam skrip perl membuatnya masuk dalam status 'S'.

xyz
sumber

Jawaban:

22

Proses dalam Skeadaan biasanya dalam panggilan sistem pemblokiran, seperti membaca atau menulis ke file atau jaringan, atau menunggu program lain yang disebut untuk menyelesaikan.

Anda dapat menggunakan strace -p <pid>untuk mengetahui panggilan sistem mana yang saat ini terjadi. Ini akan menghasilkan output seperti

tulis (1, "foobar" ..., 4096

yang berarti bahwa proses sedang mencoba untuk menulis 4096 byte dimulai dengan "foobar" ke stdout (fd # 1) tetapi apa pun yang telah dialihkan menjadi sibuk dan buffer output penuh.

BCoates
sumber
5

Proses menuju status tidur ketika mereka menunggu sesuatu, biasanya I / O.

Proses Anda akan dalam Skeadaan ketika sedang membaca dan mungkin menulis yang memblokir. Dapat juga terjadi saat menunggu di semaphores atau sinkronisasi primitif lainnya.

Anda tidak dapat "membangunkannya" - ini hanya akan dilanjutkan ketika data / sumber daya yang ditunggu-tunggu tersedia.

Ini semua normal dan diharapkan, dan biasanya bukan masalah. Biasanya, "program" ini berjalan di baris perintah tanpa file:

while (<>) { print; }

akan menghabiskan sebagian besar waktunya dalam kondisi sleep, yang bagus - Anda tidak ingin membuang-buang CPU sambil menunggu input pengguna.

Jika Anda pikir ini adalah masalah, cobalah mengubah cara Anda melakukan I / O Anda (membaca bongkahan yang lebih besar, dalam kelipatan yang bagus dari ukuran blok perangkat yang mendasarinya, melakukan memori yang dipetakan I / O, dll.).

Tikar
sumber