上下文切换是指操作系统将当前进程或线程的执行状态(如寄存器内容、程序计数器、堆栈指针等)保存在内存中,然后加载下一个进程或线程的执行状态,以实现进程或线程的切换。下面是进程和线程上下文切换的一些细节:
进程上下文切换:当操作系统决定将 CPU 时间片分配给另一个进程时,它会执行以下步骤:
保存当前进程的执行状态,包括 CPU 寄存器、程序计数器、进程状态等;
将新的进程的执行状态从内存中读入 CPU 寄存器、程序计数器等寄存器中;
更新进程的状态为“运行中”(Running),开始执行新的进程。进程上下文切换需要保存和恢复较多的信息,包括进程的内存映像、文件描述符等,因此它的开销比线程上下文切换更大。
线程上下文切换:当操作系统将 CPU 时间片分配给同一进程中的另一个线程时,它会执行以下步骤:
保存当前线程的执行状态,包括 CPU 寄存器、程序计数器、线程状态等;
将新的线程的执行状态从内存中读入 CPU 寄存器、程序计数器等寄存器中;
更新线程的状态为“运行中”(Running),开始执行新的线程。线程上下文切换只需要保存和恢复较少的信息,因为同一进程中的线程共享相同的地址空间、文件描述符等资源。
上下文切换的开销:由于上下文切换需要保存和恢复进程或线程的执行状态,因此它会带来一定的开销。上下文切换的开销主要来自于 CPU 寄存器的保存和恢复、内存映像的切换等操作。为了尽量减小上下文切换的开销,可以采用以下策略:
减少进程或线程的数量,避免频繁地进行上下文切换;
尽量避免在关键路径上使用锁等同步机制,减少线程间的竞争;
使用多核 CPU 来实现并发,避免在同一核上频繁地进行上下文切换。