实际使用Linux实时调度优先级(SCHED_FIFO和SCHED_RR)?

时间:2012-05-12 10:58:14

标签: c linux kernel real-time scheduler

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

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

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

  1. 我缺少什么?
  2. 调度程序是否仍会尝试在运行实时进程的核心上运行其他进程?如果是这样,有没有办法阻止这种情况?
  3. 在父级中设置sched_setscheduler()的调度策略是否会更改之前创建的子级的行为?
  4. 提前致谢。

1 个答案:

答案 0 :(得分:5)

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

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

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

我不确定Linux是否符合这些要求,但至少应该首先确保您的代码符合规范,然后根据需要进行调整......