我正在尝试编写一个使用实时调度策略 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 策略的进程没有在下一个进程开始之前完成它们的全部任务?