Linux sched_降低了其他线程的速度

Linux sched_降低了其他线程的速度,linux,linux-kernel,Linux,Linux Kernel,我们的代码在循环中使用sched_yield。当我们这样做时,其他线程的性能似乎会降低,特别是那些涉及内核调用的线程(如IO和互斥/事件处理)。我正试图确定这种行为的确切原因 对sched_的过度调用是否会导致内核出现瓶颈 我的怀疑是,如果我们一直要求内核检查其进程列表,那么其他线程将受到影响,因为关键数据结构可能会被持续锁定——而如果我们不调用sched_yield,那么这些内核锁将倾向于不受挑战。这有意义吗,或者反复调用sched_yield可以吗?请看一下Linux的手册页: 避免调用sc

我们的代码在循环中使用
sched_yield
。当我们这样做时,其他线程的性能似乎会降低,特别是那些涉及内核调用的线程(如IO和互斥/事件处理)。我正试图确定这种行为的确切原因

sched_的过度调用是否会导致内核出现瓶颈

我的怀疑是,如果我们一直要求内核检查其进程列表,那么其他线程将受到影响,因为关键数据结构可能会被持续锁定——而如果我们不调用
sched_yield
,那么这些内核锁将倾向于不受挑战。这有意义吗,或者反复调用sched_yield可以吗?请看一下Linux的手册页:

避免调用sched_yield() 不必要或不适当地(例如,当其他人需要资源时) 可调度线程仍然由调用方持有),因为这样做会导致 在中,不必要的上下文切换将降低系统性能

在紧密循环中调用它会导致问题。降低你呼叫它的频率

(并检查您是否需要首先调用它。调度程序通常自己做正确的事情。)

如果您的线程优先级较低,您可能会发现其他值得研究的选项:

  • -使用
    SCHED_IDLE
    SCHED_BATCH
    可能(影响整个过程)
  • -每个线程,但可能对您可以使用的策略有限制(现在找不到)
当然也可以使用旧的命令。

看看Linux的手册页:

避免调用sched_yield() 不必要或不适当地(例如,当其他人需要资源时) 可调度线程仍然由调用方持有),因为这样做会导致 在中,不必要的上下文切换将降低系统性能

在紧密循环中调用它会导致问题。降低你呼叫它的频率

(并检查您是否需要首先调用它。调度程序通常自己做正确的事情。)

如果您的线程优先级较低,您可能会发现其他值得研究的选项:

  • -使用
    SCHED_IDLE
    SCHED_BATCH
    可能(影响整个过程)
  • -每个线程,但可能对您可以使用的策略有限制(现在找不到)

当然,也可以使用老命令。

在我们的系统中调用
sched_yield
的线程不会以任何方式阻塞其他线程。这个想法是,其他一些线程可能已经释放了一个资源,而该资源现在又解锁了另一个线程。因此,我不关心调用
sched_yield
的线程的性能损失,而只关心其他线程的性能损失。请阅读粗体部分:它不仅会降低调用线程的性能,还会降低系统性能。在Linux中,上下文切换相对较轻,但不是免费的。太多的时间会使整个系统慢下来。我想我得考虑其他的选择。也许我会问另一个问题。你需要另一个选择吗?你不能降低你发出系统调用的速率吗?那是第一个选择。最终,我只想要一个线程,它应该在任何给定时刻被现在可以处理的任何其他线程抢占(而不必等待整个时间片结束)。在我们的系统中,调用
sched_yield
的线程不会以任何方式阻塞其他线程。这个想法是,其他一些线程可能已经释放了一个资源,而该资源现在又解锁了另一个线程。因此,我不关心调用
sched_yield
的线程的性能损失,而只关心其他线程的性能损失。请阅读粗体部分:它不仅会降低调用线程的性能,还会降低系统性能。在Linux中,上下文切换相对较轻,但不是免费的。太多的时间会使整个系统慢下来。我想我得考虑其他的选择。也许我会问另一个问题。你需要另一个选择吗?你不能降低你发出系统调用的速率吗?那是第一个选择。最终,我只想要一个线程,它应该在任何给定时刻被现在可以处理的任何其他线程抢占(而不必等待整个时间片结束)。