嵌入式知识点总结 操作系统 专题提升(四)-上下文
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。
目录
1.上下文有哪些?怎么理解?
2.为什么会有上下文这种概念?
3.什么情况下进行用户态到内核态的切换?
4.中断上下文代码中有哪些注意事项?
5.请问线程需要保存哪些上下文,SP、PC、EAX这些寄存器是干嘛用的?

1.上下文有哪些?怎么理解?
操作系统中的“上下文”是指与进程或线程的执行相关的所有信息。上下文的保存和切换是操作系统实现进程调度、线程调度和资源管理的基础。上下文的内容决定了一个进程或线程的状态,确保当进程或线程被暂停时,能够恢复到先前的执行状态。
上下文的组成
上下文通常包含以下几个部分:
1. CPU寄存器
CPU寄存器保存了进程当前的状态和执行位置。常见的寄存器包括:
-
程序计数器(PC):保存下一条指令的地址。程序计数器决定了程序的执行顺序。
-
通用寄存器:保存进程执行时所需要的临时数据,如整数、浮点数等。
-
堆栈指针(SP):指向当前栈顶,用于管理函数调用和局部变量。
-
基址寄存器和段寄存器:用于管理内存地址的转换和访问。
2. 内存管理信息
内存管理信息包括了进程的地址空间和虚拟内存的映射。它可能包括:
-
页表:映射虚拟地址到物理地址。
-
段表:将虚拟地址分段处理,进行内存分段管理。
-
堆和栈的指针:分别指向进程的堆区和栈区。
3. 程序状态字(PSW)
程序状态字包含了进程当前的状态信息,包括:
-
中断使能位:控制是否允许中断。
-
进程的状态:如运行、等待、就绪等。
-
条件码:如加法溢出标志等。
4. 文件描述符
进程在执行时可能会使用文件、设备等外部资源,这些资源的访问通过文件描述符来管理。文件描述符包含文件的状态信息,指示文件的读写位置等。
5. 进程控制块(PCB)
进程控制块是操作系统用于管理进程的一个数据结构。它包含了一个进程的所有元数据,除了CPU寄存器、内存管理信息、程序状态字外,还可能包括:
-
进程的标识符(PID)。
-
父进程和子进程的关系。
-
进程的优先级和调度信息。
-
进程的资源(如打开的文件、IO设备)信息。
上下文的理解
上下文的核心含义是“描述进程执行状态的所有信息”,它决定了一个进程(或线程)能否在某个时刻恢复并继续执行。上下文切换(Context Switch)是操作系统中一个关键的操作,它发生在操作系统调度进程时。在进行上下文切换时,操作系统会将当前进程的上下文保存到进程控制块(PCB)中,再加载下一个进程的上下文,使得新的进程能够从它上次保存的状态继续执行。
上下文的作用
-
进程切换:操作系统在多任务处理时,通过上下文切换来让多个进程轮流执行。每次切换时,操作系统会保存当前进程的上下文,并恢复下一个进程的上下文,从而实现多任务并发。
-
进程恢复:当一个进程被中断、挂起或切换出去时,操作系统需要保存其上下文信息,以便在以后恢复该进程时,能够从上次停止的地方继续执行,保证进程状态的一致性。
-
多线程执行:类似进程的上下文,线程也有自己的上下文。当多个线程共享同一进程的地址空间时,每个线程的上下文会包括该线程特有的寄存器和栈信息,而其他资源(如堆、代码段等)则是共享的。
上下文切换的代价
上下文切换是操作系统中不可避免的开销。每次上下文切换都会引入一定的时间成本,主要是由于:
-
保存和加载寄存器状态:需要将当前进程的寄存器值保存在进程控制块(PCB)中,再将下一个进程的寄存器值加载到CPU寄存器。
-
更新内存管理信息:涉及页表、段表的切换或更新。
-
更新调度信息:包括进程的优先级、调度队列等信息的更新。
因此,操作系统会尽量减少上下文切换的次数,以提高系统的效率。
2.为什么会有上下文这种概念?
上下文这一概念在操作系统中出现,是为了支持 多任务处理 和 进程调度,从而实现系统的并发执行和资源的合理分配。操作系统通过上下文管理来保证多个进程或线程能够共享 CPU 等系统资源,并且在它们之间进行有效的切换,确保每个进程的执行状态能够被保存并恢复。理解这一点有助于明确为什么上下文如此重要。
为什么会有上下文这种概念?
支持多任务并发执行 在现代操作系统中,通常需要支持多个进程或线程同时运行。尽管计算机只有有限数量的 CPU 核心,但操作系统通过上下文切换技术,使得每个进程或线程看起来像是同时在运行。操作系统会将 CPU 的时间片分配给多个进程或线程,而每个进程的 上下文 存储了该进程的状态信息。当进程切换时,操作系统通过保存和恢复上下文,实现不同进程的交替执行,从而达到 并发执行 的效果。
上下文切换:当一个进程或线程被暂停,操作系统需要保存该进程的当前状态(即上下文),以便在恢复时能够从上次停止的地方继续执行。这就是为什么上下文需要保存与加载的原因。
进程的独立性与隔离 操作系统需要确保每个进程有自己的独立运行环境。上下文的概念有助于确保进程间的隔离性,即一个进程的执行状态不会被其他进程干扰。当一个进程运行时,它的寄存器、程序计数器、堆栈等信息(即上下文)是唯一的,并且操作系统通过上下文切换来管理进程的执行,确保每个进程在自己的独立上下文中执行。
进程的暂停与恢复 在操作系统中,进程可能由于各种原因被暂停,例如:I/O 操作、时间片耗尽、等待资源等。上下文的概念使得操作系统能够在进程暂停时保存其当前状态,并在进程恢复时恢复之前的状态。没有上下文,操作系统就无法恢复进程的执行,进程的执行就无法持续进行下去。
比如,当一个进程被中断时,操作系统需要保存该进程的上下文(包括 CPU 寄存器的内容、内存信息等),然后切换到另一个进程。当需要恢复该进程时,操作系统再从保存的上下文中恢复其状态,继续执行。
提供进程调度机制 操作系统需要根据一定的策略调度多个进程执行。上下文的概念使得进程调度成为可能。每当操作系统切换进程时,它就需要保存当前进程的上下文,并加载下一个进程的上下文,保证系统能够正常切换和运行多个进程。
时间片轮转:操作系统通过分配给每个进程一个时间片,进程在时间片用尽时会被挂起,进行上下文切换。操作系统保存当前进程的上下文,恢复下一个进程的上下文,从而实现时间共享。
资源管理与共享 上下文还帮助操作系统管理进程之间的资源共享和独占。进程的上下文包括了该进程使用的资源的信息(如文件句柄、内存块等),通过保存和恢复这些上下文信息,操作系统能够确保资源在进程间切换时被正确管理。
调试和异常处理 上下文也是进行调试和异常处理的基础。操作系统或调试工具可以通过获取进程的上下文,了解进程在崩溃或发生错误时的执行状态。通过恢复进程的上下文,操作系统能够恢复到错误发生前的状态,帮助分析和修复问题。
3.什么情况下进行用户态到内核态的切换?
1.进程上下文主要是异常处理程序和内核线程。内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。
2.中断上下文是由于硬件发生中断时会触发中断信号请求,请求系统处理中断,执行中断服务子程序。
4.中断上下文代码中有哪些注意事项?
运行于进程上下文的内核代码是可抢占的,但中断上下文则会一直运行至结束,不会被抢占。所以中断处理程序代码要受到一些限制,在中断代码中不能出现实现下面功能的代码:
1.睡眠或者放弃CPU
因为内核在进入中断之前会关闭进程调度,一旦睡眠或者放弃CPU,这时内核无法调度别的进程来执行,系统就会死掉。牢记:中断服务子程序一定不能睡眠(或者阻塞)。
2.尝试获得信号量
如果获得不到信号量,代码就会睡眠,导致(1)中的结果。
3.执行耗时的任务
中断处理应该尽可能快,因为如果一个处理程序是IROF DISABLED类型,他执行的时候会禁止所有本地中断线,而内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。中断处理程序的任务尽可能放在中断下半部执行。
4.访问用户空间的虚拟地址
因为中断运行在内核空间。
5.请问线程需要保存哪些上下文,SP、PC、EAX这些寄存器是干嘛用的?
线程在切换的过程中需要保存当前线程id、线程状态、堆栈、寄存器状态等信息。其中寄存器主要包括SP、PC、EAX等寄存器,其主要功能如下
SP:堆栈指针,指向当前栈的栈顶地址
PC:程序计数器,存储下一条将要执行的指令
EAX:累加寄存器,用于加法乘法的缺省寄存器
相关文章:
嵌入式知识点总结 操作系统 专题提升(四)-上下文
针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.上下文有哪些?怎么理解? 2.为什么会有上下文这种概念? 3.什么情况下进行用户态到内核态的切换? 4.中断上下文代码中有哪些注意事项? 5.请问线程需要保存哪些…...
Elasticsearch基本使用详解
文章目录 Elasticsearch基本使用详解一、引言二、环境搭建1、安装 Elasticsearch2、安装 Kibana(可选) 三、索引操作1、创建索引2、查看索引3、删除索引 四、数据操作1、插入数据2、查询数据(1)简单查询(2)…...
携程Android开发面试题及参考答案
在项目中,给别人发的动态点赞功能是如何实现的? 数据库设计:首先要在数据库中为动态表添加一个点赞字段,用于记录点赞数量,同时可能需要一个点赞关系表,记录用户与动态之间的点赞关联,包括点赞时间等信息。界面交互:在 Android 界面上,为点赞按钮设置点击事件监听器。…...
xxl-job 在 Java 项目的使用 以一个代驾项目中的订单模块举例
能搜到这里的最起码一定知道 xxl-job 是用来干什么的,我就不多啰嗦怎么下载以及它的历史了 首先我们要知道 xxl-job 这个框架的结构,如下图: xxl-job-master:xxl-job-admin:调度中心xxl-job-core:公共依赖…...
Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱
文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…...
【数据分析】案例03:当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)
当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…...
需求分析应该从哪些方面来着手做?
需求分析一般可从以下几个方面着手: 业务需求方面 - 与相关方沟通:与业务部门、客户等进行深入交流,通过访谈、问卷调查、会议讨论等方式,明确他们对项目的期望、目标和整体业务需求,了解项目要解决的业务问题及达成的…...
申博经验贴
1. 所谓申博,最重要的就是定制的海投 分成两个部分 1. 定制 要根据每个教授去写不同的,一定不要泛泛的去写,一定要非常非常的具体,要引起教授的兴趣。每个教授每天都会收到几十封邮件,所以要足够的引起教授的注意&a…...
SpringAI 人工智能
随着 AI 技术的不断发展,越来越多的企业开始将 AI 模型集成到其业务系统中,从而提升系统的智能化水平、自动化程度和用户体验。在此背景下,Spring AI 作为一个企业级 AI 框架,提供了丰富的工具和机制,可以帮助开发者将…...
虚幻基础17:动画层接口
能帮到你的话,就给个赞吧 😘 文章目录 animation layer interface animation layer interface 动画层接口:动画图表的集。仅有名字。 添加到动画蓝图中,由动画蓝图实现动画图表。...
SQLAlchemy 2.0的简单使用教程
SQLAlchemy 2.0相比1.x进行了很大的更新,目前网上的教程不多,以下以链接mysql为例介绍一下基本的使用方法 环境及依赖 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步骤 1、创建引擎,链接到mysql engine crea…...
Codeforces Round 1002 (Div. 2) A-D
复活!年后首场!本期封面是我自己AI弄的图 A - Milya and Two Arrays 题意 给两个所有数字出现次数都大于2的数组,问能不能修改排序之后对应位置相加得到新的数组使不同数字个数达到3 思路 直接计数就行了,不同的数字匹配一下…...
OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)
文章目录 摄像机/观察空间/视图变换LookAt矩阵移动相机(处理键盘输入)移动速度欧拉角移动视角(处理鼠标输入)缩放场景(处理滚轮输入)Camera类 摄像机/观察空间/视图变换 在上一节变换中,我们讨…...
『VUE』vue-quill-editor富文本编辑器添加按钮houver提示(详细图文注释)
目录 预览效果新建一个config.js存放标题编写添加提示的方法调用添加标题方法的生命周期总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 预览效果 新建一个config.js存放标题 export const titleConfig [{ Choice: .ql-bold…...
如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?
我使用DeepSeek AI和Dexscreener API构建的一个简单的 AI 加密交易机器人实现了这一目标。在本文中,我将逐步指导您如何构建像我一样的机器人。 DeepSeek 最近发布了R1,这是一种先进的 AI 模型。您可以将其视为 ChatGPT 的免费开源版本,但增加…...
Kafka流式计算架构
引言 Kafka 凭借其卓越的架构设计,具备极为高效的流式计算能力,在海量数据环境下,依然能够以惊人的速度实现消息的高性能消费,轻松应对高并发、低延迟的严苛业务需求。无论是实时数据处理、复杂事件分析,还是大规模数…...
C++泛型编程06(默认模板实参)
文章目录 1.4 默认模板实参 (Default Template Arguments)示例:灵活定义返回类型 当然,这里是对关于默认模板实参(Default Template Arguments)的内容进行了改进和优化后的叙述: 1.4 默认模板实参 (Default Template Arguments) 在C中&…...
微信登录模块封装
文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…...
SRS代码目录
代码目录: src/目录下核心代码: core:核心功能模块,包括日志、配置、错误处理等;protocol:实现RTMP、HTTP-FLV、HLS等协议的模块;app:应用层的实现,包括流的发布、播放…...
C++STL(一)——string类
目录 一、string的定义方式二、 string类对象的容量操作三、string类对象的访问及遍历操作四、string类对象的修改操作五、string类非成员函数 一、string的定义方式 string是个管理字符数组的类,其实就是字符数组的顺序表。 它的接口也是非常多的。本章介绍一些常…...
机器学习--1.KNN机器学习入门
1、机器学习概述 1.1、什么是机器学习 机器学习(Machine Learning)是人工智能(Artificial Intelligence)领域的一个子集,它主要关注如何让计算机系统通过经验学习(数据)并自动改进性能。机器学…...
Adaptive LLM Transformer²
看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的,是一家日本AI公司SakanaAI的论文(我以前写过他们的不训练提升模型的能力的文章,感兴趣可以去翻)它家有Lion Jones坐镇…...
三路排序算法
三路排序算法 引言 排序算法是计算机科学中基础且重要的算法之一。在数据分析和处理中,排序算法的效率直接影响着程序的执行速度和系统的稳定性。本文将深入探讨三路排序算法,包括其原理、实现和应用场景。 一、三路排序算法的原理 三路排序算法是一…...
代码随想录day27
669. /** lc appleetcode.cn id669 langcpp** [669] 修剪二叉搜索树*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}…...
基于LabVIEW的Modbus-RTU设备通信失败问题分析与解决
在使用 LabVIEW 通过 Modbus-RTU 协议与工业设备进行通信时,可能遇到无法正常发送或接收指令的问题。常见原因包括协议参数配置错误、硬件连接问题、数据帧格式不正确等。本文以某 RGBW 控制器调光失败为例,提出了一种通用的排查思路,帮助开发…...
1. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--前言
在我们的专栏《单体开发》中,我们实现了一个简单的记账软件的服务端,并且成功上线。随着用户数量的不断增长,问题逐渐开始显现。访问量逐渐增加,服务端的压力也随之加大。随着访问量的攀升,服务端的响应时间变得越来越…...
直方图:摄影中的视觉数据指南
目录 一、直方图基础:揭开它的神秘面纱 二、解读直方图类型:亮度与色彩的密码 (一)亮度直方图 (二)RGB 直方图 三、拍摄中巧用直方图:优化曝光与效果 (一)精准判断曝…...
一份完整系统化提升信息输出密度与逻辑严谨性的训练素材
一、方法 1. 理论基础与核心概念 1.1 信息输出密度 定义 信息输出密度可以理解为单位表达中所包含的有效信息量。它要求在有限的篇幅或时间内传递更多有价值、低冗余的信息。衡量指标 信息熵(Shannon Entropy):在信息论中,信息…...
CommonJS 和 ES6module 的区别
动态与静态 CommonJS 与 ES6 Module 最本质的区别在于前者对模块依赖的解决是“动态的”,而后者是“静态的”。在这里“动态”的含义是,模块依赖关系的建立发生在代码运行阶段:而“静态”则表示模块依赖关系的建立发生在代码编译阶段。 看一…...
IM 即时通讯系统-51-MPush开源实时消息推送系统
IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术,提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…...
