多线程程序里 close 一个描述符后立刻被重用会导致什么竞态?
围绕“多线程程序里 close 一个描述符后立刻被重用会导致什么竞态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 fd 立即回收导致的 ABA 式误用及 EINTR 后是否重试 close 的争议。
操作系统 · 并发编程面试题第 1 页,显示第 1–50 题,共找到 66 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“多线程程序里 close 一个描述符后立刻被重用会导致什么竞态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 fd 立即回收导致的 ABA 式误用及 EINTR 后是否重试 close 的争议。
围绕“多个线程同时 epoll_wait 同一个 epoll 实例为什么会产生惊群,如何处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释同一事件唤醒所有等待者的问题及 EPOLLEXCLUSIVE/每线程独立实例两种方案。
围绕“eventfd 和 timerfd 为什么经常出现在 epoll 程序里,它们解决了什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明将线程间通知与定时器统一为 fd 以纳入单事件循环。
围绕“线上进程文件描述符持续上涨,如何定位是哪里泄漏的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 /proc/PID/fd 与 lsof 观察增长类型的诊断路径,并区分管道、socket 与文件泄漏。
围绕“进程能打开多少个文件描述符受什么限制,调优时应改哪个值”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分 RLIMIT_NOFILE、/proc/sys/fs/file-max 和 nr_open 三层限制。
围绕“Linux 中文件描述符在进程内核结构里是如何管理的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 fd 是每进程 fdtable 的索引而非全局编号,以及打开文件表项共享的含义。
围绕“为什么 printf 未换行就 fork 会让子进程重复输出同一段内容”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须归因于用户态 stdio 缓冲随进程复制而内核文件表无此问题。
围绕“io_uring 相比 epoll + 线程池做磁盘异步 I/O 解决了什么核心问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明提交/完成双环形队列减少系统调用与拷贝、支持真正的文件异步。
围绕“为什么新建文件描述符推荐加 O_CLOEXEC,它解决了哪类问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 exec 时自动关闭避免子进程持有无关 fd,以及 open 与 fcntl 两步设置的竞态。
围绕“向管道并发写入时,多大以内的写能保证原子性”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出 PIPE_BUF 界限及其对日志交织问题的影响。
围绕“select 在高并发下的三个主要瓶颈是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须列出 fd 数量上限、每次重置集合、内核到用户态线性扫描。
围绕“Shell 重定向和守护进程关闭 0/1/2 的实现依赖 dup2 的什么性质”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 dup2 能原子地指定目标 fd 从而替换标准流。
围绕“为什么高并发服务用 epoll 而不是信号驱动 I/O(O_ASYNC/SIGIO)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出信号携带信息少、处理函数受限、队列溢出丢失事件。
围绕“删除一个仍被进程打开的文件,磁盘空间何时真正释放”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须用 inode 的链接计数与打开计数解释空间延迟释放,并指出这在日志清理中的实战后果。
围绕“write 返回成功后,数据到达磁盘的顺序和时机由什么决定”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 write 只保证进页缓存、由 flusher 线程异步写回,及掉电风险。
围绕“进程写文件偶尔卡顿数秒,为什么可能是内核写回限流而非磁盘坏了”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 dirty_ratio/dirty_bytes 触发同步写回导致写阻塞,并给出观察 dirty 计数的路径。
围绕“cgroup 内存限额达到上限时容器内进程会发生什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确回收尝试与 cgroup 级 OOM kill 的顺序。
围绕“fork 之后父子进程如何通过写时复制共享内存页”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确只读共享加写保护触发复制的机制。
围绕“多线程程序中什么是伪共享(false sharing),如何避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确同缓存行多核失效 ping-pong 的机制与对齐填充手段。
围绕“为什么 fork 一个大内存进程通常很快,什么情况下 fork 会变慢”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确复制页表而非页帧的成本模型及大页表场景。
围绕“为什么 free 之后进程的 RSS 往往不会立即下降”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确分配器缓存与堆顶归还条件。
围绕“如何区分进程是内存泄漏还是被 glibc 分配器缓存了内存”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出观测分配器统计与 valgrind 类工具的判定路径。
围绕“Linux OOM Killer 如何挑选要杀死的进程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 oom_score 的计算因素与调整手段。
围绕“原子操作和无锁编程能解决什么问题,为什么原子变量不等于线程安全”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分单变量原子性与复合操作的原子性缺失。
围绕“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 上的可见性差异在哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明乱序执行与缓存一致性导致的可见性问题及强弱内存模型差异。
围绕“mmap 共享映射如何实现进程间通信,MAP_SHARED 与 MAP_PRIVATE 差异是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明共享映射的页回写与匿名共享用法。
围绕“pthread_mutex 在 Linux 上基于 futex 如何做到无竞争时零系统调用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明快路径用户态原子操作、慢路径 futex 等待。
围绕“互斥锁和信号量的本质区别是什么,能用二值信号量替代互斥锁吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明所有权与释放者限制及优先级继承差异。
围绕“nice 值如何影响 CFS 中进程实际获得的 CPU 时间”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 nice 到权重的映射改变 vruntime 增速。
围绕“Linux OOM killer 如何挑选要杀掉的进程,如何保护关键进程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 oom_score 计算与 oom_score_adj 调整手段。
围绕“孤儿进程为什么会被 init 收养而不是变成僵尸”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明父进程先退出时 reparent 到 PID 1 的机制。
围绕“匿名管道和命名管道 FIFO 的区别是什么,管道的容量与阻塞行为如何”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明有无文件系统节点、PIPE_BUF 原子性及读写阻塞规则。