czekać (wywołanie systemowe)

W komputerowych systemach operacyjnych proces (lub zadanie ) może czekać na zakończenie wykonywania przez inny proces . W większości systemów proces nadrzędny może utworzyć niezależnie wykonywany proces potomny . Proces nadrzędny może następnie wydać wywołanie systemowe oczekiwania , które zawiesza wykonywanie procesu nadrzędnego na czas wykonywania procesu podrzędnego. Gdy proces potomny zakończy działanie, zwraca status wyjścia do systemu operacyjnego, który jest następnie zwracany do oczekującego procesu nadrzędnego. Następnie proces nadrzędny wznawia wykonywanie.

wątkowi procesu tworzyć inne wątki i czekać na ich zakończenie („dołączenie” do nich) w podobny sposób.

System operacyjny może udostępniać odmiany wywołania oczekiwania , które pozwalają procesowi czekać na zakończenie któregokolwiek z jego procesów potomnych lub czekać na zakończenie jednego określonego procesu potomnego (identyfikowanego przez jego identyfikator procesu ).

Niektóre systemy operacyjne wysyłają sygnał ( SIGCHLD ) do procesu nadrzędnego, gdy proces podrzędny kończy działanie, powiadamiając proces nadrzędny i umożliwiając mu pobranie statusu zakończenia procesu podrzędnego.

Status wyjścia zwrócony przez proces potomny zazwyczaj wskazuje, czy proces zakończył się normalnie, czy nieprawidłowo . W przypadku normalnego zakończenia, status ten obejmuje również kod wyjścia (zwykle jest to liczba całkowita), który proces zwrócił do systemu. W ciągu pierwszych 20 lat systemu UNIX tylko 8 niższych bitów kodu wyjścia było dostępnych dla oczekującego rodzica. W 1989 roku wraz z SVR4 [ potrzebne źródło ] wprowadzono nowy identyfikator oczekiwania, który zwraca wszystkie bity z wywołania wyjściowego w strukturze zwanej siginfo_t w elemencie struktury si_status . [ potrzebne źródło ] Waitid jest obowiązkową częścią standardu POSIX od 2001 roku.

Zombie i sieroty

Kiedy proces potomny kończy działanie, staje się procesem zombie i nadal istnieje jako wpis w tablicy procesów systemowych , mimo że nie jest już aktywnie wykonywanym programem. Podczas normalnej pracy jest zwykle natychmiast oczekiwany przez swojego rodzica, a następnie zbierany przez system, odzyskując zasób (wpis w tablicy procesów). Jeśli dziecko nie czeka na rodzica, nadal zużywa ten zasób w nieskończoność, a zatem jest to wyciek zasobów . Takie sytuacje są zwykle obsługiwane za pomocą specjalnego procesu „żniwiarza” [ potrzebne źródło ] który lokalizuje zombie i pobiera ich status wyjścia, umożliwiając systemowi operacyjnemu zwolnienie ich zasobów.

I odwrotnie, proces potomny, którego proces nadrzędny kończy się przed nim, staje się procesem osieroconym . Takie sytuacje są zwykle obsługiwane za pomocą specjalnego procesu „root” (lub „init”), który jest przypisywany jako nowy rodzic procesu, gdy jego proces macierzysty kończy działanie. Ten specjalny proces wykrywa zakończenie procesu osieroconego, a następnie pobiera jego status wyjścia, umożliwiając systemowi zwolnienie przerwanego procesu potomnego.

Jeśli proces potomny otrzyma sygnał, oczekujący rodzic będzie kontynuował wykonywanie, pozostawiając za sobą proces osierocony. [ Potrzebne źródło ] Dlatego czasami konieczne jest sprawdzenie argumentu ustawionego przez wait, waitpid lub waitid iw przypadku, gdy WIFSIGNALED ma wartość true, poczekać, aż proces potomny ponownie zwolni zasoby. [ potrzebne źródło ]

Zobacz też