操作系统 上下文切换
上下文切换是操作系统用来在系统中切换进程状态以执行其功能的一种技术或方法,通过使用系统中的CPU来完成任务。当在系统中执行切换时,它以寄存器的形式存储旧的运行进程的状态,并将CPU分配给新的进程来执行其任务。当系统中运行一个新的进程时,之前的进程必须等待在就绪队列中。旧进程的执行从另一个进程停止的位置开始。它定义了多任务操作系统的特点,其中多个进程共享相同的CPU以执行多个任务,而无需额外的处理器。
上下文切换的需求
上下文切换有助于在所有进程之间共享单个CPU以完成其执行,并存储系统任务的状态。当进程重新加载到系统中时,进程的执行从存在冲突的位置开始。
以下是描述操作系统中上下文切换需求的原因:
- 在系统中,一个进程切换到另一个进程不是直接进行的。上下文切换帮助操作系统在多个进程之间切换,使用CPU资源来完成其任务,并存储其上下文。我们可以稍后在同一点恢复进程的服务。如果不存储当前运行进程的数据或上下文,切换进程时可能会丢失存储的数据。
- 如果一个高优先级进程进入就绪队列,当前运行的进程将被高优先级进程关闭或停止,以完成系统中的任务。
- 如果任何正在运行的进程在系统中需要I/O资源,当前进程将被另一个进程切换以使用CPU。当满足I/O需求时,旧进程进入就绪状态,等待在CPU中执行。上下文切换存储进程的状态以恢复其在操作系统中的任务。否则,进程需要从初始级别重新开始执行。
- 如果在操作系统中运行进程时发生任何中断,使用上下文切换将进程状态保存为寄存器。解决中断后,进程从等待状态切换到就绪状态,以稍后在操作系统中发生中断的同一点继续执行。
- 上下文切换允许单个CPU同时处理多个进程请求,而无需任何额外的处理器。
上下文切换的例子
假设有多个进程存储在进程控制块(PCB)中。一个进程处于运行状态,使用CPU执行其任务。当进程运行时,另一个进程到达就绪队列,具有高优先级,需要使用CPU完成任务。在这种情况下,我们使用上下文切换来将当前进程与需要CPU的新进程进行切换以完成其任务。在切换进程时,上下文切换将旧进程的状态保存在寄存器中。当进程重新加载到CPU时,它从新进程停止的位置开始执行。如果不保存进程的状态,我们必须从初始级别开始执行。通过这种方式,上下文切换帮助操作系统在进程之间进行切换,存储或重新加载进程,以在需要执行任务时执行。
上下文切换触发器
以下是上下文切换的三种触发器:
- Interrupts
- Multitasking
- Kernel/User switch
Interrupts :CPU请求从磁盘读取数据,如果有任何中断事件发生,上下文切换会自动切换到更快处理中断的硬件部分。
Multitasking :上下文切换是多任务的特性,允许将进程从CPU切换出去,以便运行另一个进程。在切换进程时,将保存旧状态,以便在系统中的同一点恢复进程的执行。
Kernel/User Switch :操作系统在用户模式和内核/用户模式之间进行切换时使用。
什么是PCB
PCB(进程控制块)是操作系统中用于存储与进程相关的所有数据信息的数据结构。例如,当在操作系统中创建一个进程时,PCB中会保存进程的更新信息、切换信息和终止进程。
上下文切换的步骤
上下文切换的过程涉及到几个步骤。下图表示当中断、I/O需求或基于优先级的进程出现在PCB的就绪队列中时,从P1切换到P2的上下文切换过程。
如图所示,最初,P1进程在CPU上运行以执行其任务,与此同时,另一个进程P2处于就绪状态。如果发生错误或中断,或者进程需要输入/输出,P1进程将其状态从运行状态切换到等待状态。在更改P1进程状态之前,上下文切换将P1进程的上下文保存为寄存器和程序计数器的形式, PCB1 。然后,它将P2进程的状态从 PCB2 的就绪状态加载到运行状态。
切换P1进程到P2进程的步骤如下:
- 首先,上下文切换需要将P1进程的状态以程序计数器和寄存器的形式保存到运行状态下的PCB(程序计数器块)中。
- 现在将PCB1更新为处理P1,并将进程移动到适当的队列,如就绪队列、I/O队列和等待队列。
- 之后,另一个进程进入运行状态,或者我们可以从就绪状态中选择一个新的要执行的进程,或者优先级较高的进程执行其任务。
- 现在,我们需要更新所选进程P2的PCB(进程控制块)。这包括将进程状态从就绪状态切换到运行状态,或者从阻塞、退出或挂起等其他状态切换。
- 如果CPU已经执行了进程P2,我们需要获取进程P2的状态,以便在系统中断发生的同一时间点恢复其执行。
类似地,将P2进程从CPU中切换出来,以便P1进程可以继续执行。将P1进程从PCB1重新加载到运行状态,以恢复其在同一点的任务。否则,信息将丢失,并且当进程再次执行时,它将从初始水平开始执行。