CPU寄存器与程序计数器(保存CPU执行指令的位置,或保存即将执行的下一指令的位置)一起构成CPU上下文。
CPU上下文切换是指保存上一个任务的CPU上下文,将新任务的上下文加载到这些寄存器和程序计数器中,最后跳转到程序计数器指向的新位置以执行新任务。 保存的上下文保存在系统内核中,并在重新调度和执行任务时重新加载。
根据任务的不同,CPU的上下文切换可以分为几个不同的场景。 (进程上下文切换、线程上下文切换、中断上下文切换) )。
流程上下文切换系统调用
众所周知,进程的执行区域分为内核区域和用户区域。 内核空间可以访问所有资源,用户空间只能访问有限的资源,而不能访问内存等硬件设备。
从用户状态到内核状态的转换必须在系统调用中进行。 对文件(如open、read、write和close )的所有操作都是系统调用。
在系统调用过程中产生CPU上下文开关,首先切换到内核状态,执行内核状态代码,然后返回用户状态代码。 因此,一次系统调用将导致两次CPU上下文切换。 也称为特权模式切换,但仍然运行着相同的进程。
进程上下文切换性能问题
进程由内核管理和调度,进程切换仅在内核状态下进行。 流程上下文不仅包括虚拟内存、堆栈、全局变量等用户空间资源,还包括内核堆栈、寄存器等内核空间状态。 每次需要进程上下文切换几十纳秒到几微秒的CPU时间。
另外,Linux通过TLB管理着从虚拟内存到物理内存的映射,虚拟内存更新后还需要更新TLB,对存储器的访问也很慢。 特别是在多处理器系统中,高速缓存由多个处理器共享,刷新高速缓存不仅会影响当前处理器的进程,还会影响共享高速缓存的其他处理器的进程。
进程上下文切换发生的时机
安排进程时,必须在上下文之间切换。 Linux为每个CPU维护就绪队列,并激活进程(正在运行和等待CPU的进程)
按优先级和等待CPU的时间进行排序,选择并运行最需要CPU的进程。 (优先级高、等待时间长的过程)
1、CPU时间被划分为一定的时间片,当某个进程的时间片用完时,就被系统挂起,切换到其他等待的进程
2、流程在系统资源不足的情况下,在资源满足之前无法运行。 在这种情况下,该过程也被挂起,并且CPU转交给其他过程
3、进程主动挂起sleep休眠函数,CPU让位给其他进程
4、当优先级更高的进程运行时,当前进程将被挂起
5、发生硬件中断,CPU进程被中断挂起,运行内核中的中断服务程序
进程上下文切换线程是调度的基本单元,而进程是资源拥有的基本单元。 如果进程只有一个线程,则进程被认为等于线程。
如果进程有多个线程,则这些线程将共享相同的虚拟内存和全局变量等资源。
线程主要是私有数据、堆栈、寄存器等资源。
线程上下文切换分为以下两种情况:
1、两个线程属于不同的线程,不共享资源,所以与进程的上下文切换相同
2、两个线程属于同一个进程,只是在专用数据、寄存器等不共享的数据之间切换
中断上下文切换与系统调用不同,中断上下文切换与进程的用户状态无关。 因此,中断进程会中断处于用户状态的进程,无需保存和恢复进程的虚拟内存和全局变量等用户资源。 仅包含运行内核状态中断服务程序所需的状态、CPU寄存器、内核堆栈和硬件中断参数