嵌入式知识点总结 操作系统 专题提升(四)-上下文

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。

目录

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)中,再加载下一个进程的上下文,使得新的进程能够从它上次保存的状态继续执行。

上下文的作用

  1. 进程切换:操作系统在多任务处理时,通过上下文切换来让多个进程轮流执行。每次切换时,操作系统会保存当前进程的上下文,并恢复下一个进程的上下文,从而实现多任务并发。

  2. 进程恢复:当一个进程被中断、挂起或切换出去时,操作系统需要保存其上下文信息,以便在以后恢复该进程时,能够从上次停止的地方继续执行,保证进程状态的一致性。

  3. 多线程执行:类似进程的上下文,线程也有自己的上下文。当多个线程共享同一进程的地址空间时,每个线程的上下文会包括该线程特有的寄存器和栈信息,而其他资源(如堆、代码段等)则是共享的。

上下文切换的代价

上下文切换是操作系统中不可避免的开销。每次上下文切换都会引入一定的时间成本,主要是由于:

  • 保存和加载寄存器状态:需要将当前进程的寄存器值保存在进程控制块(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:累加寄存器,用于加法乘法的缺省寄存器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/963926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python算法和数据结构刷题[6]:二叉树、堆、BFS\DFS

遍历二叉树 前序遍历NLR:先访问根结点,再前序遍历左子树,最后前序遍历右子树。中序遍历LNR:先中序遍历左子树,再访问根结点,最后中序遍历右子树。后序遍历 LRN:先后序遍历左子树,再…

012-51单片机CLD1602显示万年历+闹钟+农历+整点报时

1. 硬件设计 硬件是我自己设计的一个通用的51单片机开发平台,可以根据需要自行焊接模块,这是用立创EDA画的一个双层PCB板,所以模块都是插针式,不是表贴的。电路原理图在文末的链接里,PCB图暂时不选择开源。 B站上传的…

w191教师工作量管理系统的设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

Python 网络爬虫实战:从基础到高级爬取技术

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 网络爬虫(Web Scraping)是一种自动化技术,利用程序从网页中提取数据,广泛…

[漏洞篇]SQL注入漏洞详解

[漏洞篇]SQL注入漏洞详解 介绍 把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。…

C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)

Made By 于子轩,2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件,或是使用Windows Script Host对象创建快捷方式,亦或是使用Shell32对象创建快捷方式,都对用户很不友好,今天小编为大家带来一种全新…

DDD - 微服务架构模型_领域驱动设计(DDD)分层架构 vs 整洁架构(洋葱架构) vs 六边形架构(端口-适配器架构)

文章目录 引言1. 概述2. 领域驱动设计(DDD)分层架构模型2.1 DDD的核心概念2.2 DDD架构分层解析 3. 整洁架构:洋葱架构与依赖倒置3.1 整洁架构的核心思想3.2 整洁架构的层次结构 4. 六边形架构:解耦核心业务与外部系统4.1 六边形架…

基于SpringBoot的新闻资讯系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

xmind使用教程

xmind使用教程 前言xmind版本信息“xmind使用教程”的xmind思维导图 前言 首先xmind是什么?XMind 是一款思维导图和头脑风暴工具,用于帮助用户组织和可视化思维、创意和信息。它允许用户通过图形化的方式来创建、整理和分享思维导图,可以用于…

半导体器件与物理篇7 微波二极管、量子效应和热电子器件

基本微波技术 微波频率:微波频率涵盖约从0.1GHz到3000GHz,相当于波长从300cm到0.01cm。 分布效应:电子部件在微波频率,与其在较低频率的工作行为不同。 输运线:一个由电阻、电容、电感三种等效基本电路部件所组成的…

Java自定义IO密集型和CPU密集型线程池

文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue(实现 核心线程->最大线程数->队列) 场景1:CPU密集型场景思路&…

浅谈线段树

文章同步发布于洛谷,建议前往洛谷查看。 前言 蒟蒻终于学会线段树(指【模板】线段树 1 1 1)啦! 线段树思想 我们先来考虑 P3372(基础线段树模板题)给的操作: 区间修改(增加&am…

linux运行级别

运行级别:指linux系统在启动和运行过程中所处的不同的状态。 运行级别之间的切换:init (级别数) 示例: linux的运行级别一共有7种,分别是: 运行级别0:停机状态 运行级别1:单用户模式/救援模式…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具03

SQLSERVER的ImpDp和ExpDp工具 1、全部的表导出(仅表结构导出) 2、导出的表结构,导入到新的数据库 导入前,test3数据没有任何表 导入 导入结果确认:表都被做成,但是没有数据 3、全部的表导出&#x…

商品列表及商品详情展示

前言 本文将展示一段结合 HTML、CSS 和 JavaScript 的代码&#xff0c;实现了一个简单的商品展示页面及商品详情&#xff0c;涵盖数据获取、渲染、搜索及排序等功能。 效果展示 点击不同的商品会展示对应的商品详情。 代码部分 代码总体实现 <!DOCTYPE html> <htm…

c++提取矩形区域图像的梯度并拟合直线

c提取旋转矩形区域的边缘最强梯度点&#xff0c;并拟合直线 #include <opencv2/opencv.hpp> #include <iostream> #include <vector>using namespace cv; using namespace std;int main() {// 加载图像Mat img imread("image.jpg", IMREAD_GRAYS…

独立开发浏览器插件:案例与启示

浏览器插件&#xff08;Browser Extension&#xff09;作为提升用户浏览体验的重要工具&#xff0c;近年来吸引了许多独立开发者的关注。从广告拦截到生产力工具&#xff0c;再到个性化定制功能&#xff0c;浏览器插件的开发为个人开发者提供了一个低成本、高潜力的创业机会。本…

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量&#xff0c;本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”&#xff0c;我们会更详细讲解&#xff1b;理解环境变量的全局…

BFS(广度优先搜索)——搜索算法

BFS&#xff0c;也就是广度&#xff08;宽度&#xff09;优先搜索&#xff0c;二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS&#xff08;深度优先搜索&#xff09;。从字面意思也很好理解&#xff0c;DFS就是一条路走到黑&#xff0c;BFS则是一层一层地展开。…

SpringCloud基础二(完结)

HTTP客户端Feign 在SpringCloud基础一中&#xff0c;我们利用RestTemplate结合服务注册与发现来发起远程调用的代码如下&#xff1a; String url "http://userservice/user/" order.getUserId(); User user restTemplate.getForObject(url, User.class);以上代码就…