LINUX任务运行前,CPU都要知道从任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU寄存器和程序计数器
CPU上下文:CPU寄存器和程序计数器
CPU寄存器:
CPU内置容量小、速度极快的内存
程序计数器:
存储CPU正在执行的指令位置、或者即将执行的下一条指令位置
CPU上下文切换-负载升高
把前一个任务的CPU上下文保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后在跳转到程序计数器所指的位置
类别:进程上下文切换、线程上下文切换、中断上下文切换
**进程上下文切换:**LINUX按照特权等级,把进程的运行空间分为内核空间和用户空间,分包对应下图,从一个进程切换到另一个进程
LINUX为每个CPU都维护了一个继续队列,将活跃进程(正在运行的进程和正在等待的进程)按照优先级和等待CPU的时间排序,然后选择最需要CPU的进程,也就是优先级最高和等待时间最长的进程来运行
CPU时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其他正在等待CPU的进程运行
进程和线程
线程是调度的基本单位,而进程则是资源拥有的基本单位
所谓内核中的任务调度,实际上的调度是对象是线程;而进程只是给线程提供了虚拟内存、全局变量等资源
(1)当进程只有一个线程,可以认为进程就是线程
(2)当进程有多个线程,这些线程会共享相同的虚拟内存和全局变量等资源,这些资源在上下文切换是不需要修改的
(3)线程也有自己的私有数据,比如栈和寄存器,在上下文切换也需要保存
上下文切换工具vmstat 5