进程切换时是如何保存上下文的

2023-05-16

前言

当前操作系统大部分采用分时的进程调度, 既每个进程运行一小段时间, 然后切换到下一个进程运行, 依次往复.

当进程运行的时候是独占CPU的, 此时操作系统是无法强行介入的, 为了将执行权让出来, 就需要硬件的配合了. 硬件每个一个时钟周期(比如10ms), 就会产生一个时钟中断, 而这个时钟中断会将执行权强行交给操作系统的调度进程, 然后由调度进程进行后续处理.

以上, 就是我在第一遍看操作系统时留下的印象, 但有几个问题当时没有搞明白:

  1. 如何保存进程的上下文? 在将进程暂停后, 为了之后再次运行, 需要将运行现场保存起来, 以便再次运行时恢复. 而在CPU的角度, 运行现场其实就是几个寄存器的值. 想标志寄存器/通用寄存器/段寄存器等等, 调度进程都能拿到, 我都能理解. 但是, 指令寄存器 PC如何保存呢? 当执行权交给调度进程后, PC自然也就指向了调度进程, 已经丢失了当时的值.
  2. 若在调度进程运行时, 再次发生了时钟中断, 不就陷入死循环了.

以上问题, 在多年后我再次重翻操作系统时, 得到了解答.

解惑

如何保存上下文

其实, 前面的分析是没错的, 当执行进程切换后, 指令寄存器的值必然指向当前执行的进程. 既然软件办不到, 那就硬件来做咯.

找到了这样一篇CPU文档 (可能和现在主流 CPU 实现有所差异, 不过作为参考倒是问题不大):

当触发中断时, 会将PC, X, A, CC寄存器的值保存到栈中. 其中X A是通用寄存器, CC是一个条件码寄存器, 在文档的5.1小节对这些寄存器均有介绍.

哎, 这不就解决了切换后的上下文问题么.

中断嵌套问题

当调度程序正在运行时, 再次发生中断怎么办? 如果能将中断关闭, 不就没人来打扰了么.

没错, 就是这么干. 通过修改CC寄存器的值, 可以达到关闭中断的效果.

同时也提供了中断操作的汇编指令.

至此, 中断的嵌套问题便解决了.

并且中断程序结束后, 调用IRET退出, 可恢复程序执行. 这自然是为了键盘输入这种中断使用的.

总结

在看了这么一份硬件文档后, 硬件真的是做了很多事情, 很多软件做不到的事情, 硬件来做, 软件做的慢的事情, 硬件来做.

当然, 文档中不止有这些内容, 奈何我才疏学浅, 看英文文档着实费尽. 罢了罢了, 解了心中疑惑便好…


原文地址: https://hujingnb.com/archives/782

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程切换时是如何保存上下文的 的相关文章

随机推荐

  • FreeRTOS之xTaskCreate()

    xTaskCreate 函数解析 task span class token punctuation span h BaseType t span class token function xTaskCreate span span cla
  • 解决笔记本双USB接口散热器无法给其他外接设备供电的问题

    问题描述 xff1a 有个双usb接口的笔记本散热器 xff0c 之前是散热器接笔记本的一个usb接口 xff0c 连接到散热器的一个USB接口上 xff0c 散热器上的另一个usb接口可以连其他设备 xff0c 比如外界键盘 出现了问题
  • FreeRTOS之vTaskDelete()

    vTaskDelete 函数解析 task span class token punctuation span h span class token keyword void span span class token function v
  • MobaXterm连接不上虚拟机linux的问题

    目录 问题描述 xff1a step1 进入centOS下的 etc sysconfig network scripts step2 输入命令vi ifcfg ens33 查看并编辑该文件 step3 将文件中的 step4 重启网络服务
  • Linux LVM root分区 磁盘扩容

    LVM 的基本概念 物理卷 Physical Volume PV xff1a 可以在上面建立卷组的媒介 xff0c 可以是硬盘分区 xff0c 也可以是硬盘本身或者 回环文件 xff08 loopback file xff09 物理卷包括一
  • 浅尝树莓派3之串口配置

    树莓派3硬件串口的使用及编程 发表于 2017 01 29 分类于 树莓派 暂无评论 阅读次数 54 引言 本文转载自 xff1a http etrd org 2017 01 29 E6 A0 91 E8 8E 93 E6 B4 BE3 E
  • Android开发必备——注解

    前言 阅读官方源码以及各类第三方框架时可以发现 xff0c 很多地方都有注解 xff0c 作为一名Android程序员 xff0c 掌握注解属于必不可少的一项技能 1 什么是注解 注解是以 64 符号开头的用来标识如类 字段 方法等的工具
  • ROS 'catkin_make' 命令出错

    之前 xff0c 我在自己的电脑上 xff08 新安装的ubuntu16 04 xff09 装好了ROS xff0c 用catkin make编译成功了 xff0c 但是用一样的方法在实验室的电脑上编译就报错 xff0c 后来发现和之前装过
  • PX4 里面的TCP服务端代码

    PX4 里面的TCP服务端代码 span class token comment examples nettest nettest server c Copyright C 2007 2011 2012 Gregory Nutt All r
  • 传感器研究NO1.陀螺仪

    一 陀螺仪重要参数 如下图所示 xff0c 一般陀螺仪手册具有很多参数 xff0c 此处仅记录软件编程应注意的参数 Full Scale Range xff08 量程 xff09 xff1a dps xff08 Degree Per Sec
  • ESP8266与电脑PC端TCP通讯步骤+例子一

    我们先讲 xff0c 拿到一个ESP8266模块之后 xff0c 该做什么 我拿到这个模块之后 xff0c 一脸蒙蔽 xff0c 我不知道怎么使用 xff0c 这个时候 xff0c 不要慌 xff0c 去看技术手册 我4步让你学会最简单的使
  • 读java编程思想的一点感触

    学习一些java基础语法后 xff0c 能应付简单的日常工作 但是觉得还是得系统学习一下这门语言 xff0c 就选择了java编程思想 原书第4版 xff0c 机械工业出版社 xff0c 陈昊鹏译的这本 看懂的不是很多 xff0c 还是学到
  • linux---UDP代码通信

    udp连接特性 xff1a 无连接 xff1a 可以不构成连接就进行通信不可靠 xff1a 数据并不能保证可靠性面向数据报 xff1a 每条数据有长度限制 xff0c 整条数据发送整条数据接受 xff0c 传输不灵活 xff0c 但是不会存
  • virtualBox安装debian9.5的网络配置杂记

    2019 02 01补充 桥接模式设置方式 1 虚拟机界面 gt 设备 gt 网络 gt 网络 gt 网卡1 gt 桥接网卡 2 连接虚拟机 xff0c 为虚拟机配置一个ip地址即可 ip a add 192 168 0 107 24 de
  • 如何在linux shell脚本中自动输入密码.

    答案是需要通过expect 来实现 注意 如果没有 expect xff0c 需要预先安装 tony 64 pd2 yum info expect Loaded plugins fastestmirror Repodata is over
  • 动态捕捉(四)深度图像基础知识

    第一部分 xff1a 深度图像 xff08 depth image 也被称为距离影像 xff08 range image xff09 xff0c 是指将从图像采集器到场景中各点的距离 xff08 深度 xff09 作为像素值的图像 xff0
  • 完善二叉树的右指针

    对于一个二叉树 xff0c 每个结点有三个指针 xff0c 除了左右子节点指针外还有一个指向右边的结点的指针 现在给定一个二叉树 xff0c 每个结点的右指针为空 xff0c 让你把每一层的结点都连起来 xff08 默认是完全二叉树 xff
  • dockerfile文件参数

    一 背景 如果仅限于使用dockerhub里面的镜像 xff0c 是没办法满足我们实际的应用场景的 xff0c 所以我们需要创建属于自己的docker镜像 构建docker镜像需要编写dockerfile xff0c 却不知道语法怎么写 下
  • pycharm 不能单步调试(debug)的原因,或者点击debug不能进入断点。debug区域是灰色的

    如上图 xff0c 不要点击pycharm右上角的Debug 那样不能进入调试 xff08 在多个py文件都存在的情况下 xff09 xff0c 找到程序的入口点出 xff08 if name 61 61 34 main xff09 xff
  • 进程切换时是如何保存上下文的

    前言 当前操作系统大部分采用分时的进程调度 既每个进程运行一小段时间 然后切换到下一个进程运行 依次往复 当进程运行的时候是独占CPU的 此时操作系统是无法强行介入的 为了将执行权让出来 就需要硬件的配合了 硬件每个一个时钟周期 比如10m