schedule_timeout与mdelay

schedule_timeout  该方法相当于设置一个timer,然后schedule,timer到期后process_timeout会调用wake_up_process唤醒进程。不会修改进程状态,依然为TASK_RUNNING,不会把这个task从runqueue中移出去。那么当系统进行调度的时候这个进程仍然会被调度进来,因此一般调用前要set_current_state(TASK_INTERRUPTIBLE);然后让需要延迟的任务睡眠到指定的延时时间耗尽后在重新运行。

schedule_timeout有可能被signal打断,导致delay的时间小于预期

mdelay可以确保等待的时间大于等于参数设置的时间,在一些hardware驱动当中使用的delay,安全起见,一般推荐使用mdelay或者usleep_range函数。

msleep函数不会导致cpu忙等,时间不如mdelay精确,一般会大于设置的时间。底层实现是调用schedule_timeout

msleep_interruptible有可能会在延迟到一半时被信号打断退出

用户态的msleep底层会调用hrtimer_nanosleep来实现

推荐调用

Schedule_timeout_interruptible

Schedule_timeout_uninterruptible

Schedule_timeout_killable

这几个函数都会在调用schedule_timeout之前调用set_current_state,来把进程的状态设置为非TASK_RUNNING得状态。

其中msleep就是调用schedule_timeout_uninterruptible,ps查看进程为“D”状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值