Linux mdelay与msleep的区别以及中断中不能休眠的原因

 

在linux driver开发中,经常要用到延迟函数:msleepmdelay

虽然msleepmdelay都有延迟的作用,但他们是有区别的:

mdelay是忙等待函数,在延迟过程中CPU无法运行其他任务。最好用于短时间的延时,否则太浪费CPU资源。

msleep会使当前进程进入休眠状态,CPU可以去执行其他任务。由于msleep涉及到进程调度,延时误差比较大

(进程调度需要耗费时间)。msleep不能用于中断上下文,因为中断函数不能休眠。

至于中断为什么不能进入休眠,今天再网上查阅并总结了一下:

   中断处理的时候,不应该发生进程切换,因为在中断上下文中,唯一能打断当前中断handler的只有更高优先级的中断,

它不会被进程打断(这点对于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断上下文中休眠,

没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断上下文中,没有进程的概念,没有相应的

task_struct(这点对于softirqtasklet一样),因此真的休眠了,比如调用了会导致阻塞的例程,内核几乎肯定会死.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值