四个 “系统调用” API
xs
中的一个随机选项s
fn
除此之外,所有的代码都是确定 (deterministic) 的纯粹计算
操作系统玩具:
count = 0
def Tprint(name):
global count
for i in range(3):
count += 1
sys_write(f'#{count:02} Hello from {name}{i+1}\n')
sys_sched()
def main():
n = sys_choose([3, 4, 5])
sys_write(f'#Thread = {n}\n')
for name in 'ABCDE'[:n]:
sys_spawn(Tprint, name)
sys_sched()
有些 “系统调用” 的实现是显而易见的
def sys_write(s): print(s)
def sys_choose(xs): return random.choice(xs)
def sys_spawn(t): runnables.append(t)
有些就困难了
def sys_sched():
raise NotImplementedError('No idea how')
我们需要
Generator objects (无栈协程/轻量级线程/...)
def numbers():
i = 0
while True:
ret = yield f'{i:b}' # “封存” 状态机状态
i += ret
使用方法:
n = numbers() # 封存状态机初始状态
n.send(None) # 恢复封存的状态
n.send(0) # 恢复封存的状态 (并传入返回值)
完美适合我们实现操作系统玩具 (os-model.py)
我们并没有脱离真实的操作系统
void sys_write(const char *s) { printf("%s", s); }
void sys_sched() { usleep(rand() % 10000); }
int sys_choose(int x) { return rand() % x; }
void sys_spawn(void *(*fn)(void *), void *args) {
pthread_create(&threads[nthreads++], NULL, fn, args);
}