Linux Scheduler FIFO无法按预期工作

时间:2012-10-24 09:13:29

标签: linux pthreads scheduled-tasks scheduler

我想以这种方式使用调度程序:

示例

  • 3个不同优先级的pthreads(0,50,99)

如果带有99的pthread正在运行,则不允许运行其他pthread。 执行顺序应以优先级为导向

我的实施:

每个pthread都是使用该序列创建的

struct sched_param schedparam;  // thread scheduler parameter

pthread_create(threadPtr,NULL,(void *)entryPt,NULL);

pthread_attr_setschedpolicy(attrPtr, SCHED_FIFO);

schedparam.__sched_priority=priority;

pthread_attr_setschedparam(attrPtr, &schedparam );

pthread_setschedparam(threadId,SCHED_FIFO,&schedparam );

但它不起作用。

行为:

pthreads的执行顺序与创建顺序相同。

2 个答案:

答案 0 :(得分:1)

'pthreads的执行顺序与它们的创建顺序相同':如果你有三个或更多的可用内核,那么这就是预期的行为 - 所有线程都有不同的优先级,但是有足够的资源来运行它们,所以他们都跑了。

即使你只有一个核心,许多操作系统调度程序都有反饥饿算法,逐渐提高低优先级线程的动态优先级,以便它们最终能够运行(一点点)。如果低优先级线程已获得锁定,此方案可以帮助重载框,然后被抢占然后无法继续,导致其他地方出现问题(优先级倒置)。

如果你想要发布这样的'奇怪'行为,你必须使用合适的内部线程通信对其进行编码,以防止其他线程在重要线程运行时运行。

编辑:

'pthreads按照创建顺序执行' - 你怎么知道这个?线程做什么?他们会永远奔跑吗?

答案 1 :(得分:1)

假设你的线程没有被I / O阻塞或收益(请显示代码),这可能是由于:

  • 非超级用户线程不允许超过优先级19
  • sysctl设置限制每个线程可用的时间量,例如:
    • kernel.sched_rt_period_us = 1000000
    • kernel.sched_rt_runtime_us = 950000,允许线程每秒只运行95%。