Mosaic Model and Checker
Mosaic Model and Checker
Mosaic Model and Checker
数学视角的操作系统
状态
多个 “应用程序” 状态机
当然,可以是模型
初始状态
仅有一个 “main” 状态机
这个状态机处于初始状态
迁移
选择一个状态机执行一步
就像我们在操作系统模型上看到的那样
Mosaic Model and Checker
计算机系统中的不确定性 (non-determinism)
调度
:状态机的选择不确定
current = random.choice(self.procs)
操作系统每次可以随机选择一个状态机执行一步
I/O
:系统外的输入不确定
read 返回的结果也有两种可能性
t = sys_read()
后,可能
t
=
0
t=0
t
=
0
或
t
=
1
t=1
t
=
1
推论:我们得到了
状态图
u
→
v
⇔
u
u \to v\Leftrightarrow u
u
→
v
⇔
u
可以通过一步迁移到达
v
v
v
当然,我们只关系
s
0
s_0
s
0
可达的状态
Mosaic Model and Checker
你们学过的算法忽然更有用了
Breadth-first search 可以构建 “状态图”
Mosaic Model and Checker
Prove by Brute-force
想要证明程序的性质?
只要稍微 “修改” 一下模拟器的实现就行了
构建状态图,检查程序正确性
read():创建两个状态,分别是
r
=
0
r=0
r
=
0
和
r
=
1
r=1
r
=
1
调度:为每个进程
p
p
p
创建一个状态,对应选择
p
p
p
执行
程序正确:不存在从
s
0
s_0
s
0
可达的 “坏状态”
例如:最终 buffer 中 A 和 B 的数量相同
“模型检查器”;
Turing Award Lecture
Mosaic Model and Checker
Putting Them Together
模型
理论上,我们可以建模任何系统调用
当然,我们选择建模
最重要
的那些
Three Easy Pieces!
检查器
最简单的 BFS 就行 (只要能获得状态机的状态)
可视化
我们就是绘制一个顶点是状态的图
G
(
V
,
E
)
G(V, E)
G
(
V
,
E
)
Mosaic Model and Checker
于是,我们有了一个更复杂的玩具
模块
系统调用
行为
基础
choose(xs)
返回一个 xs 中的随机的选择
基础
write(s)
向调试终端输出字符串 s
并发
spawn(fn)
创建从 fn 开始执行的线程
并发
sched()
切换到随机的线程/进程执行
虚拟化
fork()
创建当前状态机的完整复制
持久化
bread(k)
读取虚拟设磁盘块
k
k
k
的数据
持久化
bwrite(k, v)
向虚拟磁盘块
k
k
k
写入数据
v
v
v
持久化
sync()
将所有向虚拟磁盘的数据写入落盘
持久化
crash()
模拟系统崩溃