Jaki proces kontroluje powinowactwo procesora do nowych procesów w języku Python

2

Napisałem kod, aby ustawić powinowactwo każdego procesu pod moją nazwą użytkownika tylko do rdzenia 0. Uruchomiłem ten kod, a następnie został zakończony, gdy został ukończony.

Następnie, nawet gdy uruchomiłem zupełnie nowy terminal i otworzyłem przy nim python, jego powinowactwo nadal było ustawione na rdzeń 0. Oczekiwanym domyślnym zachowaniem byłoby, aby nowo uruchomiona powłoka pytona miała powinowactwo zarówno do rdzenia 0, jak i rdzenia 1, oczywiście .

To nie jest tak, że coś powoduje, że wszystkie procesy Pythona mają takie samo powinowactwo procesora - zweryfikowałem to, ustawiając dwa różne procesy Pythona na dwa różne rdzenie.

Kolejnym eksperymentem, który przeprowadziłem, jest ustawienie powinowactwa tylko procesów pythonowych na rdzeń 0 (wszystkie pozostałe procesy nietknięte). Następnie, kiedy uruchomiłem nową powłokę Pythona, jej powinowactwo było nadal normalne (nie ustawione tylko na 0). Sugeruje to, że istnieje jakiś specjalny proces niebędący pythonem, który zarządza powinowactwem procesorów nowych procesów pythonowych.

Moje pytanie brzmi: co to za specjalny proces?

Dla porównania, do ustawiania i sprawdzania powinowactwa procesora użyłem psutil.Process.cpu_affinityz psutilbiblioteki Pythona .

shimao
źródło
2
Jeśli napisałeś kod, aby ustawić powinowactwo każdego procesu do rdzenia 0, dlaczego jesteś zaskoczony, że nowe procesy w Pythonie są ustawione na rdzeń 0?
Ramhound,
Ponieważ ustawiłem powinowactwo każdego istniejącego procesu na rdzeń 0 - co nie powinno mieć żadnego wpływu na powinowactwo jakichkolwiek nowych procesów rozpoczętych później. Kod nie mógł dotknąć powinowactwa nowych procesów, ponieważ procesy te nie istniały w momencie uruchomienia kodu.
shimao,
4
Jeśli udało ci się ustawić powinowactwo każdego procesu na 0, to wszelkie procesy potomne (dowolnego wyskakującego pytona lub twojego terminala) mogą odziedziczyć to powinowactwo. Jeśli chciałbyś, aby wpłynęło to tylko na terminal, który uruchomił Pythona, powinieneś tylko zmienić powinowactwo tego terminalu
Mokubai
1
Widzę. Potwierdziłem to dla siebie i odkryłem, że bash był uruchamiany z xfterminal, który sam jest potomkiem xfsettingsd, który jest potomkiem procesu init. powinowactwo xfsettingsd ustawiono na 0, co wyjaśnia wszystko.
shimao,