time(7)

NAZWA
time - przegląd czasu i czasomierzy

OPIS

  Czas rzeczywisty i czas procesu
Czas rzeczywisty jest definiowany jako czas mierzony od jakiegoś określonego punktu: albo od standardowego punktu w przeszłości (zob. opis Epoki i czasu kalendarzowego poniżej), albo jakiegoś punktu (np. początku) na etapie życia procesu (czas trwania – ang. elapsed time).

Czas procesu jest definiowany jako czas procesora użyty przez proces. Czasem dzieli się go na część użytkownika i systemu. Czas procesu przypisany do użytkownika jest czasem wykonywania kodu w trybie użytkownika. Systemowy czas procesora jest czasem wykonywania przez jądro w trybie systemowym kodu w imieniu procesu (np. wykonywanie wywołań systemowych). Polecenie time(1) może posłużyć do określenia czasu procesora użytego do wykonania procesu, natomiast program może go określić za pomocą times(2), getrusage(2) lub clock(3).

  Zegar sprzętowy
Większość komputerów posiada (zasilany bateryjnie) zegar sprzętowy, odczytywany przez jądro w trakcie rozruchu, w celu zainicjowania zegara programowego. Więcej szczegółów w podręcznikach rtc(4) i hwclock(8).

  Zegar programowy, stała HZ i jednostka „jiffy”
Dokładność różnych wywołań systemowych, które ustawiają czasy oczekiwania (np. select(2), sigtimedwait(2)) i mierzą czas procesora (np. getrusage(2)) jest ograniczona rozdzielczością zegara programowego – zegara zarządzanego przez jądro, który mierzy czas w jednostce zwanej „jiffy”. Rozmiar jiffy zależy od wartości stałej jądra HZ.

Wartość HZ różni się pomiędzy wersjami jądra i platformami sprzętowymi. Na architekturze i386 sytuacja wygląda następująco: do Linuksa 2.4 włącznie HZ wynosiło 100, co dawało wartość jiffy wynoszącą 0,01 sekundy, natomiast w Linuksie 2.6.0, zwiększono wartość HZ do 1000, co dało jiffy mające 0,001 sekundy. Od Linuksa 2.6.13, wartość HZ jest parametrem konfiguracji jądra i może wynosić 100, 250 (wartość domyślna) lub 1000, co skutkuje wartościami jiffy odpowiednio: 0,01 s; 0,004 s lub 0,001 sekundy. Od Linuksa 2.6.20 dodano kolejną dopuszczalną wartość: 300, gdyż jest to liczba dzieląca bez reszty popularne wartości liczby klatek na sekundę dla wideo (używany w Polsce PAL ma 25 Hz, a amerykański NTSC – 30 Hz).

Wywołanie systemowe times(2) jest szczególnym przypadkiem. Zwraca czas, z rozdzielczością określoną stałą jądra USER_HZ. Aplikacje w przestrzeni użytkownika mogą określić wartość tej stałej za pomocą sysconf(_SC_CLK_TCK).

  Zegar systemowy i zegar procesu; przestrzenie nazw czasu
Jądro obsługuje szeroki zestaw zegarów mierzących różne rodzaje czasu, który upłynął i wirtualnego (użytego przez procesor). Zegary te opisano w clock_gettime(2). Kilka zegarów można resetować za pomocą clock_settime(2). Wartości określonych zegarów są wirtualizowane w przestrzeniach nazw czasu; zob. time_namespaces(7).

  Czasomierze o wysokiej rozdzielczości
Przed Linuksem 2.6.21, dokładność wywołań systemowych czasomierza oraz uśpienia (zob. niżej) była również ograniczona rozmiarem jiffy.

Od Linuksa 2.6.21, jądro Linux obsługuje czasomierze o wysokiej rozdzielczości (ang. high-resolution timer – HRT), konfigurowane opcjonalnie poprzez CONFIG_HIGH_RES_TIMERS. W systemie obsługującym HRT, dokładność wywołań systemowych czasomierza oraz uśpienia nie jest już ograniczona wartością jiffy, lecz dokładnością na jaką pozwala sprzęt (współczesny sprzęt ma zwykle dokładność mikrosekund). Można sprawdzić, czy czasomierze o wysokiej rozdzielczości są dostępne, sprawdzając rozdzielczość zwracaną przez wywołanie do clock_getres(2) lub przez sprawdzenie wpisów „resolution” w /proc/timer_list.

Czasomierze o wysokiej rozdzielczości nie są obsługiwane na wszystkich architekturach sprzętowych (obsługa jest zapewniona m.in na x86, ARM i PowerPC).

  Epoka
Systemy Uniksowe reprezentują czas w sekundach od Epoki tj. 1970-01-01 00:00:00 +0000 (UTC).

Program może określić czas kalendarzowy za pomocą zegara CLOCK_REALTIME clock_gettime(2), które zwraca czas (w sekundach i nanosekundach), jaki upłynął od Epoki; time(2) udostępnia podobne informacje, ale z dokładnością tylko do najbliższej sekundy. Czas systemowy można zmienić za pomocą clock_settime(2).

  Czas rozłożony
Określone funkcje biblioteczne używają struktury typu tm do reprezentowania czasu rozłożonego (ang. broken-down time), który przechowuje wartości czasu podzielone na ich poszczególne części (rok, miesiąc, dzień, godzina, minuta, sekunda itd.). Struktura ta jest opisana w podręczniku tm(3type), razem z opisem funkcji konwertujących pomiędzy czasem kalendarzowym a czasem rozłożonym. Funkcje konwertujące pomiędzy czasem rozłożonym a wypisywalnymi łańcuchami reprezentującymi czas, opisano w podręcznikach ctime(3), strftime(3) i strptime(3).

  Usypianie oraz ustawianie czasomierzy
Różne wywołania systemowe i funkcje pozwalają na uśpienie (wstrzymanie wykonania) programu na określony czas; zob. nanosleep(2), clock_nanosleep(2) i sleep(3).

Różne wywołania systemowe zezwalają na ustawienie stopera, który upłynie w jakimś momencie w przyszłości i opcjonalnie może być powtarzany w określonych interwałach; zob. alarm(2), getitimer(2), timerfd_create(2) i timer_create(2).

  Luz czasomierza
Od Linuksa 2.6.28, można kontrolować wartość „luzu czasomierza” (ang. „timer slack”) dla wątku. Luz czasomierza to czas, o jaki jądro może opóźnić wybudzenie pewnych wywołań systemowych, które blokuje przy użyciu czasu oczekiwania. Zezwolenie na to opóźnienie pozwala jądru na łączenie zdarzeń wybudzenia, potencjalnie redukując liczbę systemowych wybudzeń oraz oszczędzając energię. Więcej szczegółów w opisie PR_SET_TIMERSLACK w podręczniku prctl(2).

ZOBACZ TAKŻE
date(1), time(1), timeout(1), adjtimex(2), alarm(2), clock_gettime(2), clock_nanosleep(2), getitimer(2), getrlimit(2), getrusage(2), gettimeofday(2), nanosleep(2), stat(2), time(2), timer_create(2), timerfd_create(2), times(2), utime(2), adjtime(3), clock(3), clock_getcpuclockid(3), ctime(3), ntp_adjtime(3), ntp_gettime(3), pthread_getcpuclockid(3), sleep(3), strftime(3), strptime(3), timeradd(3), usleep(3), rtc(4), time_namespaces(7), hwclock(8)

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.