R.9 面试竞技场
面试不是背答案,是在追问下保持路径完整。每题的「追一问」是面试官最常接的下一句;答不上来,说明上一题是背的。
1. 初级:会不会用
| # | 问题 | 一句话答案 | 追一问 |
|---|---|---|---|
| 1 | ps 的 STAT 里 D 是什么? | 不可中断睡眠,通常在等块设备 I/O | D 多怎么查? |
| 2 | 硬链接和软链接区别? | 同一 inode vs 独立 inode 存路径 | 为什么硬链接不能跨文件系统? |
| 3 | chmod 4755 的 4 是什么? | setuid,执行时以文件属主身份运行 | 为什么现在不推荐? |
| 4 | df 满但 du 小,为什么? | 被删除文件仍被进程持有 | 怎么找? |
| 5 | kill -9 和 kill -15 区别? | KILL 不可捕获,TERM 可捕获清理 | 为什么先 TERM? |
| 6 | systemctl enable 和 start 区别? | 开机自启 vs 立即启动 | unit 的 WantedBy 是什么? |
| 7 | ip addr 和 ifconfig 区别? | iproute2/netlink vs 旧 ioctl | 为什么新系统不装 net-tools? |
| 8 | crontab 和 systemd timer 怎么选? | 简单周期用 cron,要日志/依赖/精度用 timer | timer 的 OnCalendar 怎么写? |
2. 中级:说不说得清机制
| # | 问题 | 一句话答案 | 追一问 |
|---|---|---|---|
| 9 | fork 后父子共享什么? | 打开文件描述(偏移)、COW 页;fd 表复制 | 为什么 fork 大内存进程慢? |
| 10 | write 返回就落盘了吗? | 没有,只到 page cache | 怎么保证落盘? |
| 11 | O_APPEND 原子吗? | 单次 write 原子追加;多条写仍交错 | NFS 上呢? |
| 12 | 短读/短写怎么处理? | 循环 + EINTR 重试 + 0 处理 | 为什么 read 可能只返回 1 字节? |
| 13 | close 失败能重试吗? | 不能,fd 可能被复用 | 那怎么保证数据安全? |
| 14 | 条件变量为什么 while? | 虚假唤醒/竞争,醒来重查谓词 | wait 内部做了什么? |
| 15 | pthread_* 怎么报错? | 返回错误码,不设 errno | 为什么这样设计? |
| 16 | epoll LT/ET 区别? | 持续通知 vs 变化通知 | ET 为什么必须非阻塞? |
| 17 | epoll 为什么快? | 回调挂就绪链表,不轮询全部 fd | 红黑树干什么? |
| 18 | select 的 1024 限制来自哪? | fd_set 位图大小 FD_SETSIZE | poll 为什么没有? |
| 19 | TCP 三次握手为什么不是两次? | 防止旧 SYN 建立错误连接/确认双方收发能力 | 四次挥手为什么多一次? |
| 20 | TIME_WAIT 为什么存在? | 处理迟到报文 + 让旧连接消散 | 什么时候要 tcp_tw_reuse? |
| 21 | CLOSE_WAIT 多说明什么? | 应用没 close,是 bug | 怎么定位? |
| 22 | listen backlog 限制哪个队列? | accept 队列 | SYN 队列怎么调? |
| 23 | 收包路径? | NIC→NAPI→协议栈→socket 队列 | 软中断打满怎么优化? |
3. 高级:能不能做取舍
| # | 问题 | 答题骨架 | 追一问 |
|---|---|---|---|
| 24 | 设计百万连接服务器 | 多 reactor + SO_REUSEPORT + epoll ET + 内存池 + 定时器 + fd/内存/backlog 估算 | 怎么压测?瓶颈在哪? |
| 25 | 实现容器运行时 | namespace/cgroups/overlayfs/pivot_root/OCI/信号/安全 | 容器逃逸怎么防? |
| 26 | 实现 B+ 树存储引擎 | 页格式/buffer pool/分裂合并/WAL/恢复/事务 | 崩溃恢复怎么保证幂等? |
| 27 | 实现用户态 TCP | 状态机/序号/重传/窗口/校验和/TUN | 怎么和 Linux 栈互通? |
| 28 | 排查 CPU 高 | top 分 us/sy/si/wa → perf → 内核/用户态 → 锁/拷贝 | %si 高怎么查? |
| 29 | 排查内存涨 | free/PSS/smaps/valgrind/ASan → 泄漏 vs 缓存 vs 碎片 | OOM 怎么定位? |
| 30 | 排查网络慢 | ss -tin/tcpdump/mtr → 重传/RTT/cwnd/丢包 | BBR 什么时候有用? |
4. 答题纪律
- 先给结论,再给路径:一句话答案 + 三步展开,不要从定义背起。
- 带条件:「在 Linux 6.8 上」「对普通文件」「除非
O_DIRECT」。 - 承认边界:「这块我没做过,但我会这样查」比编造好。
- 给证据:说「用
ss -tin看retrans」比「可能是网络问题」强。 - 追问链:每个答案留一个可追问的钩子(版本、失败路径、替代方案),引导面试官往你熟的地方问。
5. 高频「送命题」
| 问题 | 陷阱 | 正确姿势 |
|---|---|---|
「write 之后数据在哪?」 | 只说 page cache | 分「进程崩溃 vs 机器断电」两种情况 |
「fork 复制内存吗?」 | 说「复制」 | COW;页表复制仍是成本 |
「epoll 一定比 poll 快?」 | 绝对化 | 连接多且活跃比例低时快;少量 fd 未必 |
| 「容器是轻量 VM?」 | 混淆 | 共享内核,隔离靠 namespace/cgroups |
「TIME_WAIT 要调小?」 | 乱调内核 | 先分清主动/被动关闭;CLOSE_WAIT 才是 bug |
「load 高就是 CPU 忙?」 | 忽略 D 状态 | load 含不可中断睡眠 |
「O_DIRECT 一定快?」 | 忽略对齐/缓存 | 只有自管缓存且对齐时才可能 |
「volatile 能解决竞争?」 | 混淆可见性/原子性 | 用 atomic/锁 |