POSIX时钟用法简介

POSIX时钟系列接口包括timer_create()(创建定时器)、timer_settime()(初始化定时器)、timer_delete(销毁)等。

1. 时间测量方式

POSIX时钟支持的时间测量方式包括CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_PROCESS_CPUTIME_ID、CLOCK_THREAD_CPUTIME_ID。

CLOCK_REALTIME:这种时钟表示的是绝对时间, 指的是从1970年1月1月0:00到目前经过多少秒, 相当于你的linux系统中显示的时间, 所以这个时间是可以更改的, 当系统的时钟源被改变,或者系统管理员重置了系统时间之后,这种类型的时钟可以得到相应的调整, 对设定为此类型的timer是有影响的。

CLOCK_MONOTONIC:这种时钟表示的是相对时间, 其值对通过累积时钟节拍(嘀嗒)计算出来的, 不受时钟源等的影响, 从系统启动这一刻起开始计时, 如果你想计算出在一台计算机上不受重启的影响,两个事件发生的间隔时间的话,那么它将是最好的选择。

CLOCK_PROCESS_CPUTIME_ID:测量调用进程(包含其中所有线程)所消耗的(用户和系统)总CPU时间。

CLOCK_THREAD_CPUTIME_ID:测量调用线程消耗的(用户和系统)CPU时间。

2. 时钟超时通知方式

      SIGEV_NONE,当计时器到期不进行异步通知,使用timer_gettime()可以监视计时器进展。

SIGEV_SIGNAL,到计时器到期时,在进程中产生信号量,运行在进程上下文,会随机发给某个线程。

 SIGEV_THREAD,到计时器到期时,创建一个新的线程(在改进程内),执行用户处理函数。
 SIGEV_THREAD_ID,类似 SIGEV_SIGNAL,但信号量signal 发送到用户指定的线程,这个线程必须和调用线程在同一个进程中。

3. 定时器信号处理时机

和Singnal处理时机相同。以SIGEV_THREAD_ID方式为例,线程的运行状态不同信号的处理时机也不同。

  1. 用户线程运行在内核态。不会打断当前的执行流程,等到从内核态返回用户态的时候,先处理超时信号,在当前线程上下文运行用户注册的信号处理函数,然后再返回用户态执行之前的流程。
  2. 组塞在系统调用。

 1) 可被中断的系统调用。打断当前的阻塞状态返回用户态,在返回用户态时先处理超时信号,在当前线程上下文运行用户 注册的信号处理函数,然后再返回用户态,系统调用接口返回-1,并将错误码errno设置为EINTR。

        2) 不可被中断的系统调用。不打断当前的系统调用,等待系统调用自己返回,等到从内核态返回用户态的时候,先处理超时信号,在当前线程上下文运行用户注册的信号处理函数,然后再返回用户态执行之前的流程。

4. 通知信号

    系统默认的超时通知方式为SIGEV_SIGNAL,信号为SIGALRM,应用也可以自定义超时通知信号。

5. 时钟超限

       当一个timer到期并且上一次到期时产生的信号还处于挂起状态时,不会产生新的信号(即丢弃一个信号),这就是定时器超限(overrun), 丢弃的信号数量就是 overrun count。

        对于一个给定的timer,无论用户使用实时还是非实时信号,在任何时间点只能有一个信号在进程中排队,这是POSIX.1-2001中指定的,因为不这样做,排队信号的数量很容易达到系统的上限。因为系统调度延迟或者信号被暂时阻塞都会造成信号产生到信号被发送( (e.g., caught by a signal handler))或者接收((e.g., using sigwaitinfo(2)))之间有一个延迟的时间段,在这个时间段中可能会有多次的timer到期。

       程序可以通过调用timer_getoverrun来确定一个指定的定时器出现这种超限的次数, 从而精确能精确的计算出在给定时间内timer到期了多少次。定时器超限只能发生在同一个定时器产生的信号上。多个定时器,甚至是那些使用相同的时钟和信号的定时器,所产生的信号都会排队而不会丢失。如果超限运行的次数等于或大于 {DELAYTIMER_MAX},则此调用会返回 {DELAYTIMER_MAX}。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值