何时使用linux内核的add_timer vs queue_delayed_work

要在Linux内核驱动程序中安排稍后的操作,我有两个选项:

  • add_timer
  • queue_delayed_work

我所知道的一个区别是:对于计时器,您需要指定计时器到期时的jiffies值,因为延迟工作,您需要指定jiffies的延迟。

我一直在阅读有关定时器和work_queue的其他问题 ,并提到定时器在stream程上下文之外运行。 这与延误工作有何不同?

另外我知道定时器有一个问题,在计算expires ,可能会发生数值溢出,所以计算的值比当前的jiffies小,定时器立即过期(纠正我,如果我在这里错了)。 迟到的工作是否遭受同样的问题? 如果是这样,怎么办

对我来说,使用延迟工作似乎更容易(因为工作不是定期的)。 但是使用定时器有什么缺点?

编辑我做了一些进一步的研究。 看来queue_delayed_work只是add_timer内部使用add_timer

所以我的新问题是,如何正确处理定时器的溢出问题? 例如,我如何设置一个计时器/ delayed_work延迟10分钟?

Solutions Collecting From Web of "何时使用linux内核的add_timer vs queue_delayed_work"

正如我在我的问题中所述, 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在进程上下文中运行,您可以使用那些可能睡眠或倾向于在回调函数内部休眠的函数。 而在内核定时器的情况下,你不能使用那些睡觉或倾向于睡觉的功能。 结论:如果您的回调函数需要睡眠,则使用其他工作队列使用定时器/小程序。

希望能帮助到你 :)