信息技术大学
锁与同步
计算机基础面试八股 · 第 2 章 操作系统
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
信息技术大学
锁与同步
计算机基础面试八股 · 第 2 章 操作系统
互斥锁与自旋锁的选择
等锁时睡还是转:临界区长,睡(阻塞)省 CPU;临界区极短,转(自旋)更快。
互斥锁
拿不到就休眠让出 CPU,唤醒有开销
自旋锁
原地忙等不睡眠,烧 CPU 换最低延迟
选型
临界区几十纳秒选自旋,毫秒级选互斥
混合
先自旋几次再休眠,自适应锁的思路
等外卖对应 →等锁
先站着等片刻,太久就回去睡,到了再喊你
读写锁与条件变量
读多写少场景读锁共享、写锁独占;条件变量解决「等某个条件成立再干活」。
读写锁
读共享写独占,读多写少吞吐大增
写饥饿
读流不断写者难入,需写优先或公平策略
条件变量
wait 挂起等条件,notify 唤醒后再复查
信号量与生产者消费者模型
信号量管计数:资源剩几个、空位有几个;生产者消费者是它的招牌应用。
P/V 操作
P 减一可能阻塞,V 加一可能唤醒等待者
双信号量
空位数与满额数各管一个,互斥锁护队列
模型骨架
生产者填缓冲区,消费者取数据,互不直呼
乐观锁与悲观锁
冲突少用乐观,冲突多用悲观:一个先改后验,一个先锁后改。
乐观锁
无锁读,提交时校验版本号,失败就重试
悲观锁
先锁再操作,冲突代价低但并发度也低
场景
读多写少选乐观(CAS),热点写选悲观
锁选型自测
点击作答
多线程计数器冲突极其频繁,哪种方案更合适?
本节要点
- ✓临界区长用互斥,极短用自旋
- ✓读写锁救读多写少,条件变量管等待
- ✓信号量管计数,生产者消费者是招牌
- ✓冲突少乐观、冲突多悲观
延伸主题:手写一遍双信号量队列找找项目里的乐观锁
课后思考
先自己回答,再展开参考答案——能讲出来才算真懂。
1自旋锁在单核环境为什么几乎不能用?
参考答案自旋的前提是「持锁者正在别的核上推进」;单核上持锁者与自旋者抢同一个 CPU,自旋纯烧时间片拖慢持锁者,不如立刻休眠让出。
2条件变量为什么要配合互斥锁和 while 循环使用?
参考答案检查条件与进入等待必须是原子的,否则有丢失唤醒的窗口;被唤醒时条件可能已被别人消费,用 while 复查保证虚假唤醒与竞态下仍然正确。
3数据库里的乐观锁怎么落地?适合什么业务?
参考答案表加版本号字段,更新时 where version = 旧值,影响行数为零即冲突重试。适合读多写少、冲突稀少的场景;热点行高频写会演变成重试风暴,应改悲观锁排队。