W systemie * nix identyfikatory PID są unikatowymi identyfikatorami dla uruchomionych procesów. Jak generowane są PID? Czy to tylko liczba całkowita, która się zwiększa, czy bardziej złożona struktura, taka jak lista? Jak są poddawane recyklingowi? Przez recykling rozumiem, że kiedy proces się zakończy, jego PID zostanie ostatecznie wykorzystany przez inny proces.
42
Odpowiedzi:
Jak mówi wikipedia ,
więc jest to naprawdę bardzo prosta zasada „generowania”, po prostu zwiększania licznika i „recyklingu”, po prostu owiń liczbę wokół wartości maksymalnej i kontynuuj zwiększanie, dopóki nie znajdziesz numeru, który został przypisany do procesu, który został zakończony i ma został usunięty z tabeli procesów.
Niektóre implementacje uniksowe, takie jak AIX, używają zasad, które są mniej proste, patrz np. Ten FAQ .
źródło
while(true);
), przepraszam, szybko odpowiadałem ;-)To się zmienia.
Większość systemów po prostu rejestruje ostatnio wygenerowany PID, dodaje jeden (zawijanie do maksymalnej liczby, takiej jak 65535 lub nieco mniejszej - często zawijanie ma miejsce przy 65000 lub nawet 60000) i sprawdza, czy numer nie jest aktualnie używany ( powtarzanie, jeśli PID jest nadal w użyciu - więc jądro PID 1 wciąż tam jest i nie zostaje ponownie uruchomione).
Inne systemy zorientowane na bezpieczeństwo generują losowo liczbę i sprawdzają, czy nie jest używana.
W danym momencie gwarantuje się, że wszystkie numery PID są unikalne.
źródło
Jeśli chodzi o część pytania dotyczącego recyklingu, należy pamiętać, że pid nie staje się dostępny, gdy tylko zakończy się proces z tym pid. Pid nie staje się dostępny, dopóki rodzic tego procesu nie odbierze statusu zakończenia swojego potomka poprzez jakąś formę wywołania systemowego wait (). Dziecko, które zostało zakończone, ale którego rodzic nie wydał czekania, nazywa się zombie i zwykle pojawia się w ps jako nieistniejące. Niegrzeczny rodzic może głodować system pid, jeśli uruchamia on dzieci i nie czeka na nie ().
Jeśli rodzic procesu umiera, zanim pobierze status dziecka, jest to w porządku. Dziecko jest dziedziczone przez init, który upewni się, że zostanie wydane wait (), a pid zostanie przetworzony.
źródło
myprog &
następowałby powait $!
UB.Są to numery sekwencyjne i są zawijane (według wartości specyficznej dla systemu operacyjnego), jeśli system działa wystarczająco długo. Liczby nigdy nie są ponownie używane, chyba że są darmowe
fork()
.źródło