Linux实时调度优先级(SCHED_FIFO和SCHED_RR)的实际用途是什么?

6
我正在尝试使用 SCHED_FIFO,但我看到了一些意外的行为。我使用的服务器有12个核心,并已禁用超线程。所有可配置中断都被设置为在CPU 0上运行。
我的程序启动时,使用pthread库创建了一个低优先级任务的线程,而不改变调度策略,并将CPU亲和力设置为core 0。然后,父线程将其CPU亲和性设置为core 3,自己的调度策略设置为SCHED_FIFO,使用sched_setscheduler(),pid为零,优先级为1,然后开始运行非阻塞循环。
程序本身运行良好。但是,如果我在程序运行时尝试第二次登录服务器,终端会无响应,直到我停止程序。就像调度程序试图在实时进程所在的同一核上运行其他进程一样。
以下是需要回答的问题:
  1. 我错过了什么?
  2. 调度程序是否仍会尝试在运行实时进程的核上运行其他进程?如果是,请问有什么方法可以防止这种情况发生?
  3. 在父进程中使用sched_setscheduler()设置调度策略是否会改变之前创建的子进程的行为?
谢谢。
1个回答

6

sched_setscheduler函数设置的是进程的调度器,而不是线程的。详情请看:

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

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

我不确定Linux是否完全遵守这些要求,但至少要确保代码符合规范,然后根据需要进行调整...


谢谢回复。你说得对,文档确实说明sched_setscheduler()设置进程的调度策略而不是线程的。然而,我在阅读这个回复后使用ps运行了一些测试,发现线程的策略被正确地设置了。这促使我进行了进一步的测试。其中最明显的问题之一是,在程序运行时登录需要很长时间。看起来新登录的bash会话最初被设置为运行实时进程的CPU。 - digby280

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接