mmap 的 MAP_SHARED 和 MAP_PRIVATE 在写操作后行为有何不同?
围绕“mmap 的 MAP_SHARED 和 MAP_PRIVATE 在写操作后行为有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确写回文件与写时复制私有副本的差异。
程序员面试题库第 64 页,收录第 3151–3200 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
围绕“mmap 的 MAP_SHARED 和 MAP_PRIVATE 在写操作后行为有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确写回文件与写时复制私有副本的差异。
围绕“虚拟化中内存气球(ballooning)如何回收虚拟机的空闲内存”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确客户机驱动充气让客户机自己换页/释放的机制。
围绕“缓存一致性协议和内存屏障分别解决多核编程中的什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分硬件保证一致性与编译器/CPU 重排序两个层面。
围绕“内存内部碎片和外部碎片的成因分别是什么,各用什么手段缓解”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按分配单元内外区分两类碎片并对应缓解手段。
围绕“如何区分进程是内存泄漏还是被 glibc 分配器缓存了内存”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出观测分配器统计与 valgrind 类工具的判定路径。
围绕“次缺页和主缺页有什么区别,如何用 minflt/majflt 判断程序瓶颈”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确是否需要磁盘 I/O 这一判定标准及排查含义。
围绕“mlock 锁定的内存有什么保证,数据库为什么用它”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确防止换出的语义与典型场景。
围绕“匿名 mmap 和文件 mmap 在页面来源与回收路径上有什么区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 swap 与页缓存两条回收路径的差异。
围绕“用 mmap 读文件和用 read 读文件在数据拷贝和缺页上有什么差异”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确页缓存映射与 read 的额外拷贝及随机小读的劣势。
围绕“NUMA 架构下跨节点访问内存的代价是什么,如何做内存亲和优化”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确本地与远程节点延迟差异及绑定手段。
围绕“Linux OOM Killer 如何挑选要杀死的进程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 oom_score 的计算因素与调整手段。
围绕“Linux 内存超卖(overcommit)策略的三种模式分别意味着什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 vm.overcommit_memory 三种取值对分配成败的影响。
围绕“Linux 页缓存是什么,为什么 free 显示的可用内存很少但系统并不缺内存”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确缓存可回收性与 available 指标的读法。
围绕“发生缺页异常时操作系统内核的完整处理流程是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按内核处理顺序回答从异常入口到恢复执行的步骤,不区分 minor/major fault 的对比。
围绕“常见的页面置换算法有哪些,为什么 LRU 在实际内核中被近似实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须比较各算法的开销与近似原因。
围绕“内存分页和分段有什么区别,为什么主流系统以分页为主”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确固定大小与变长大小带来的碎片差异。
围绕“Linux 内核的 slab 分配器解决什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确小对象高频分配的内部碎片与初始化成本。
围绕“生产服务器应该禁用 swap 吗,保留少量 swap 的理由是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须权衡换出冷匿名页的价值与换页延迟风险。
围绕“vm.swappiness 参数如何影响匿名页与页缓存的回收倾向”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确取值含义与调成低值的适用场景。
围绕“Linux 透明大页(THP)的 always/madvise/never 策略如何取舍”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确自动合并的收益与分配延迟、碎片风险。
围绕“TLB 在地址转换中起什么作用,TLB miss 时代价有多大”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确缓存页表项避免多级遍历的机制及 miss 路径。
围绕“多核系统中修改共享页表后为什么需要 TLB shootdown”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确各核私有 TLB 与 IPI 失效广播的成本来源。
围绕“虚拟机中客户机虚拟地址到宿主机物理地址经历几级翻译”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 guest VA→guest PA→host PA 两级页表及硬件辅助。
围绕“宿主机回收虚拟机内存时,balloon 和 KSM 各适用于什么场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须比较主动归还与被动去重的触发方式和开销。
围绕“CPU 如何将虚拟地址翻译成物理地址”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确多级页表逐级查找与 MMU 的角色。
围绕“什么是内存抖动(thrashing),如何诊断系统正在抖动”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出工作集超过物理内存的成因和可观测指标。
围绕“为什么现代操作系统使用多级页表而不是单级页表”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用 64 位地址空间算清单级页表的内存开销来说明动机。
围绕“为什么操作系统需要虚拟内存而不是直接使用物理内存”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确隔离、超配、地址连续性与共享四个动机。
围绕“什么是工作集模型,它和驻留集大小 RSS 有什么关系”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确工作集概念如何指导内存容量评估。
围绕“zswap 和 zram 在压缩换出路径上有什么区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确压缩写回缓存与压缩块设备两条路径的差异。
围绕“原子操作和无锁编程能解决什么问题,为什么原子变量不等于线程安全”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分单变量原子性与复合操作的原子性缺失。
围绕“Linux CFS 完全公平调度器如何用 vruntime 决定下一个运行的任务”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释虚拟运行时间与红黑树选择最小者的机制。
围绕“条件变量为什么必须与互斥锁配合、wait 为什么要在 while 循环里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释虚假唤醒与唤醒时谓词可能再次失效。
围绕“为什么频繁上下文切换会降低性能,如何在压测中观测”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 TLB/缓存失效与内核开销两类成本及观测工具。
围绕“一次进程上下文切换具体保存和恢复哪些内容”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须列出寄存器、栈指针、页表与 TLB 影响。
围绕“CPU 亲和性是什么,绑核在什么场景能提升性能”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明缓存局部性收益与负载不均风险。
围绕“死锁的四个必要条件是什么,面试中如何用它推导排查思路”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须列出互斥、占有等待、不可剥夺、循环等待并说明破坏任一即可预防。
围绕“线上进程疑似死锁,如何用 gdb、pstack 或 /proc 定位持锁线程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出抓线程栈、比对锁持有的实操路径。
围绕“epoll 水平触发与边缘触发的区别是什么,ET 模式为什么必须配非阻塞 fd”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 ET 只通知一次导致必须读到 EAGAIN 的原因。
围绕“eventfd 适合什么场景,它和 pipe 做线程间通知相比好在哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明计数语义、单 fd 双向与内核对象轻量性。
围绕“Unix socket 的 SCM_RIGHTS 如何实现进程间传递文件描述符”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明辅助消息与内核 fd 表转换。
围绕“fork 之后再 exec 的典型流程是什么,为什么 Unix 要拆成两步”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释两步设计如何支持重定向与管道设置。
围绕“futex 是什么,为什么说它是 Linux 用户态锁的基石”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明等待队列在内核、无竞争时纯用户态的混合设计。
围绕“管道、消息队列、共享内存、socket 之间如何按场景选型”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按是否本机、数据量、是否需要同步语义给出取舍,不深入每种实现细节。
围绕“活锁和死锁的区别是什么,什么设计会引入活锁”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用状态持续变化但无进展的定义区分,并给出重试风暴示例。
围绕“Linux load average 包含哪些状态的进程,高负载一定代表 CPU 忙吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 R+D 状态计入及 IO 等待导致的高负载场景。
围绕“固定加锁顺序为什么能预防死锁,跨模块代码如何约定顺序”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明打破循环等待的原理及层级化锁设计。
围绕“Linux 内核 lockdep 是如何在运行时检测潜在死锁的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明锁依赖图与环检测思想。
围绕“条件变量的丢失唤醒问题是怎么发生的,如何正确使用避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用检查谓词与 signal 之间的竞态说明成因。
围绕“为什么多线程程序需要内存序,x86 和 ARM 上的可见性差异在哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明乱序执行与缓存一致性导致的可见性问题及强弱内存模型差异。