要在Linux内核驱动程序中安排稍后的操作,我有两个选项:
add_timer queue_delayed_work 我所知道的一个区别是:对于计时器,您需要指定计时器到期时的jiffies值,因为延迟工作,您需要指定jiffies的延迟。
我一直在阅读有关定时器和work_queue的其他问题 ,并提到定时器在stream程上下文之外运行。 这与延误工作有何不同?
另外我知道定时器有一个问题,在计算expires ,可能会发生数值溢出,所以计算的值比当前的jiffies小,定时器立即过期(纠正我,如果我在这里错了)。 迟到的工作是否遭受同样的问题? 如果是这样,怎么办
对我来说,使用延迟工作似乎更容易(因为工作不是定期的)。 但是使用定时器有什么缺点?
编辑我做了一些进一步的研究。 看来queue_delayed_work只是add_timer内部使用add_timer 。
所以我的新问题是,如何正确处理定时器的溢出问题? 例如,我如何设置一个计时器/ delayed_work延迟10分钟?
正如我在我的问题中所述, queue_delayed_work只是add_timer内部使用add_timer 。 所以使用是平等的。
回答你的第二个问题。
从现在起10分钟,用于内核定时器:
// 10 minutes * 60 converts to seconds * 1000 converts to microseconds // msecs_to_jiffies converts the resulting microsecond delay to jiffies // which is added to the current time (system variable jiffies) jiffies + msecs_to_jiffies(10 * 60 *1000)
而对于排队延迟的工作,您只需使用10分钟的延迟部分:
msecs_to_jiffies(10 * 60 * 1000)
重新溢出 – 如果您需要自己比较jiffies,请参阅time_after和time_before(和其他)宏http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/jiffies.h#L93
在内核编程的情况下,当你的定时器/工作的回调函数需要睡眠,那么你必须使用delayed_work。 由于delayed_work在进程上下文中运行,您可以使用那些可能睡眠或倾向于在回调函数内部休眠的函数。 而在内核定时器的情况下,你不能使用那些睡觉或倾向于睡觉的功能。 结论:如果您的回调函数需要睡眠,则使用其他工作队列使用定时器/小程序。
希望能帮助到你 :)