基本上,上下文切换是一种保存计算机当前状态并将其替换为新状态的方法。步骤大概是这样的:
- 进入特权模式,CPU将可以访问系统/内核内存
- 保存旧的程序计数器(现在我们知道任务切换事件发生时我们在哪里-可能是系统调用,可能是中断;基本上正在运行的进程被迫放弃控制权)
- 保存当前寄存器状态(在堆栈上,或在一组特定的OS分配和管理的内存中)
- 保存堆栈指针(如果架构包含一个)
- 通过将该进程使用的所有页面标记为符合驱逐条件来保存被暂停的任务的内存信息(如果下一个任务或操作系统需要旧进程正在使用的主内存,则将其复制到页面中)存储,然后将内存映射到正确的地址空间;否则,它们可能会徘徊,并在任务重新获得控制权时可用)
现在,OS可以执行自己喜欢的任何事情,因为它可以保存旧进程的瞬态状态,并且其内存是安全的。也许它可以处理中断或执行系统调用。我们将跳过所有这些,仅执行任务切换。
- 为新任务设置内存(将主内存映射到新进程的虚拟内存;某些内存可能已经在主内存中,如果没有使用太多内存,或者可能已将其调出到外部存储中)在这种情况下,当程序尝试引用它时将通过“页面错误”进行加载-程序将以与上述相同的方式挂起,操作系统将读取内存块,并且操作系统将恢复该过程)
- 从新进程的OS控制块或堆栈中加载寄存器状态
- 根据需要加载堆栈指针
- 退出特权模式
- 分支到新任务的最后一个挂起程序计数器或入口点
关键是操作系统负责保存状态;它针对CPU体系结构适当地管理此过程。寄存器不是“忙碌”的,因为任务切换过程会保存并恢复它们。失去控制然后重新获得控制的过程并不知道失去控制。它的世界状态可以无缝保存和恢复。