Linux进程调度程序

时间:2013-08-31 03:56:05

标签: c linux process scheduler

我正在尝试编写一个使用实时调度策略SCHED_FIFO来调度不同进程的进程管理器。我想要做的是设置进程的优先级,并根据优先级执行它们。

我有暂停的测试进程,等待进程管理器恢复,以便他们执行任务。

以下是测试过程的部分代码:

while(1) {
  kill(myPid, SIGTSTP); // pause process until resumed by scheduler
  printf("Process %s with PID %d and priority %d\n",
  argv[0], myPid, param.sched_priority);
  printf("Process %s processing...\n", argv[0]);
  k = 0;

  for (i = 0; i < 10000; i++) // do random task
  {
     for (j = 0; j < 10000; j++)
     {
        k++;
     }
  }
  printf("Process %s done.  Going to sleep.\n", argv[0]);
  sched_yield(); // yield the processor
}

以下是流程管理器的示例代码:

pid_t child[3]; // holds child processes
while(1)
{

    for (i = 0; i < num_child; i++)
    {
       kill(child[i], SIGCONT); // resume process
       child_param.sched_priority = BASE_CHILD_PRIORITY + i * 10; // set priority
       sched_setscheduler(child[i], SCHED_FIFO, &child_param); // set policy
    }

}

虽然我能够首先获得最高优先级,但是在生成处理器之前,进程并没有完全完成任务。我的问题的输出可以在下面看到。

Process 1 with PID 5975 and priority 79
Process 1 processing...
Process 2 with PID 5974 and priority 69
Process 3 with PID 5973 and priority 59
Process 2 processing...
Process 3 processing...
Process 1 done.  Going to sleep.
Process 2 done.  Going to sleep.
Process 3 done.  Going to sleep.

为什么具有SCHED_FIFO策略的流程在下一个流程开始之前不能完成其全部任务?

1 个答案:

答案 0 :(得分:1)

来自sched_setscheduler()的手册页,

对于在SCHED_FIFO政策下安排的流程,以下规则适用:

  1. 已由另一个进程抢占的SCHED_FIFO进程   优先级较高的优先级将保留在列表的首位   并且一旦所有进程更高,将立即恢复执行   优先级再次被阻止。

  2. SCHED_FIFO进程变为可运行时,它将被插入   列表的优先级结束。

  3. 致电sched_setscheduler()sched_setparam()即可   在pid开头标识的SCHED_FIFO进程   列表是否可以运行。因此,它可能会抢先一步   当前正在运行的进程如果具有相同的优先级。   (POSIX.1-2001指定该过程应该结束   清单。)

  4. 调用sched_yield()的流程将放在最后   列表

  5.   

    Rule1 Rule3 间接暗示SCHED_FIFO仅在另一个优先级较高的进程未获得时才保证FIFO行为   调度。


    再往下man page

      

    根据其中一个实时政策安排的流程的 sched_priority 值在1(低)到99(高)范围内。

    代码段中的以下代码行

    child_param.sched_priority = BASE_CHILD_PRIORITY + i * 10;
    

    为后面的流程设置更高的优先级。因此,他们倾向于抢占早期的过程。

    <子> 注意:POSIX.1-2001要求实施仅支持实时策略的至少32个不同优先级,有些系统只提供此最低要求。可移植程序应使用sched_get_priority_min()sched_get_priority_max()来查找特定策略支持的优先级范围。