^-^
Why so serious?
lec10 Locking
  1. Locking
    1. 课前准备
      1. Race conditions:以 kfree 为例
        1. race
      2. Code: Locks
        1. acquire
        2. amoswap
        3. acquire 与 release 实现
      3. Code: Using locks
        1. 何时使用锁
        2. 何时不使用锁
        3. big kernel lock
        4. 细粒度锁
      4. Deadlock and lock ordering
        1. e.g. 不同顺序获取锁
        2. 全局锁链
        3. 锁遇到的一些问题
      5. Locks and interrupt handlers
        1. 问题:死锁
        2. solution
        3. push_off 与 pop_off:锁嵌套层级
      6. Instruction and memory ordering
        1. 内存模型
        2. 重排与并发
        3. __sync_synchronize
      7. Sleep locks
        1. acquiresleep
        2. 睡眠锁的使用场景
      8. Real world
        1. POSIX 线程
        2. 无原子指令锁
        3. 锁与缓存
        4. 无锁的数据结构和算法
    2. 为什么要使用锁?
      1. 并行与锁:矛盾的处境
        1. 为什么要依靠并行提升性能?
    3. 锁如何避免 race condition?
      1. critical section
      2. big kernel lock 与序列化
    4. 什么时候使用锁?
      1. 可变共享数据结构
      2. printf
      3. 自动加锁是否可行?
        1. e.g. rename
      4. 锁的使用完全是由程序员决定的
    5. 锁的一般用途和问题
      1. 锁的一般用途
      2. 锁的问题:死锁
        1. 单个锁
        2. 多个锁:deadly embrace
      3. 锁的问题:破坏抽象
      4. 锁的问题:性能权衡与复杂性
        1. 通常的开发流程
    6. xv6:UART 与锁
      1. 不变量
      2. uartputc
      3. uartstart
      4. uartintr:handler 或许也得加锁
    7. 自旋锁的实现
      1. amoswap
        1. amoswap 具体实现?
      2. acquire
      3. release
      4. 其他原子指令
      5. 总结:自旋锁需要处理的并发
      6. memory fence