操作系统内核中的自旋锁
操作系统内核中的自旋锁
操作系统内核中的自旋锁
回顾:计算机系统的状态机模型
状态
共享内存 + per-CPU 寄存器
初始状态
由系统设计者规定 (CPU Reset)
状态迁移
选择任意 CPU
:
从 PC 取指令执行或响应中断信号 (中断打开时)
计算:改变内存/寄存器数值
I/O:与 “计算机系统外” 交换数据
操作系统内核中的自旋锁
操作系统内核中的互斥
操作系统接管了完整的计算机系统
每个处理器都并行 x++
每个处理器中断发生时执行 x += 1000000000
(假想 x 是操作系统中的数据结构,例如进程表)
如何正确实现 x 的原子访问?
仅仅自旋是不够的
因为还有中断
操作系统内核中的自旋锁
正确性准则
正确实现互斥
关中断 + 自旋可以保证实现互斥
上锁/解锁前后中断状态不变
不得在关中断时随意打开中断 (例如处理中断时)
不得随意关闭中断 (否则可能导致中断丢失)
因此我们需要保存中断状态
全局?
Per CPU?
Per Thread?
xv6 自旋锁