我正在阅读How Linux Works: What Every Superuser Should Know,我读了以下有关上下文切换的内容:
- CPU(实际硬件)根据内部电路中断当前进程,切换到内核模式,并进行手动控制 回到内核。
- 内核记录CPU和内存的当前状态,这对于恢复刚刚中断的进程至关重要。
- 内核执行前一个时间片中可能出现的任何任务(例如从输入和输出中收集数据, 或I / O,操作)。
- 内核现在已准备好让另一个进程运行。内核分析准备运行的进程列表并选择一个进程。
- 内核为这个新进程准备内存,然后准备CPU。
- 内核告诉CPU新进程的时间片将持续多长时间。
- 内核将CPU切换到用户模式,并将CPU控制权交给进程。
醇>
我理解需要从CPU状态(寄存器值等)中保存的内容,但我不明白需要管理哪些内存。进程是否有自己的内存块,应该不受上下文切换的影响?
内核需要在上下文切换之间保存内存吗?
答案 0 :(得分:5)
在具有内存管理单元(MMU)的处理器上,关于内存的任务切换期间发生的主要事情是告诉MMU使用不同的虚拟地址空间。这假设目标任务具有不同的地址空间,即任务是不同的进程而不是同一进程中的不同线程。例如,在32位x86上,控制寄存器3(CR3)包含页面目录表的物理地址。在任务切换到其他进程期间,目标进程的相应CR3值将加载到CR3中,因此所有进一步的虚拟内存访问都将使用新的地址空间。
内存本身通常不会以任何方式保存,因为MMU用于保护页面,因此一个进程通常无法访问另一个进程内存。我总的说是因为有一些情况允许这样做,但这与这个问题无关。
在内存受限系统中,当需要更多虚拟内存并且没有更多可用物理内存时,内存页面可以存储到辅助存储(例如硬盘驱动器),但这通常不会在上下文中完成切换(虽然它可以),而是在需求的基础上完成。无论哪种方式,将内存存储到二级存储都不是上下文切换的重要部分。
最后关于以下陈述
内核记录CPU和内存的当前状态,这对于恢复刚刚中断的进程至关重要。
如果通过"记忆"该语句指的是控制虚拟到物理地址转换的MMU状态,然后在上下文切换期间可以保存。我说可能是因为通常进程的CR3值没有改变所以没有理由保存它,因为它已经知道了。如果语句指的是任务使用的实际内存,那么它就错了。
最后关于以下声明:
内核为这个新进程准备内存,然后准备CPU。
再次,如果通过"为新进程准备内存"它意味着设置MMU以使用新的虚拟到物理地址转换,然后在上下文切换期间确实发生。如果它意味着它从某个地方为新进程加载内存,那么由于MMU,这不需要发生。