Linux 内核中的进程管理
Process Management in Linux Kernel
我一直在研究Linux内核的子系统。那里写到 Linux 内核负责 上下文切换(让另一个进程使用 CPU)。以下是内核进行上下文切换的步骤:
- CPU(实际硬件)根据当前进程中断
在内部计时器上,切换到内核模式,并交出控制权
回到内核。
- 内核记录了CPU和内存的当前状态,这
对于恢复刚刚中断的进程至关重要。
- 内核会执行在运行期间可能出现的任何任务
之前的时间片(例如从输入和输出收集数据,
或 I/O,操作)。
- 内核现在准备让另一个进程运行。内核分析
准备好 运行 并选择一个的进程列表。
- 内核为这个新进程准备内存,然后准备CPU。
- 内核告诉CPU新进程的时间片有多长
会持续。
- 内核将 CPU 切换到用户模式并交出控制权
CPU 到进程。
我的问题是我无法理解上面的第 3 步。有人可以阐明这句话吗?谢谢!
- 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" 不是任务切换本身的一部分。
- 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 状态的各个部分.
- 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")。
- 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.
有点;但它不像列表那么简单,有时(例如,高优先级实时线程解除阻塞并抢占一个不太重要的任务)内核知道它需要切换到哪个任务而不需要做任何额外的事情。
- 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 状态未加载且未保存)。
- The kernel tells the CPU how long the time slice for the new process will last.
是的。
- 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" 不是任务切换的一部分。
我一直在研究Linux内核的子系统。那里写到 Linux 内核负责 上下文切换(让另一个进程使用 CPU)。以下是内核进行上下文切换的步骤:
- CPU(实际硬件)根据当前进程中断 在内部计时器上,切换到内核模式,并交出控制权 回到内核。
- 内核记录了CPU和内存的当前状态,这 对于恢复刚刚中断的进程至关重要。
- 内核会执行在运行期间可能出现的任何任务 之前的时间片(例如从输入和输出收集数据, 或 I/O,操作)。
- 内核现在准备让另一个进程运行。内核分析 准备好 运行 并选择一个的进程列表。
- 内核为这个新进程准备内存,然后准备CPU。
- 内核告诉CPU新进程的时间片有多长 会持续。
- 内核将 CPU 切换到用户模式并交出控制权 CPU 到进程。
我的问题是我无法理解上面的第 3 步。有人可以阐明这句话吗?谢谢!
- 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" 不是任务切换本身的一部分。
- 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 状态的各个部分.
- 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")。
- 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.
有点;但它不像列表那么简单,有时(例如,高优先级实时线程解除阻塞并抢占一个不太重要的任务)内核知道它需要切换到哪个任务而不需要做任何额外的事情。
- 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 状态未加载且未保存)。
- The kernel tells the CPU how long the time slice for the new process will last.
是的。
- 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" 不是任务切换的一部分。