系列导航:面试索引 · 代码评审与 Agentic 研发
本库面向资深工程师,只收录容易因遗漏前提、版本或失败路径而答错的问题,不收概念默写和基础语法题。先从现有面试系列提取问题,再补充经典易错题;答案是机制与反例的复习提纲,不代表已完成实现或性能实验。
追加时复制下面的模板,选择所属分类的前缀,使用该分类现有最大编号加一,编号补足三位;保持各节内按编号递增,不重排或复用旧编号。每题仅保留这七个字段,每字段 1—3 句;语言题在标签标明 C++、Java、Rust、Go 或 Python,涉及版本差异必须写明适用版本。
难度:★★★ 为隐藏前提或关键反例,★★★★ 为跨机制推演,★★★★★ 为并发、恢复或跨节点安全证明。来源保留“面试系列 0X 文章名, 2026-10-24”或“经典易错题, 2026-10-24”,新增资料链接放在对应字段内。
1### ALG-013 题目短名
2
3- 题目:写清约束和需要判断的行为。
4- 分类/标签:算法 / 具体主题
5- 难度:★★★★
6- 易错点(常见错误答案):记录容易误信的答案。
7- 正确要点:说明成立条件、关键机制与限制。
8- 追问:用反例或失败路径继续验证。
9- 来源/日期:经典易错题, 2026-10-24
算法 ALG
ALG-001 二分答案的单调性
- 题目:资源配置随参数变化时,怎样证明可以二分答案而不会漏掉可行解?
- 分类/标签:算法 / 二分查找、边界
- 难度:★★★
- 易错点(常见错误答案):目标值有大小顺序就能二分,循环退出时返回值一定对应已有元素。
- 正确要点:二分查找(Binary Search)要求判定函数单调;半开区间
[lo, hi)应明确两侧已排除的范围并保证每轮收缩。左边界可能等于 n,空输入和中点计算也要避免下溢、溢出。 - 追问:若可行性先真后假再真,哪个不变量首先失效?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-002 带负数的最短子数组
- 题目:求和至少为 K 的最短连续子数组,加入负数后双指针为何可能出错?
- 分类/标签:算法 / 滑动窗口、前缀和
- 难度:★★★★
- 易错点(常见错误答案):和够大就收缩,否则右移,正负数都适用。
- 正确要点:滑动窗口(Sliding Window)的常用收缩规则依赖和的单调变化,负数会破坏它。可对前缀和维护单调队列(Monotonic Queue):先弹出满足差值的队首更新答案,再移除不可能更优的队尾;每个下标至多进出一次,故总计 O(n)。
- 追问:用
[1, -1, 5]、K=5 推演普通窗口为何漏掉长度 1 的解。 - 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-003 局部词频前 K 的遗漏
- 题目:多个分片分别取词频前 K,再合并候选,何时能保证精确答案?
- 分类/标签:算法 / Top K、分区
- 难度:★★★★
- 易错点(常见错误答案):任意切分输入后,所有全局热门词都会在某个分片进入前 K。
- 正确要点:前 K 项(Top K)若按频次排序,必须先完成同键计数;K=1 时,两片分别为 x:6、a:7 与 x:6、b:7,局部候选会漏掉全局 x:12。先按完整键归到唯一分区并统一并列排序规则,局部前 K 才能覆盖所需全局候选。
- 追问:要求返回所有并列第 K 名时,候选规模还能限制为 K 吗?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-004 压缩状态与背包方向
- 题目:0/1 背包把二维表压成一维后,为何容量必须倒序更新?
- 分类/标签:算法 / 动态规划、0/1 背包
- 难度:★★★
- 易错点(常见错误答案):正序、倒序只影响缓存命中,不影响状态含义。
- 正确要点:动态规划(Dynamic Programming)压缩后必须保留转移依赖的旧状态;倒序使
dp[c-w]仍属于上一轮物品。正序可能读取本轮已更新值,从而重复使用当前物品,改变了题目约束。 - 追问:若要求恢复选取路径,单个最优值数组还缺哪些信息?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-005 递增子序列的尾值数组
- 题目:最长递增子序列的尾值数组,能直接作为答案序列返回吗?
- 分类/标签:算法 / LIS、路径恢复
- 难度:★★★★
- 易错点(常见错误答案):每个位置都由原数组元素得到,所以拼起来必然是一条子序列。
- 正确要点:最长递增子序列(Longest Increasing Subsequence,LIS)的尾值数组只记录各长度的最小末尾,不保证各槽位来自同一条路径。严格递增使用首个大于等于目标的位置替换;恢复路径须另存前驱和对应原下标。
- 追问:允许相等的非递减子序列,应改用哪一种边界搜索?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-006 拓扑排序残留不全是环
- 题目:入度法结束后还有节点未输出,能否把它们全部报告为环成员?
- 分类/标签:算法 / 图、依赖调度
- 难度:★★★★
- 易错点(常见错误答案):未输出节点都在环上,删除这些节点即可恢复调度。
- 正确要点:拓扑排序(Topological Sort)残留包含环及被环阻塞的下游,例如 a↔b、b→c 中 c 不在环上。定位环可进一步求强连通分量(Strongly Connected Component);调度还须区分任务成功、失败与依赖解除条件。
- 追问:单节点分量何时也构成环?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-007 哈希连接的输出成本
- 题目:哈希连接为什么不能无条件写成 O(n+m),增加分区能否解决所有热点?
- 分类/标签:算法 / 哈希连接、倾斜
- 难度:★★★★
- 易错点(常见错误答案):哈希查找均摊常数,所以与输出规模、热点分布无关。
- 正确要点:哈希连接(Hash Join)的期望工作量应包含输出 Z,即 O(n+m+Z),并以合适的哈希分布等为前提。同键热点仍进入同一分区;两侧大量重复可令输出达乘积规模,须区分状态超限与结果爆炸。
- 追问:热点分块处理怎样保证每对匹配恰好输出一次?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-008 外排归并路数的上限
- 题目:外部排序是否总应一次合并全部有序段,以减少归并轮数?
- 分类/标签:算法 / 外部排序、I/O
- 难度:★★★★
- 易错点(常见错误答案):归并轮数越少就一定越快,内存只需放一个堆。
- 正确要点:外部排序(External Sorting)的归并路数受各输入缓冲、输出缓冲、文件句柄与设备并发预算约束。若每轮完整读写 N 字节,生成段加 p 轮归并约为
2N(1+p)字节;末轮流式输出可省一次物化写入,少轮次也不保证低等待。 - 追问:远端小请求很多时,增大单路缓冲为何可能比增大路数有效?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-009 过滤器删除与发布
- 题目:标准 Bloom Filter 为何不能直接清位删除,构建正确是否就没有线上漏数?
- 分类/标签:算法 / Bloom Filter、集合语义
- 难度:★★★★
- 易错点(常见错误答案):误判率很低,所以清除该键对应的位不会影响其他键。
- 正确要点:布隆过滤器(Bloom Filter)中多个键共享位,清位可能使其他已存在键被误判为不存在。理论无假阴性还依赖完整构建与正确发布;新数据已可见而过滤器未覆盖时,必须更新覆盖版本或旁路过滤。
- 追问:Cuckoo Filter 一次查询为阳性,是否就能安全删除该键?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-010 草图合并不等于可撤回
- 题目:HyperLogLog 能合并每日去重状态,为什么不能从七日状态中减掉第一天?
- 分类/标签:算法 / HyperLogLog、增量计算
- 难度:★★★★
- 易错点(常见错误答案):并集能合并,因此过期时把昨天的估计数减去即可。
- 正确要点:HyperLogLog 逐寄存器保留最大秩,丢失了元素归属和次大值,普通状态没有任意撤回的逆运算。应合并仍有效的时间桶,且哈希、种子、精度和编码必须兼容;估计数相加也无法处理跨桶重复。
- 追问:滑动窗口更细时,如何权衡桶数量、边界精度和重合并成本?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
ALG-011 负权边与最短路
- 题目:没有负环但存在负权边,Dijkstra 算法还能保证正确吗?
- 分类/标签:算法 / Dijkstra、算法前提
- 难度:★★★★
- 易错点(常见错误答案):只要不存在负环,第一次弹出的最短距离就不会改变。
- 正确要点:Dijkstra 的定型证明要求相关边权非负;例如 s→a 为 2、s→b 为 5、b→a 为 -4,a 提前定型会出错。存在负边可按约束选择 Bellman–Ford,或在有向无环图(Directed Acyclic Graph)上按拓扑序松弛,不能混用前提。
- 追问:允许反复重新入队是否仍有 Dijkstra 的复杂度保证?
- 来源/日期:经典易错题, 2026-10-24
ALG-012 快速选择的最坏代价
- 题目:快速选择找第 K 小,期望线性意味着单次请求也有线性上界吗?
- 分类/标签:算法 / Quickselect、复杂度
- 难度:★★★★
- 易错点(常见错误答案):每轮丢掉一侧,所以无论枢轴怎样选都是 O(n)。
- 正确要点:快速选择(Quickselect)在随机枢轴等假设下期望 O(n),极端不平衡划分可退化到 O(n²)。中位数的中位数(Median of Medians)可提供最坏线性选择;工程上也可设置退化检测与回退,另计有序输出成本。
- 追问:大量相等元素时,三路划分如何避免无效递归?
- 来源/日期:经典易错题, 2026-10-24
操作系统 OS
OS-001 配额下的空闲处理器
- 题目:主机处理器利用率不高,容器线程为何仍长时间排队?
- 分类/标签:操作系统 / Linux、调度
- 难度:★★★★
- 易错点(常见错误答案):主机还有空闲核,增加工作线程就能消除等待。
- 正确要点:控制组(Control Group,cgroup)的处理器配额和允许核集合限制实际预算;配额耗尽会节流(Throttling),主机均值不能代表容器可运行资源。应结合可运行队列、节流计数与锁持有者调度情况定位,线程增加可能扩大争抢。
- 追问:若锁持有者被节流,等待线程增加为何会放大尾延迟?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
OS-002 分配成功与首次触页
- 题目:大块分配很快,第一次扫描却很慢,是否能判定是磁盘换入?
- 分类/标签:操作系统 / Linux、虚拟内存
- 难度:★★★
- 易错点(常见错误答案):分配返回时所有物理页已就绪,缺页都要访问磁盘。
- 正确要点:虚拟内存(Virtual Memory)的地址空间承诺不等于物理页已分配,首次访问可能触发按需分配与清零。次缺页(Minor Page Fault)通常不需磁盘读取,主缺页(Major Page Fault)才涉及相应 I/O;还应区分回收与交换压力。
- 追问:预触页把成本移到何处,是否保证后续不会被回收?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
OS-003 大页与尾延迟
- 题目:透明大页提高吞吐后,为何有些请求延迟反而上升?
- 分类/标签:操作系统 / Linux、THP
- 难度:★★★★
- 易错点(常见错误答案):页越大越好,只会提高地址转换效率。
- 正确要点:透明大页(Transparent Huge Pages,THP)可减少地址转换后备缓冲(Translation Lookaside Buffer,TLB)压力,但分配、内存规整和拆页可能引入停顿。应固定内核配置与访问模式,对照缺页、规整事件和延迟分布;收益不能由页大小直接推断。
- 追问:稀疏访问大地址空间时,大页会怎样改变实际内存占用?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
OS-004 直接 I/O 与持久化
- 题目:数据库用 O_DIRECT 绕过页缓存,写调用返回后是否就可确认持久化?
- 分类/标签:操作系统 / Linux、O_DIRECT
- 难度:★★★★
- 易错点(常见错误答案):不经过页缓存就是直接落盘,不必再同步。
- 正确要点:直接输入输出(Direct I/O)主要改变缓存路径,并不自动提供同步持久化保证;对齐、文件系统和设备支持也有限制。确认边界还需按接口使用
fsync、fdatasync或相应同步标志,并核对设备缓存与错误返回。 - 追问:数据文件同步成功后,新建文件的目录项是否也必然持久?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
OS-005 完成接口也会排队
- 题目:使用 io_uring 后,能否推断所有操作均由设备异步执行且没有工作线程?
- 分类/标签:操作系统 / Linux、io_uring
- 难度:★★★★
- 易错点(常见错误答案):提交不阻塞,所以内核不会为这些操作阻塞线程。
- 正确要点:io_uring 提供提交与完成机制,具体操作可能走内核工作线程,轮询模式也有处理器成本。须区分提交队列等待、实际执行与完成消费,并按操作类型、内核版本和注册选项验证;异步接口不消除下游瓶颈。
- 追问:完成队列无人消费时,缓冲区和在途上限由谁回收?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
OS-006 边沿触发的排空条件
- 题目:边沿触发 epoll 每次只读一个消息,然后等待下次通知,为什么可能卡住?
- 分类/标签:操作系统 / Linux、epoll
- 难度:★★★★
- 易错点(常见错误答案):只要描述符仍可读,下一轮一定会再通知。
- 正确要点:边沿触发(Edge-Triggered)通常需配合非阻塞描述符,持续读取直到
EAGAIN,否则剩余数据可能没有新边沿。EINTR、对端关闭和应用分帧要分别处理;若为公平性提前让出,应自行保留可继续执行的状态。 - 追问:写缓冲非空时,何时订阅和取消可写通知以避免忙循环?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
OS-007 发送成功不等于业务提交
- 题目:TCP 的 send 成功、收到传输确认、收到业务响应,分别证明什么?
- 分类/标签:操作系统 / TCP、确认边界
- 难度:★★★★
- 易错点(常见错误答案):send 成功表示对端应用收到并处理了全部请求。
- 正确要点:传输控制协议(Transmission Control Protocol,TCP)是字节流,send 成功通常只说明相应字节被本地协议栈接受;传输确认也不等于业务提交。消息边界由应用编码,业务响应能否代表持久提交取决于服务端契约。
- 追问:响应丢失时,客户端怎样区分未执行与已提交?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
OS-008 多线程进程中的 fork
- 题目:多线程进程 fork 后,子进程为何可能在日志输出或分配内存时死锁?
- 分类/标签:操作系统 / POSIX、进程创建
- 难度:★★★★★
- 易错点(常见错误答案):子进程复制所有线程,原来持锁的线程最终会继续解锁。
- 正确要点:子进程仅保留调用 fork 的线程,却复制地址空间中的锁状态;其他线程持有的锁可能无人释放。多线程 fork 后到 exec 之前,应只调用异步信号安全(Async-Signal-Safe)的操作,不能随意使用分配器和常规日志;预派生或适用的 posix_spawn 可缩小风险面。 参见Linux fork 手册。
- 追问:pthread_atfork 为什么不能普遍修复所有第三方库的内部锁?
- 来源/日期:经典易错题, 2026-10-24
OS-009 映射文件截断的故障
- 题目:文件已 mmap,另一进程将文件截短,原映射内的地址为何仍可能触发故障?
- 分类/标签:操作系统 / POSIX、mmap
- 难度:★★★★
- 易错点(常见错误答案):虚拟地址仍在映射区,所以读不到数据时会自动返回零。
- 正确要点:内存映射(Memory Mapping)保留地址映射不代表其后备文件范围仍有效;在 Linux 上访问截断后超出文件的映射页可能触发
SIGBUS。应约束文件生命周期和替换协议,不能把地址有效性等同于存储有效性。 - 追问:原子重命名替换文件,与原地截断对已有映射有什么区别?
- 来源/日期:经典易错题, 2026-10-24
OS-010 描述符关闭与复用
- 题目:一个线程 close 描述符,另一个线程正在阻塞读取,能否把 close 当作可靠取消?
- 分类/标签:操作系统 / POSIX、文件描述符
- 难度:★★★★★
- 易错点(常见错误答案):关闭后内核立即终止所有使用该编号的调用。
- 正确要点:文件描述符(File Descriptor)编号可复用,且 Linux 中阻塞调用可能持有底层打开文件描述的引用,关闭编号后仍能完成。取消应由明确的所有权与唤醒协议实现,避免旧回调操作已复用的编号;套接字的 shutdown 也要按具体方向和并发路径设计。
- 追问:如何用代际编号阻止迟到回调误操作新连接?
- 来源/日期:经典易错题, 2026-10-24
OS-011 信号处理函数的锁
- 题目:信号处理函数里加互斥锁再写日志,为什么可能在单线程程序中也死锁?
- 分类/标签:操作系统 / POSIX、信号安全
- 难度:★★★★
- 易错点(常见错误答案):只有一个线程,不会与其他线程争锁。
- 正确要点:信号可打断正在持锁的同一线程,处理函数再次获取非递归锁就无法前进。应限制为异步信号安全操作,并通过合适的标志或通知通道把复杂处理移回普通控制流;可重入与线程安全是不同约束。
- 追问:为什么把变量声明成 volatile 仍不足以提供跨线程同步?
- 来源/日期:经典易错题, 2026-10-24
OS-012 新文件的崩溃一致性
- 题目:写临时文件、同步文件、重命名后返回成功,掉电恢复时是否必然保留新名字?
- 分类/标签:操作系统 / 文件系统、fsync
- 难度:★★★★★
- 易错点(常见错误答案):rename 原子,所以名字和文件内容自动一起持久化。
- 正确要点:原子可见性与崩溃持久性不同;在 Linux 常见文件系统上,稳健协议还需同步承载目录,跨目录操作需考虑两端。结论取决于文件系统、挂载和设备保证,不能把进程内无中间态扩大成掉电承诺。
- 追问:在重命名前后分别注入崩溃,应允许恢复出哪些状态?
- 来源/日期:经典易错题, 2026-10-24
编程语言 LANG
LANG-001 移动不保证调用移动构造
- 题目:对 const 对象使用 std::move,为何可能仍调用拷贝构造?
- 分类/标签:编程语言 / C++、移动语义
- 难度:★★★
- 易错点(常见错误答案):std::move 会执行资源转移,被移动对象必然变空。
- 正确要点:移动语义(Move Semantics)中的
std::move是值类别转换,本身不搬运资源;const 对象通常得到const T&&,常规T(T&&)无法接收而可能选择拷贝。移动后的允许状态取决于类型契约,不能一概读成空对象。 - 追问:vector 扩容时,移动构造是否 noexcept 会怎样影响选择?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
LANG-002 共享所有权的三层安全
- 题目:不同 shared_ptr 实例共享对象,是否意味着指针变量和对象内容都能任意并发修改?
- 分类/标签:编程语言 / C++、shared_ptr
- 难度:★★★★
- 易错点(常见错误答案):引用计数是原子的,所以整个对象图线程安全。
- 正确要点:
shared_ptr的控制块支持相应并发管理,但同一指针实例上的冲突访问仍需同步,对象内容也需独立同步。引用计数只管理生命周期,非拥有视图如string_view还可能在异步使用前悬空。 - 追问:C++20 的
atomic<shared_ptr<T>>解决哪一层,仍不解决哪一层? - 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
LANG-003 内存池中的对象身份
- 题目:内存池在原地址构造新对象后,旧指针是否必然可继续访问?
- 分类/标签:编程语言 / C++、生命周期
- 难度:★★★★★
- 易错点(常见错误答案):地址没变,指针指向的对象就没有变。
- 正确要点:对象生命周期(Object Lifetime)与存储期不同,复用存储会结束旧对象生命周期。旧指针能否自动指向新对象取决于透明可替换条件等规则;
std::launder也不能修复错误类型、已释放存储或并发回收。 - 追问:基类子对象或 const 完整对象复用时,为什么不能只凭地址判断?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
LANG-004 协程挂起不延长借用
- 题目:C++20 协程挂起后,其参数引用和外部缓冲是否自动活到恢复?
- 分类/标签:编程语言 / C++、协程
- 难度:★★★★★
- 易错点(常见错误答案):编译器把局部变量放入协程帧,因此引用目标也被托管。
- 正确要点:协程(Coroutine)帧可保存跨挂起点的局部状态,但引用、指针与视图不自动拥有目标。必须明确帧销毁权、恢复权及被借用对象的存活期;取消回调与完成回调并发时尤其要防重复恢复和提前销毁。
- 追问:协程 lambda 的闭包先销毁,捕获的数据是否仍可安全使用?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
LANG-005 Send 与 Sync 的不同约束
- 题目:Rust 中 T: Send 与 T: Sync 各允许什么,Arc 能否让任意 T 跨线程安全共享?
- 分类/标签:编程语言 / Rust、Send/Sync
- 难度:★★★★
- 易错点(常见错误答案):Send 表示允许共享,套上 Arc 后内部状态就都是线程安全的。
- 正确要点:
Send允许所有权安全转移到另一线程,Sync等价于&T: Send,约束共享引用的安全性。Arc只同步引用计数,Arc<RefCell<T>>不因外壳而获得 Sync;可变共享仍需匹配的同步类型。 参见Rust 官方 Send/Sync 说明。 - 追问:为什么
Cell<u32>可 Send 却不 Sync? - 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
LANG-006 双重检查与安全发布
- 题目:Java 双重检查单例中,外层读取为什么不能只依赖内层 synchronized?
- 分类/标签:编程语言 / Java、volatile
- 难度:★★★★
- 易错点(常见错误答案):构造语句执行完就会对其他线程完整可见,外层读无需同步。
- 正确要点:先行发生(Happens-Before)关系需要跨线程同步边;在 Java 5 及之后,正确使用 volatile 引用可把构造写入发布给读者。外层无锁读取若不是 volatile 等正确发布路径,内层互斥并不替未加锁读建立关系;构造期 this 逃逸还需另查。 参见Java SE 21 内存模型 §17.4—17.5。
- 追问:final 字段初始化保证为什么不等于对象所有后续修改都可见?
- 来源/日期:经典易错题, 2026-10-24
LANG-007 可见性不等于复合原子性
- 题目:volatile int 的自增为何仍可能丢更新?
- 分类/标签:编程语言 / Java、原子更新
- 难度:★★★
- 易错点(常见错误答案):每次读写都可见,所以
count++不会被其他线程打断。 - 正确要点:volatile 为相关访问提供可见性与排序规则,却不把读、加、写组合成单一原子操作。需用
AtomicInteger等原子更新或锁;多个字段共同维护不变量时,也不能只把每个字段分别改为原子类型。 参见Java SE 21 §17.4。 - 追问:余额扣减与库存扣减各用一个原子变量,怎样仍会破坏业务约束?
- 来源/日期:经典易错题, 2026-10-24
LANG-008 类型擦除与不变泛型
- 题目:List
为何不能当作 List 使用,泛型检查能否阻止所有运行期类型错误? - 分类/标签:编程语言 / Java、泛型
- 难度:★★★★
- 易错点(常见错误答案):Integer 是 Number 的子类型,所以对应列表也是子类型。
- 正确要点:泛型(Generics)通常具有不变性,否则可向整数列表写入浮点数;
? extends Number适合读取,? super Integer允许写入整数。类型擦除(Type Erasure)、原始类型与不安全强制转换可能造成堆污染,编译通过不代表不存在运行期类型错误。 - 追问:为什么通常不能直接创建
new T[],数组的运行期检查有何不同? - 来源/日期:经典易错题, 2026-10-24
LANG-009 循环变量的版本边界
- 题目:Go 循环里启动闭包读取迭代变量,升级到 1.22 后是否所有捕获问题都消失?
- 分类/标签:编程语言 / Go、1.22、闭包
- 难度:★★★★
- 易错点(常见错误答案):旧版永远得到最后值,新版无论声明方式都自动复制变量。
- 正确要点:按 Go 1.22 语言语义,循环中声明的迭代变量每轮有独立实例,旧语义下复用变量可能导致捕获错误。须核对包的语言版本;使用
=赋给外部已有变量仍共享它,多个实例引用同一可变对象也仍需同步。 参见Go 1.22 发布说明。 - 追问:比较
for _, v := range xs与预先声明 v 后的for _, v = range xs。 - 来源/日期:经典易错题, 2026-10-24
LANG-010 接口中的带类型空值
- 题目:函数返回的 error 内装一个 nil 的具体指针,为什么
err != nil? - 分类/标签:编程语言 / Go、interface、nil
- 难度:★★★
- 易错点(常见错误答案):接口只看底层指针是不是 nil,空指针装进去也是 nil 接口。
- 正确要点:接口值(Interface Value)包含动态类型与动态值;只有两者都为空才等于 nil 接口。装入
(*MyError)(nil)后动态类型存在,因此接口非 nil,调用方法还可能因接收者实现而崩溃。 - 追问:如何让返回路径明确返回 nil 接口,并避免日志打印掩盖差别?
- 来源/日期:经典易错题, 2026-10-24
LANG-011 GIL 与自由线程构建
- 题目:Python 有 GIL 是否就无需锁,3.13 是否默认让所有 Python 线程并行?
- 分类/标签:编程语言 / Python、CPython 3.13
- 难度:★★★★
- 易错点(常见错误答案):GIL 保证业务操作不可分割,3.13 已在所有构建中移除它。
- 正确要点:全局解释器锁(Global Interpreter Lock,GIL)不保证跨多步业务不变量,传统构建中的 I/O 与部分扩展还会释放它。CPython 3.13 提供可选的实验性自由线程(Free-Threading)构建,默认构建仍有 GIL;扩展兼容性及运行时是否重新启用 GIL 要独立核对。 参见CPython 3.13 自由线程说明。
- 追问:为什么字典自身有内部保护,也不能保证“检查后插入”整个流程原子?
- 来源/日期:经典易错题, 2026-10-24
LANG-012 默认参数的共享状态
- 题目:函数用空列表作默认参数并追加结果,为何不同请求会相互污染?
- 分类/标签:编程语言 / Python、默认参数、闭包
- 难度:★★★
- 易错点(常见错误答案):默认值每次调用时重新求值,所以只有显式共享变量才会串数据。
- 正确要点:默认参数(Default Argument)在函数定义执行时求值,随后未传参调用复用同一个对象。通常用 None 哨兵并在调用内创建列表;闭包晚绑定也是名字读取时机问题,不能靠“函数是独立调用”推断状态独立。
- 追问:闭包捕获可变对象时,用默认参数绑定它,是否也复制了对象内容?
- 来源/日期:经典易错题, 2026-10-24
并发 CONC
CONC-001 发布关系需要读到对应写
- 题目:写数据后 release 存标志,读线程 acquire 读标志,何时才能安全读取数据?
- 分类/标签:并发 / C++、内存序
- 难度:★★★★★
- 易错点(常见错误答案):任意 release 与任意 acquire 都构成全局屏障。
- 正确要点:内存序(Memory Ordering)要求匹配的同步关系:例如 acquire 读取同一原子对象上该 release 写入的值,才建立相应先行发生关系。普通数据须在发布前写好,发布后若再并发修改仍需同步;不能只看到两种标签就宣布安全,参见 C++ 标准草案原子内存序。
- 追问:如果读到的是初始值,或读的是另一个原子变量,证明缺少哪条边?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
CONC-002 原子计数不能只用读写拼接
- 题目:两个线程对原子变量先 load 再 store 加一,为何会丢更新?
- 分类/标签:并发 / C++、读改写
- 难度:★★★★
- 易错点(常见错误答案):所有步骤都是原子操作,组合起来也原子。
- 正确要点:原子读改写(Atomic Read-Modify-Write)必须作为整体实现,分离 load/store 可让两线程读到同一旧值再覆盖。单纯计数可用
fetch_add;若需 CAS 重试,须基于失败后更新的期望值重新计算。 - 追问:仅用于统计的计数器为何可用 relaxed,而发布对象通常不行?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
CONC-003 CAS 成功不等于对象未变
- 题目:无锁栈头从 A 变成 B 再变回 A,为什么 CAS 成功仍可能破坏结构?
- 分类/标签:并发 / C++、ABA
- 难度:★★★★★
- 易错点(常见错误答案):地址相等证明期间没有线程修改栈头。
- 正确要点:比较并交换(Compare-And-Swap,CAS)比较的是当前位模式,ABA 问题(ABA Problem)中地址回到旧值并不代表节点身份和链接未变。版本标签可帮助识别变化,但有限标签会回绕;内存安全还需独立的回收协议。
- 追问:只加版本号,为什么仍不能安全解引用一个已经释放的节点?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
CONC-004 危险指针的再次校验
- 题目:读取共享节点后再登记危险指针,是否就能保证节点在登记前未被释放?
- 分类/标签:并发 / C++、内存回收
- 难度:★★★★★
- 易错点(常见错误答案):回收线程看见危险指针就不回收,因此登记顺序无关。
- 正确要点:危险指针(Hazard Pointer)通常要求加载候选、发布保护、再校验共享指针仍匹配,失败则重试。具体屏障与扫描协议必须匹配实现证明,不能在完成保护前解引用;仅删除节点不等于可以立即释放。
- 追问:发布、校验和回收扫描之间需要排除哪一种交错?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
CONC-005 无锁的进度对象
- 题目:无锁队列是否保证每个生产者在固定时间内完成入队?
- 分类/标签:并发 / 无锁、实时性
- 难度:★★★★
- 易错点(常见错误答案):无互斥锁就没有等待,因此所有线程都有固定上界。
- 正确要点:无锁(Lock-Free)通常保证系统整体持续取得进展,不保证某个线程不会长期重试;无等待(Wait-Free)才约束各操作在有限自身步骤内完成。分配器、回收、操作系统调度与缺页还会影响实际延迟,算法进度不直接给出墙钟上界。
- 追问:若队列算法无锁但分配节点需要互斥锁,能否称整个调用路径无锁?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
CONC-006 引用归零前设备还在用
- 题目:主机任务取消并释放最后一个智能指针后,设备使用的缓冲能否立即复用?
- 分类/标签:并发 / C++、GPU、异步生命周期
- 难度:★★★★★
- 易错点(常见错误答案):主机没有引用,设备执行一定也已结束。
- 正确要点:异步生命周期(Asynchronous Lifetime)须覆盖真实消费者;图形处理器(Graphics Processing Unit,GPU)提交返回和业务取消均不表示设备完成。应以完成事件和在途引用延后归还,取消路径仍要推进完成消费与清理。
- 追问:完成回调迟到时,如何防止释放已归给下一请求的内存?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
CONC-007 伪共享不是数据竞争
- 题目:不同线程各写独立计数器,为什么仍会随线程数增加而变慢?
- 分类/标签:并发 / 缓存一致性、NUMA
- 难度:★★★★
- 易错点(常见错误答案):没有共享变量,就不会发生缓存一致性流量。
- 正确要点:伪共享(False Sharing)来自不同变量落在同一缓存行,引起所有权转移,即使逻辑上无冲突也会争抢。可按实际缓存布局分隔并分片汇总;非一致内存访问(Non-Uniform Memory Access,NUMA)的远端代价又是另一层问题,需分别测量。
- 追问:怎样设计对照以区分伪共享与真正共享同一计数器?
- 来源/日期:面试系列 03 C++ 与系统编程面试:从生命周期证明到并发与性能决策, 2026-10-24
CONC-008 条件变量必须复查谓词
- 题目:条件变量返回后,为什么还要在锁内用循环检查队列是否非空?
- 分类/标签:并发 / C++、条件变量
- 难度:★★★
- 易错点(常见错误答案):通知精确对应一个元素,醒来就可直接取队首。
- 正确要点:条件变量(Condition Variable)允许伪唤醒(Spurious Wakeup),真实唤醒后元素也可能先被其他线程取走。应由同一互斥协议保护谓词,等待时原子地解锁并阻塞,醒来重新持锁检查;通知本身不保存业务条件。
- 追问:生产者不按该锁协议修改谓词,会怎样产生丢失唤醒?
- 来源/日期:经典易错题, 2026-10-24
CONC-009 顺序一致也不包办事务
- 题目:把所有原子操作设为 seq_cst,能否保证两个账户余额转移不会暴露中间状态?
- 分类/标签:并发 / C++、seq_cst
- 难度:★★★★
- 易错点(常见错误答案):存在全局顺序,所以多个原子变量的更新也成为一个事务。
- 正确要点:顺序一致性(Sequential Consistency)为相应操作提供满足规则的总序,但两次原子写仍是两个可分别观察的步骤。跨字段不变量需锁、版本验证或其他完整协议;普通对象上的未同步冲突访问仍可能是数据竞争(Data Race)。
- 追问:读者先读余额 A、再读 B,哪种交错会看到不合法总额?
- 来源/日期:经典易错题, 2026-10-24
CONC-010 线程池等待自己的任务
- 题目:固定大小线程池的所有工作线程都提交子任务并同步等待,为何队列有任务却不运行?
- 分类/标签:并发 / 线程池、死锁
- 难度:★★★★
- 易错点(常见错误答案):任务已经入队,调度器最终一定会执行。
- 正确要点:线程池(Thread Pool)的执行槽被等待者全部占住,子任务缺少可执行槽,形成资源依赖死锁。可改用异步续接、结构化依赖或经过证明的协助执行策略;单纯加大线程数只移动触发阈值。
- 追问:取消父任务时,排队子任务与已运行子任务分别由谁收尾?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
CONC-011 超时后不能立即销毁锁
- 题目:等待某任务超时,能否直接销毁任务对象里的互斥锁和条件变量?
- 分类/标签:并发 / POSIX、取消与所有权
- 难度:★★★★★
- 易错点(常见错误答案):调用者不再等待,其他线程就没有理由继续访问任务。
- 正确要点:超时只结束等待者的等待,不证明工作线程、回调或其他等待者已退出。应先请求取消,再完成唤醒、停止引用与汇合,最后释放同步对象;对象销毁需要证明无人使用,不能以业务状态替代。
- 追问:若回调还能注册新回调,关闭协议如何阻止新增引用?
- 来源/日期:经典易错题, 2026-10-24
CONC-012 自旋锁与调度竞争
- 题目:临界区很短是否足以证明自旋锁比阻塞锁更快?
- 分类/标签:并发 / 锁、处理器配额
- 难度:★★★★
- 易错点(常见错误答案):自旋避免系统调用,所以只要代码短就应替换互斥锁。
- 正确要点:自旋锁(Spinlock)收益依赖持锁者很快继续运行;超额线程、抢占或容器节流可能让等待者烧掉剩余处理器预算。需比较实际持锁时间、抢占和竞争程度,短代码路径也可能遇到缺页或下游等待。
- 追问:单核或配额很小的容器中,自旋为何可能反过来延迟解锁?
- 来源/日期:经典易错题, 2026-10-24
数据库内核 DB
DB-001 外连接下推改变保留行
- 题目:左外连接右表的过滤,放 ON 与放 WHERE 是否总等价?
- 分类/标签:数据库内核 / 优化器、SQL 语义
- 难度:★★★★
- 易错点(常见错误答案):只过滤右表列,推到连接前肯定更快且结果不变。
- 正确要点:左外连接(Left Outer Join)在 ON 无匹配时保留左行并补 NULL;WHERE 会在连接后筛选,空值拒绝谓词(Null-Rejecting Predicate)可删除这些补空行。是否转为内连接、能否下推,必须依据谓词位置和完整等价条件证明。
- 追问:
b.x IS NULL与b.x > 0的空值行为为何不同? - 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-002 物理属性不能只存最低代价
- 题目:优化器对子表达式只保存当前最低成本计划,为什么可能错过全局最优?
- 分类/标签:数据库内核 / 查询优化、Memo
- 难度:★★★★★
- 易错点(常见错误答案):局部最便宜计划拼起来就是最便宜的完整计划。
- 正确要点:排序、分布等物理属性(Physical Properties)影响父算子可用实现及属性补齐成本;局部更贵但已排序的计划可能省掉上层排序。Memo 中需按所需属性等上下文比较候选,不能把不同属性压成一个成本标量。
- 追问:基数低估如何通过广播决策放大成内存故障?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-003 物化视图匹配还需版本契约
- 题目:查询与物化视图的表达式匹配成功,为何仍不能直接替换?
- 分类/标签:数据库内核 / MV、查询改写
- 难度:★★★★
- 易错点(常见错误答案):结果结构相同就等价,是否刷新只影响性能。
- 正确要点:物化视图(Materialized View,MV)替换还需覆盖查询数据范围、聚合粒度、空值与重复语义,并满足快照和新鲜度要求。视图定义与基表版本不兼容时,即使表达式匹配也可能返回旧数据或漏数据。
- 追问:如何向用户区分允许陈旧读取和必须读取当前提交结果?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-004 连接增量的交叉项
- 题目:两侧表同时变化,连接增量为何不只是
ΔR⋈S + R⋈ΔS? - 分类/标签:数据库内核 / IVM、代数
- 难度:★★★★★
- 易错点(常见错误答案):分别维护每张表增量,再相加就覆盖所有新增组合。
- 正确要点:增量视图维护(Incremental View Maintenance,IVM)若以旧 R、S 为基线,连接展开还包含
ΔR⋈ΔS。若顺序处理并让第二次计算使用已更新一侧,交叉项可能隐含其中;必须固定版本约定以避免遗漏或重复,删除还需处理重数。 - 追问:外连接最后一个匹配被删除时,还要补出什么结果?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-005 向量化的收益与边界
- 题目:执行器按批处理后,为何不等于所有表达式都用了 SIMD,也不保证固定加速倍数?
- 分类/标签:数据库内核 / 执行器、SIMD
- 难度:★★★★
- 易错点(常见错误答案):批量接口自动把标量循环转换成向量指令。
- 正确要点:向量化执行(Vectorized Execution)可摊薄分派开销,单指令多数据(Single Instruction Multiple Data,SIMD)则依赖布局、分支和指令支持。空值位图、变长字符串与选择向量会改变访问成本,应按算子和真实数据分布测量。
- 追问:宽批次提高吞吐时,为什么可能扩大取消响应时间和峰值内存?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-006 算子外溢要有预算
- 题目:哈希聚合支持外溢后,是否就能承诺不会因高基数组发生内存故障?
- 分类/标签:数据库内核 / 执行器、Spill
- 难度:★★★★
- 易错点(常见错误答案):超内存自动写盘,所以只要磁盘够大就安全。
- 正确要点:外溢(Spill)自身需要分区、序列化和缓冲内存,且读回时仍可能出现过大分区。必须在耗尽之前预留触发空间,并约束磁盘配额、并发、清理及失败传播;不支持可分解状态的聚合还需额外机制。
- 追问:多个查询同时触发外溢时,如何避免内存与磁盘队列同时失控?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-007 快照提交的原子性边界
- 题目:把一批数据文件上传成功,是否意味着表读者已能看到它们且并发提交没有冲突?
- 分类/标签:数据库内核 / Iceberg、并发提交
- 难度:★★★★★
- 易错点(常见错误答案):对象写入成功就相当于事务提交,冲突时直接覆盖元数据即可。
- 正确要点:Iceberg 读者依据已发布快照及其元数据集合读取,上传文件不等于发布。提交需按目录服务和操作类型执行原子更新与冲突校验;失败重试应重新验证假设,孤儿文件回收还须避开在途提交。
- 追问:追加与覆盖同一分区,为何不应采用完全相同的冲突判定?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-008 长快照阻碍版本回收
- 题目:分析事务只读不写,为什么仍可能推高存储和后台维护成本?
- 分类/标签:数据库内核 / MVCC、垃圾回收
- 难度:★★★★
- 易错点(常见错误答案):只读事务不持写锁,也就不影响其他工作。
- 正确要点:多版本并发控制(Multi-Version Concurrency Control,MVCC)必须为活跃快照保留可见历史,长读可推迟旧版本回收。无写锁不代表没有版本、快照或日志保留成本;跨表一致读取还需协调快照范围。
- 追问:如何限制快照寿命而不在读者仍用旧文件时物理删除?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DB-009 快照隔离中的写偏斜
- 题目:两名值班医生各看到两人值班,再分别把自己改为下班,为什么都能提交却违反约束?
- 分类/标签:数据库内核 / 事务、Snapshot Isolation
- 难度:★★★★★
- 易错点(常见错误答案):两事务读取相同快照且写不同记录,因此执行等价于串行。
- 正确要点:快照隔离(Snapshot Isolation)可阻止某些同记录写冲突,却允许跨记录读写依赖形成写偏斜(Write Skew)。例中两事务各写一行,最终无人值班;可用可串行化隔离(Serializable Isolation)并重试,或让约束检查通过适当锁协议产生冲突。 参见PostgreSQL 17 隔离级别说明。
- 追问:只对“自己那行”执行 SELECT FOR UPDATE 为什么仍可能不足?
- 来源/日期:经典易错题, 2026-10-24
DB-010 写前日志不等于每页同步
- 题目:使用写前日志后,提交是否必须同步刷出事务改过的全部数据页?
- 分类/标签:数据库内核 / 恢复、WAL
- 难度:★★★★★
- 易错点(常见错误答案):日志只是备份,数据页没刷完就不能安全提交。
- 正确要点:写前日志(Write-Ahead Logging,WAL)要求相关日志先于脏页持久化,持久提交通常还要保证提交所需日志已稳定。数据页可后刷并通过恢复重做;若允许未提交页落盘,还需对应撤销或版本可见性机制,具体依赖恢复设计。
- 追问:日志先落盘但提交响应丢失,恢复后应怎样判定事务状态?
- 来源/日期:经典易错题, 2026-10-24
DB-011 删除标记不能随意丢弃
- 题目:日志结构合并树的删除标记很旧,能否在任意一次合并中直接丢弃?
- 分类/标签:数据库内核 / LSM、Compaction
- 难度:★★★★
- 易错点(常见错误答案):删除已经发生,去掉标记只会节省空间。
- 正确要点:日志结构合并树(Log-Structured Merge-Tree,LSM Tree)的删除标记(Tombstone)可能仍在遮蔽更深层旧值,提前移除会令旧数据复活。能否丢弃需证明覆盖相关旧版本且不再被快照需要,不能仅凭时间或所在层判断。
- 追问:范围删除与长快照并存时,回收判定还缺哪些覆盖信息?
- 来源/日期:经典易错题, 2026-10-24
DB-012 检查点不是日志截断指令
- 题目:完成一次检查点后,为什么不能无条件删除它之前的所有日志?
- 分类/标签:数据库内核 / 恢复、Checkpoint
- 难度:★★★★★
- 易错点(常见错误答案):检查点代表整个系统此刻已刷盘,旧日志都没用。
- 正确要点:检查点(Checkpoint)记录恢复起点或相关状态,模糊检查点不要求瞬时刷完全部脏页。日志保留还取决于最早未落盘修改、未完成事务及复制和备份消费者,截断必须满足实现中的所有保留约束。
- 追问:一个很早开始但仍未结束的事务,会怎样影响恢复与日志保留?
- 来源/日期:经典易错题, 2026-10-24
分布式 DIST
DIST-001 超时的结果仍未知
- 题目:写请求超时后自动换节点重试,为何可能把业务执行两遍?
- 分类/标签:分布式 / RPC、幂等
- 难度:★★★★
- 易错点(常见错误答案):超时代表服务端没执行,重试天然安全。
- 正确要点:远程过程调用(Remote Procedure Call,RPC)超时可能发生在提交后、响应前,因此结果未知。幂等性(Idempotency)需把稳定请求标识、去重记录与业务副作用纳入同一正确性边界,并支持查回结果;不能只做短期内存去重。
- 追问:去重记录过期后迟到重试,协议如何避免重新执行?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DIST-002 恰好一次依赖提交边界
- 题目:消费端先提交业务结果,再提交消息位点,为什么崩溃后仍可能重复生效?
- 分类/标签:分布式 / 消息处理、恢复
- 难度:★★★★★
- 易错点(常见错误答案):位点能记录进度,两个提交先后完成就是恰好一次。
- 正确要点:恰好一次(Exactly-Once)语义需说明覆盖边界;结果和位点分离提交时存在结果已生效而位点未推进的崩溃窗口。可在同一事务内提交,或以稳定标识做原子去重;外部副作用未纳入协议时不能扩大承诺。
- 追问:先提交位点再写结果,会把重复风险换成什么风险?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DIST-003 缓存击穿后的源站预算
- 题目:缓存节点失效后,为什么自动回源和重试可能拖垮原本健康的数据库?
- 分类/标签:分布式 / 缓存、过载
- 难度:★★★★
- 易错点(常见错误答案):缓存只影响命中率,源站能够接收剩余请求即可。
- 正确要点:缓存击穿(Cache Stampede)可让同一热点的并发请求集中回源,故障还可能放大重试流量。需按源站容量限制在途请求,合并同键加载并设计拒绝、过期数据或降级策略;仅增加缓存副本不消除冷启动洪峰。
- 追问:合并请求的首个加载失败时,等待者应怎样重试以避免再次集中冲击?
- 来源/日期:面试系列 05 算法与系统设计面试:从解题不变量到 OLAP 与 LLM 服务的容量边界, 2026-10-24
DIST-004 滚动升级的双向兼容
- 题目:新服务能读旧协议,是否就足以保证滚动升级可用且能回滚?
- 分类/标签:分布式 / 协议、版本倾斜
- 难度:★★★★
- 易错点(常见错误答案):兼容老客户端只需新版本支持旧字段。
- 正确要点:版本倾斜(Version Skew)还包括旧执行器读新计划、新节点写入旧节点不能恢复的持久状态。应约束能力协商、未知字段与枚举处理,并在全体具备能力后启用新格式;回滚需要反向读写兼容或明确停止点。
- 追问:删除字段与复用旧字段编号,哪一种更容易造成静默语义错误?
- 来源/日期:面试系列 02 数据库内核面试:沿查询、视图维护与恢复解释正确性, 2026-10-24
DIST-005 过载时排队必须有界
- 题目:入口持续接受请求并排队,是否比立即拒绝更能提高成功率?
- 分类/标签:分布式 / 背压、截止时间
- 难度:★★★★
- 易错点(常见错误答案):排队不丢请求,后端迟早会追上。
- 正确要点:背压(Backpressure)要让下游容量限制传播到上游;持续到达率超过服务率时,无界队列只会累计等待与内存。应限定队列和在途资源,传播截止时间并丢弃已无成功预算的工作,重试还须有预算与退避。
- 追问:客户端已超时的请求为什么可能继续消耗整个集群?
- 来源/日期:面试系列 04 操作系统与网络面试:从调度、内存到 RPC 背压的 Staff 追问链, 2026-10-24
DIST-006 旧任期日志的提交限制
- 题目:Raft 新领导者发现旧任期条目已复制到多数节点,能否单凭该计数提交它?
- 分类/标签:分布式 / Raft、日志提交
- 难度:★★★★★
- 易错点(常见错误答案):多数节点有副本就不可能被覆盖,与条目任期无关。
- 正确要点:Raft 不能仅凭副本计数直接提交旧任期条目;领导者用此规则推进提交位置时,所选条目必须属于当前任期。当前任期条目在多数上复制并提交后,其之前的日志才随此前缀间接提交,选举与日志匹配共同保证安全。 参见Raft 论文 §5.4.2。
- 追问:新领导者为何常先追加当前任期的空操作?
- 来源/日期:经典易错题, 2026-10-24
DIST-007 领导者本地读也可能过期
- 题目:曾当选领导者的节点,能否不与其他节点通信就持续提供线性一致读?
- 分类/标签:分布式 / Raft、线性一致性
- 难度:★★★★★
- 易错点(常见错误答案):只要进程未主动降级,它的日志就是最新值。
- 正确要点:线性一致性(Linearizability)要求读尊重已完成写的实时顺序;失联旧领导者可能不知道新领导者已经完成写。读协议通常需确认当前领导权并等状态机应用到安全读位置;租约方案还依赖时钟和租约约束,不能凭本地角色位判断。 参见Raft 论文 §8。
- 追问:多数确认后本地 apply 仍落后,立即读取状态机会违反什么?
- 来源/日期:经典易错题, 2026-10-24
DIST-008 过期持锁者需要隔离
- 题目:分布式锁租约到期后,新客户端已获锁,旧客户端从长暂停恢复还能写吗?
- 分类/标签:分布式 / 租约、Fencing Token
- 难度:★★★★★
- 易错点(常见错误答案):锁服务已让旧租约失效,旧进程的所有后续操作都会被自动拒绝。
- 正确要点:租约(Lease)失效不会自动撤销已发出或即将发出的存储操作。可由锁服务产生单调递增的隔离令牌(Fencing Token),并让实际资源端拒绝旧令牌;只在客户端检查锁状态仍存在检查与使用之间的窗口。
- 追问:若存储端不校验令牌,单靠延长租约能否证明互斥?
- 来源/日期:经典易错题, 2026-10-24
DIST-009 CAP 的分区前提
- 题目:CAP 是否意味着系统无论何时都必须从三个属性中永久选两个?
- 分类/标签:分布式 / 一致性、可用性
- 难度:★★★★
- 易错点(常见错误答案):复制系统只能同时具备两个属性,正常网络时也一样。
- 正确要点:CAP 定理(CAP Theorem)讨论网络分区下,线性一致语义与每个非故障节点都需响应的可用性要求之间的冲突。需要根据操作和分区策略说明拒绝或返回什么;工程成功率目标也不等同于定理的可用性定义。
- 追问:少数派拒绝写入,多数派继续服务,保留了什么又放弃了什么?
- 来源/日期:经典易错题, 2026-10-24
DIST-010 两阶段提交的阻塞窗口
- 题目:两阶段提交的参与者已投赞成票,协调者失联时能否超时后自行回滚?
- 分类/标签:分布式 / 事务、2PC
- 难度:★★★★★
- 易错点(常见错误答案):没有收到提交指令,就说明还未提交,可以直接回滚。
- 正确要点:两阶段提交(Two-Phase Commit,2PC)进入准备状态后,其他参与者可能已收到提交决定;单方回滚会破坏原子性。恢复需查询或恢复持久化决定;复制协调状态能改善故障恢复,但不能把所有网络分区下的等待都消除。
- 追问:参与者何时可安全回答“我尚未准备,因此可以终止”?
- 来源/日期:经典易错题, 2026-10-24
DIST-011 跨分片读需要共同切面
- 题目:每个分片各自返回一个本地一致快照,合并后是否就是全局一致查询?
- 分类/标签:分布式 / 快照、读一致性
- 难度:★★★★★
- 易错点(常见错误答案):局部读都无脏数据,拼起来也不会出现异常。
- 正确要点:各分片独立选时间可能让查询同时看到转账扣款后的 A 与入账前的 B。跨分片快照(Distributed Snapshot)需共同的可见性切面或等效协调协议,并处理未完成事务;本地一致性不能推导全局一致性。
- 追问:全局读时间已确定后,某分片尚未追到该时间,应等待还是降级语义?
- 来源/日期:经典易错题, 2026-10-24
DIST-012 墙钟不能判定因果
- 题目:用各节点本地时间戳排序事件,能否准确恢复因果先后?
- 分类/标签:分布式 / 时钟、因果关系
- 难度:★★★★
- 易错点(常见错误答案):时间精度足够高且部署了校时,时间较小就一定先发生。
- 正确要点:墙钟(Wall Clock)可能偏移或回拨;逻辑时钟(Logical Clock)可保证因果先发生推出较小逻辑时间,反向推导通常不成立。若要表达并发关系,可按场景使用向量时钟(Vector Clock),但需承担状态与成员管理成本。
- 追问:两个事件逻辑时间有大小,为什么仍可能互不因果依赖?
- 来源/日期:经典易错题, 2026-10-24
AI Infra AI
AI-001 KV 容量必须按模型结构计算
- 题目:估算大语言模型服务的每请求 KV 显存,为什么不能只乘模型参数量或查询头数?
- 分类/标签:AI Infra / LLM Serving、KV Cache
- 难度:★★★★
- 易错点(常见错误答案):权重放得下就能服务任意并发,KV 总是按全部注意力头存储。
- 正确要点:大语言模型(Large Language Model,LLM)常规全层解码器的键值缓存(Key-Value Cache,KV Cache)逻辑字节数约为
2×层数×已缓存词元数×KV头数×头维度×每元素字节数。还须计块浪费、元数据与实现复制;分组查询注意力(Grouped-Query Attention,GQA)使用 KV 头数,压缩潜在状态等其他结构须另建公式。 - 追问:张量并行中 KV 头数少于设备数时,分片还是复制会怎样改变每卡预算?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-002 块化状态不改变逻辑容量
- 题目:PagedAttention 是否把每个词元的逻辑 KV 大小压缩了,也自动消除了内存不足?
- 分类/标签:AI Infra / PagedAttention、显存
- 难度:★★★★
- 易错点(常见错误答案):分页以后 KV 像磁盘虚拟内存一样几乎不占显存。
- 正确要点:PagedAttention 按块管理 KV 的物理位置与共享,减少预留浪费和重复状态,未自动改变模型所需的每词元逻辑状态。块表、尾块浪费、活跃块和其他运行内存仍占预算,超额服务仍需准入或抢占策略。 参见PagedAttention 论文。
- 追问:共享前缀后某请求分叉写尾块,为什么需要写时复制(Copy-on-Write)或等效机制?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-003 分块预填充的收益归属
- 题目:将长输入预填充分块后,首词和后续词延迟为什么可能一升一降?
- 分类/标签:AI Infra / 调度、Chunked Prefill
- 难度:★★★★
- 易错点(常见错误答案):块越小越公平,所有延迟和吞吐都会同时改善。
- 正确要点:分块预填充(Chunked Prefill)缩短单轮长输入占用时间,可减少对已有解码的干扰,但新增轮次与调度开销可能拖慢该请求首词。需在混合输入与输出长度分布下,联合测量首词时延(Time to First Token,TTFT)、词间时延(Inter-Token Latency,ITL)及满足目标的吞吐。
- 追问:低负载且只有一个长输入时,小块还有同样收益吗?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-004 前缀相似不等于可复用
- 题目:语义相似但词元序列不同的提示,能否直接共享已有 KV?
- 分类/标签:AI Infra / Prefix Cache、状态兼容
- 难度:★★★★
- 易错点(常见错误答案):意思接近说明注意力状态接近,可以直接复用来保持精确结果。
- 正确要点:前缀缓存(Prefix Cache)要求模型和状态语义兼容,包括权重修订、词元序列、位置编码及影响状态的适配器等配置。普通因果注意力中,后续状态依赖完整此前序列,不能任意复用相似片段;缓存键与租户隔离也须匹配安全边界。
- 追问:相同文本换了词元化器或提示模板,为什么仍可能失配?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-005 远端命中未必更快
- 题目:远端 KV 命中率很高,为什么 TTFT 仍可能比重新计算更大?
- 分类/标签:AI Infra / KV Offloading、带宽
- 难度:★★★★
- 易错点(常见错误答案):只要命中缓存就少做计算,必然降低延迟。
- 正确要点:状态卸载(KV Offloading)的取回路径包含定位、排队、传输、布局转换与同步,须与重算关键路径比较。题设若为 1 GiB、有效带宽 25 GiB/s,仅传输下界就是 40 ms;这只是演算,不是测量,也未含其他成本。
- 追问:多个请求同时取回时,单请求标称带宽为何不再成立?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-006 预填充解码分离的交接成本
- 题目:预填充与解码资源特征不同,是否就应该无条件拆成两个池?
- 分类/标签:AI Infra / PD Disaggregation、调度
- 难度:★★★★★
- 易错点(常见错误答案):隔离阶段后各自效率更高,传输总能被计算完全遮住。
- 正确要点:预填充/解码分离(Prefill-Decode Disaggregation)减少阶段干扰,却引入 KV 交接、多队列及容量配比问题。必须比较省下的等待与新增传输、转换和同步成本;短输入、低负载或互连不足时可能退化,布局变化也不一定可零成本交接。
- 追问:解码池拥塞时,预填充完成的 KV 应由谁持有、如何限制积压?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-007 FlashAttention 的精确性边界
- 题目:FlashAttention 是否通过稀疏化注意力,将稠密注意力的计算复杂度降为线性?
- 分类/标签:AI Infra / 注意力、内存访问
- 难度:★★★★
- 易错点(常见错误答案):不物化完整矩阵,就表示不再计算所有词元对。
- 正确要点:FlashAttention 通过分块与在线 softmax 减少中间结果访存,常规稠密注意力的词元对计算仍为平方级。数学表达等价不代表浮点逐位一致;它与 PagedAttention 的 KV 分配管理承担不同职责,组合支持需看后端。
- 追问:按块最大值变化时,为什么必须重标定此前的归一化累加量?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-008 执行图的地址与容量约束
- 题目:CUDA Graph 单步执行更快,为何服务总吞吐仍可能降低?
- 分类/标签:AI Infra / CUDA Graph、显存
- 难度:★★★★
- 易错点(常见错误答案):减少启动开销不会改变显存预算,所以性能只会上升。
- 正确要点:CUDA Graph 的常见捕获重放路径依赖稳定地址与形状约束,变长服务常需形状桶、静态缓冲和回退。额外图与内存池可能挤压 KV 容量,令可服务并发下降;需固定后端与图配置评估端到端收益,而非只看单步时间。
- 追问:很少命中的大形状桶,是否值得一直保留捕获图?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-009 推测解码的分布与成本
- 题目:草稿模型一次猜多个词元,为何验证后既不一定更快,也不能直接接受全部草稿?
- 分类/标签:AI Infra / Speculative Decoding、采样
- 难度:★★★★★
- 易错点(常见错误答案):目标模型并行打分后挑最高分,就同时得到原分布与固定倍数加速。
- 正确要点:推测解码(Speculative Decoding)的精确采样方案需按目标与草稿分布执行接受及拒绝后修正,不能把任意验证规则视为分布等价。速度取决于接受长度、草稿和验证成本及调度;与普通逐词元采样同分布,也不保证同随机种子得到逐词元相同输出。
- 追问:高并发时验证占用的大批计算,为什么可能抵消少轮次收益?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-010 量化对象与容量不能混算
- 题目:权重从 16 位改成 4 位,能否推断整机显存变成四分之一且输出质量不变?
- 分类/标签:AI Infra / Quantization、权重、KV
- 难度:★★★★
- 易错点(常见错误答案):模型位宽缩小四倍,所有显存和传输都同比缩小。
- 正确要点:量化(Quantization)必须区分权重、激活和 KV;权重量化不自动缩小 KV,尺度、分组元数据和工作区也占空间。数值扰动可能影响质量,执行内核与反量化成本影响性能,应分别验证容量、时延与目标任务质量。
- 追问:长上下文中 KV 占主导时,继续压权重为何可能几乎不增加并发?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-011 向量过滤后的召回语义
- 题目:近似向量检索先取 k 个候选再按租户过滤,是否等于在该租户内求前 k?
- 分类/标签:AI Infra / ANN、过滤、Recall
- 难度:★★★★
- 易错点(常见错误答案):全局最近的结果包含局部最近,过滤后有多少返回多少即可。
- 正确要点:近似最近邻(Approximate Nearest Neighbor,ANN)后过滤可能把多数候选删除,即使返回不足 k 条也不代表合格集合不足。召回率(Recall)真值应在相同过滤、快照与距离规则下精确计算;过采样只能缓解,任意选择率下没有固定倍数保证。
- 追问:合格集合很小时,何时精确扫描比图索引更合适?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
AI-012 工具重试不能重放副作用
- 题目:智能体调用扣款工具超时,是否可以把同一步交给模型再次调用?
- 分类/标签:AI Infra / Agent Runtime、恢复
- 难度:★★★★★
- 易错点(常见错误答案):模型重新规划会理解失败原因,不需要持久化工具执行状态。
- 正确要点:智能体运行时(Agent Runtime)必须区分未执行、执行中、已提交与结果未知,模型对超时的解释不能判定现实状态。对有副作用工具使用持久化操作标识、结果查询和业务端幂等协议;补偿也须定义边界,不能把重放文本当作回滚。
- 追问:工具已成功但步骤日志未落盘,恢复应先查询什么再决定是否重试?
- 来源/日期:面试系列 06 AI 时代基础设施面试:从数据库内核到 LLM 推理与 Agent 运行时, 2026-10-24
复习时先独立回答,再用追问构造反例;若无法说明同步边、提交点或版本边界,继续查证后再扩写。具体实现与性能结论仍需绑定版本、负载和失败注入结果,本库不替代这些验证。