内核定时机制API之msleep 和 msleep_interruptible

void msleep(unsigned int msecs) 用于睡眠一段时间。不能用于原子环境
其源码分析如下:
void msleep(unsigned int msecs)
{
	#可见timeout的时间是在形参的基础上再加一个jiffies,这也说明msleep 睡眠的后wakeup
	#的时间不是很准确,一般会在时间到期后的下一个jiffies再wakeup
	unsigned long timeout = msecs_to_jiffies(msecs) + 1;
	#可见sleep这段时间cpu没有忙等待,而是通过schedule把cpu让出来。
	while (timeout)
		timeout = schedule_timeout_uninterruptible(timeout);
}
与之相关的是msleep_interruptible,这个函数的作用也是sleep一段时间,但是可以被signal 唤醒,之前的函数就不能
其源码分析如下:
unsigned long msleep_interruptible(unsigned int msecs)
{
	unsigned long timeout = msecs_to_jiffies(msecs) + 1;
	#可见这里会通过signal_pending来检查是否有信号量,如果有信号量的话就退出while 循环,从而实现提前wakeup
	while (timeout && !signal_pending(current))
		timeout = schedule_timeout_interruptible(timeout);
	#这个函数由于可以被signal 唤醒,并不总是到了形参指定的时间,一次这里会返回已经sleep的时间
	return jiffies_to_msecs(timeout);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值