我们有在循环中使用sched_yield
的代码。当我们这样做时,我们似乎得到了其他线程的较慢性能,特别是那些涉及内核调用(如IO和互斥/事件处理)的线程。我正试图确定这种行为的确切原因。
对sched_yield
的过度调用会导致内核出现瓶颈吗?
我的怀疑是,如果我们不断要求内核检查其进程列表,那么其他线程将受到影响,因为关键数据结构可能会被连续锁定 - 而如果我们没有调用sched_yield
那些内核锁将倾向于无可争议。这是否有意义,或者反复拨打sched_yield
是否完全可以。
答案 0 :(得分:6)
查看Linux的sched_yield
手册页:
避免调用sched_yield() 不必要或不恰当地(例如,当其他人需要资源时) 可调度线程仍然由调用者保持),因为这样做会导致 在不必要的上下文切换中,这将降低系统性能。
在紧密循环中调用它会导致问题。降低你打电话的速度。
(并检查您是否需要首先调用它。调度程序通常会自行完成正确的事情。)
如果你有一个低优先级的线程,你会发现有趣的其他选项:
sched_setscheduler
- 可能SCHED_IDLE
或SCHED_BATCH
(影响整个过程)thread_setschedparam
- 每个帖子,但可能会限制您可以使用的政策(目前无法找到)。当然是好的nice
命令。