【问题标题】:Practical use of Linux real time scheduling priorities (SCHED_FIFO and SCHED_RR)?Linux 实时调度优先级(SCHED_FIFO 和 SCHED_RR)的实际使用?
【发布时间】:2012-05-12 10:58:13
【问题描述】:

我正在试验SCHED_FIFO,我看到了一些意想不到的行为。我使用的服务器有 12 个内核,禁用了超线程。所有可配置的中断都已设置为在 CPU 0 上运行。

我的程序开始使用 pthreads 库为较低优先级任务创建一个线程,而不更改调度策略,并将 CPU 亲和性设置为核心 0。然后父线程将其 CPU 亲和性设置为核心 3,并将其自己的调度策略设置为 SCHED_FIFO使用 sched_setscheduler() 和 pid 零和优先级 1,然后开始运行非阻塞循环。

程序本身运行良好。但是,如果我在程序运行时第二次尝试登录服务器,终端将无响应,直到我停止我的程序。这就像调度程序试图在与实时进程相同的核心上运行其他进程。

  1. 我错过了什么?
  2. 调度程序是否仍会尝试在运行实时进程的核心上运行其他进程?如果是这样,有没有办法防止这种情况发生?
  3. 在父级中使用sched_setscheduler() 设置调度策略会改变之前创建的子级的行为吗?

提前致谢。

【问题讨论】:

    标签: c linux kernel real-time scheduler


    【解决方案1】:

    sched_setscheduler 设置进程的调度程序,而不是线程。见:

    http://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html

    如果要为线程设置调度程序,则需要在创建新线程之前对新线程的属性对象使用pthread_attr_setschedpolicypthread_attr_setschedparam 函数。

    我不确定 Linux 在满足这些要求方面的一致性,但您至少应该首先确保您的代码符合规范,然后根据需要进行调整...

    【讨论】:

    • 感谢您的回复。你是对的,文档确实说 sched_setscheduler() 为进程而不是线程设置调度策略。但是,我在阅读此回复后使用 ps 运行了一些测试,并且为线程设置了正确的策略。这促使我进行了一些进一步的测试。最引人注目的问题之一是程序运行时登录需要很长时间。看起来新登录的 bash 会话最初设置为运行实时进程的 cpu。
    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2011-12-02
    • 2012-05-12
    相关资源
    最近更新 更多