Linux线程调度

时间:2017-08-24 18:38:37

标签: c pthreads embedded-linux scheduling

我在一个运行多个线程(pthreads)的嵌入式Linux系统上有一个进程。所有线程都是SCHED_FIFO类型。

为简单起见 - 假设线程T60优先级为60,T40优先级为40,T10优先级为10.每个线程都有一个printf,所以我可以看到谁在运行以及何时运行。

T60 psuedo代码:

while(1)
{
  sendmsg();
  printf("T60 pending");
  fflush(stdout);
  pend_for_reply();
  printf("T60 got reply");
  fflush(stdout);
  process reply();
}

T40 psuedo代码:

...
for(i=0;i<100;i++)
{
  printf("T40 executing for loop\n");
  fflush(stdout);
  NoStallFoo();
}

T10伪代码:

while(1)
{
  wdog_pet();
  printf("T10 Running\n");
  fflush(stdout);
  sleep(2);
}

我希望由于优先级,我永远不会在100 T40的块内看到T10输出。然而,我所看到的更像是: T60待定 T40执行循环
T40执行循环
T40执行循环
T40执行循环
T40执行循环
T40执行循环
...
T40执行循环
T10运行
T60得到了答复 T60待定
T40执行循环
T40执行循环
T40执行循环
T40执行循环
T40执行循环
....等等等等。

显然T40有工作要做,但不知怎的,优先级较低的T10能够运行。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

在调度算法中,

在每个循环中通过准备运行的进程列表

进程优先级在每个循环中通过列表递减,

直到该过程实际运行,

然后将'优先级重置回原始优先级