数学视角的操作系统

数学视角的操作系统

2025 南京大学《操作系统原理》
数学视角的操作系统

应用视角的操作系统

程序 = 状态机

  • 状态
    • 栈帧中的变量和 PC; 局部变量
  • 初始状态
    • main(argc, argv)
  • 状态迁移
    • 执行 “当前栈帧 PC” 的语句
    • 有一种特殊的语句:syscall
  • (我们不妨就认可状态机是可以 “数学定义” 的)
2025 南京大学《操作系统原理》
数学视角的操作系统

数学视角的操作系统

操作系统 = 状态机的管理者

  • 可以同时容纳多个 “程序状态机”
    • 程序内计算:选一个程序执行一步
    • 系统调用:创建新状态机、退出状态机、打印字符……

有了一个有趣的想法……

  • 能不能我们自己定义 “状态机”
    • 用我们喜欢的语言、喜欢的方式
    • 不要受限于 C、汇编……
  • 自己模拟状态机的执行
    • 不就有了一个 “玩具操作系统” 吗?
2025 南京大学《操作系统原理》
数学视角的操作系统

表示状态机:当然是程序

Life is short, you need Python!

def StateMachine():
    b = sys_read()

    if b == 0:
        sys_write('I got a zero.')
    else:
        sys_write('I got a one.')

def main():
    sys_spawn(StateMachine)
2025 南京大学《操作系统原理》
数学视角的操作系统

玩具操作系统

操作系统中的对象

  • 状态机 (进程)
    • Python 代码
    • 初始时,仅有一个状态机 (main)
    • 允许执行计算或 read, write, spawn 系统调用
  • 一个进程间共享的 buffer (“设备”)

系统调用

  • read(): 返回随机的 0 或 1
  • write(s): 向 buffer 输出字符串 s
  • spawn(f): 创建一个可运行的状态机 f
2025 南京大学《操作系统原理》
数学视角的操作系统

如何实现?

难点是多状态机的管理

  • 如何在状态机之前来回切换
  • 实现我们单 CPU 上运行多个程序的效果?

一些途径

  • 用一个模拟器去解释执行语句 (2022 年的实现)
    • 创建多个模拟器对象单步执行 (J2ME KVM 就是如此)
    • “虚拟机” (QEMU TCG)
  • 是否有语言机制能 “暂存” 函数的运行状态,并且之后回复?
    • 有:Generators/Coroutines
    • DeepSeek-R1 几乎做对了 (给了一个 99% 正确的代码)
2025 南京大学《操作系统原理》
数学视角的操作系统

于是,我们有了 “操作系统”!

30 行代码讲完 UNIX 系统的基本模型

  • 进程
  • 系统调用
  • 上下文切换
  • 调度

你会在 Linux Kernel 中看到 “类似” 的代码

  • “procs” → cpu->runqueue
  • “current” → current = (current_thread_info()->task)
2025 南京大学《操作系统原理》
数学视角的操作系统

打开并发程序的大门

操作系统是最早的实用并发程序

  • 每个进程 (程序) 都是顺序状态机
    • 但发生中断/系统调用以后,操作系统代码直接执行
    • 如果有多个处理器 (或者允许此时切换到另一个程序执行),就有了并发
def Process(name):
    for _ in range(5):
        sys_write(name)

def main():
    sys_spawn(Process, 'A')
    sys_spawn(Process, 'B')
2025 南京大学《操作系统原理》