内核定时机制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);
}

你可能感兴趣的:(Linux,源码分析,kernel常用API源码分析)