liunx是多任务操作系统,但当任务数量大于CPU数量时,系统会在很短的时间内将CPU轮流分配给任务,并不是所有的任务都在同时运行。
每个任务在运行前,系统都需要事先设置好CPU寄存器和程序计数器。
CPU寄存器是CPU内置的容量小速度极快的内存,程序计数器是用来存储CPU正在执行的指令位置、或者即将执行的下一条指令位置。他们称为CPU的上下文。
CPU上下文切换指的是CPU将当前任务的CPU寄存器和程序计数器保存起来,然后加载新任务CPU寄存器和程序计数器,再跳到新任务的程序计数器指的位置,运行新任务。
保存起来的CPU上下文会存储在系统内核中,等待任务重新调度。
保存CPU上下文和恢复CPU上下文是需要系统内核在CPU上运行才能完成的。
CPU上下文切换大体可以分为三种,进程上下文切换、线程上下文切换、中断上下文切换。
进程上下文切换
进程的上下文切换是指从一个进程切换到另一个进程运行。
liunx将进程的运行空间分为内核空间和用户空间。
内核空间具有最高等级,可以直接访问所有系统资源。
用户空间只能访问有限资源,不能直接访问内存等硬件设备,必须通过系统调用深入内核才能访问这些资源。
进程是由内核来管理和调度的,进程的切换只能发生在内核态。进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。
进程可以在这内核空间和用户空间运行,分别称为进程的用户态和进程的内核态。
从用户态到内核态的转变需要通过系统调用来完成,需要进行CPU上下文切换,保存用户态的CPU上下文,加载内核