In [1]:
from mosaic import *
OS2023(14)
14. 多处理器系统与中断机制¶
Changelog & 反馈
- L1 Online Judge 上线 (一片惨状)
- 难度警告:操作系统内核来了
背景回顾:我们已经了解并发编程实践需要的几乎全部内容——线程、内存模型、互斥、同步和并发 bugs 的应对。但我们一直是在简化的线程模型 (thread.h) 上讲解的。但我们还没有回答一个关键问题:线程到底在计算机硬件上是如何实现的?即便系统中只有一个处理器,我们依然可以创建很多并发执行的线程。
本讲内容:操作系统内核实现
- 多处理器和中断
- AbstractMachine API
- 50 行实现嵌入式操作系统
In [2]:
slideshow('14.1')
In [3]:
demo('rvemu', 'i/rvemu')
这个简易的多处理器系统模型容易理解,但同时也有缺陷:它上似乎没办法运行任何 “正经” 的操作系统:如果任何处理器上的应用程序死循环,那么这个处理器就彻底 “卡死” 了。而使真正得我们的线程可以 “逃出” 死循环的核心机制,就是操作系统管理的硬件中断。
In [4]:
slideshow('14.2')
In [5]:
demo('rv32ima', 'c/rv32ima')
In [6]:
demo('spinlock', 'c/spinlock-am')
In [7]:
slideshow('14.3')
In [8]:
demo('thread-os', 'c/thread-os')
Take-away Messages¶
本节课遭遇了画风突变:在做了 “状态机” 和 “并发” 足够的铺垫后,我们终于回到了机器指令 (状态机) 和操作系统内核了。本次课回答了为什么 while (1)
不会把操作系统 “卡死”:
- 在操作系统代码切换到应用程序执行时,操作系统内核会打开中断
- “不可信任” 的应用程序定期会收到时钟中断被打断,且应用程序无权配置中断
- 操作系统接管中断后,可以切换到另一个程序执行
课后习题/编程作业¶
1. 调试 Thread-OS¶
thread-os 的代码很简短,看起来的确在讲一个像教科书一样的 “操作系统” 故事。然而,其中的许多细节是不显然的,例如中断发生后,究竟是如何保存所有寄存器的,以及寄存器究竟是如何被恢复的。但对初学者来说可能会有理解的难度。你需要调试到 AbstractMachine 中去,理解 “每一行代码做了什么” 是必要的实践。
2. 编程实践¶
开始动手完成 L1 和 L2。实验对初学者具有爆炸性的难度,是从门外汉到 “专家” 的重要必经之路。