我有一个使用 boost asio 的应用程序,我想用它poll()
来检测就绪的网络事件(数据包)并尽快处理它们。
另外,我想在这个过程中使用 SCHED_FIFO (这是单线程的)尝试控制抖动(我试图解决的主要问题..)
现在的限制是,内核是 2.6.32(没有实时补丁)。这还有一个额外的问题,即有一些内核进程在我的应用程序运行的核心上运行,我无法移出(即内核不运行)似乎没有真正的隔离 - 我知道这出现在更高版本的内核中 - 但我还不能升级到那个。)
所以,现在如果我不友好,我会执行以下操作:
while(some_condition)
service.poll();
该进程将旋转核心,并且由于设置了 SCHED_FIFO,因此它永远不会放弃需要在该核心上运行的其他内核进程,并且会发生各种不可预测的不良情况。现在我的问题是,如何执行此轮询循环并确保我放弃以便其他线程至少运行一点?
我看到两个选择,
- 某种睡眠
- 如果 没有处理任何事件
poll()
,我可以run_one()
只调用一个事件的哪些块,但这里的问题是这个事件可能是我想要的数据包,现在我又抖动了......
我是否错过了其他方法?
答案1
我没用过Boost::asio
,但乍一看好像想用.run()
又不想用.poll()
。正如 Patrick 指出的,规范的poll()
系统调用可以被动地阻塞,而asio::poll()
显式地不会(要求您忙循环),但是run()
做:
run() 函数会阻塞,直到所有工作完成并且不再需要分派处理程序,或者直到 io_service 停止为止。
当然,如果您正在处理无情的数据包流,这并不能解决问题——但我认为您已经被逼到了一个角落。如果系统必须定期使用该核心,并且您也必须仅使用该核心,并且放弃它会给您的处理带来延迟,那么这是一个困难的地方。