内核——bug捕获和时间测量

  • bug捕获
    有一些函数假定在特定情况系被调用,或者假定在特定情况下不被调用,内核使用BUG_ON和BUG_TRAP宏来捕获这类条件不满足的地方。
    当传给BUG_TRAP的输入条件为假时,内核会打印出警告消息(warning message)。
    对于BUG_ON则打印错误信息,然后内核Panic。
    以下为示例:
BUG_ON(v.counter != r);
BUG_TRAP(session->status.detached);
  • 时间测量
    内核很多时候需要测量从给某一个时刻起过了多少时间。例如,一个CPU密集型任何(CPU-intensive),通常会在执行特定一段时间后释放CPU,当其被重新调度时,再继续其工作。即使内核支持内核抢占(kernel preemption)机制,在内核代码中,这点也非常重要。
    内核空间中的时间流逝,是通过滴答(tick)来计算的。一个滴答就是两个连读到期的定时器中断之间的时间长度。定时器会处理各种不同的任务,而且每秒会到期HZ次,HZ是一个变量,有体系依赖代码进行初始化,例如,在i386的机器上,它被初始化为每秒1000次,也就是说,当Linux在i386上运行时,定时器每秒中断1000次,因此两个连续到期的定时器中断的时间长度就是1毫秒。
    每次定时器到期时,就会使一个名为jiffies的全局变量(unsigned long类型)递增,也就是说人任何时刻,jiffies代表的是从系统引导后所经过的滴答次数,通常值为n*HZ,代表的就是n秒的时间。
    如果一个函数所作的时间是测量经过的时间,就可以把jiffies的值保存在一个局部变量中,待任务完成后,再拿jiffies和当前时间戳做对比,得到一个时间间隔(以tick数表示),可以得到从测量时刻开始经过了多少时间。
    示例执行某段代码不超过一个滴答:
unsigned long start_time = jiffies;
int job_done = 0;
do {
	do_sth(&job_done);
	if (job_down)
		return;
} while (jiffies - start_time < 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值