Czym konkretnie są czas zegara ściennego, czas procesora użytkownika i czas procesora systemowego w systemie UNIX?

144

Mogę zgadywać na podstawie nazw, ale czym konkretnie są czas zegara ściennego, czas procesora użytkownika i czas procesora systemu w systemie UNIX?

Czy czas procesora użytkownika to ilość czasu spędzonego na wykonywaniu kodu użytkownika, podczas gdy czas procesora jądra to ilość czasu spędzonego w jądrze z powodu konieczności wykonywania uprzywilejowanych operacji (takich jak IO na dysk)?

W jakiej jednostce czasu jest ten pomiar.

I czy czas zegara to naprawdę liczba sekund, które proces spędził na procesorze, czy też nazwa po prostu wprowadza w błąd?

John Humphreys - w00te
źródło
Możliwy duplikat Co oznaczają „rzeczywisty”, „użytkownik” i „sys” w danych wyjściowych czasu (1)?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

143

Czas zegara ściennego to czas, który zegar na ścianie (lub stoper w ręku) mierzyłby jako upływający od początku procesu do „teraz”.

Czas procesora użytkownika i czas procesora systemowego są prawie takie, jak powiedziałeś - ilość czasu spędzonego na kodzie użytkownika i ilość czasu spędzonego w kodzie jądra.

Jednostkami są sekundy (i podsekundy, które mogą być mikrosekundami lub nanosekundami).

Czas zegara ściennego nie jest liczbą sekund, które proces spędził na CPU; jest to czas, który upłynął, w tym czas spędzony na oczekiwaniu na włączenie procesora (podczas gdy inne procesy są uruchamiane).

Jonathan Leffler
źródło
16
Czy to oznacza, że ​​czas zegara ściennego zawsze będzie większy niż czas procesora?
Pacerier,
36
@Pacerier: na komputerze jednordzeniowym, tak, ale maszyny wielordzeniowe i programy wielowątkowe mogą zużywać więcej niż 1 sekundę procesora na sekundę.
Jonathan Leffler,
@JonathanLeffler dziękuję za odpowiedź, chciałem uzyskać liczbę nanosekund, które upłynęły, ale CPUtime = #clock_cycles / clock_rateobliczenie czasu procesora za pomocą wzoru nie może być tym samym, co obliczenie czasu, który upłynął. Czy wiesz, czy mogę uzyskać czas, który upłynął, na podstawie czasu procesora?
Bionix1441
2
@ Bionix1441: Nie można wyprowadzić czasu, który upłynął, z czasu procesora z wielu powodów. Po pierwsze, proces może być bezczynny, nie zużywając żadnego czasu procesora, przez dowolne okresy (na przykład proces demona czekający na połączenie klienta przez sieć), więc może nic nie robić przez wiele dni w czasie, który upłynął . Po drugie, jeśli działa, może mieć wiele wątków, a jeśli ma, powiedzmy, 4 wątki i są 4 lub więcej rdzeni w systemie, może pochłaniać 4 sekundy wysiłku procesora na sekundę upływającego czasu. To pokazuje, że nie ma prostej (lub nawet złożonej) formuły, której można by użyć.
Jonathan Leffler,
1
@ Catbuilts: Czy wiesz, że jądro Uniksa działa niezależnie od programów użytkownika. Kiedy program wykonuje wywołanie systemowe (na przykład read()lub getpid()), jądro wykonuje kod w imieniu programu. Jądro obsługuje również wielozadaniowość z wywłaszczaniem, aby inne programy otrzymały swoją kolej, a także wykonuje pewne ogólne prace porządkowe, aby system działał płynnie. Ten kod jest wykonywany w „kodzie jądra” (także w „trybie jądra”). Różni się to od kodu, który napisałeś, i bibliotek użytkownika (w tym systemowej biblioteki C), które uruchamiasz.
Jonathan Leffler
36

Czas zegara ściennego: czas, który upłynął według wewnętrznego zegara komputera, który powinien odpowiadać czasowi na świecie. Nie ma to nic wspólnego z wykorzystaniem procesora; podano w celach informacyjnych.

Czas procesora użytkownika i czas systemowy: dokładnie to, o czym myślisz. Wywołania systemowe, które obejmują I / O wywołuje takie jak read, writeitp są wykonywane przez skoki do kodu jądra i wykonanie tego.

Jeśli czas zegara ściennego <czas procesora, program jest wykonywany równolegle. Jeśli zegar ścienny> czas procesora, czekasz na dysk, sieć lub inne urządzenia.

Wszystkie są mierzone w sekundach według SI .

Fred Foo
źródło
7

Czas zegara ściennego jest dokładnie tym, co mówi, czas, który upłynął, mierzony przez zegar na ścianie (lub zegarek na rękę)

Czas procesora użytkownika to czas spędzony w „krainie użytkownika”, czyli czas spędzony na procesach spoza jądra

Czas procesora systemowego to czas spędzony w jądrze, zwykle czas spędzony na obsłudze wywołań systemowych.

ennuikiller
źródło
7
time [WHAT-EVER-COMMAND]

real    7m2.444s
user    76m14.607s
sys 2m29.432s

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24

prawdziwy lub zegar ścienny

prawdziwe 7m2,444s

W systemie z 24-rdzeniowym procesorem ten proces cmd / proces trwał ponad 7 minut. To dzięki wykorzystaniu możliwie największej równoległości ze wszystkimi podanymi rdzeniami.

użytkownik

użytkownik 76m14.607s

Proces cmd / proces wykorzystywał tak dużo czasu procesora. Innymi słowy, na komputerze z jednordzeniowym procesorem wartość rzeczywista i użytkownik będą prawie równe, więc wykonanie tego samego polecenia zajmie około 76 minut.

sys

sys 2m29.432s

Jest to czas potrzebny jądru na wykonanie wszystkich podstawowych / systemowych operacji w celu uruchomienia tego polecenia cmd, w tym przełączania kontekstu, alokacji zasobów itp.

Uwaga: w przykładzie założono, że polecenie wykorzystuje równoległość / wątki.

Szczegółowa strona podręcznika : https://linux.die.net/man/1/time

Sankarganesh Eswaran
źródło
Biorąc pod uwagę czasy, w których opublikowałeś, czy nie jest to mniej więcej połowa równoległości? (Robię to tylko po to, (user + sys) / realżeby to reprezentować.
dtc,