上下文保护
当CPU在运行某个进程时遭遇中断或者发生进程切换,操作系统需要保存当前进程的执行状态,以便稍后能够恢复到该进程的执行点。这个过程叫做上下文保存(context saving),然后再进行相应的中断处理或调度其他进程。保存的数据不直接保存在进程的内部,而是保存在操作系统的管理区域(如进程控制块 PCB),并且包括当前CPU寄存器的内容、程序计数器等。
1. 中断和进程切换时的保存操作
在中断或进程切换时,操作系统需要将当前运行进程的执行状态(上下文)保存下来,以便后续恢复。保存的内容包括:
- CPU寄存器的值:包括通用寄存器、程序计数器(PC)、堆栈指针(SP)、状态寄存器(如标志寄存器)。
- 程序计数器(PC):它存储了当前正在执行的指令的地址。程序计数器的保存是为了确保中断处理或进程切换后,CPU能够从正确的地方继续执行。
- 堆栈:每个进程有一个堆栈,保存局部变量、函数调用的返回地址、调用参数等。当发生中断或进程切换时,堆栈内容也需要保存,以确保中断或进程恢复时能准确地恢复堆栈指针。
2. 保存的地方
-
进程控制块(PCB):操作系统为每个进程维护一个进程控制块(Process Control Block,PCB)。其中保存了进程的状态信息(如进程ID、优先级、调度信息、内存信息等)以及该进程的上下文信息。每当中断或进程切换发生时,操作系统会将当前进程的寄存器值、程序计数器、堆栈指针等保存到对应进程的PCB中。
具体来说,进程上下文通常包含以下内容:
- CPU的寄存器值(包括通用寄存器、程序计数器、堆栈指针等)。
- 进程的状态(如就绪、运行、阻塞)。
- 程序计数器(PC)的值。
- 堆栈信息。
- 其他内存管理相关的信息(如页表、段表等)。
-
中断处理的堆栈:当发生中断时,CPU会将当前的程序计数器和其他相关寄存器值压入系统堆栈,以备中断处理程序(ISR)执行完毕后恢复。中断服务程序执行完毕后,操作系统会根据中断信息将进程的状态恢复,从而继续执行。
3. 中断时的操作过程
-
触发中断:当发生中断(例如硬件中断或定时器中断)时,CPU会暂停当前正在执行的进程。
-
保存当前上下文:CPU会将当前的寄存器状态(包括程序计数器、堆栈指针、通用寄存器等)压入到系统堆栈或操作系统的管理区域。对于进程的上下文,操作系统会将其保存到对应进程的PCB中。
-
中断处理:操作系统会从中断向量表中找到对应的中断处理程序(ISR),并执行这个处理程序。中断处理可能包括硬件设备的处理、进程调度等。
-
恢复上下文:中断处理完成后,操作系统会根据中断发生时的上下文信息(通常保存在进程的PCB中),恢复CPU的寄存器值、程序计数器、堆栈指针等信息,从而恢复到中断发生前的状态。如果是进程切换,操作系统会从另一个进程的PCB中恢复其上下文,切换到新进程。
4. 进程切换时的保存操作
进程切换(或上下文切换)是操作系统调度算法的一部分。在进程切换时,操作系统需要保存当前进程的状态,并恢复下一个进程的状态。这个过程与中断类似,但不同的是,进程切换通常是在操作系统的调度程序控制下发生的。
进程切换的过程包括:
-
保存当前进程的上下文:操作系统会将当前进程的寄存器值、程序计数器、堆栈指针等保存在该进程的PCB中。
-
选择下一个进程:操作系统根据调度算法选择一个下一个进程(通常是就绪队列中的进程)来运行。
-
恢复下一个进程的上下文:操作系统会将下一个进程的上下文从该进程的PCB中恢复,并将CPU控制权转交给该进程。恢复的上下文包括寄存器值、程序计数器、堆栈指针等。
-
继续执行:CPU恢复下一个进程的状态后,它将从上次保存的程序计数器位置继续执行。
5. 总结:保存数据的位置
-
进程的内部存储:进程本身的内存空间(如堆栈、堆等)不会直接存储关于上下文切换的信息。这些内存区域用于存储程序运行过程中产生的数据、局部变量、堆栈帧等。
-
操作系统内部存储:实际保存上下文的地方是操作系统的内部数据结构,最主要的是进程控制块(PCB),它保存了与进程状态相关的所有信息,包括寄存器状态、程序计数器等。
因此,当中断或进程切换发生时,操作系统并不会直接保存数据到进程的内部存储(如堆栈或堆内存),而是将这些数据保存在**操作系统的控制结构(如PCB)**中,以便后续恢复。