Linux 如何在单核机器上保持对 CPU 的控制?

Linux 如何在单核机器上保持对 CPU 的控制?

Linux如何“杀死”一个进程?据解释,Linux 通过将内存返回到池来杀死进程。

在单核机器上,它实际上是如何做到这一点的?它必须需要 CPU 时间来杀死一个进程,并且如果该进程正在执行一些极长时间运行的计算而没有屈服,那么 Linux 如何获得对处理器足够长的控制权以杀死该进程?

答案1

内核在正常操作中非常频繁地获得控制权:每当进程调用系统调用时,以及每当发生中断时。当硬件需要 CPU 的关注时,或者当 CPU 需要内核的关注时,就会发生中断,并且可以对一个特定的硬件进行编程以定期请求关注(计时器)。因此,内核可以确保,只要系统没有严重锁定而不再生成中断,它就会被定期调用。

因此,

如果该进程正在执行一些极长时间运行的计算而没有产生

不是一个问题:Linux 是抢占式多任务处理操作系统,IE它无需运行程序的合作即可执行多任务。

当涉及到终止进程时,内核无论如何都会参与其中。如果一个进程想要杀死另一个进程,它必须调用内核来执行此操作,因此内核处于控制之中。如果内核决定终止一个进程(例如OOM 杀手,或者因为进程尝试执行不允许执行的操作(例如访问未映射的内存),它也处于控制之中。

请注意,内核可以配置为不是控制系统 CPU 本身的子集(使用已弃用的isolcpus内核参数),或者不在某些 CPU 本身上调度任务(使用中央处理器组无需负载平衡,它们完全集成在cgroup v1cgroup v2);但系统中至少有一个CPU必须始终完全由内核管理。还可以被配置减少生成的定时器中断的数量,具体取决于给定 CPU 的用途。

单CPU(单核等)系统和多CPU系统之间也没有太大区别,就内核控制而言,同样的问题也适用于两者:每个CPU都需要定期调用内核(如果它是)。用于内核控制下的多任务处理。

答案2

Linux 和大多数现代操作系统都使用抢占式多任务处理这意味着内核可以完全控制每个进程允许运行的时间,并且如果运行时间过长,内核将抢占进程,这与协作式多任务处理进程将随时传递控制权

基本上,在抢占式多任务处理中,内核将定期从计时器中触发,并且每当内核处于控制状态时(当发生计时器中断或调用系统调用时),内核将保存当前进程的上下文,然后切换到下一个进程' 如有必要,请提供上下文。这就是所谓的上下文切换进程的整个状态(包括所有线程信息、寄存器值等)都会被保存和恢复,以使进程从被抢占的确切点继续运行,甚至不知道它没有连续运行。因此,许多进程将出现在单个 CPU 核心中同时运行,即使实际上任何时候只有 1 个进程正在运行。内核也只是一个特殊的进程,它负责所有的进程和资源处理。它不是从单独的核心运行只是为了监视其他进程

也可以看看“Linux 内核是抢占式的”是什么意思?

答案3

在一些奇怪的情况下(嵌入式设备,也许树莓派基于)你可以有一个 Linux 内核(看内核.org&kernelnewbies.org详情)管理非常有限的一组流程

您甚至可以编写自己的/sbin/init程序

那么您就可以完全控制这组流程。

(看初始化(1))这样它叉子(2)-s 很少的子进程并使用其他进程系统调用(2)

操作系统教科书应该会给你更多的见解,并且通过从源代码编译 Linux 内核你会学到很多东西。第一个运行的命令可能是make menuconfig(在本地磁盘上拥有整个 Linux 内核树之后)。另请阅读高级Linux编程信号(7),时间(7),VDS(7)

然而,请注意,到 2020 年,大多数 Linux 处理器至少有两个内核。许多Linux系统都在使用系统,其源代码是开源(并且您可以研究它并改进它)。其他Linux系统可以使用运行(也是开源的)。借助现有init程序的细心和灵感,您可以编写自己的程序。

您可能想看看Linux 从头开始,并研究你的源代码crt0例程,以及GNU 库(这是自由软件, 喜欢海湾合作委员会GNU binutilsGNU bash是!)或musl-libc 库

一个相关的概念是延续(具体化的一个奇特名称调用栈)和呼叫/抄送方案的原语。所以读R5RS,ACM信号计划会议记录(例如PLDI),奎内克的书Lisp 的小片段,以及皮特拉特的书人造生物也许还有这个草案报告(由战车)。意识到赖斯定理

如果你使用海湾合作委员会,不要忘记编译你的foo.c代码,然后 gcc -Wall -Wextra -fverbose-asm -S foo.c查看内部foo.s

OSDEV网站还提供了有关编写(和研究其源代码)操作系统内核的实用信息。您可能会对奇点软件和FOSDEMACM 西格普斯会议。

您可能想要使用/proc/(请参阅过程(5))然后你可以观察到你的 Linux 内核正在处理中断经常(通常每秒数百个中断)。每个中断(例如由高温PET)是(对于 Linux 内核)调度其他进程的机会。

如果您的硬件每秒不提供数百个中断,您应该与硬件的提供商或设计者讨论。

该进程正在执行一些非常长时间运行的计算而不产生任何结果

在 Linux 上,这种情况永远不会发生,除非你的内核或硬件有问题。

用户空间一个进程每秒至少被中断数十次(2020 年,在大多数硬件上)。阅读内核抢占上下文切换

观察上下文切换正在更改当前的延续。在抽象层面上,中断接近于某些call/cc中断方案

答案4

简单来说,内核是系统的绝对独裁者* 。它控制什么时候进程获取资源(通过成为抢占式多任务内核)并控制什么它获得的资源。 (进程请求资源,如果资源可用,内核就会向它们提供资源。如果资源不可用,则不会提供资源。)

作为绝对的独裁者,内核可以在认为需要时杀死它们。

*总会有例外和边缘情况。

相关内容