南京大学蒋炎岩操作系统笔记(p4-p7)
P4理解并发程序执行Model Checker通用检查器负责通用任务枚举所有可达状态生成并探索状态转移搜索错误状态输出状态图Python Generator生成器是后面实现Model Checker的一个关键技术Generator 可以让一个函数暂停下次再从暂停的位置继续执行。yield会保存整个函数的执行现场包括局部变量、程序执行位置等。下一次next()时会从上一次yield的下一条语句继续执行而不是重新进入函数。利用 GeneratorModel Checker 可以控制不同线程每次只执行一步从而模拟不同的线程调度顺序。P5并发控制互斥自旋锁、互斥锁和futexlock保证一条指令原子执行不会被其他 CPU 或线程打断。xchg一种原子交换指令能够一次性完成“读旧值 写新值”常用于实现自旋锁等同步机制。实际开发通常使用stdatomic.h提供的原子操作接口而不是直接编写这些汇编指令。利用xchg原子交换指令实现自旋锁如果锁被别人占用就一直在CPU上循环等待直到锁释放的代码int table YES; void lock() { retry: int got xchg(table, NOPE); if (got NOPE) goto retry; assert(got YES); } void unlock() { xchg(table, YES); }其中YES表示锁是空闲的NOPE表示锁已经被别人占用RISC-V原子操作LR/SCLoad-Reserved / Store-ConditionalLRLoad Reserved 作用 ① 读取内存数据 ② 对该内存建立 reservation预约/保留SCStore Conditional 作用 只有 reservation 未失效时才允许写入。返回值 0写入成功 非0写入失败reservation 已失效reservation 失效条件 1、其他 CPU/线程修改该内存 2、中断多数实现会取消 reservation实现流程 LR → 本地计算 → SC 成功则完成原子操作 失败则重新执行 LR/SC直到成功。RISC-V 不像 x86 提供 lock add、lock xchg 等专用原子指令RISC-V 通过LR预约读取 SC条件写回实现原子操作若期间数据被其他处理器修改则 SC 失败需要重新尝试。自旋锁的缺陷① 缓存同步开销 - 多个 CPU 不断访问同一个锁变量。 - 会触发缓存一致性Cache Coherence增加通信延迟降低性能。② CPU空转- 获得锁的线程执行临界区。 - 其他线程一直 while 循环等待自旋占用 CPU 但不做有效工作。 - 竞争线程越多CPU 利用率越低。③ 持锁线程被切换 - 持有锁的线程可能被操作系统切换出去。 - 其他线程持续自旋等待无法进入临界区。 - 造成 CPU 100% 占用但没有有效工作资源严重浪费自旋锁的使用场景操作系统内核的并发数据结构短临界区实现长临界区的互斥长临界区不适合一直自旋而是采用“阻塞 唤醒”机制。流程 ① 获得锁的线程进入临界区。 ② 后来的线程加入等待队列并调用 yield() 主动让出 CPU。 ③ 持锁线程释放锁后唤醒等待队列中的一个线程若无人等待则释放锁。自旋锁Spin Lock优点获取锁很快不需要系统调用缺点获取不到锁就一直自旋浪费 CPU。睡眠锁Mutex优点获取不到锁就睡眠不浪费 CPU。缺点每次加锁、解锁都可能进入内核系统调用开销较大。FutexFast Userspace Mutex自旋锁睡眠锁核心思想 先在用户态尝试获取锁只有竞争时才进入内核。工作流程 ① 获取锁成功用户态完成无系统调用Fast Path。 ② 获取锁失败调用 futex()进入内核睡眠等待Slow Path。 ③ 解锁若有等待线程调用 futex_wake() 唤醒否则直接释放锁。优点 无竞争时无需系统调用速度快。 有竞争时线程睡眠不会一直自旋浪费 CPU。Fast Path 用户态完成加锁/解锁无系统调用。Slow Path 锁竞争时进入内核睡眠和唤醒线程。注意 Futex 实现复杂容易出现竞争、死锁、丢失唤醒等问题因此常借助 Model Checker 验证其正确性。P6并发控制同步条件变量、信号量在多处理器上协同多个线程完成任务。线程同步在某个时间点共同达到互相已知的状态因为并发程序的步调很难保持一致所以需要先到的先等)经典线程同步问题生产者-消费者模型生产者生成数据并放入共享缓冲区。消费者从共享缓冲区取出数据并处理。缓冲区两者共享的有限空间。也就是不断重复尝试属于忙等待会浪费 CPU。更合理的方式是使用条件变量或信号量让缓冲区满或空时线程阻塞睡眠。1、条件变量万能同步方法条件变量通常用于在某个线程等待特定条件的满足时将其挂起并在其他线程满足条件时唤醒它。条件变量提供了一种有效的方式来实现线程之间的通信以及在某个条件成立时阻塞和唤醒线程。2、信号量(Semaphore)信号量是一种基于计数器的同步机制用于控制多个线程对有限资源的访问也可实现线程同步。线程通过Pwait和Vsignal操作申请和释放资源。Pwait信号量减 1若结果小于 0或资源不足线程阻塞等待。Vsignal信号量加 1若有等待线程则唤醒其中一个线程。特点内部维护一个计数器。可实现互斥初值为 1称二值信号量。可实现资源管理初值大于 1表示可同时访问的资源数量。常用于生产者—消费者问题、读者—写者问题等同步场景。P7真实时间的并发编程高性能计算/数据中心/人机交互中的并发编程数据中心特点低延迟、有备份、能同步线程Thread特点由操作系统调度。多个线程共享同一进程地址空间。可以真正利用多核 CPU并行执行。获取共享资源时需要使用Mutex、信号量、条件变量等同步机制。优点能充分利用多核 CPU。适合计算密集型任务。缺点线程切换开销较大。容易出现竞争、死锁等并发问题。协程Coroutine特点由程序自身调度。在用户态完成切换。遇到yield或await时主动让出执行权。一个线程中可以运行多个协程。优点切换速度快。开销小。编程简单不容易产生线程竞争。缺点通常不能充分利用多核 CPU。CPU 密集型任务性能不如多线程。Go语言能像线程一样利用多核也能像协程一样轻量。

相关新闻

TMS320F280015x SPI应用:从寄存器到DriverLib的实战配置与调试

TMS320F280015x SPI应用:从寄存器到DriverLib的实战配置与调试

1. 项目概述:从寄存器到驱动,打通TMS320F280015x SPI应用之路搞嵌入式开发,尤其是用TI的C2000系列,SPI(串行外设接口)绝对是绕不开的“老朋友”。无论是驱动一块OLED屏幕、读取一个高精度ADC芯片的数据&…

2026/7/21 7:23:00阅读更多 →
Java进阶(3) | Kubernetes 入门:为什么需要它,核心概念与实战

Java进阶(3) | Kubernetes 入门:为什么需要它,核心概念与实战

📚 本系列系统梳理了 Java 开发的详细知识点,从基础语法到工程实践层层递进,内容详实成体系,建议先收藏再慢慢阅读,方便日后随时回顾查阅。前言 上一篇用 Docker Compose 把 Mini-SSP 的几个服务跑起来了。但 Compose …

2026/7/21 7:21:00阅读更多 →
Agent工程与LangChain:AI应用开发的新范式

Agent工程与LangChain:AI应用开发的新范式

1. Agent 工程崛起:LangChain 创始人的预言意味着什么2024年夏天,LangChain创始人Harrison Chase在一次闭门技术会议上抛出了一个震撼性观点:"到2026年,不会构建Agent系统的软件公司将被淘汰。"这句话迅速在开发者社区引…

2026/7/21 7:21:00阅读更多 →
终极相机参数水印工具:5分钟学会为照片批量添加专业水印

终极相机参数水印工具:5分钟学会为照片批量添加专业水印

终极相机参数水印工具:5分钟学会为照片批量添加专业水印 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具,后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils Semi-Utils 是一款免费开源的批…

2026/7/21 16:43:53阅读更多 →
如何快速上手sing-geosite?从安装到配置的完整教程

如何快速上手sing-geosite?从安装到配置的完整教程

如何快速上手sing-geosite?从安装到配置的完整教程 【免费下载链接】sing-geosite Geosite database and rule sets for sing-box. 项目地址: https://gitcode.com/gh_mirrors/si/sing-geosite 想要为你的sing-box代理工具快速配置智能路由规则吗&#xff…

2026/7/21 16:43:53阅读更多 →
Camellia高级特性:动态配置与负载均衡实战指南 [特殊字符]

Camellia高级特性:动态配置与负载均衡实战指南 [特殊字符]

Camellia高级特性:动态配置与负载均衡实战指南 🚀 【免费下载链接】camellia Camellia provide easy-to-use server toolkits, such as: redis proxy、delay queue、id gen、hot key and more 项目地址: https://gitcode.com/gh_mirrors/ca/camellia …

2026/7/21 16:43:53阅读更多 →
Neovim-GTK配置完全指南:从字体设置到插件管理的完整教程

Neovim-GTK配置完全指南:从字体设置到插件管理的完整教程

Neovim-GTK配置完全指南:从字体设置到插件管理的完整教程 【免费下载链接】neovim-gtk gtk ui for neovim 项目地址: https://gitcode.com/gh_mirrors/ne/neovim-gtk Neovim-GTK是一款为Neovim打造的GTK图形界面客户端,它将Neovim的强大编辑能力与…

2026/7/21 16:43:53阅读更多 →
LangChain 高阶 Prompt 模板生产级特性

LangChain 高阶 Prompt 模板生产级特性

# 💡 Concept: # Advanced features include validation, partial variables, output parsers, and conditional logic for production applications. # Template Validation Process: # INPUT # Template Variables # → # VALIDATE # Check Rules # → # OUTPUT …

2026/7/21 16:43:53阅读更多 →
云客服系统开通前必须核算的3项隐藏成本:API调用、坐席数、存储

云客服系统开通前必须核算的3项隐藏成本:API调用、坐席数、存储

摘要云客服系统的成本核算中,SaaS订阅费只是冰山一角。据Gartner 2025年发布的《SaaS采购与管理最佳实践》报告,SaaS产品的隐性成本平均占首年订阅费的30%-60%,但仅有23%的企业在采购评估阶段完整核算了这些费用。本文从技术开发视角拆解三项…

2026/7/21 16:41:53阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →