一:为什么会出现CPU上下文切换
首先LInux 是个多用户系统,支持大于cpu核数的任务在系统上运行所以不可避免的出现cpu资源竞争,竞争CPU会导致 上下文切换
二:什么是CPU上下文切换
CPU在不同的任务之前切换需要保存任务的运行资源记录:CPU得知道从哪里去加载任务,又从哪里开始运行所以需要用到CPU寄存器和程序计数器。在理解上面的基础上CPU上下文切换就是保存上一个任务运行的寄存器和计数器信息切换到加载下一个任务的寄存器和计数器的过程
三:分类
- 进程上下文切换
- 线程上下文切换
- 中断上下文切换
3.1:进程上下文切换
1: 理解系统调用
首先:Linux系统分为内核空间 Rinig 0 和 用户空间 Ring 3 内核空间具有最高的访问权限可以直接访问所有资源;用户空间不能直接访问内存等硬件设备,只有通过系统调用陷入到内核空间才能访问磁盘等资源
2:定义:从 用户态到内核态的转变成为系统调用
3:具体情境: 在发生系统调用的时候会触发两次CPU上下文切换,从用户态 -》 内核态 和 内核态 -》 用户态
4:系统调用和进程上下文切换的区别
- 系统调用都是在同一个进程中发生
- 进程上下文切换是从一个进程切换到第二个进程中运行
- 进程上下文切换除了需要保存 虚拟内存,栈,全局变量 等用户空间的资源,还包括 内核堆栈,寄存器等内核空间的状态
5:触发进程调度的情景
- 进程时间片用完,系统进行调度
- 进程申请的系统资源不足(比如内存不足)
- 调用 Sleep 函数主动挂起进程
- 当有优先级更高的进程运行时,CPU上的进程会被挂起
3.2:线程上下文切换
1:线程与进程的区别: 线程是调度的基本单位,进程是资源拥有的基本单位 通俗理解:系统内核中的任务调度实际上调度的对象是线程,而进程只是给线程提供了虚拟内存,全局变量等资源这些资源在线程上下文切换时是不需要修改的
2:结论:如果是同一个进程之间的线程上下文切换时,进程提供的全局资源不需要单独保存;如果是不同进程之前的线程上下文切换相对前一种会消耗资源是cpu更多
3.3:中断上下文切换
- 中断优先级会打断进程的正常调度和执行
- 对于同一个CPU来说,中断处理比进程拥有更高的优先级
四:查看系统 上下文切换
1:命令 vmstat 5
含义如下:
- cs (context switch) 每秒上下文切换的次数
- in (interupt)每秒中断的次数
- r (Running Or Runnable) 就绪队列的长度,也是正在运行和等待的CPU进程数
- b (Blocked ) 处于不可中断睡眠状态的进程数