螺竹编程
发布于 2024-05-01 / 7 阅读
0

操作系统进程切换

何为进程切换

进程切换的实质是回收当前运行进程对CPU的控制权,并将控制权转交给新调度的就绪进程。

进程上下文

进程上下文是指操作系统在切换和管理进程时所保存和恢复的关键状态信息。它包括系统级上下文、寄存器上下文和用户级上下文。

  1. 系统级上下文(System-Level Context):系统级上下文是操作系统保存和恢复的进程相关的系统状态信息。这些信息包括进程标识符(PID)、进程状态(就绪、运行、阻塞等)、进程优先级、进程所属的用户、进程的权限和资源使用情况等。系统级上下文由操作系统维护和更新,并在进程切换时进行保存和恢复。

  2. 寄存器上下文(Register Context):寄存器上下文是保存和恢复进程在执行过程中寄存器的状态信息。寄存器是计算机中用于存储临时数据和执行指令的重要组成部分。这些寄存器包括程序计数器(Program Counter,PC)、栈指针(Stack Pointer,SP)、通用寄存器(如通用寄存器组、浮点寄存器等)和状态寄存器(如标志寄存器等)。保存和恢复寄存器上下文的目的是确保进程切换后能够正确继续执行。

  3. 用户级上下文(User-Level Context): 用户级上下文是进程在用户空间执行时所保存和恢复的状态信息。这些信息包括进程的堆栈、局部变量、打开的文件描述符、动态链接库状态等。用户级上下文由进程自身维护,并在进程切换时进行保存和恢复。操作系统只负责保存和恢复系统级上下文和寄存器上下文。

进程上下文的保存和恢复是操作系统进行进程切换和调度的关键步骤。当操作系统决定切换到另一个进程时,它会先保存当前进程的上下文信息,包括系统级上下文和寄存器上下文。然后,它会加载新进程的上下文信息,将其恢复到处理器中,从而使新进程能够继续执行。

进程上下文的切换是一种开销较大的操作,因为涉及到保存和恢复大量的状态信息。因此,在设计和实现操作系统时,需要尽量减少不必要的进程切换,以提高系统的性能和效率。

进程切换的时机

进程切换是操作系统中的重要概念,它发生在多个时机,包括中断、异常和系统调用。

  1. 中断(Interrupt): 中断是由外部事件触发的信号,它可以打断正在执行的进程并引发进程切换。例如,硬件设备完成数据传输、定时器到达指定时间、用户按下键盘等都可以触发中断。当中断事件发生时,处理器会暂停当前进程的执行,保存当前进程的上下文,并切换到相应的中断处理程序执行。中断处理程序完成后,操作系统可能选择继续当前进程的执行或切换到其他进程。

  2. 异常(Exception): 异常是由当前进程执行期间发生的错误或异常情况触发的事件。这些异常情况可能包括除零错误、访问非法内存、页面错误等。当发生异常时,处理器会暂停当前进程的执行,保存当前进程的上下文,并切换到相应的异常处理程序执行。异常处理程序可以处理异常情况,例如修复错误、恢复进程正常执行,或者终止当前进程。

  3. 系统调用(System Call): 系统调用是进程通过特定的指令请求操作系统提供服务和资源的机制。当进程需要执行特权操作或访问受限资源时,它会发起系统调用请求。例如,进程可能需要打开文件、创建进程、发送网络请求等。在系统调用期间,处理器会暂停当前进程的执行,保存当前进程的上下文,并切换到操作系统内核态执行相应的系统调用服务程序。系统调用完成后,操作系统会将结果返回给进程,并根据调度策略决定是否切换到其他进程。

进程切换的时机取决于具体的事件和操作系统的设计。中断和异常是由外部事件或进程内部错误触发的,它们通常需要立即处理,以确保系统的正确性和稳定性。而系统调用是由进程主动发起的,它在进程需要操作系统服务或资源时进行,可能会涉及更多的上下文切换和调度决策。

进程切换是操作系统实现并发和多任务的基础,它使得多个进程可以在共享资源的环境中交替执行,提高了系统的吞吐量和资源利用率。操作系统的调度器负责决定进程切换的时机和顺序,以满足不同进程的调度策略和优先级。

进程上下文切换

概念

进程切换发生时,当前运行进程让出其占用的CPU,由操作系统保存当前运行进程(旧进程)的上下文环境,并设置被进程调度程序选中的就绪进程(新进程)的上下文环境,这一过程称为进程的上下文切换。

上下文切换的步骤

进程上下文切换是操作系统在进行进程调度时,从一个正在执行的进程切换到另一个进程的过程。下面是一般情况下进程上下文切换的步骤:

  1. 保存当前进程的系统级上下文:操作系统首先保存当前进程的系统级上下文信息。这些信息包括进程标识符(PID)、进程状态(就绪、运行、阻塞等)、进程优先级、进程所属的用户、进程的权限和资源使用情况等。这些信息通常存储在进程控制块(Process Control Block,PCB)中。

  2. 保存当前进程的寄存器上下文:操作系统接下来保存当前进程的寄存器上下文信息。这些信息包括程序计数器(Program Counter,PC)、栈指针(Stack Pointer,SP)、通用寄存器(如通用寄存器组、浮点寄存器等)和状态寄存器(如标志寄存器等)。这些寄存器的值被保存在当前进程的 PCB 中,以便在切换回该进程时能够正确地恢复执行。

  3. 保存当前进程的用户级上下文:如果是用户级上下文的切换,操作系统会协助当前进程保存其用户级上下文。这包括进程的堆栈、局部变量、打开的文件描述符、动态链接库状态等。这些信息通常由进程自身维护。

  4. 加载新进程的系统级上下文:操作系统根据调度算法选择下一个要执行的进程,并加载其系统级上下文。这包括更新进程的标识符、状态、优先级等信息,并将其相应的 PCB 加载到内存中。

  5. 加载新进程的寄存器上下文:操作系统将新进程的寄存器上下文从其 PCB 中加载到处理器的寄存器中。这样,处理器就可以从新进程的上次执行位置继续执行。

  6. 加载新进程的用户级上下文:如果是用户级上下文的切换,操作系统会协助新进程加载其用户级上下文。这包括将新进程的堆栈、局部变量、打开的文件描述符、动态链接库状态等恢复到适当的状态。

  7. 恢复执行:在完成上述步骤后,处理器会从中断或异常处理的状态转换回正常执行状态。控制权被转移到新进程,它可以从恢复的上下文继续执行。

进程上下文切换是一个开销较大的操作,它涉及到保存和恢复大量的状态信息。因此,操作系统设计和优化时通常会尽量减少不必要的进程切换,以提高系统的性能和效率。