linux时间子系统之,semaphore Linux时间子系统(五) POSIX Clock

294667685.jpg

clock是timer的基础,任何一个timer都需要运作在一个指定的clock上来。内核中维护了若干的clock,本文第二章描述了clock的基本概念和一些静态定义的posix clock。根据计时的特点,clock分成两种:一种是真实世界的时间概念,另外一个是仅仅计算CPU执行时间 ,这两种clock分别在第三和第四章描述。从clock的生命周期来看,可以分成静态和动态的posix clock,静态是一直存在于内核中的,而动态clock有创建和销毁的概念,本文第五章描述了dynamic posix clock。

二、基本概念

1、核心数据结构

所谓clock,实际上就是一种计时工具,可能是硬件,也可能是软件,当然对于POSIX clock而言,当然是指软件抽象了。clock能够记录一段时间的流逝,这段时间可能是真实的墙上时间,也可能是虚拟的时间,例如基于某个进程或者线程的CPU执行时间。在linux kernel中,用struct k_clock来抽象,具体定义如下:

struct k_clock {

int (*clock_getres) (const clockid_t which_clock, struct timespec *tp);

int (*clock_set) (const clockid_t which_clock, const struct timespec *tp);

int (*clock_get) (const clockid_t which_clock, struct timespec * tp);

int (*clock_adj) (const clockid_t which_clock, struct timex *tx);

int (*timer_create) (struct k_itimer *timer);

int (*nsleep) (const clockid_t which_clock, int flags, struct timespec *, struct timespec __user *);

long (*nsleep_restart) (struct restart_block *restart_block);

int (*timer_set) (struct k_itimer * timr, int flags, struct itimerspec * new_setting,

struct itimerspec * old_setting);

int (*timer_del) (struct k_itimer * timr);

void (*timer_get) (struct k_itimer * timr, struct itimerspec * cur_setting);

};

clock作为一个计时工具当然有计时精度,通过clock_getres函数可以获取该clock的时间精度,需要说明的是这个精度是和timer相关的,用于将用户设定的timer超时时间规整到clock精度允许的数值上。clock_get和clock_set函数可以分别获取和设定当前的时间,这个时间值是一个绝对时间值(对于时间轴而言,这个绝对时间也是相对的,是相对于该timeline的epoch而言),标记了当前时间点。clock计时有可能是不准确的,例如基于系统晶振的clock。一方面本身晶振的精度有限,时间累积长了会出现较大误差。另外,晶振也会随着使用时间的推移、温度的变化等等因素而导致误差。clock_adj函数允许系统根据外部的精确时间信息对本clock进行调整。nsleep和nsleep_restart这两个成员函数可以让进程sleep一段时间。timer_xxx系列函数是和POSIX interval timer相关,具体会在POSIX timer文档中描述。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-77921-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值