【问题标题】:What is the difference between tasklet and workqueuetasklet和workqueue有什么区别
【发布时间】:2013-08-19 19:44:36
【问题描述】:

我是一名 Linux 设备驱动程序新手,想知道taskletworkqueue 之间的确切区别。我有以下疑惑:

  1. 在中断/进程上下文中运行时,中断、tasklet 和工作队列使用哪个内核堆栈?
  2. tasklet 和 workqueue 将以什么优先级运行,我们可以修改它的优先级吗?
  3. 如果我实现自己的工作队列列表,我可以独立安排/确定优先级吗?

【问题讨论】:

    标签: c linux-kernel linux-device-driver tasklet workqueue


    【解决方案1】:

    小任务

    • 很旧(我相信大约 2.3)
    • 拥有简单明了的 API
    • 专为低延迟而设计
    • 不能休眠(在软 IRQ 上下文中以原子方式运行,并且保证不会在给定处理器的多个 CPU 上运行,对于给定的 tasklet)

    工作队列

    • 较新(在 2.5 中引入)
    • 拥有灵活的 API(支持更多选项/标志)
    • 专为更高的延迟而设计
    • 可以睡觉了

    底线是:将 tasklet 用于仍必须在硬 IRQ 上下文之外执行的高优先级、低延迟的原子任务。

    您可以使用tasklet_hi_enable/tasklet_hi_schedule(而不是它们各自的 no-_hi 版本)来控制某些级别的优先级。来自this IBM page

    普通优先级调度是通过TASKLET_SOFTIRQ级软中断执行的,其中高优先级是通过HI_SOFTIRQ级软中断。

    ...

    首先服务于高优先级向量中的小任务,然后是法线向量上的小任务。请注意,每个 CPU 都维护自己的正常和高优先级软中断向量。

    对于工作队列,在创建工作队列时,您将使用alloc_workqueuecreate_workqueue 已弃用)和can pass a flag 要求更高的优先级:

    WQ_HIGHPRI:

    highpri wq 的工作项排入队列的 highpri 线程池 目标 gcwq。 Highpri 线程池由工作线程提供服务 良好的水平。

    请注意,normal 和 highpri 线程池不会与每个线程池交互 其他。每个都维护其单独的工人和工具池 其工作人员之间的并发管理。

    我无法回答您的所有问题,但我希望这对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      相关资源
      最近更新 更多