我正在尝试编写一个使用实时调度策略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策略的流程在下一个流程开始之前不能完成其全部任务?
答案 0 :(得分:1)
来自sched_setscheduler()
的手册页,
对于在SCHED_FIFO
政策下安排的流程,以下规则适用:
已由另一个进程抢占的SCHED_FIFO
进程
优先级较高的优先级将保留在列表的首位
并且一旦所有进程更高,将立即恢复执行
优先级再次被阻止。
当SCHED_FIFO
进程变为可运行时,它将被插入
列表的优先级结束。
致电sched_setscheduler()
或sched_setparam()
即可
在pid开头标识的SCHED_FIFO
进程
列表是否可以运行。因此,它可能会抢先一步
当前正在运行的进程如果具有相同的优先级。
(POSIX.1-2001指定该过程应该结束
清单。)
调用sched_yield()
的流程将放在最后
列表
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()
来查找特定策略支持的优先级范围。
子>