Mosaic Model and Checker

Mosaic Model and Checker

2024 南京大学《操作系统:设计与实现》
Mosaic Model and Checker

数学视角的操作系统

状态

  • 多个 “应用程序” 状态机
    • 当然,可以是模型

初始状态

  • 仅有一个 “main” 状态机
    • 这个状态机处于初始状态

迁移

  • 选择一个状态机执行一步
    • 就像我们在操作系统模型上看到的那样
2024 南京大学《操作系统:设计与实现》
Mosaic Model and Checker

计算机系统中的不确定性 (non-determinism)

调度:状态机的选择不确定

  • current = random.choice(self.procs)
  • 操作系统每次可以随机选择一个状态机执行一步

I/O:系统外的输入不确定

  • read 返回的结果也有两种可能性
  • t = sys_read() 后,可能 t=0t=0t=1t=1

推论:我们得到了状态图

  • uvuu \to v\Leftrightarrow u 可以通过一步迁移到达 vv
  • 当然,我们只关系 s0s_0 可达的状态
2024 南京大学《操作系统:设计与实现》
Mosaic Model and Checker

你们学过的算法忽然更有用了

Breadth-first search 可以构建 “状态图”

center

2024 南京大学《操作系统:设计与实现》
Mosaic Model and Checker

Prove by Brute-force

想要证明程序的性质?

  • 只要稍微 “修改” 一下模拟器的实现就行了

构建状态图,检查程序正确性

  • read():创建两个状态,分别是 r=0r=0r=1r=1
  • 调度:为每个进程 pp 创建一个状态,对应选择 pp 执行
  • 程序正确:不存在从 s0s_0 可达的 “坏状态”
2024 南京大学《操作系统:设计与实现》
Mosaic Model and Checker

Putting Them Together

模型

  • 理论上,我们可以建模任何系统调用
  • 当然,我们选择建模最重要的那些
    • Three Easy Pieces!

检查器

  • 最简单的 BFS 就行 (只要能获得状态机的状态)

可视化

  • 我们就是绘制一个顶点是状态的图 G(V,E)G(V, E)
2024 南京大学《操作系统:设计与实现》
Mosaic Model and Checker

于是,我们有了一个更复杂的玩具

模块 系统调用 行为
基础 choose(xs) 返回一个 xs 中的随机的选择
基础 write(s) 向调试终端输出字符串 s
并发 spawn(fn) 创建从 fn 开始执行的线程
并发 sched() 切换到随机的线程/进程执行
虚拟化 fork() 创建当前状态机的完整复制
持久化 bread(k) 读取虚拟设磁盘块 kk 的数据
持久化 bwrite(k, v) 向虚拟磁盘块 kk 写入数据 vv
持久化 sync() 将所有向虚拟磁盘的数据写入落盘
持久化 crash() 模拟系统崩溃
2024 南京大学《操作系统:设计与实现》