上下文交換

开销

上下文交换通常是计算密集型的，操作系统中的许多设计都是针对上下文交换的优化。在进程间切换需要消耗一定的时间进行相关的管理工作——包括寄存器和内存映射的保存与读取、更新各种内部的表等等。处理器或者操作系统不同，上下文交换时所涉及的内容也不尽相同。比如在Linux内核中，上下文交换需要涉及寄存器、栈指针、程序计数器的交换，但和地址空间的交换无关（虽然进程在进行上下文交换时也需要做地址空间的交换）。用户态线程之间也会发生类似的上下文交换，但这样的交换非常轻量。

何时交换?

有三种可能的情况会发生上下文交换，分别为：

多任务

最常见的，在一些调度(scheduling)算法内，其中进程有时候需要暂时离开CPU，让另一个进程进来CPU运作。在先占式多任务系统中，每一个进程都将轮流运行不定长度的时间，这些时间段落称为时间片。如果进程并非自愿让出CPU(例如运行I/O操作时，进程就需放弃CPU使用权)，当时限到时，系统将产生一个定时中断，操作系统将排定由其它的进程来运行。此机制用以确保CPU不致被较依赖处理器运算的进程垄断。若无定时中断，除非进程自愿让出CPU，否则该进程将持续运行。对于拥有较多I/O指令的进程，往往运行不了多久，便需要让出CPU；而较依赖处理器的进程相对而言I/O操作较少，反而能一直持续使用CPU，便形成了垄断现象。

中断处理

在接受到中断（Interrupt）的时候，CPU必须要进行上下文交换。

用户态或者内核态的交换

当用户态和内核态交换发生的时候，并不需要进行上下文交换；并且用户态和kernel mode的交换本身并不是一个上下文交换。不过，根据操作系统的不同，有时候会在此时进行一次上下文交换的步骤。

上下文交换：具体步骤

在一次交换中，第一个进程的状态要被纪录在某个地方，这样当调度器(scheduler)要回到这个进程时，才可以重建这个进程并且继续运算。
这里所谓“进程的状态”，包含了这个进程使用的所有寄存器(register)，特别是程序计数器；加上所有操作系统可能需要的特定数据。这些数据一般以名为进程控制块(process control block，PCB)的数据结构存储起来。

上下文交换：由软件或硬件实现

上下文交换可分为主要由软件实现或由硬件实现。部分中央处理器，比如Intel 80386或同系列更高端的处理器，就具备支持上下文交换的硬件设计。