系统也是状态机

系统也是状态机

2024 南京大学《操作系统:设计与实现》
系统也是状态机

《操作系统》课:迷你小结

也讲了一个 “状态机” 的故事

  • “最小” 线
    • C 程序 (hanoi.c)
    • 汇编代码 (minimal.S)
    • 操作系统内核 (thread-os)
  • “实际” 线
    • 最小 Linux (initramfs)
    • musl libc; ELF 文件
    • 金山游侠、按键精灵、变速齿轮
      • 在与实际程序交互的过程中理解操作系统
      • 也会发现产生更多有趣的想法
2024 南京大学《操作系统:设计与实现》
系统也是状态机

操作系统对象和 API

操作系统管理了状态机

  • 状态机管理 API
    • 状态机创建与更新:fork, execve, exit
    • 地址空间管理:mmap, sbrk

操作系统提供了对象

  • 访问操作系统对象
    • 文件描述符:指向操作系统对象的 “指针” (handle)
    • fork() 时会继承
  • 操作系统对象管理 API
    • open, read, write, lseek, pipe, ...
2024 南京大学《操作系统:设计与实现》
系统也是状态机

状态机:理解程序世界的基本方法

程序执行 = 状态机执行

  • 我们能够 “hack” 进这个状态机
    • 观察状态机的执行
      • strace/gdb
    • 甚至记录和改变状态机的执行

Time-Travel Debugging & Record-replay

  • 如何退回到 s0s1s2s_0 \to s_1 \to s_2 \to \ldots 中的任何一个状态?
    • Time-travel debugging 的实现原理是什么?
  • 我们甚至可以完整记录程序的执行
    • rr, QEMU, ...
2024 南京大学《操作系统:设计与实现》
系统也是状态机

性能优化和 Profiler

Premature optimization is the root of all evil. (D. E. Knuth)

那到底怎么样才算 mature 呢?

  • 状态机的执行需要时间;对象需要占用空间
  • 需要理解好 “时间花在哪里”、“什么对象占用了空间”

我们需要真实执行的性能摘要

  • 本质的回答:“为了做某件事到底花去了多少资源”
  • 简化的回答:“一段时间内资源的消耗情况”
2024 南京大学《操作系统:设计与实现》
系统也是状态机

Profiler: 实现

隔一段时间 “暂停” 程序、观察状态机的执行

  • 中断就可以做到
  • sss \to s' 的指令 “记账”
    • 对应的语句
    • 函数调用栈
  • 得到统计意义的性能摘要

例子:Linux Kernel perf (支持硬件 PMU)

  • perf list, perf stat (-e), perf record, perf report
  • 案例:如果你部署了 100 台一模一样的机器,但有一台 CPU 100%,应该怎么办?
2024 南京大学《操作系统:设计与实现》
系统也是状态机

实际中的性能优化

你们遇到的大部分情况

  • 二八定律:80% 的时间消耗在非常集中的几处代码
  • L1 (pmm): 小内存分配时的 lock contention
    • profiler 直接帮你解决问题

工业界遇到的大部分情况

  • 木桶效应:每个部分都已经 tune 到局部最优了
    • 剩下的部分要么 profiler 信息不完整,要么就不好解决
    • (工程师整天都对着 profiler 看得头都大了)
    • The flame graph (CACM'16)
2024 南京大学《操作系统:设计与实现》
系统也是状态机

Model Checker 和 Verifier

一些真正的 model checkers

def main():
    x = sys_choose(range(1, 100))
    y = sys_choose(range(1, 100))
    if x > y:
        if x * x + y * y == 65:
            sys_write(f'BUG: {x=} {y=}')
2024 南京大学《操作系统:设计与实现》