【问题标题】:Linux Scheduler FIFO don't work as expectedLinux 调度程序 FIFO 无法按预期工作
【发布时间】:2012-10-14 07:31:25
【问题描述】:

我想这样使用调度器:

示例

  • 3 个不同优先级的 pthread(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 );

但它不起作用。

行为:

pthread 的执行顺序与它们创建时的顺序相同。

【问题讨论】:

  • 使优先级为 99 的线程成为一个不执行任何 I/O 的忙等待循环;你的问题还存在吗?还要验证您的程序是否以超级用户权限运行。

标签: linux pthreads scheduled-tasks scheduler


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    即使您只有一个内核,许多操作系统调度程序也具有抗饥饿算法,可以逐渐提高低优先级线程的动态优先级,以便它们最终能够运行(有点)。如果低优先级线程获得锁,然后被抢占然后无法继续,则此方案可以帮助过载的盒子,从而导致其他地方出现问题(优先级反转)。

    如果您希望在发布时出现这种“奇怪”的行为,则必须使用合适的线程间通信对其进行实际编码,以防止其他线程在重要线程运行时运行。

    编辑:

    'pthread 的执行顺序与它们创建时的顺序相同' - 你怎么知道的?线程做什么?它们会永远运行吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多