Skip to content

状态机的管理者

1. 状态机模型简介

状态机是一种抽象模型,用于描述系统在不同状态之间的转换。在计算机科学中,状态机包含三个核心要素: - 状态:系统当前的情况 - 事件:触发状态变化的行为 - 转换:从一个状态到另一个状态的过程

2. 进程作为状态机

os-model.py中,进程被精确地表示为一个可暂停和恢复的状态机

class Process:
    '''
    A "freezed" state machine. The state (local variables,
    program counters, etc.) are stored in the generator
    object.
    '''

进程状态的组成

  • 局部变量:执行过程中的数据
  • 程序计数器:当前执行位置
  • 执行上下文:各种寄存器和执行信息

这些状态都被封装在Python的生成器对象中,通过生成器的暂停和恢复机制实现状态的保存和恢复。

3. 系统调用与状态转换

系统调用是进程状态机发生转换的关键点:

syscall, args, *_ = self._func.send(self.retval)

转换过程

  1. 进程执行到系统调用指令(yield语句)
  2. 状态机暂停,控制权交给操作系统
  3. 操作系统处理系统调用请求
  4. 操作系统将结果返回给进程(通过send()
  5. 进程状态机恢复执行

这个过程模拟了真实操作系统中的用户态/内核态切换

4. 操作系统作为状态机管理者

def run(self):
    while self.procs:
        current = random.choice(self.procs)
        try:
            match current.step():
                case 'read', _:
                    current.retval = random.choice([0, 1])
                # ...其他系统调用处理

操作系统的角色

  • 管理多个状态机:维护进程列表
  • 调度决策:选择下一个执行的进程
  • 处理系统调用:响应进程的服务请求
  • 资源分配:为进程提供所需资源

5. 具体系统调用与状态机视角

读取操作 (read)

case 'read', _:
    current.retval = random.choice([0, 1])
  • 进程状态机暂停,请求读取数据
  • 操作系统提供数据(这里简化为随机位)
  • 进程状态机恢复,使用读取到的数据继续执行

写入操作 (write)

case 'write', s:
    self.buffer += s
  • 进程状态机暂停,提供要写入的数据
  • 操作系统将数据写入缓冲区
  • 进程状态机恢复执行

进程创建 (spawn)

case 'spawn', (fn, *args):
    self.procs += [OS.Process(fn, *args)]
  • 当前进程状态机暂停,请求创建新进程
  • 操作系统创建新的状态机(进程)
  • 当前进程状态机恢复执行

6. 调度与多进程切换

current = random.choice(self.procs)

在状态机视角下,调度就是操作系统在多个状态机之间切换执行权的过程: - 暂停当前执行的状态机 - 选择下一个要执行的状态机 - 恢复被选中状态机的执行

此模型中采用随机选择策略,真实系统中会更复杂。

7. 进程终止

except StopIteration:
    # The generator object terminates.
    self.procs.remove(current)

当一个状态机运行到终止状态(生成器执行完毕)时: - 抛出StopIteration异常 - 操作系统将其从进程列表中移除 - 释放相关资源

8. 从状态机视角理解操作系统的价值

  1. 简化复杂性:将操作系统核心功能抽象为状态机管理
  2. 明确责任边界:区分进程(状态机)和操作系统(管理者)的职责
  3. 理解并发本质:多个状态机的交替执行形成并发
  4. 理解操作系统核心:资源分配、进程调度、系统调用处理

这种视角让我们能够跳出细节,从更高层次理解操作系统的本质功能:管理和协调多个并发执行的状态机