什么是上下文切换
上下文切换指的是内核操作系统的核心在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 寄存器、内核堆栈、硬件中断参数等
转载: https://blog.csdn.net/zydybaby/article/details/127080584