时间子系统三——低精度定时器和高精度定时器

本文探讨Linux内核中的低精度和高精度定时器。低精度定时器基于jiffies,精度约4ms,而高精度定时器依赖硬件timer,提供纳秒级精度。通过测试代码对比,高精度定时器在中断上下文执行,超时精度在微秒级别,而低精度定时器在软中断或进程上下文,精度在毫秒级别。
摘要由CSDN通过智能技术生成

先有低精度定时器,后来引入了高精度定时器。低精度定时器只能提供毫秒级别的定时时间,因为它实际上是依赖于jiffies的,一个jiffies的时间,就是其能够提供的最小定时时间,比如CONFIG_HZ配置为250,那么一个jiffies就是4ms,所以低精度定时器的精度就是4ms;而高精度定时器则不一样,它不依赖于jiffies,甚至jiffies是依赖于高精度定时器的,因为jiffies的累加实际上也是通过一个特殊的高精度定时器来实现的,高精度定时器只依赖于硬件timer,所以可以提供纳秒级别的精度。那么除了从函数接口上看到的定时事件精度的差异之外,高精度定时器和低精度定时器还有哪些不一样呢?下面通过实例来探讨一下。

  • 高精度定时器测试代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/time64.h>
#include <linux/hrtimer.h>
#include <linux/timekeeper_internal.h>

#define GET_TIME_SAMPLES_CNT  32 

#define HRTIMER_TIMEOUT_NSECOND    1000000000

static int g_get_time_index = 0;
static struct hrtimer g_hrtimer;
static struct timespec64 current_time[GET_TIME_SAMPLES_CNT];

static enum hrtimer_restart timer_test_func(struct hrtimer *hrtimer)
{
	if(g_get_time_index >= GET_TIME_SAMPLES_CNT){
		printk("timer test done!\n");
		return HRTIMER_NORESTART;
	}
	hrtimer_forward_now(hrtimer, ns_to_ktime(HRTIMER_TIMEOUT_NSECOND));
	getnstimeofday64(&current_time[g_get_time_index++]);
	
	return HRTIMER_RESTART;
}

static int __init hrtimer_test_init(void)
{
	hrtimer_init(&g_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	g_hrtimer.function = timer_test_func;
	hrtimer_start(&g_hrtimer, ns_to_ktime(HRTIMER_TIMEOUT_NSECOND), HRT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值