Sleep与delay

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 以上

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值