from mosaic import *
OS2023(4)
Changelog & 反馈
背景回顾:在理解了 “软件 (应用)” 和 “硬件 (计算机)” 之后,操作系统就是直接运行在计算机硬件上的程序,它提供了应用程序执行的支撑和一组 API (系统调用):操作系统内核被加载后,拥有完整计算机的控制权限,包括中断和 I/O 设备,因此可以构造出多个应用程序同时执行的 “假象”。
本讲内容:一个 Python “操作系统玩具” 的设计与实现,帮助大家在更高的 “抽象层次” 上理解操作系统的行为。这个 “玩具” 将贯穿整个课程。
slideshow('4.1')
slideshow('4.2')
demo('model', 'm/os-model')
slideshow('4.3')
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) 系统调用的行为,并用它们实现很多有趣的程序。下面展示了一个更复杂的例子:
model('m/mix.py')
我们可以用 “简化” 的方式把操作系统的概念用可执行模型的方式呈现出来:
阅读、调试 os-model.py 的代码,观察如何使用 generator 实现在状态机之间的切换。在现代分时操作系统中,状态机的隔离 (通过虚拟存储系统) 和切换是一项基础性的基础,也是操作系统最有趣的一小部分代码:在中断或是 trap 指令后,通常由一段汇编代码将当前状态机 (执行流) 的寄存器保存到内存中,完成状态的 “封存”。
开始课程实验:课程实验在在课程网站上发布。实验有一定难度,同时也有实验指导,请大家仔细阅读。