time(7) - Linux 手册页
名称
time - 时间和定时器的概述
描述
实时和进程时间
- 实时定义为从某个固定点测量的時間,可以是来自过去的标准点(参见下面对 Epoch 和日历时间的描述),也可以是进程生命周期中的某个点(经过的时间)。
进程时间定义为进程使用的 CPU 时间量。这有时分为用户和系统组件。用户 CPU 时间是在用户模式下执行代码所花费的时间。系统 CPU 时间是内核代表进程在系统模式下执行所花费的时间(例如,执行系统调用)。time(1) 命令可用于确定程序执行期间消耗的 CPU 时间量。程序可以使用 times(2)、getrusage(2) 或 clock(3) 确定其自身消耗的 CPU 时间量。
硬件时钟
软件时钟、HZ 和滴答
- 各种设置超时(例如,select(2)、sigtimedwait(2))和测量 CPU 时间(例如,getrusage(2))的系统调用的精度受软件时钟分辨率的限制,该时钟由内核维护,以滴答为单位测量时间。滴答的大小由内核常量 HZ 的值决定。
HZ 的值因内核版本和硬件平台而异。在 i386 上,情况如下:在内核版本高达 2.4.x 时,HZ 为 100,滴答值为 0.01 秒;从 2.6.0 开始,HZ 提高到 1000,滴答为 0.001 秒。从内核 2.6.13 开始,HZ 值是内核配置参数,可以是 100、250(默认值)或 1000,滴答值分别为 0.01、0.004 或 0.001 秒。从内核 2.6.20 开始,还提供另一个频率:300,该数字可被常见的视频帧速率(PAL,25 HZ;NTSC,30 HZ)整除。
times(2) 系统调用是一个特例。它以由内核常量 USER_HZ 定义的粒度报告时间。用户空间应用程序可以使用 sysconf(_SC_CLK_TCK) 确定该常量的値。
高分辨率计时器
- 在 Linux 2.6.21 之前,计时器和睡眠系统调用的精度(参见下文)也受滴答大小的限制。
从 Linux 2.6.21 开始,Linux 支持高分辨率计时器 (HRT),可以选择通过 CONFIG_HIGH_RES_TIMERS 进行配置。在支持 HRT 的系统上,睡眠和计时器系统调用的精度不再受滴答的约束,而是可以达到硬件允许的精度(现代硬件通常具有微秒级的精度)。可以通过调用 clock_getres(2) 返回的分辨率或查看 /proc/timer_list 中的“resolution”条目来确定是否支持高分辨率计时器。
HRT 并非在所有硬件架构上都受支持。(支持 x86、arm 和 powerpc 等。)
Epoch
- UNIX 系统以自 Epoch 以来的秒数来表示时间,即 1970-01-01 00:00:00 +0000 (UTC)。
程序可以使用 gettimeofday(2) 确定日历时间,该函数返回自 Epoch 以来经过的时间(以秒和微秒为单位);time(2) 提供类似的信息,但精度仅为最接近的秒。可以使用 settimeofday(2) 更改系统时间。
分解时间
- 某些库函数使用类型为 tm 的结构来表示分解时间,该结构将时间值分成不同的组件(年、月、日、小时、分钟、秒等)。该结构在 ctime(3) 中描述,该手册页还描述了在日历时间和分解时间之间进行转换的函数。将分解时间转换为时间的打印字符串表示形式的函数的描述在 ctime(3)、strftime(3) 和 strptime(3) 中描述。
睡眠和设置计时器
- 各种系统调用和函数允许程序在指定的时间段内睡眠(暂停执行);请参阅 nanosleep(2)、clock_nanosleep(2) 和 sleep(3)。
各种系统调用允许进程设置在未来某个时间点到期,并可以选择以重复的间隔设置计时器;请参阅 alarm(2)、getitimer(2)、timerfd_create(2) 和 timer_create(2)。
计时器延迟
- 从 Linux 2.6.28 开始,可以控制线程的“计时器延迟”值。计时器延迟是内核可能延迟唤醒具有超时阻塞的某些系统调用的时间长度。允许这种延迟使内核能够合并唤醒事件,从而可能减少系统唤醒次数并节省功耗。有关更多详细信息,请参阅 prctl(2) 中 PR_SET_TIMERSLACK 的描述。
参见
date(1)、time(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)、pthread_getcpuclockid(3)、sleep(3)、strftime(3)、strptime(3)、timeradd(3)、usleep(3)、rtc(4)、hwclock(8)