上下文切换(英语:context switch),又称环境切换,电脑术语,是一个存储和重建CPU的状态(上下文),因此令多个进程(process)可以分享单一CPU资源的计算过程。要切换CPU上的进程时,必须先行存储目前进程的状态,再将欲执行的进程之状态读回CPU中。 [1]
开销
编辑上下文切换通常是计算密集型的,操作系统中的许多设计都是针对上下文切换的优化。在进程间切换需要消耗一定的时间进行相关的管理工作——包括寄存器和内存映射的保存与读取、更新各种内部的表等等。处理器或者操作系统不同,上下文切换时所涉及的内容也不尽相同。比如在Linux内核中,上下文切换需要涉及寄存器(register)、栈指针(stack pointer)、程序计数器(program counter)的切换,但和地址空间的切换无关(虽然进程在进行上下文切换时也需要做地址空间的切换)[2][3]。用户态线程之间也会发生类似的上下文切换,但这样的切换非常轻量。
切换时机
编辑有三种可能的情况会发生上下文切换,分别为:
多工
编辑最常见的,在一些调度(scheduling)算法内,其中行程有时候需要暂时离开CPU,让另一个行程进来CPU运作。在先占式多工系统中,每一个行程都将轮流执行不定长度的时间,这些时间段落称为时间片。如果行程并非自愿让出CPU(例如执行I/O操作时,行程就需放弃CPU使用权),当时限到时,系统将产生一个定时中断,操作系统将排定由其它的行程来执行。此机制用以确保CPU不致被较依赖处理器运算的行程垄断。若无定时中断,除非行程自愿让出CPU,否则该行程将持续执行。对于拥有较多I/O指令的行程,往往执行不了多久,便需要让出CPU;而较依赖处理器的行程相对而言I/O操作较少,反而能一直持续使用CPU,便形成了垄断现象。
中断处理
编辑在接受到中断(Interrupt)的时候,CPU根据Interrupt种类决定是否要进行上下文切换。
用户态或者内核态的切换
编辑当用户态和内核态切换发生的时候,并不需要进行上下文切换;并且用户态和kernel mode的切换本身并不是一个上下文切换。不过,根据操作系统的不同,有时候会在此时进行一次上下文切换的步骤。
上下文切换:具体步骤
编辑在一次切换中,第一个行程的状态要被纪录在某个地方,这样当调度器(scheduler)要回到这个行程时,才可以重建这个行程并且继续运算。
这里所谓“行程的状态”,包含了这个行程使用的所有寄存器(register),特别是程序计数器;加上所有操作系统可能需要的特定资料。这些资料一般以名为进程控制块(process control block,PCB)的数据结构存储起来。
上下文切换:由软件或硬件实现
编辑上下文切换主要由软件实现或由硬件实现。部分中央处理器,比如Intel 80386[4]或同系列更高阶的处理器,就具备支持上下文切换的硬件设计。
参考资料
编辑- ^ Silberschatz, Abraham; Peter Baer Galvin, Greg Gagne. Operating System Principles 7. John Wiley & Sons (Asia) Pte Ltd. ISBN 0-4717-2595-1.
- ^ IA-64 Linux Kernel: Design and Implementation, 4.7 Switching Address Spaces (页面存档备份,存于互联网档案馆)
- ^ Operating Systems, 5.6 The Context Switch, p. 118 (页面存档备份,存于互联网档案馆)
- ^ 存档副本. [2010-02-05]. (原始内容存档于2010-02-18).
外部链接
编辑- Context Switching(页面存档备份,存于互联网档案馆) - at OSDev.org
- Context Switch Definition - by The Linux Information Project (LINFO)
- Context Switches - from the Microsoft Developer Network (MSDN)