In [1]:
from mosaic import *
OS2023(4)
4. Python 建模操作系统¶
Changelog & 反馈
- 视频直播/回放:放大黑板/投影区域 + 屏幕录制
- AbstractMachine 代码将随实验一同发布 (请关注课程主页,因紧急背锅,再缓一缓 😂)
背景回顾:在理解了 “软件 (应用)” 和 “硬件 (计算机)” 之后,操作系统就是直接运行在计算机硬件上的程序,它提供了应用程序执行的支撑和一组 API (系统调用):操作系统内核被加载后,拥有完整计算机的控制权限,包括中断和 I/O 设备,因此可以构造出多个应用程序同时执行的 “假象”。
本讲内容:一个 Python “操作系统玩具” 的设计与实现,帮助大家在更高的 “抽象层次” 上理解操作系统的行为。这个 “玩具” 将贯穿整个课程。
In [2]:
slideshow('4.1')
In [3]:
slideshow('4.2')
In [4]:
demo('model', 'm/os-model')
In [5]:
slideshow('4.3')
In [6]:
model('m/hello.py')
在我们的操作系统模型中,应用程序 (状态机) 被分为两部分:确定性 (deterministic) 的本地计算,和可能产生非确定性的系统调用 (以 sys 开头的函数)。操作系统提供以下 API:
系统调用/Linux 对应 | 行为 |
---|---|
sys_spawn(fn)/pthread_create | 创建共享内存的线程,并且从 fn 开始执行 |
sys_fork()/fork | 创建当前状态机的完整复制 |
sys_sched()/定时被动调用 | 切换到随机的线程/进程执行 |
sys_choose(xs)/rand | 返回一个 xs 中的随机的选择 |
sys_write(s)/printf | 向调试终端输出字符串 s |
sys_bread(k)/read | 读取虚拟设磁盘块 $k$ 的数据 |
sys_bwrite(k, v)/write | 向虚拟磁盘块 $k$ 写入数据 $v$ |
sys_sync()/sync | 将所有向虚拟磁盘的数据写入落盘 |
sys_crash()/长按电源按键 | 模拟系统崩溃 |
我们将会在这个学期的时间里,仔细分析模型和真实操作系统 (Linux) 系统调用的行为,并用它们实现很多有趣的程序。下面展示了一个更复杂的例子:
In [7]:
model('m/mix.py')
Take-away Messages¶
我们可以用 “简化” 的方式把操作系统的概念用可执行模型的方式呈现出来:
- 程序被建模为高级语言 (Python) 的执行和系统调用
- 系统调用的实现未必一定需要基于真实或模拟的计算机硬件
- 操作系统的 “行为模型” 更容易理解
课后习题/编程作业¶
1. 编程实践¶
阅读、调试 os-model.py 的代码,观察如何使用 generator 实现在状态机之间的切换。在现代分时操作系统中,状态机的隔离 (通过虚拟存储系统) 和切换是一项基础性的基础,也是操作系统最有趣的一小部分代码:在中断或是 trap 指令后,通常由一段汇编代码将当前状态机 (执行流) 的寄存器保存到内存中,完成状态的 “封存”。
2. 实验作业¶
开始课程实验:课程实验在在课程网站上发布。实验有一定难度,同时也有实验指导,请大家仔细阅读。