Jaki jest „kanał oczekiwania” procesu?

36

W zakładce Procesy Monitora systemu GNOME znajduje się kolumna „Kanał oczekiwania”. Zdecydowanie najczęstszymi wartościami, które tu widzę, są poll_schedule_timeout , ale widzę także inne wartości: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram i unix_stream_data_wait .

Co oznacza ta kolumna „Kanał oczekiwania”? A może co oznaczają niektóre z tych wartości?

Zrzut ekranu

8128
źródło

Odpowiedzi:

42

Kanał oczekiwania to miejsce w jądrze, w którym zadanie aktualnie czeka. Zadanie musi czekać na zasób, którym może być czas przetwarzania lub danych. Te dwa obejmują gniazda sieciowe, sprzęt, pliki i tak dalej; ponieważ większość z nich to tylko pliki w systemach uniksopodobnych.

  • 0: Proces nie czeka

  • poll_schedule_timeout

    poll()to wywołanie systemowe 1 używane do obsługi we / wy. Jest podobny do select(). 2)

    Aplikacje korzystające z nieblokujących wejść / wyjść używają tych wywołań, aby sprawdzić, czy potrafią czytać lub zapisywać pliki, bez konieczności ich blokowania. Są często używane do strumieni wejściowych / wyjściowych, które mogą nie zostać zablokowane (w przeciwnym razie być może mysz przestałaby się poruszać).

    Kanał oczekiwania poll_schedule_timeoutwskazuje, że zadanie oczekuje na operacje we / wy, albo sprzęt, jak klawiatury i myszy, urządzenia dźwiękowe, a nawet gniazda sieciowe.

    1. Funkcja w jądrze
    2. Są zdefiniowane w <linux/poll.h>. pollbyła implementacją po raz pierwszy widzianą w Systemie V, selectjest odpowiednikiem UND BSD.
  • futex_wait_queue_me:

    Aby to wyjaśnić, musimy spojrzeć na Locks. Blokada to stan zapisany w systemie, który wskazuje, że zadanie działa z zasobem. Może być na przykład tylko jedno zadanie, które odczytuje plik. To zadanie zablokuje plik, każde inne zadanie 1, które spróbuje odczytać plik, będzie wiedziało, że jest zablokowane, i zaczeka, aż zamek zniknie, zanim będzie mógł uzyskać do niego dostęp. To samo dzieje się z czasem procesora.

    Nowoczesna wersja Linuksa (w większości architektur) używa blokady jądra Futex (szybki muteks przestrzeni użytkownika). Mutex, wzajemne wykluczenie, odnosi się do idei, że do wspólnego zasobu można uzyskać dostęp tylko przez jedno zadanie w dowolnym momencie. W tym celu ustawiane są flagi w systemie.

    Jeśli proces czeka na zablokowany zasób, nazywa się to Zajęty Oczekiwaniem lub „Wiruje”, co oznacza fakt, że próbuje uzyskać do niego dostęp w kółko, dopóki nie będzie w stanie. Zadanie jest blokowane, gdy się obraca.

    Jeśli potrafisz to przeczytać, musisz poprawić przynajmniej jeden błąd w tej odpowiedzi: P.

    Blokady Futex można traktować jako liczbę w przestrzeni użytkownika, która może być zwiększana lub zmniejszana przez zadanie (w przypadkach, gdy do zasobu można uzyskać dostęp za pomocą wielu zadań, liczba ta może być większa niż jeden). Jest to liczba pokazana na schemacie 4 .

    Zadania te umieszczają się w kolejce oczekiwania , prostej kolejce zadań, które wymagają pewnej pracy. Gdy czas przetwarzania będzie dostępny, zadania wykonają swoją pracę i zostaną usunięte z kolejki.

    futex_wait_queue_mekolejkuje zadania. Następnie czeka na sygnał, przerwę lub budzenie. Zadania, które znajdują się w tym kanale oczekiwania, czekają nie w kolejce oczekiwania, czekają na kolejkowanie.


    1. Zadanie może być procesem 3 lub wątkiem 2
    2. Wątek jest podsekcją procesu. Wiele wątków może działać równolegle
    3. Proces jest w pełni rozwiniętym programem, składa się z jednego lub więcej wątków, chociaż program może również składać się z wielu procesów.
    4. Pamiętaj, że wciąż jest to bardzo wysoki widok rzeczy, nie uwzględnia szczegółów implementacji
  • __skb_recv_datagram

    Poczekaj na niektóre dane w zablokowanym gnieździe sieciowym.

  • sk_wait_data

    Poczekaj na dane w gnieździe sieciowym.

  • do_exit

    To ostatnia część wychodzenia z procesu. do_exit()wywołuje schedule()następny, aby zaplanować kolejny proces. Kiedy do_exit()jest wywoływany, proces jest następujący ZOMBIE.

  • do_wait

    Proces jest dodawany do kolejki oczekiwania programu planującego.

  • pipe_wait, unix_stream_data_wait

    Proces oczekuje na dane z podprocesu. Dzieje się tak na przykład po uruchomieniu tego rodzaju kodu:

    echo | sleep 10 && echo hallo              # pipe
    

    lub

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    Proces śpi przy użyciu hrtimer_nanosleep()metody. Metodę tę można zastosować w programie do spania przez określony czas z dokładnością do nanosekund.

To nie wszystko, ale nie zaobserwowałem żadnych innych. Opublikuj komentarz, jeśli coś przeoczyłem.

Stefano Palazzo
źródło
Natknąłem się na sleep_on_page_killable?
Pan Axilus,
Najbardziej prawdopodobną przyczyną dla sleep_on_page_killable jest to, że proces próbuje załadować stronę, która nie jest w pamięci, więc powoduje błąd strony, a proces musi zostać uśpiony, dopóki strona nie zostanie załadowana. Jeśli podsystem we / wy jest przeciążony (może dlatego, że wykonujesz dużo operacji we / wy), może się to często pojawiać.
tsuna
co signal? Wpadłem na to. Czy proces jest martwy? zambi? albo co? co stanie się z procesem?
itsnotmyrealname
11

Wartość kanału oczekującego to nazwa funkcji jądra, w której proces jest obecnie zablokowany.

Nazwa jest zwykle związana z wywołaniem systemowym, które będzie miało stronę podręcznika.

  • futex_wait_queue_me jest powiązany z futex . To odnosi się do rodzaju mutexa zamka (szybko przestrzeni użytkownika wzajemnego wykluczania), która jest wykorzystywana do planowania wiele procesów w jednym procesorze. Stan wskazuje, że proces jest w kolejce, aby otrzymać blokadę. 2)
  • do_wait ma związek z oczekiwaniem .
  • itp.

Jeśli naprawdę potrzebujesz bardziej szczegółowych informacji, możesz sprawdzić źródło jądra .

Jeśli wpiszesz cat /proc/some_pid/stackterminal, otrzymasz takie dane wyjściowe:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

A w pierwszym wierszu wyświetla się to, co jest wyświetlane na monitorze systemu. O ile mi wiadomo, poll_schedule_timeout wskazuje, że twój proces na coś czeka.

Dotyczy asynchronicznych operacji we / wy i odpytywania .

Źródło (źródła): 1. przetwarzać kanał oczekiwania (WCHAN) i alarm? - 2. Odpowiedź AskUbuntu

Maxime R.
źródło
Przeformułuj to. : P
Stefano Palazzo
Wygląda na to, że zauważyłeś, że ponownie wykorzystałem twoją odpowiedź, aby ją poprawić ;-) Jakiego rodzaju atrybucji chciałbyś mieć?
Maxime R.
2
Twój komentarz jest więcej niż wystarczający, aby mnie uszczęśliwić :) Jeśli chcesz dowiedzieć się, jak działa atrybucja, na blogu znajduje się fajny post na blogu SO . Nie przejmuj się jednak zbytnio, chcę, aby ludzie w jak największym stopniu korzystali z mojej pracy.
Stefano Palazzo
1
Właśnie pisałem pytanie na ten temat na temat meta. (już przeczytał post na blogu)
Maxime R.
To tutaj . I założę się, że twoja odpowiedź skończy się moja w pewnym momencie ^^
Maxime R.