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

深入解析Pintos优先级捐赠机制:从理论到实践

1. 优先级反转问题与捐赠机制我第一次在Pintos里遇到优先级反转问题时系统直接卡死了——高优先级线程H等着低优先级线程L释放锁但L根本抢不到CPU。这种场景就像救护车被堵在卡车后面而卡车司机正在等红灯。操作系统课程里把这个现象称为优先级反转它会让实时系统完全失去可预测性。优先级捐赠机制的精妙之处在于它打破了这种死循环。当高优先级线程H需要获取被低优先级线程L持有的锁时H会把自己的优先级借给L。这就相当于给卡车司机开了警笛让它能临时获得道路优先权。具体实现时需要区分三种典型场景简单捐赠线程A优先级31持有锁线程B优先级33尝试获取该锁时A的优先级临时提升到33递归捐赠线程A持有锁1线程B持有锁2A在等锁2线程C高优先级尝试获取锁1时需要同时提升A和B的优先级多重捐赠线程A持有锁同时有多个高优先级线程B、C都在等待该锁时A应该获得这些线程中的最高优先级在Pintos的thread结构体中我们新增了三个关键字段来支持这个机制struct thread { int base_priority; // 线程的原始优先级 struct list locks; // 线程当前持有的所有锁 struct lock *lock_waiting; // 线程正在等待的锁 };2. 数据结构改造实战改造lock结构体时踩过一个坑最初只记录了当前持有者的优先级没考虑多重捐赠的情况。后来增加了max_priority字段用来记录所有等待线程中的最高优先级struct lock { struct list_elem elem; // 用于优先级捐赠列表 int max_priority; // 等待线程中的最高优先级 // ...其他原有字段 };初始化线程时要特别注意锁列表的初始化我在thread_init()函数里加了这两行t-base_priority priority; list_init(t-locks);实测中发现一个易错点在lock_acquire()中获取锁之前必须先处理优先级捐赠逻辑。正确的执行顺序应该是检查当前线程优先级是否高于锁持有者如果需要捐赠递归更新所有相关线程优先级执行实际的锁获取操作将锁添加到线程的持有锁列表3. 核心算法实现细节优先级捐赠的核心逻辑在thread_donate_priority()函数中实现。这里有个优化技巧不是直接修改线程优先级而是通过锁的max_priority来间接控制void thread_donate_priority(struct thread *t, int new_priority) { if (new_priority t-priority) return; t-priority new_priority; if (t-status THREAD_READY) { // 如果线程在就绪队列中需要重新排序 list_remove(t-elem); list_insert_ordered(ready_list, t-elem, thread_less_priority, NULL); } }处理递归捐赠时我写了个notify_father()辅助函数。它会沿着锁的持有链向上追溯直到遇到没有更高优先级需求的线程static void notify_father(struct thread *t) { if (t-lock_waiting NULL) return; struct thread *holder t-lock_waiting-holder; int max_priority list_max(t-lock_waiting-waiters, thread_priority_less, NULL); if (max_priority holder-priority) { thread_donate_priority(holder, max_priority); notify_father(holder); // 递归处理 } }释放锁时的处理同样关键。在lock_release()中需要恢复锁持有者的原始优先级检查是否还有其他锁在被持有如果没有锁了完全恢复base_priority否则取剩余锁中的最高优先级4. 测试与调试经验priority-donate-one测试用例最能验证简单捐赠场景。我调试时发现一个典型错误忘记在释放锁时更新ready_list的顺序。这会导致调度器仍然按旧优先级选择线程。对于递归捐赠测试priority-donate-nest建议在代码中加入调试输出printf(Thread %s donating to %s (new prio: %d)\n, thread_current()-name, holder-name, new_priority);遇到最棘手的bug是在多重捐赠场景下当多个高优先级线程等待同一个锁时最初实现只记录了最后一个捐赠者的优先级。解决方案是在lock结构体中维护一个捐赠者优先级列表而不是单个值。5. 性能优化技巧在实现优先级队列时直接使用Pintos提供的list_insert_ordered()虽然方便但在高频操作时性能较差。我最终优化为保持ready_list始终有序只在thread_yield()时执行全列表排序其他时候用二分查找确定插入位置对于递归深度问题设置了一个最大捐赠深度限制实测8层足够。超过该深度时会打印警告但仍继续执行避免栈溢出。6. 与其他模块的交互优先级捐赠会影响定时器唤醒策略。在timer_sleep()的实现中需要特别注意被捐赠优先级的线程唤醒后应该保持捐赠优先级直到释放所有锁。与信号量的交互也是个坑点。最初我的sema_up()没有考虑优先级导致高优先级线程可能无法立即被唤醒。修正后的实现void sema_up(struct semaphore *sema) { enum intr_level old_level intr_disable(); if (!list_empty(sema-waiters)) { // 按优先级排序后唤醒第一个 list_sort(sema-waiters, thread_priority_less, NULL); thread_unblock(list_entry(list_pop_front(sema-waiters), struct thread, elem)); } intr_set_level(old_level); }7. 真实项目中的教训在课程项目中我们组最初尝试用一个全局捐赠表来记录所有优先级关系结果发现锁竞争太严重。后来改为每个锁维护自己的捐赠列表性能提升了近3倍。另一个经验是在thread_set_priority()实现中必须区分基础优先级和捐赠优先级。直接覆盖当前优先级会导致捐赠失效。正确做法是void thread_set_priority(int new_priority) { thread_current()-base_priority new_priority; if (list_empty(thread_current()-locks)) { // 没有锁时才允许直接修改当前优先级 thread_current()-priority new_priority; } thread_yield_if_should(); }

相关文章:

深入解析Pintos优先级捐赠机制:从理论到实践

1. 优先级反转问题与捐赠机制 我第一次在Pintos里遇到优先级反转问题时,系统直接卡死了——高优先级线程H等着低优先级线程L释放锁,但L根本抢不到CPU。这种场景就像救护车被堵在卡车后面,而卡车司机正在等红灯。操作系统课程里把这个现象称为…...

Go语言的依赖管理

Go语言的依赖管理 1. 依赖管理的基础概念 1.1 什么是依赖管理 依赖管理是指管理项目依赖的第三方库和模块的过程包括依赖的添加、更新、移除和版本控制确保项目在不同环境中能够正确构建和运行 1.2 Go语言依赖管理的发展 GOPATH模式:早期的依赖管理方式Go Modules&a…...

Doris Catalog实战指南:从创建到多源数据联邦查询

1. Doris Catalog核心概念解析 Doris Catalog是Apache Doris实现多源数据联邦查询的核心组件,简单理解它就像是数据世界的"图书馆管理员"。想象一下,你走进一个巨大的图书馆,里面有来自不同出版社(数据源)的…...

别再自己造轮子了!用大疆Cloud API的MQTT示例项目,快速搞定无人机状态订阅

别再重复造轮子!用大疆Cloud API的MQTT示例项目快速订阅无人机状态 去年接手一个农业巡检项目时,团队花了三周时间逆向解析无人机通信协议。直到发现大疆官方GitHub仓库里那个带着灰尘的MQTT示例项目,我们才意识到自己走了多少弯路——原来只…...

爱毕业aibiye等品牌依托互联网技术,打造了便捷高效的论文辅导解决方案

核心工具对比速览 工具名称 核心优势 适用场景 降重效果 处理速度 aibiye 专业术语保留度高 理工科论文 40%→7% 快速 aicheck 逻辑结构保持好 社科类论文 38%→6% 极快 askpaper 上下文连贯性强 人文类论文 45%→8% 中等 秒篇 多语种支持 外语论文 42%…...

VSCode插件配置避坑:Live Server指定用Chrome打开,别再用默认浏览器了

VSCode开发者必备:Live Server精准调用Chrome的终极配置指南 每次启动Live Server时,Edge或Safari突然跳出来打断你的工作流?这可能是VSCode开发者最恼人的"小问题"之一。想象一下:当你正在调试一个CSS动画,…...

以数字化服务为核心,爱毕业aibiye等机构持续优化用户体验,赢得广泛认可

核心工具对比速览 工具名称 核心优势 适用场景 降重效果 处理速度 aibiye 专业术语保留度高 理工科论文 40%→7% 快速 aicheck 逻辑结构保持好 社科类论文 38%→6% 极快 askpaper 上下文连贯性强 人文类论文 45%→8% 中等 秒篇 多语种支持 外语论文 42%…...

Umi-CUT:三分钟掌握批量图片去黑边的终极解决方案

Umi-CUT:三分钟掌握批量图片去黑边的终极解决方案 【免费下载链接】Umi-CUT 项目地址: https://gitcode.com/gh_mirrors/um/Umi-CUT 在数字内容创作和日常工作中,处理大量图片的黑边、尺寸调整和压缩任务常常耗费大量时间。Umi-CUT是一款开源的批…...

【工业控制系统网络安全系列课程】第2课-工业控制系统的网络安全风险-过程控制漏洞利用(二)典型漏洞利用路径-物理过程影响攻击

【工业控制系统网络安全系列课程】第2课-工业控制系统的网络安全风险-过程控制漏洞利用(二)典型漏洞利用路径-物理过程影响攻击 严正声明 本文章方法和工具只用于学习和交流,严禁使用文章中的方法在未经许可的情况下对生产系统进行方法验证…...

Synopsys DW_apb_i2c实战:从零配置到多主机仲裁避坑指南

Synopsys DW_apb_i2c实战:从零配置到多主机仲裁避坑指南 在嵌入式系统开发中,I2C总线因其简单性和多设备支持特性而广受欢迎。Synopsys的DW_apb_i2c IP作为业界广泛采用的解决方案,为开发者提供了强大的硬件加速功能。然而,从基础…...

2025届毕业生推荐的五大AI辅助写作方案推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网正式上线了AIGC检测服务,它能有效识别由GPT、DeepSeek等大模型生成的学术文本…...

2026届必备的五大AI辅助写作平台实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 基于深度语言模型跟模式识别算法,其是学术原创性审查的重要工具,专门…...

多尺度地理加权回归:解决空间异质性的完整指南

多尺度地理加权回归:解决空间异质性的完整指南 【免费下载链接】mgwr Multiscale Geographically Weighted Regression (MGWR) 项目地址: https://gitcode.com/gh_mirrors/mg/mgwr 你是否曾在地理数据分析中遇到过这样的困境:某些影响因素在城市中…...

视频PPT智能提取终极指南:三步将视频内容转为PDF文档

视频PPT智能提取终极指南:三步将视频内容转为PDF文档 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 你是否曾观看在线课程或会议录像时,希望能快速获取其中的…...

7.8%复合增速!无人机管理软件未来六年发展路径清晰

据恒州诚思调研统计,2025年全球无人机管理软件市场规模约26.12亿元,预计未来将持续保持平稳增长态势,到2032年市场规模将接近44.89亿元,未来六年复合年均增长率(CAGR)达7.8%。在无人机技术飞速发展、应用场…...

BilibiliDown:3步完成B站视频下载的完整免费解决方案

BilibiliDown:3步完成B站视频下载的完整免费解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi…...

3分钟快速上手:VideoDownloadHelper视频下载助手完整指南

3分钟快速上手:VideoDownloadHelper视频下载助手完整指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否经常在网上看到精…...

【12.MyBatis源码剖析与架构实战】13.1 SqlSource解析过程剖析-案例

下面提供一个完整的 MyBatis 基础使用案例,包含从项目构建到单元测试的全部代码和配置。 一、项目结构 mybatis-demo ├── pom.xml ├── src │ └── main │ ├── java │ │ └── com │ │ └── example │ │ ├…...

告别付费下载!用阿里DataV+Python+ArcGIS,手把手教你自制精准行政区划SHP文件

零成本构建精准行政区划数据:DataVPythonArcGIS全链路实战 在GIS数据领域,行政区划边界文件堪称基础设施级别的存在——无论是城市规划分析、商业选址评估,还是人口统计研究,都离不开精准的行政区划数据支撑。然而现实情况却令人尴…...

LS-DYNA过量采购的许可证(核心数)内部调剂与跨项目共享策略

用闲置许可证做项目“缓冲池”,才是真正省下的钱我啊这边又赶上个烦心事,甲方项目组死活要使用LS-DYNA,说句实在的,IT部门说许可证全被占用了问题是,那帮人并尚未真的在用,只是担心自己用不到,搞…...

天气的所有状态

这个问题其实没有一个**全球统一“固定数量”**的天气状态标准,不同气象机构(比如中国气象局、WMO、METAR航空天气)分类都不一样。 但在嵌入式/APP开发里,一般会用一个**“工程上够用 覆盖常见情况”**的分类,大概 20…...

Rust模式匹配与解构语法

Rust语言以其安全性和高效性闻名,而模式匹配与解构语法则是其最具表现力的特性之一。无论是处理复杂数据结构还是简化条件逻辑,模式匹配都能让代码更清晰、更优雅。解构语法则进一步扩展了这一能力,允许开发者轻松提取嵌套数据中的值。本文将…...

向量搜索实战:FAISS与ChromaDB的性能对比与选型指南

1. 向量搜索技术为何成为AI应用的核心组件 最近两年,AI应用呈现爆发式增长,从推荐系统到智能客服,从图像识别到语义理解,背后都离不开一个关键技术——向量相似度搜索。想象一下,当你在电商平台搜索"红色连衣裙&q…...

124.二叉树中的最大路径和

package org.example;class Solution {/*** 最大路径和*/private int maxPathSum Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {maxPath(root);return maxPathSum;}/*** 计算经过 treeNode 结点的路径的最大路径和* * param treeNode 结点* return 经过 treeNode…...

基于增强大气散射模型的图像去雾与曝光优化实践

1. 为什么我们需要更好的图像去雾技术 你有没有遇到过这样的情况?在雾天拍了一张照片,结果画面灰蒙蒙的,远处的建筑和景物都看不清楚。这种情况在户外摄影、监控摄像头和自动驾驶系统中特别常见。传统的图像增强方法往往只是简单提高对比度&a…...

从GEBCO到Delft3D:MATLAB自动化构建高精度水深模型的完整流程

1. 为什么需要自动化水深建模流程 想象一下你正在规划一个新港口项目,领导突然要求三天内提交初步水深模型。传统做法是手动下载数据、用Excel筛选、再导入建模软件——这个过程不仅耗时,还容易出错。这就是为什么我们需要MATLAB自动化流程来解放工程师的…...

告别电源焦虑:用SY8113B这颗3A DCDC芯片,给你的树莓派/路由器做个高效供电模块(附完整原理图)

告别电源焦虑:用SY8113B打造3A高效供电模块实战指南 树莓派玩家和路由器发烧友常被一个问题困扰:原装电源适配器要么体积笨重,要么在高负载时发热严重。去年我为一个边缘计算项目调试树莓派集群时,就曾因劣质电源导致SD卡频繁损坏…...

为什么你的神经网络训练效果差?可能是激活函数没选对!

为什么你的神经网络训练效果差?可能是激活函数没选对! 在深度学习项目的实战中,许多开发者都遇到过这样的困境:模型训练过程看似正常,但验证集准确率始终徘徊不前,甚至出现预测结果完全随机的情况。上周一位…...

别再硬算拉格朗日乘子了!用Python+CMDP搞定带约束的强化学习任务(附代码)

用Python实战CMDP:避开数学陷阱的工程化实现指南 在资源分配、机器人控制等实际场景中,我们常常需要在特定约束条件下优化目标函数。传统强化学习虽然擅长寻找最优策略,但面对"总功耗不超过100W"或"平均响应时间必须小于200ms…...

从零到一:在Banana Pi BPI-W3上部署YOLOv8,手把手教你用RKNN-Toolkit2搞定模型转换与板端推理

从零到一:在Banana Pi BPI-W3上部署YOLOv8,手把手教你用RKNN-Toolkit2搞定模型转换与板端推理 当目标检测遇上边缘计算,如何在资源受限的嵌入式设备上实现实时AI推理?本文将带你完整走通YOLOv8模型从训练到Banana Pi BPI-W3开发板…...