Linux驱动中使用的delay和sleep

1、二者区别
    (1)delay
        不主动放手,直接时间片到或者系统调用/中断发生,CPU的控制权被操作系统剥夺。
    (2)sleep
        主动放手,调用schedule()函数主动让出CPU控制权
        
2、sleep的两种类型
    (1)sleep————不能被信号唤醒
        进程状态为:TASK_UNINTERRUPTIBLE
    
    (2)sleep_interrupt————能被信号唤醒
        进程状态为:TASK_INTERRUPTIBLE


3、sleep的实现    
    (1)主要在Linux内核timer.c中实现
        /**
         * msleep - sleep safely even with waitqueue interruptions(安全的休眠,线程在等待队列中不会被打扰)
         * @msecs: Time in milliseconds to sleep for
         */
        void msleep(unsigned int msecs)
        {
            unsigned long timeout = msecs_to_jiffies(msecs) + 1;

            while (timeout)
                timeout = schedule_timeout_uninterruptible(timeout);
        }

        EXPORT_SYMBOL(msleep);

        /**
         * msleep_interruptible - sleep waiting for signals
         * @msecs: Time in milliseconds to sleep for
         */
        unsigned long msleep_interruptible(unsigned int msecs)
        {
            unsigned long timeout = msecs_to_jiffies(msecs) + 1;       /* 计算超时时间 */

            while (timeout && !signal_pending(current))                       /* 在该内核线程执行的过程中不停判断是否睡眠结束,以及是否有发给自己的信号 */
                timeout = schedule_timeout_interruptible(timeout);        /* 睡眠不超时,但是没有给自己的信号,那么就让出CPU控制权 */
            return jiffies_to_msecs(timeout);                                         /* 如果睡眠超时或者有给自己的信号被挂起,那么该内核线程被唤醒,获得CPU控制权 */
        }

        EXPORT_SYMBOL(msleep_interruptible);

3、delay的相关知识点
    (1)死等直到系统调用/中断到来或者时间片用完,CPU控制权被操作系统调度模块强行剥夺。
    (2)其实现,类似于spin lock获取锁的操作do{ 获取锁 } while(如果锁未获取)。其实就是类似与N年前写得裸机程序的延时函数。
    (3)主要在linux内核的delay.h中实现
        
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

denglin12315

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值