背景:我正在编写网络流量处理内核模块。 我正在使用 netfilter Hook 获取数据包。所有过滤都是在钩子(Hook)函数内完成的,但我不想在这里进行数据包处理。所以解决方案是微线程或工作队列。我知道它们之间的区别,我可以同时使用它们,但是我遇到了一些问题,需要建议。
Tasklet 解决方案。最好。我可以创建并启动tasklet 每个数据包,但是谁会删除这个tasklet呢?小任务函数?我 不认为这是一个好主意 - 释放tasklet 执行。创建全局微线程池?好吧,既然不能 如果一个处理器上有 2 个正在执行的微线程,则池大小将为 处理器数量。但是如何知道tasklet何时可用 新用途?只有两种状态:棚和跑,但是有 没有“完成”状态。好吧,我可能可以用一些结构来包装 tasklet 与旗帜。但这会不会太过分了?
工作队列解决方案。同样的问题:谁会删除作品?与微线程相同的“解决方案”?
工作队列解决方案2。只需通过模块加载创建永久工作,将数据包保存到某个队列并在工作中处理它们。可能有两个工作和两个队列:传入和传出。但我担心,通过该解决方案,我将仅使用一个(或两个)处理器,因为看起来工作无法同时在几个处理器上执行。
还有其他解决方案吗?
最佳答案
可以使用高优先级( WQ_HIGH_PRI
)、未绑定(bind)( WQ_UNBOUND
)工作队列并坚持使用列在问题。
WQ_HIGH_PRI
保证尽快启动处理。 WQ_UNBOUND
消除了单 CPU 瓶颈,因为调度程序会立即将工作分配给任何可用的 CPU。
关于linux-kernel - 动态微线程或工作队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507308/