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

Ada*_*ths 13 linux process

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

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

Ste*_*itt 43

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

其结果,

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

不是问题:Linux 是一种抢占式多任务操作系统,它可以在不需要运行程序的合作下进行多任务处理。

当涉及到杀死进程时,无论如何都涉及内核。如果一个进程想要杀死另一个进程,它必须调用内核来这样做,因此内核处于控制之中。如果内核决定杀死一个进程(例如OOM 杀手,或者因为该进程试图做一些它不允许做的事情,例如访问未映射的内存),它也处于控制之中。

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

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


phu*_*clv 11

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

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

另请参阅“linux kernel is preemptive”是什么意思?

  • 一些小问题。内核在返回用户空间时不一定会更改进程;它返回到下一个选择运行的进程,这可能与以前相同。“抢占式”在“抢占式多任务”和“抢占式内核”中的含义有些不同——前者是进程被抢占;在后者中,内核被抢占。Linux 一直使用抢占式多任务处理,但内核本身仅从 2.5.4 开始就具有抢占性(我怀疑您知道这一点,但从您的回答中并不清楚是否存在差异)。 (9认同)