c - Linux 进程调度程序

标签 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 策略的进程没有在下一个进程开始之前完成它们的全部任务?

最佳答案

来自 sched_setscheduler() 的手册页,

对于根据 SCHED_FIFO 策略安排的进程,以下规则适用:

  1. 一个 SCHED_FIFO 进程已被另一个进程抢占 更高的优先级将保留在其优先级列表的头部 并将在更高级别的所有进程恢复后立即恢复执行 优先级再次被阻止。

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

  3. 调用 sched_setscheduler()sched_setparam() 将把 SCHED_FIFO 进程开始时由 pid 标识 如果它是可运行的列表。因此,它可能会抢占 当前正在运行的进程,如果它具有相同的优先级。 (POSIX.1-2001 指定进程应该结束 列表。)

  4. 调用 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/

相关文章:

c - OpenGL 旋转和缩放

python - 生成恰好有 1 个元素与组中其他集合相交的集合的算法

linux - 如何在旧版本的 Bash 上测试我的 Bash 脚本?

c++ - 如何发出包含 'suspicious' 和 '-Wmain' 字样的警告?

objective-c - 使用 getrusage

python - 如何在失败时自动重启 python 脚本?

c - -I GCC ( Linux ) 中的标志

linux - 为什么 tar 允许不带连字符的选项?

.net - 如何使用 .NET 以编程方式沙箱进程

c - ncurses 无法识别箭头键宏