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);
}
内核定时机制API之msleep 和 msleep_interruptible
最新推荐文章于 2023-05-04 20:09:00 发布