Linux 内核中的进程管理

Process Management in Linux Kernel

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

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

我的问题是我无法理解上面的第 3 步。有人可以阐明这句话吗?谢谢!

  1. The CPU (the actual hardware) interrupts the current process based on an internal timer, switches into kernel mode, and hands control back to the kernel.

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

最好(更准确)说"something"(IRQ,系统调用)导致在内核决定要进行任务切换之前切换到内核代码,并且这个"something" 不是任务切换本身的一部分。

  1. The kernel records the current state of the CPU and memory, which will be essential to resuming the process that was just interrupted.

有点。因为"something"(IRQ,系统调用)导致在内核决定要进行任务切换之前切换到内核的代码;所有任务切换只会在内核代码(对于一个任务)和内核代码(对于另一个任务)之间发生。因为任务切换只会从内核代码切换到内核代码;任务切换本身不需要关心 user-space 内存(这对内核代码来说并不那么重要)或内核内存(所有 CPU 和 global/shared 和所有虚拟地址spaces)。更多的;因为有些寄存器是 "callee preserved"(根据 C 调用约定)而有些是 "constant as far as kernel is concerned"(例如段寄存器)任务切换代码也不需要关心 CPU 状态的各个部分.

  1. The kernel performs any tasks that might have come up during the preceding time slice (such as collecting data from input and output, or I/O, operations).

也不是任务切换的一部分(更多"things that happen before or after kernel decides to do a task switch")。

  1. The kernel is now ready to let another process run. The kernel analyzes the list of processes that are ready to run and chooses one.

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

  1. The kernel prepares the memory for this new process, and then prepares the CPU.

为了记忆;内核主要只是加载一个新的 "reference for new task's virtual address space"(例如 80x86 上的单个 mov cr3, ... 指令)。对于 CPU 状态,它与上面的“2. The kernel records the current state of the CPU ...”相反(加载之前保存的内容,其中某些 CPU 状态未加载且未保存)。

  1. The kernel tells the CPU how long the time slice for the new process will last.

是的。

  1. The kernel switches the CPU into user mode and hands control of the CPU to the process.

不是真的。更好(更准确)的说法是在内核完成任务切换后,新任务的内核代码会做任何它想做的事情(最终可能 return 到 user-space); "things that happen after task switch finished" 不是任务切换的一部分。