什么是上下文切换?

上下文切换指的是内核操作系统的核心在CPU上对进程或者线程进行切换。

搞清楚上下文切换需要先搞清楚什么是上下文

CPU在开始执行任务时需要先知道从哪里去加载任务,从哪里开始执行,上下文的作用就是告诉CPU这些。(通常是由程序计数器和CPU寄存器来完成)

那为什么需要上下文切换呢?

一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式,就是一个线程的时间片用完会退回到就绪态,其他线程继续运行,这个过程就是进行了一次上下文切换

上下文切换的步骤:

  • 挂起一个进程,将这个进程在CPU中的状态(上下文信息)存储于内存的PCB(Process Control Block)中
  • 在PCB中检索下一个进程的上下文并将其在CPU的寄存器中恢复
  • 最后跳转到程序计数器所指的新位置,运行新任务

引起线程上下文切换的原因:

(1)当前正在执行的任务完成,系统的CPU正常调度下一个任务。

(2)当前正在执行的任务遇到I/O等阻塞操作,调度器挂起此任务,继续调度下一个任务。

(3)多个任务并发抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续调度下一个任务。

(4)用户的代码挂起当前任务,比如线程执行yield()方法,让出CPU。

(5)硬件中断。

上下文切换可以分为进程上下文切换、线程上下文切换、中断上下文切换三种

进程上下文切换:进程上下文切换需要保存的东西比较多,花费的时间也比较多,进程的上下文主要包括虚拟内存、栈、全局变量、堆栈、寄存器等

线程上下文切换:线程上下文切换时,虚拟内存和全局变量等资源都是共享的,线程的上下文包括栈和寄存器等,比寄存器少很多。

中断上下文切换:为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,然后调用中断处理程序,响应设备事件。中断上下文,只包括内核态中断服务程序执行所必需的状态,也就是 CPU 寄存器、内核堆栈、硬件中断参数等

推荐阅读:操作系统知识点详解

你可能感兴趣的:(操作系统)