Jak poznać przyczynę procesu przejścia w stan uśpienia i obudzenia go?


19

Kiedy wykonuję „top”, widzę proces skryptu w perlu w stanie „S”. Czy istnieje sposób, aby dowiedzieć się, co powoduje, że ten proces Perla przechodzi w stan uśpienia i sposoby, aby go obudzić? Dowolny sposób debugowania, aby uzyskać więcej wglądu w wiersze w skrypcie perla, dzięki czemu przechodzi w stan „S”.

Odpowiedzi:


22

Proces w Sstanie jest zwykle w blokującym wywołaniu systemowym, takim jak odczyt lub zapis do pliku lub sieci, lub oczekiwanie na zakończenie innego wywoływanego programu.

Możesz użyć, strace -p <pid>aby dowiedzieć się, które połączenie systemowe ma obecnie miejsce. Będzie produkować jak

napisz (1, „foobar” ..., 4096

co oznacza, że ​​proces próbuje zapisać 4096 bajtów zaczynając od „foobar” na stdout (fd # 1), ale wszystko, na co zostało przekierowane, jest zajęte, a bufor wyjściowy jest pełny.


5

Procesy przechodzą w stan uśpienia, gdy na coś czekają, zwykle we / wy.

Twój proces będzie w Sstanie, gdy będzie czyta i zapisuje, które blokują. Może się również zdarzyć podczas oczekiwania na semafory lub inne operacje podstawowe synchronizacji.

Nie możesz „obudzić” - będzie działać tylko wtedy, gdy dane / zasoby, na które czeka, stają się dostępne.

To wszystko jest normalne i oczekiwane, i zwykle nie stanowi problemu. Zazwyczaj ten „program” działa w wierszu poleceń bez pliku:

while (<>) { print; }

spędza większość czasu w stanie uśpienia, co jest dobre - nie chcesz, aby marnował procesor podczas oczekiwania na dane wejściowe użytkownika.

Jeśli uważasz , że to problem, spróbuj zmienić sposób wykonywania operacji we / wy (odczytywanie większych porcji, w przyjemnych wielokrotnościach wielkości bloku urządzenia bazowego, wykonywanie operacji we / wy odwzorowanych w pamięci itp.).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.