代码之家  ›  专栏  ›  技术社区  ›  Jamey Hicks

在Linux内核中何时使用内核线程与工作队列

  •  30
  • Jamey Hicks  · 技术社区  · 15 年前

    在Linux内核中有许多方法来安排工作:计时器、微线程、工作队列和内核线程。什么时候使用一个和另一个的准则是什么?

    有一些明显的因素:计时器函数和微线程无法睡眠,因此它们不能等待互斥体、条件变量等。

    在司机中选择哪种机制的其他因素是什么?

    哪些是首选机制?

    3 回复  |  直到 8 年前
        1
  •  28
  •   Michael F    15 年前

    正如你所说,这取决于手头的任务:

    工作队列将工作延迟到内核线程中-您的工作将始终在进程中运行 语境。它们是可调度的,因此可以睡觉。

    通常,工作队列或SOTFTIRQ/微线程之间没有争论;如果延迟的工作需要睡眠,则使用工作队列,否则使用软IRQ或微线程。微线程也更适合于中断处理(它们得到了某些保证,例如:微线程的运行时间永远不会晚于下一个时间点,它总是针对自身进行序列化等)。

    当您确切地知道您希望什么时候发生,并且不希望同时中断/阻塞进程时,内核计时器是很好的。它们在进程上下文之外运行,而且它们对于其他代码也是异步的,因此如果不小心的话,它们就是竞争条件的来源。

    希望这有帮助。

        2
  •  31
  •   user361697    14 年前
    SOFTIRQ:在中断上下文中延迟工作运行
    微线程:在中断上下文中延迟工作运行
    工作队列:进程上下文中延迟的工作运行
    
    SoftIRQ:不能在不同的CPU上同时运行
    微线程:不能在不同的CPU上同时运行
    工作队列:可以在不同的CPU上同时运行
    
    软IRQ:无法进入睡眠状态
    微线程:无法进入睡眠状态
    工作队列:可以进入睡眠状态
    
    SOFTIRQ:不能被抢占/调度
    微线程:不能被抢占/调度
    工作队列:可能被抢占/调度
    
    SoftIRQ:不易使用
    微线程:易于使用
    工作队列:易于使用
    
        3
  •  1
  •   TheLoneJoker    14 年前

    内核线程是工作队列的基础。它们是在进程上下文中运行的内核助手例程的唯一类型。