program czasowy

2

Uruchamiam program na serwerze linuksowym, a także mierzę czas jego użycia według czasu polecenia .

Patrząc na końcowy wynik, jestem zdezorientowany, ponieważ pomyślałem „real = sys + użytkownik” lub przynajmniej w przybliżeniu się to utrzymuje. Oto jego wynik

prawdziwe 189m6.807s

użytkownik 1173m6,203s

sys 3m6.508s

Czy „sys + użytkownik” jest mierzony w innej jednostce niż „rzeczywisty”?

Dlaczego „użytkownik” jest o wiele większy niż „prawdziwy”? Czy nie powinno być mniejsze?

Przyznaję, że tak naprawdę nie rozumiem tych czasów, jak myślałem. Tak więc każde wyjaśnienie jest mile widziane!

Tim
źródło

Odpowiedzi:

3

W twoim komputerze jest co najmniej siedem (prawdopodobnie osiem;) rdzeni. „Tylko” zajęło to łącznie 189 minut, ale w ciągu tych 189 minut działało na wielu rdzeniach jednocześnie.

Jest to zawarte w traktacie Joe:

Na maszynie wieloprocesorowej proces wielowątkowy lub proces rozwidlania dzieci może mieć mniejszy czas niż całkowity czas procesora - ponieważ różne wątki lub procesy mogą przebiegać równolegle.

wfaulk
źródło
7

Statystyki czasu rzeczywistego, użytkownika i Sys

Jedna z tych rzeczy nie jest taka jak druga. Rzeczywisty odnosi się do rzeczywistego czasu, który upłynął; Użytkownik i Sys odnoszą się do czasu procesora wykorzystywanego tylko przez proces.

* Rzeczywisty to czas naścienny - czas od początku do końca połączenia. Jest to cały czas, który upłynął, w tym przedziały czasowe używane przez inne procesy oraz czas, który proces spędza zablokowany (na przykład, jeśli czeka na zakończenie operacji we / wy).

* Użytkownik to ilość czasu procesora spędzona w kodzie trybu użytkownika (poza jądrem) w procesie. Jest to tylko rzeczywisty czas pracy procesora użyty do wykonania procesu. Inne procesy i czas zablokowany przez proces nie liczą się do tej liczby.

* Sys to ilość czasu procesora spędzonego w jądrze w procesie. Oznacza to wykonywanie czasu procesora spędzonego na wywołaniach systemowych w jądrze, w przeciwieństwie do kodu biblioteki, który wciąż działa w przestrzeni użytkownika. Podobnie jak „użytkownik”, proces ten zajmuje tylko czas procesora. Poniżej znajduje się krótki opis trybu jądra (znanego również jako tryb „superwizora”) i mechanizmu wywołania systemowego.

Użytkownik + Sys powie ci, ile czasu procesora faktycznie wykorzystałeś.

Pochodzenie statystyk zgłaszanych według czasu (1)

Statystyki raportowane według czasu są gromadzone z różnych wywołań systemowych. „Użytkownik” i „Sys” pochodzą z oczekiwania (2) lub czasów (2), w zależności od konkretnego systemu. „Rzeczywisty” jest obliczany na podstawie czasu rozpoczęcia i zakończenia zebranego z połączenia gettimeofday (2). W zależności od wersji systemu różne statystyki, takie jak liczba przełączników kontekstu, mogą również być zbierane według czasu.

Na maszynie wieloprocesorowej proces wielowątkowy lub proces rozwidlania dzieci może mieć mniejszy czas niż całkowity czas procesora - ponieważ różne wątki lub procesy mogą przebiegać równolegle. Ponadto raportowane statystyki czasowe pochodzą z różnych źródeł, więc czasy zarejestrowane dla bardzo krótkotrwałych zadań mogą być obarczone błędami zaokrąglania, jak pokazuje przykład z oryginalnego plakatu.

Krótki podkład w trybie jądra kontra użytkownik

W systemie Unix lub dowolnym systemie operacyjnym z chronioną pamięcią tryb „Kernel” lub „Supervisor” odnosi się do trybu uprzywilejowanego, w którym może działać procesor. Niektóre działania uprzywilejowane, które mogą mieć wpływ na bezpieczeństwo lub stabilność, można wykonać tylko wtedy, gdy procesor działa w trybie ten tryb; te działania nie są dostępne dla kodu aplikacji. Przykładem takiej akcji może być manipulowanie MMU w celu uzyskania dostępu do przestrzeni adresowej innego procesu. Normalnie kod trybu użytkownika nie może tego zrobić (z uzasadnionego powodu), chociaż może żądać pamięci współdzielonej z jądra, które może być odczytane lub zapisane przez więcej niż jeden proces. W takim przypadku pamięć współdzielona jest jawnie wymagana od jądra za pośrednictwem bezpiecznego mechanizmu i oba procesy muszą jawnie się z nim połączyć, aby z niego skorzystać.

Tryb uprzywilejowany jest zwykle określany jako tryb „jądra”, ponieważ jądro jest wykonywane przez procesor działający w tym trybie. Aby przejść do trybu jądra, musisz wydać konkretną instrukcję (często nazywaną pułapką ), która przełącza procesor do pracy w trybie jądra i uruchamia kod z określonej lokalizacji. Ze względów bezpieczeństwa nie można przejść do trybu jądra i wykonać dowolny kod - pułapkami zarządza się za pomocą tabeli adresów, których nie można zapisać, chyba że procesor pracuje w trybie nadzorcy.

Wywołania „systemowe” w bibliotece C (szczególnie te opisane w Rozdziale 2 stron podręcznika) mają komponent trybu użytkownika, który tak naprawdę wywołujesz z programu C. Za kulisami mogą wydawać jedno lub więcej wywołań systemowych do jądra w celu wykonania określonych usług, takich jak We / Wy, ale nadal mają kod działający w trybie użytkownika. W razie potrzeby można również bezpośrednio uruchomić pułapkę do trybu jądra z dowolnego kodu przestrzeni użytkownika, chociaż może być konieczne napisanie fragmentu języka asemblera, aby poprawnie skonfigurować rejestry dla wywołania. Strona opisująca wywołania systemowe dostarczane przez jądro Linuksa i konwencje konfigurowania rejestrów można znaleźć tutaj .

Więcej informacji

Wyjaśnienie na temat „sys”: Są rzeczy, których twój kod nie może zrobić z trybu użytkownika - takie jak przydzielanie pamięci lub dostęp do sprzętu (HDD, sieć itp.) Są pod nadzorem jądra i tylko on może to zrobić. Niektóre operacje, które wykonujesz (np. Malloc lub fread / fwrite) wywołują te funkcje jądra, a następnie będą liczone jako czas „sys”. Niestety nie jest to takie proste, że „każde połączenie do malloc będzie liczone w czasie„ sys ”. Wywołanie malloc wykona własne przetwarzanie (nadal liczone w czasie „użytkownika”), a następnie gdzieś po drodze wywoła funkcję w jądrze (liczone w czasie „sys”). Po powrocie z wywołania jądra będzie więcej czasu w „user”, a następnie malloc powróci do twojego kodu. Kiedy nastąpi zmiana i ile wyda się w trybie jądra - nie można powiedzieć. To zależy od implementacji biblioteki. Również inne pozornie niewinne funkcje mogą również używać malloc i tym podobnych w tle, które znów będą miały trochę czasu w „sys”.

Źródło: tutaj

Joe
źródło