我正在尝试编写一个进程管理器,它使用实时调度策略 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 策略的进程没有在下一个进程开始之前完成它们的全部任务?
最佳答案
来自 sched_setscheduler()
的手册页,
对于根据 SCHED_FIFO
策略安排的进程,以下规则适用:
一个
SCHED_FIFO
进程已被另一个进程抢占 更高的优先级将保留在其优先级列表的头部 并将在更高级别的所有进程恢复后立即恢复执行 优先级再次被阻止。当
SCHED_FIFO
进程变为可运行时,它将被插入到 优先级列表的末尾。调用
sched_setscheduler()
或sched_setparam()
将把SCHED_FIFO
进程开始时由 pid 标识 如果它是可运行的列表。因此,它可能会抢占 当前正在运行的进程,如果它具有相同的优先级。 (POSIX.1-2001 指定进程应该结束 列表。)调用
sched_yield()
的进程将放在 列表。
Rule1 and Rule3 indirectly imply that
SCHED_FIFO
guarantees FIFO behaviour ONLY if another process of higher priority does NOT get scheduled.
再往下 man page ,
Processes scheduled under one of the real-time policies have a
sched_priority
value in the range 1(low) to 99(high).
您的代码段中的以下代码行
child_param.sched_priority = BASE_CHILD_PRIORITY + i * 10;
为后面的进程设置更高的优先级。因此,它们倾向于抢占较早的过程。
<子>
注意:POSIX.1-2001 要求实现仅支持实时策略的最少 32 个不同的优先级,并且一些系统仅提供这个最小值。可移植程序应使用 sched_get_priority_min()
和 sched_get_priority_max()
来查找特定策略支持的优先级范围。
关于c - Linux 进程调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18544332/