当前位置: 首页 > article >正文

3调度和上下文切换

第3章 调度和上下文切换0. 导言并发执行的幻觉并发的本质操作系统通过在处理器上频繁切换不同的任务给用户造成多个任务“同时”处理的幻觉。核心机制上下文切换。步骤停止当前进程。保存足够的信息状态以便稍后能重新启动。启动另一个进程。后续动作切换完成后处理器必须紧接着执行新进程的代码。本章重点上下文切换的机制、进程状态的数据结构、调度器的实现Xinu、xv6、HarmonyOS案例。1. 进程表与进程状态1.1 进程表定义操作系统记录所有进程相关信息的数据结构。维护方式每个存在的进程在表中占用一个进程表项。进程创建时分配表项结束时删除。活动进程在单核单线程系统中任一时刻只有一个进程在执行因此进程表中只有一个表项对应“活动进程”。切换过程将当前运行进程的信息存入其表项从另一个表项中恢复目标进程的信息。1.2 进程表项中保存的信息当进程被暂停时必须保存所有可能被后续运行破坏的值栈指针必须保存。虽然每个进程有独立栈空间但寄存器中的栈指针必须在暂停时保存到进程表恢复时写回寄存器。思考x86 32位架构下栈指针寄存器是%esp帧指针是%ebp。通用寄存器如EAX,EBX等也需要保存通常保存在进程自己的栈中而非直接写在进程表字段里。元信息用于资源计数、错误避免、所有权管理。用户ID (uid)、组ID (gid)。内存限制。1.3 Xinu 进程表案例Xinu 的进程表proctab包含NPROC个表项通常为 100。核心字段prstate进程状态如PR_CURR,PR_READY。prprio调度优先级。prstkptr保存的栈指针进程不运行时使用。prstkbase进程栈在内存中的最高地址。prstklen栈的最大容量。prname进程名。prsem等待的信号量 ID。prparent父进程 ID。全局变量prcount当前活动进程总数。currpid当前正在执行的进程 ID。1.4 进程状态系统给每个进程赋予一个状态用于记录进程行为并校验操作合法性。进程表项procent中使用prstate字段记录每个进程的状态信息Xinu定义了7个有效状态每个状态对应一个符号常量。另外定义了一个额外常量用于标识未被使用的进程表项即没有进程使用该进程表项。Xinu 的状态常量PR_FREE(0)表项未使用。PR_CURR(1)正在运行。PR_READY(2)在就绪队列中等待 CPU。PR_RECV(3)等待消息。PR_SLEEP(4)休眠中。PR_SUSP(5)被挂起。PR_WAIT(6)在信号量队列中等待。PR_RECTIM(7)带超时的接收等待。对比 Linux/xv6Linux 0.12使用TASK_RUNNING统一表示就绪和运行。xv6就绪态为RUNNABLE运行态为RUNNING。2. 调度的实现2.1 调度器的定义调度器是执行进程选择策略的软件模块。从当前执行的进程转换到另一个进程需要两个步骤从有资格使用处理器的进程中挑选一个将处理器的控制权交给该进程。Xinu 调度策略优先级最高者优先任何时刻执行有资格运行的优先级最高的进程。时间片轮转若优先级相同则轮流执行。两点关键理解当前进程在“有资格进程”集合中。若它优先级最高则继续运行。相同优先级的进程按FIFO先来先服务顺序在组内轮转。2.2 调度器的本质函数调用调度器不是主动的代理而是由执行中的进程调用的一个函数resched()。就绪链表 (readylist)存储所有PR_READY进程。Xinu中进程的优先级由一个正整数表示保持相对静止进程创建后就不再改变。所有就绪状态的进程存储在就绪链表中按优先级降序排列表头即为最高优先级。Xinu 特殊策略当前运行进程currpid不在就绪链表中。2.3resched函数逻辑核心伪代码voidresched(void){// 1. 检查是否延迟调度if(Defer.ndefers0)return;ptoldproctab[currpid];// 2. 如果当前进程还能继续跑优先级比就绪链表最高的还高if(ptold-prstatePR_CURR){if(ptold-prpriofirstkey(readylist))return;// 否则将旧进程状态改为 READY 并插入就绪链表ptold-prstatePR_READY;insert(currpid,readylist,ptold-prprio);}// 3. 从就绪链表中取出最高优先级的进程作为新进程currpiddequeue(readylist);ptnewproctab[currpid];ptnew-prstatePR_CURR;preemptQUANTUM;// 重置时间片// 4. 调用汇编函数执行上下文切换ctxsw(ptold-prstkptr,ptnew-prstkptr);return;}3. 上下文切换3.1 为什么需要汇编寄存器和硬件状态无法通过 C 语言直接操作必须使用汇编函数ctxsw来执行从一个进程到另一个进程的上下文切换。现象观察左图串行程序流程。在传统的单线程/串行程序中函数调用遵循严格的 LIFO后进先出栈模型流程函数 Acall函数 B→\rightarrow→处理器跳转到 B→\rightarrow→B 执行完毕执行ret→\rightarrow→处理器跳转回 A 调用点的下一行。特征单一上下文所有的操作都在同一个进程、同一个内核栈中完成。即时性A 的暂停和 B 的开始是连续的B 的结束和 A 的恢复也是连续的。确定性ret指令弹出的返回地址必然是 A 刚才压入的那个地址。核心问题右图调度与上下文切换流程。图展示了函数 A - resched - ctxsw。这里的疑问在于ctxsw执行ret时它回到了哪里微观上的“流程断裂”在上下文切换中流程并不是像左图那样简单的“圆环”而是一个**“跨越空间的切换”**进程 A调用resched()随后进入汇编函数ctxsw()。ctxsw()将进程 A 的寄存器保存在进程 A 的栈上。关键动作ctxsw修改了栈指针寄存器如%esp将其指向进程 B 的栈。此时流程发生了“灵魂漂移”接下来的popal和ret指令是在进程 B 的栈上操作的。ctxsw执行ret时弹出的地址是进程 B 之前被切换走时留在栈上的地址。结果ctxsw“返回”到了进程 B 的resched函数中随后返回到进程 B 的代码执行。结论 1在微观上ctxsw并没有立即返回给它的调用者进程 A而是“消失”在 A 的视野中并从 B 的视野中“复活”。宏观上的“幻觉维持”尽管微观上发生了切换但操作系统必须维持一个幻觉对函数 A 来说它调用resched()就像调用一个耗时很长的普通函数一样。当未来的某个时刻调度器再次选中进程 A。某个进程可能是 B也可能是 C会调用ctxsw并把栈指针切回进程 A 的栈。此时进程 A 栈顶的返回地址正是当初resched调用ctxsw之后的下一行。ctxsw执行ret进程 A “感觉到”ctxsw返回了随后resched返回给函数 A。结论 2在宏观上每一个函数包括调度器最终都返回到了它的调用者流程闭环了。3.2 内存中的状态保存每个进程有私有栈。在ctxsw执行期间旧进程的寄存器状态会被压入它自己的栈顶。假设3个进程2个就绪1个正在运行每个进程拥有一个私有栈上下文切换会在进程栈上保存这个进程的机器状态信息——在上下文切换之前在进程栈上保存了这个进程的所有相关信息图中处理器转到另一个进程之前每个进程最后一步都执行了上下文切换两个就绪进程的栈顶都保存了各自的状态信息。3.3ctxsw汇编详解 (x86 32位)1 ctxsw: 2 pushl %ebp ; 保存旧进程的帧指针 3 movl %esp, %ebp ; 建立新的帧 4 pushfl ; 保存标志寄存器 (EFLAGS) 5 pushal ; 保存所有通用寄存器 (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) ; 切换栈指针 6 movl 8(%ebp), %eax ; 获取第一个参数 (旧进程 prstkptr 的地址) 7 movl %esp, (%eax) ; 将当前 ESP 存入旧进程表项 8 movl 12(%ebp), %eax; 获取第二个参数 (新进程 prstkptr 的地址) 9 movl (%eax), %esp ; 从新进程表项加载 ESP - 此时已处于新进程栈 ; 恢复新进程状态 10 popal ; 恢复通用寄存器 11 movl 4(%esp), %ebp ; 恢复 ebp (注意此时栈已变) 12 popfl ; 恢复标志寄存器 13 add $4, %esp ; 跳过返回地址所在的占位 14 ret ; 返回到新进程上次调用 resched 的地方3.4 切换全流程示意图函数 A 调用resched。resched调用ctxsw。ctxsw保存 A 的寄存器将%esp切换到 B 的栈。ctxsw从 B 的栈中弹出 B 之前保存的寄存器。ctxsw执行ret返回到resched中调用ctxsw的下一行由于栈已切换现在是在 B 的上下文执行resched的剩余部分。resched返回到函数 B。4. 其他重要概念4.1 空进程存在意义处理器必须始终有指令执行。如果所有进程都在等待 I/O调度器不能返回空。Xinu 实现系统启动时创建一个 PID 为 0、优先级为 0 的空进程其代码是一个死循环。原则任何时刻至少存在一个可运行进程。4.2ready函数使一个进程进入就绪状态并重新调度。statusready(pid32 pid){prptrproctab[pid];prptr-prstatePR_READY;insert(pid,readylist,prptr-prprio);resched();// 调度策略要求在任意时刻最高优先级的进程必须优先执行。如果一个函数改变了进程的状态这个函数必须调用resched来确保该策略的正确实施。returnOK;}5. xv6 的进程调度机制差异xv6 有一个专门的scheduler()内核线程调度器循环。过程进程 A - 切换到调度器c-scheduler- 调度器挑选进程 B - 切换到进程 B。数据结构使用context结构体保存状态。voidscheduler(void){structproc*p;structcpu*cmycpu();c-proc0;for(;;){sti();/* 开启中断 */acquire(ptable.lock);for(pptable.proc;pptable.proc[NPROC];p){if(p-state!RUNNABLE)continue;// 切换到选中的进程执行c-procp;switchuvm(p);p-stateRUNNING;/* * 此处 scheduler 与 context 都是一段栈空间 * 用于存放内核调度器和新进程的机器状态 */swtch((c-scheduler),p-context);switchkvm();// 进程运行完或切换回后清空当前 CPU 运行的进程指针c-proc0;}release(ptable.lock);}}6. HarmonyOS (LiteOS) 的调度6.1 LiteOS-M (轻量级)特点只有任务内核线程无进程空间概念。优先级0~310 最高与 Xinu 相反。调度策略高优先级抢占 同优先级轮转。差异点即使旧任务是最高优先级LiteOS-M 也会先把它放回就绪队列再取出来并重新分配时间片而 Xinu 则直接返回继续运行。6.2 LiteOS-A (小型系统)特点支持多进程、虚拟内存。多级队列32个进程优先级桶每个桶对应32个线程优先级桶。调度单位线程。线程切换若跨进程涉及**进程空间页表**的切换。

相关文章:

3调度和上下文切换

第3章 调度和上下文切换 0. 导言:并发执行的幻觉 并发的本质:操作系统通过在处理器上频繁切换不同的任务,给用户造成多个任务“同时”处理的幻觉。核心机制:上下文切换。 步骤: 停止当前进程。保存足够的信息&#xff…...

debug记录

1、头文件重复包含。 包含链分析: bsp_Seg7.h:12 包含了 lks32mc45x_define.happ_Comm.h:3 包含了 lks32mc45x.h而 lks32mc45x.h 很可能也直接或间接包含了 lks32mc45x_define.h 关键问题: 我之前读取的 lks32mc45x_define.h 缺少头文件保护&#xf…...

BigIntegerBigDecimal

BigInteger 构造方法 常用第二个,第四个1. 例子2. 总结常见方法1. 总结BigDecimal构造方法 这种构造有可能不太精确:通过传递字符串表示的小数来创建对象:静态方法获取Bigdecimal 对象:常见方法RoundingMode.HALF_UP (…...

Agent长期记忆系统设计实战(非常详细),从架构原理到落地从入门到精通,收藏这一篇就够了!

在大多数Agent系统的开发中,对Memory的处理方式都比较简单直接,常见的两种实现方式: 方式一:直接保存历史对话,下次直接塞给大模型; 方式二:把对话内容放到向量库中,再次对话时通过…...

弧光保护装置定义

弧光保护装置的定义弧光保护装置是一种用于检测和快速切断电力系统中电弧故障的电气安全设备。其主要功能是通过监测电弧产生的光、电流或压力变化,在毫秒级时间内触发断路器或熔断器动作,以消除电弧危害,保护人员安全和设备完整性。核心功能…...

杰理芯片矩阵赋能音频升级:AC112N、AC1123A引领蓝牙6.0低功耗新潮流--云信通讯

在消费电子飞速迭代的今天,蓝牙耳机已成为人们日常出行、办公娱乐的必备单品,而蓝牙耳机芯片作为核心“心脏”,直接决定了耳机的连接稳定性、续航能力与音质表现。杰理科技深耕音频芯片领域多年,凭借强大的研发实力,推…...

供应链OpenClaw

别让“龙虾”困在实验室!实测实在Agent:供应链数字化的“暴力美学”与终极落地 【摘要】 2026年3月,OpenClaw(龙虾)的爆火让全行业看到了AI Agent接管桌面的可能。但在供应链这个“深水区”,光有开源的热情…...

拆解Socks5代理:从定义到原理,小白也能看懂

Socks5代理,简单来说,是一种网络传输协议,本质是一个“中转站”,负责在客户端(比如你的电脑、手机)和目标服务器之间传递数据,不直接参与数据的处理和修改,仅起到转发作用。它是Sock…...

独居老人居家看护避坑指南:带你读懂“银发宝”的隐形守护逻辑

基于银发宝数字底座,联信数字打造的为老服务一键通系统,有效解决了老人摔倒了怎么办的居家难题,并通过百视宝电视终端实现了适老化交互。本文将深入探讨这一系统的运作机制及其在隐私保护、操作便捷性及响应闭环方面的优势。一、现状痛点&…...

AI 时代全栈开发的“破局之道”:TypeScript 生态实战,让 AI 真正为你所用

前言:AI 浪潮下,全栈门槛被重新定义 在 AI 工具席卷开发圈的今天,自动生成代码片段已不再是难事,但“全栈焦虑”并未因此消失 。很多开发者发现,即便有 AI 加持,依然会陷入困境:前端懂 React 却…...

Mac+PC双系统如何共享双屏?KVM切换器选购的5个关键指标|TESmart用户真实体验复盘

如今,用双显示器管理多台电脑已成为常态,无论你是在macOS和Windows之间切换工作,还是将个人电脑与办公系统分开,亦或是同时处理创意任务和技术工作流。但如果硬件跟不上,系统间的切换就会变得令人抓狂。 KVM切换器提供…...

网易一面:KAFKA写入数据时是先写Leader还是先写Follower?

Kafka 的写入路径是先写 Leader,再由 Leader 复制到 Followers。 对生产者而言是否等 Followers取决于 acks(确认级别)。不存在生产者直接同时写 Leader 和 Follower的机制,复制由 Leader 侧串起完成。写入链路:Leader…...

欧拉系统维护

一 安装docker 1.1 欧拉2403 安装docker 1.1.1 环境准备 # 欧拉中用 dnf-utils 替代 yum-utils(功能完全一致) sudo dnf install -y dnf-utils device-mapper-persistent-data lvm2 libseccomp-devel1.1.2 安装Docker Engine 1.1.2.1 配置 Docker 国内源…...

蓝桥杯 Python 备考全攻略:从入门到进阶的学习路线

前言 蓝桥杯作为国内热门的算法竞赛,Python 凭借语法简洁、上手快的优势成为很多参赛选手的首选语言。本文结合蓝桥杯常考知识点的难度分级,整理了一套科学的 Python 备考路线,帮助不同基础的选手高效备战。 目录 前言 一、备考总览 二、…...

Claude Agent Skills 开源!模块化技能插件一键解锁专业能力,小白也能轻松上手(收藏必备)

Claude Agent Skills 是 Anthropic 开源的新功能,通过加载不同领域的“技能插件”,让 Claude 模型快速切换专业角色,如代码审查师、设计师等。文章详细解析了 Agent Skills 的核心设计(渐进式加载、可组合性、可移植性&#xff09…...

HiFi播放器Tunely Play v0.0.7:功能更新与性能解析

今天为大家介绍一款在音质与功能上均有所突破的HiFi播放器——Tunely Play v0.0.7。这款播放器在近期更新中带来了一系列实用功能,下面我们来详细了解一下。v0.0.7版本概览: 1. 播放顺序:按照评分、标题、艺术家、专辑、类别、播放次数等排序…...

代码随想录算法训练营第五十六天|prim算法、kruskal算法

题目链接:53. 寻宝 解题思路:prim 算法 具体思路: 首先读取节点数 v 和边数 e,构建大小为 (v 1) * (v 1) 的邻接矩阵 graph,初始值设为 10001 表示节点间无直接边,适配权值不超过 10000 的场景&#x…...

爱普生EPSON打印机废墨垫已满报错?附全系列清零工具软件和教程

日常办公、居家打印全靠爱普生打印机撑着,结果前段时间我的爱普生打印机突然开始 “闹脾气”,频繁弹出各种报错提示,打印出来的文件要么字迹模糊,要么色彩失真,严重拖慢了工作节奏。急得我赶紧琢磨解决办法&#xff0c…...

2026年口碑TOP5的琥珀加工厂家都有谁?带你一探究竟!

家人们,琥珀这玩意儿,近几年可是火得不行!它不仅是漂亮的饰品,还蕴含着深厚的文化内涵,就像一个时间的胶囊,藏着远古的秘密。今天咱就来聊聊2026年口碑TOP5的琥珀加工厂家,看看都有哪些厉害角色…...

MySQL迁移中的合规与兼容双轨实践:从语法适配到安全认证的技术路径

MySQL迁移中的合规与兼容双轨实践:从语法适配到安全认证的技术路径 在当前信创深化推进的背景下,金仓数据库(KingbaseES)因其对MySQL生态的深度适配能力及权威的安全合规认证体系,正被金融、政务、能源等关键行业纳入…...

告别答辩 PPT 熬夜:PaperXie AI PPT 如何让本科生从 “凑内容” 到 “控全场”

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippthttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 引言 毕业答辩的前一周,是无数本科生的 “至暗时刻”:刚改完论文终稿,又要面对空白的 PP…...

我被Notion创始人的一篇文章搞失眠了,他说的3个真相,普通人再不听就晚了

昨晚,我读了一篇文章,结果直接搞得我一整晚没睡好。真的,不是开玩笑。这篇文章,把硅谷都给炸翻了。作者不是马斯克,也不是奥特曼,而是一个叫赵伊万(Ivan Zhao)的哥们,Not…...

欧意下载地址okxz.run复制进去-1982年4月15日晚上19-21点出生性格、运势和命运

欧意下载地址okxz.run复制进去-1982年4月15日晚上19 - 21点出生的人,其性格往往兼具热情与内敛。热情使得他们在人际交往中如鱼得水,能迅速与他人建立起良好的关系。他们积极向上,对生活充满着热爱,总是以乐观的心态面对各种挑战。…...

H3LIS331DLTR‌ 是一款由意法半导体(STMicroelectronics)推出的高性能、低功耗三轴线性加速度计,专为高冲击检测和电池供电应用优化,在工业、汽车、医疗及运动设备中表现出色。

H3LIS331DLTR‌ 是一款由意法半导体(STMicroelectronics)推出的高性能、低功耗三轴线性加速度计,专为高冲击检测和电池供电应用优化,在工业、汽车、医疗及运动设备中表现出色。核心性能参数:‌测量范围‌:支…...

好写作AI:本科生初稿写作避坑指南——这5个雷区,踩中一个都要命!

雷区踩得少,初稿写得好;雷区踩得多,导师想发火四月的深夜,某高校宿舍楼灯火通明。A同学对着空白文档发呆,光标闪了半小时,一个字没憋出来。B同学疯狂敲键盘,写了删删了写,最后发现写…...

TFT-LCD液晶高精度电路板微米级激光修复

一、引言TFT-LCD液晶高精度电路板是屏幕驱动信号传输的核心载体,其线路线宽已迈入微米级(2-5μm),集成度极高。在制程或使用过程中,易因光刻缺陷、静电损伤、制程污染等出现线路短路、开路、微裂等故障,直接…...

1C31166G02 模块广泛应用于化工制造石油等

1C31166G02 产品介绍1C31166G02 是艾默生(Emerson)Ovation 系列分布式控制系统(DCS)中的一款关键模块,具体为串行链路控制器模块。以下是对该产品的详细介绍:一、产品概述品牌与型号:艾默生&…...

2. SpringAI 使用Redis完成会话记忆和会话历史功能

前言SpringAI默认提供的会话记忆功能是基于内存的。如果程序重新启动,那么会话记忆和会话历史都会失。但是SpringAI也提供了会话记忆和会话历史的持久化做法,只不过只是提供的接口,具体需要用户自己实现。这里就使用Redis进行持久化。Maven依…...

进军高端制造“俱乐部”:智石开PLM在复杂产品研发领域的突破性应用排名

在制造业的金字塔尖,高端制造领域因其产品结构极端复杂、研发协同跨学科、质量与合规要求严苛,向来被视为PLM技术与解决方案的终极“试金石”。过去,这块代表行业最高标准与价值的高地,长期被西门子、达索系统、PTC等国际巨头所垄…...

eVTOL动力电驱系统功率链路设计实战:效率、功率密度与可靠性的高空平衡之道

在电动垂直起降飞行器(eVTOL)朝着长航时、高载荷与高安全等级不断演进的今天,其核心动力电驱系统的功率管理已不再是简单的能量转换单元,而是直接决定了飞行器航程边界、动力响应与飞行安全的核心。一条设计精良的高压功率链路&am…...