我试图满足一个软的实时需求,在Linux下,任务需要在<1ms内完成。目前,我正在使用4-8线程来尝试实现这一目标,但是在Linux下使用p线程的开销和延迟似乎不太适合短期任务(在线程运行时,pthread_create和pthread_join的延迟时间分别为100 s和100 s+一些奇怪的非确定性行为,可以增加100到200秒)。
因此,我想知道是否还有其他方法可以可靠地运行短异步任务,并且延迟相当低。任务通常是< 500 s,我需要它们都在1ms内完成。我是否可以以某种方式直接使用内核线程(k线程)(例如,对任务数据使用共享内存)?或者是基于中断的东西?
背景信息
我已经尝试过在Linux上使用线程来处理调度选项。无论线程优先级如何,SCHED_FIFO和SCHED_RR都会使情况变得更糟。但是,设置线程亲和力(pthread_set_affinity_np)有点帮助,因为它减少了内核之间的线程迁移。
当前的代码也在Mach上进行了测试(Mach基于BSD和Mach内核)--它可以很好地处理p线程,并且很容易满足<1ms的要求。
看来Linux上的线程在短时间线程方面没有得到很好的优化。根据本文的观点: Linux上的:十年浪费的核心线程存在许多问题,这似乎是由于在Linux调度程序中引入了多核支持的杂乱无章的方式造成的。我的问题似乎与论文中指出的四个问题中的任何一个无关,但它确实表明,Linux上的线程可能是一个牧师的蛋。
发布于 2016-04-29 14:00:34
在Linux下,任务需要在<1ms内完成
听着,这似乎不是很严格的要求。有许多低延迟的金融软件面临着更严格的要求。
互联网上有很多关于编写低延迟软件的建议,例如:
由于您在问题中提到了创建和删除线程,我认为您的中断了其中一个(将上下文切换降到最低)。我认为您应该让一个或几个线程忙着等待,而不是创建和加入。
发布于 2016-04-29 15:16:03
听起来你只需要一个线程池。与创建/销毁每个任务的线程不同,您可以让长时间运行的工作线程从队列执行任务,例如多生产者-多消费者模式。
我会从Intel TBB任务计划程序开始。
https://stackoverflow.com/questions/36937011
复制相似问题