操作系统 -- 上下文切换
上下文
每个任务运行前, cpu都需要知道任务从哪里加载, 又从哪里开始运行, 这就涉及到cpu寄存器和程序计数器
- cpu寄存器是cpu内置的容量小, 但速度极快的内存
- 程序计数器会存储cpu正在执行的指令位置, 或者即将执行的指令位置
这两个是cpu运行任何人之前都必须依赖的环境, 因此叫做cpu上下文
上下文切换
- 将前一个cpu的上下文(也就是cpu寄存器和程序计数器里面的内容) 保存起来
- 然后加载新任务的上下文到寄存器和程序计数器
- 最后跳转到程序计数器所指的新位置, 开始运行新任务
被保存起来的上下文会存储到系统内核中, 等待任务重新调度执行时, 再次加载进来
cpu的上下文切换分为三种 :
- 进程上下文切换
- 线程上下文切换
- 中断上下文切换
系统调用
进程的运行空间分为内核空间和用户空间
进程可以在用户空间运行 ( 用户态进程 ), 也可以在内核空间运行 ( 内核态进程 ).
从用户态到内核态需要系统调用才可以完成
系统调用过程中也会发生cpu上下文切换, cpu寄存器会先保存用户态的状态, 然后加载内核态相关内容, 系统调用结束之后, cpu寄存器要回复原来保存的用户态, 继续运行进程,
所以, 一次系统调用发生两次cpu上下文切换
需要注意的是 : 系统调用不涉及进程或者线程的切换
进程上下文切换
进程是由内核管理和调度的 , 进程的切换只能发生在内核态
进程的上下文不但包括虚拟内存, 栈, 全局变量等用户空间资源, 还包括内核堆栈, 寄存器等内核空间状态,
上下问的切换比系统调用多了一个步骤, 就是保存当前进程的内核状态和cpu寄存器之前, 先把该进程的虚拟内存, 栈等保存起来
加载下一个进程的内核态后, 还需要刷新进程的虚拟内存和用户栈
保存上下文和恢复上下文需要在内核cpu上运行才能完成
操作系统为cpu维护了一个就绪队列, 将就绪进程按照优先级和等待cpu时间来排序, 然后选择最需要cpu的进程, 也就是优先级最高和等待cpu时间最长的进程来运行
进程切换场景 :
- 进程时间片耗尽
- 系统资源不足
- 进程通过睡眠函数把自己挂起
- 当有优先级更高的进程运行时, 为了运行高优先级进程, 当前进程会被挂起
- 发生中断
线程上下文切换
线程是调度的基本单位, 而进程则是资源拥有的基本单位
内核中的任务调度实际是在调度线程
进程只是给线程提供虚拟内存, 全局变量等资源
线程上下文切换时, 共享相同的虚拟内存和全局变量等资源不需要修改, 而线程自己的私有数据, 如栈和寄存器等, 上下文切换时需要保存
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggjjge
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13