多处理器编程入门

多处理器编程入门

2024 南京大学《操作系统:设计与实现》
多处理器编程入门

多线程编程模型

多个共享内存的状态机

  • C 语言状态机的多个线程
    • 共享所有全局变量
    • 独立的栈帧列表
  • 汇编语言状态机的多个线程
    • 共享一个地址空间
    • 独立的寄存器 (SP 指向不同内存位置)

状态迁移

  • 选择任意一个线程执行一步
2024 南京大学《操作系统:设计与实现》
多处理器编程入门

多线程编程模型 (cont'd)

Mosaic 状态机

  • “heap” 是共享内存
  • sys_sched 主动随机切换线程
    • 单处理器系统:中断会引起切换
      • (这就是为什么死循环不能把机器卡死)
    • 多处理器系统:真正同时执行
      • 相当于无时不刻在切换

模拟多线程程序的行为

  • 思考题:我们可以借助共享内存做什么
2024 南京大学《操作系统:设计与实现》
多处理器编程入门

多处理器编程:入门

简化的线程 API (thread.h)

  • spawn(fn)
    • 创建一个入口函数是 fn 的线程,并立即开始执行
      • void fn(int tid) { ... }
      • 参数 tid 从 1 开始编号
    • 行为:sys_spawn(fn, tid)
  • join()
    • 等待所有运行线程的返回 (也可以不调用)
    • 行为:while (done != T) sys_sched()
2024 南京大学《操作系统:设计与实现》
多处理器编程入门

多处理器编程入门,就这么简单

一个 API 搞定

#include "thread.h"

void T_a() { while (1) { printf("a"); } }
void T_b() { while (1) { printf("b"); } }

int main() {
    create(T_a);
    create(T_b);
}

实现多处理器的利用

  • 操作系统会自动把线程放置在不同的处理器上
  • CPU 使用率超过了 100%
2024 南京大学《操作系统:设计与实现》
多处理器编程入门

关于线程的一些疑问 (和解答)

T_aT_b 真的共享内存吗?

  • 如何证明/否证这件事?

如何证明线程具有独立堆栈 (以及确定堆栈的范围)?

  • 输出混乱,应该如何处理?

更多的 “好问题” 和解决

  • 创建线程使用的是哪个系统调用?
  • 能不能用 gdb 调试?
    • 基本原则:有需求,就能做到 (RTFM)
2024 南京大学《操作系统:设计与实现》