【问题标题】:Process Management in Linux KernelLinux 内核中的进程管理
【发布时间】:2023-10-02 05:15:01
【问题描述】:

我一直在研究 Linux 内核的子系统。那里写道,Linux 内核负责上下文切换(让另一个进程使用 CPU)。以下是内核执行上下文切换的步骤:

  1. CPU(实际硬件)基于中断当前进程 在内部计时器上,切换到内核模式,并手动控制 回到内核。
  2. 内核记录CPU和内存的当前状态, 对于恢复刚刚中断的流程至关重要。
  3. 内核执行在运行期间可能出现的任何任务 之前的时间片(例如从输入和输出中收集数据, 或 I/O、操作)。
  4. 内核现在已准备好让另一个进程运行。内核分析 准备运行的进程列表并选择一个。
  5. 内核为这个新进程准备内存,然后准备 CPU。
  6. 内核告诉 CPU 新进程的时间片有多长 会持续下去。
  7. 内核将 CPU 切换到用户模式并控制 进程的 CPU。

我的问题是我无法理解上面的第三步。有人可以解释一下这句话吗?谢谢!

【问题讨论】:

  • 用户模式/内核模式(管理员模式)不是由内核关闭/打开,而是由页表条目中的标志确定。 (搜索用户/主管位)。关于第三个子弹,你有什么不明白的?
  • 哪些任务可以留给内核稍后执行?这个问题来自“内核执行任何可能在前一个时间片内出现的任务”这句话。
  • 每个中断都有自己的句柄,但一个简单的例子是在接收数据时将数据包从内核空间缓冲区复制到用户空间缓冲区。不必处于定时器中断状态

标签: linux linux-kernel operating-system multitasking


【解决方案1】:
  1. CPU(实际硬件)根据内部定时器中断当前进程,切换到内核模式,并将控制权交还给内核。

大多数任务切换是由任务阻塞引起的(因为它们必须等待互斥体、磁盘 IO、用户 IO、最终用户操作等)。

最好(更准确)说“某事”(IRQ,系统调用)会在内核决定要进行任务切换之前切换到内核的代码,并且这个“某事”不是任务切换本身。

  1. 内核记录 CPU 和内存的当前状态,这对于恢复刚刚中断的进程至关重要。

有点。因为“某事”(IRQ,系统调用)会在内核决定要进行任务切换之前切换到内核代码;所有任务切换只发生在内核代码(对于一个任务)和内核代码(对于另一个任务)之间。因为任务切换只会从内核代码切换到内核代码;任务切换本身不需要关心用户空间内存(这对内核的代码来说不是那么重要)或内核的内存(它是全局的/由所有 CPU 和所有虚拟地址空间共享)。更多的;因为有些寄存器是“被调用者保留的”(通过 C 调用约定),有些是“就内核而言是恒定的”(例如段寄存器),任务切换代码也不需要关心 CPU 状态的各个部分。

  1. 内核执行之前时间片内可能出现的任何任务(例如从输入和输出或 I/O 操作中收集数据)。

也不是任务切换的一部分(更多“在内核决定执行任务切换之前或之后发生的事情”)。

  1. 内核现在已准备好让另一个进程运行。内核分析准备运行的进程列表并选择一个。

有点;但它不像列表那么简单,有时(例如,高优先级的实时线程解除阻塞并抢占一个不太重要的任务)内核知道它需要切换到哪个任务而无需做任何额外的事情。

  1. 内核为这个新进程准备内存,然后准备 CPU。

为了记忆;内核大多只是加载一个新的“新任务虚拟地址空间的引用”(例如,80x86 上的单个 mov cr3, ... 指令)。对于 CPU 状态,它与上面的“2. The kernel records the current state of the CPU ...”相反(加载之前保存的内容,其中某些 CPU 状态未加载且未保存)。

  1. 内核告诉 CPU 新进程的时间片将持续多长时间。

是的。

  1. 内核将 CPU 切换到用户模式,并将 CPU 的控制权交给进程。

不是真的。最好(更准确)说在内核完成任务切换之后,新任务的内核代码做任何它想做的事情(并最终可能返回用户空间);并且“任务切换完成后发生的事情”不是任务切换的一部分。

【讨论】:

    最近更新 更多