static inline void sleep(unsigned sec)
{
current->state = TASK_INTERRUPTIBLE;
schedule_timeout(sec * HZ);
}
sleep,msleep,ssleep都是一开睡眠延时的方式来实现的,这种方式不占用cpu资源,他会使线程可以继续被调度
udelay,ndelay,mdelay,他们的实现都是一种忙等待。让cpu进行一定次数的循环,忙等待会占用cpu资源,delay的线程不会被调度
内核中最好不要使用mdelay().这会无谓的消耗cpu资源。udelay,ndelay只是为了在机制上配合硬件的短暂延时
之前的认识更正:
但是sleep()是会受到cpu的调度影响的,cpu很忙的时候sleep是很不准确的,比如msleep(10)。结果肯能会导致20-40ms的延时,sleep是一个很不精确的操作
但是dealy()却可以相对精确的延时,它霸占cpu不受调度的影响。所以,delay可以用,但是不要使用在频繁被调度的线程中,例如while(1)中,
他会不断调用delay(),这会使cpu的负载加大,导致性能降低。
在内核线程中一定要使用 msleep_interruptible( ) 来进行睡眠释放cpu,尽量不要使用msleep( )是毫秒级的不要微秒级的。
函数 延时单位 返回值 是否可被信号中断
msleep 毫秒 无 否 msleep_interruptible 毫秒 未完成的毫秒数 是
最主要的区别就是msleep会保证所需的延时一定会被执行完,而msleep_interruptible
则可以在延时进行到一半时被信号打断而退出延时,剩余的延时数则通过返回值返回。两个函数最终的代码都会到达schedule_timeout
函数
sleep的使用场景:
一般在内核线程中,最好使用一个可中断的msleep_interruptible(2)
,最好2ms以上。因为线程的调度节拍由HZ来决定,这个可以配置,一般为1000,即1ms。,所以sleep 1ms 会让cpu切换很吃力,
所以最好出让cpu 2ms 以上