有没有一种在内核友好的实时进程中进行轮询的好方法?

有没有一种在内核友好的实时进程中进行轮询的好方法?

我有一个使用 boost asio 的应用程序,我想用它poll()来检测就绪的网络事件(数据包)并尽快处理它们。

另外,我想在这个过程中使用 SCHED_FIFO (这是单线程的)尝试控制抖动(我试图解决的主要问题..)

现在的限制是,内核是 2.6.32(没有实时补丁)。这还有一个额外的问题,即有一些内核进程在我的应用程序运行的核心上运行,我无法移出(即内核不运行)似乎没有真正的隔离 - 我知道这出现在更高版本的内核中 - 但我还不能升级到那个。)

所以,现在如果我不友好,我会执行以下操作:

while(some_condition)
  service.poll();

该进程将旋转核心,并且由于设置了 SCHED_FIFO,因此它永远不会放弃需要在该核心上运行的其他内核进程,并且会发生各种不可预测的不良情况。现在我的问题是,如何执行此轮询循环并确保我放弃以便其他线程至少运行一点?

我看到两个选择,

  1. 某种睡眠
  2. 如果 没有处理任何事件poll(),我可以run_one()只调用一个事件的哪些块,但这里的问题是这个事件可能是我想要的数据包,现在我又抖动了......

我是否错过了其他方法?

答案1

我没用过Boost::asio,但乍一看好像想用.run()又不想用.poll()。正如 Patrick 指出的,规范的poll()系统调用可以被动地阻塞,而asio::poll()显式地不会(要求您忙循环),但是run():

run() 函数会阻塞,直到所有工作完成并且不再需要分派处理程序,或者直到 io_service 停止为止。

当然,如果您正在处理无情的数据包流,这并不能解决问题——但我认为您已经被逼到了一个角落。如果系统必须定期使用该核心,并且您也必须仅使用该核心,并且放弃它会给您的处理带来延迟,那么这是一个困难的地方。

相关内容