3

要安排稍后在 linux 内核驱动程序中发生的操作,我有 2 个选项:

  • add_timer
  • queue_delayed_work

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

我一直在阅读有关计时器和 work_queue 的其他问题,其中提到计时器在进程上下文之外运行。这与延迟工作有什么不同?

另外我知道定时器有问题,在计算时expires,可能会发生值溢出,所以计算的值小于当前的 jiffies 并且定时器立即过期(如果我错了,请纠正我)。延迟工作是否会遇到同样的问题?如果有,怎么做

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

编辑 我做了一些进一步的研究。它似乎queue_delayed_work只是在add_timer内部使用。

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

4

3 回答 3

3

在内核编程的情况下,当你的定时器/工作回调函数需要休眠时,你必须使用delayed_work。由于delayed_work 在进程上下文中运行,您可以使用那些可能在回调函数中休眠或倾向于休眠的函数。而在内核定时器的情况下,您不能使用那些休眠或倾向于休眠的功能。结论:如果您的回调函数需要休眠,请使用工作队列,否则请使用计时器/任务小程序。

希望能帮助到你 :)

于 2015-03-16T04:27:53.610 回答
2

正如我在问题中所说,queue_delayed_work只是在add_timer内部使用。所以用途是一样的。

于 2013-01-14T13:29:56.573 回答
2

回答你的第二个问题。

从现在开始 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

于 2014-09-25T21:23:56.550 回答