内核内置的调度器是程序还是进程?

Is the scheduler built into the kernel a program or a process?

我查阅了 CPU 内核内置的调度程序源代码。 https://github.com/torvalds/linux/tree/master/kernel/sched

但是我有一个问题。 网上对cpu调度器褒贬不一

  1. 我看到有人认为 CPU 调度程序是一个进程。

问题:如果是这样,当 ps-ef on Linux 时,调度程序进程应该是可见的。很难找到调度程序进程的 PID 和名称。 CPU 调度程序进程的 PID 也不在 Internet 上。但是PID 0的SWAPPER进程被称为SCHED,但是在Linux中,PID 0作为空闲进程运行。

  1. 我看到有人认为 CPU 调度程序不是进程。 CPU调度器是内核内置的被动源代码,用户进程频繁进入内核轮换源代码。

问:用户进程如何自行执行内核的调度程序源代码? 如果您创建一个用户程序而不使用内核的调度程序添加系统调用怎么办? 没有这样的代码,用户进程如何在内核中自轮调度器?

您有 2 个类似的问题 ( and I want to know how to implement the cpu scheduling process in Linux operating system),所以我会在这里回答这两个问题。

答案是根本不是那样的。用户模式进程不会使用系统调用来调用调度程序。调度程序不是系统调用。有些定时器被编程为在经过一段时间后抛出中断。使用寄存器访问定时器,这些寄存器是 RAM 中的内存,通常称为内存映射 IO (MMIO)。您写入 ACPI 表 (https://wiki.osdev.org/ACPI) 指定的 RAM 中的某个位置,它将允许控制 CPU 或外部 PCI 设备中的芯片(现在 PCI 就是一切)。

当定时器到0时,会触发中断。中断由硬件抛出(CPU)。因此,CPU 包含特殊机制,让 OS 确定它在中断时跳转的位置 (https://wiki.osdev.org/Interrupt_Descriptor_Table)。 CPU 使用中断来通知 OS 事件发生了。如果没有中断,OS 将不得不为一个特殊的内核进程保留至少一个处理器核心,该进程会不断轮询外围设备的寄存器和其他东西。将无法实施。此外,如果用户模式进程自己执行调度程序系统调用,内核将成为用户模式的奴隶,因为它无法判断进程是否已完成,并且进程可能会在 CPU 时间内自私。

我没有看源代码,但我认为调度程序也经常在某些 IO 完成时被调用(也在中断但不总是在定时器中断上)。我很确定调度程序不能被抢占。也就是说,当 schedule() 函数运行时,中断(和其他东西)将被禁用。

我认为您不能将调度程序称为进程(甚至不是内核线程)。调度程序可以由内核线程调用,这些内核线程由由于 bottom half 处理而产生的中断创建。在下半部分处理中,中断处理程序的上“一半”快速高效地运行,而下“一半”被添加到进程队列中并在调度程序决定它应该被调度时运行。这具有创建一些内核线程的效果。因此可以从内核线程调用调度程序,但并不总是从中断的下半部分调用。必须有一种机制来调用调度程序,而调度程序不必自己调度任务。否则,内核将停止运行。