# 第四批复习总结 · 答案解析 > ⚠️ 做完 `第四批复习总结.md` 的全部 36 题后再翻开本文件对照。 > 每道题给答案 + 一句话解析,解析都指向对应主题页。 --- ## 判断题(对/错 + 一句话理由) 1. **错**。每个标签页是独立**进程**(独立地址空间隔离),不是线程;线程共享地址空间会一个崩全崩。→ `41.进程-vs-线程` 2. **错**。孤儿是"被 init **收养继续运行**",不是被"回收清除";"回收"是僵尸的处理(父进程 wait 清 PCB)。→ `42.僵尸-孤儿-守护进程` 3. **错**。判断守护进程的关键是**是否 setsid 脱离终端**,跟父进程死不死无关;父进程活着也可以是守护进程。→ `42.僵尸-孤儿-守护进程` 4. **错**。Ctrl+Z+bg 只是作业管理(后台任务),进程还连着终端会话,会收到 SIGHUP;守护进程必须脱离控制终端。→ `42.僵尸-孤儿-守护进程` 5. **错**。拥塞控制只管速度,TCP 可靠是"尽力而为";网络崩溃/物理链路断/对方进程崩溃时 TCP 也无法保证。→ `43.TCP如何保证可靠传输` 6. **错**。"不可靠"指没有确认/重传机制,**不是一定丢包**;网络良好时 UDP 包很可能正常到达。→ `43.TCP如何保证可靠传输` 7. **错**。判重复靠**序号(Seq)**;校验和(Checksum)只查数据完整性(传输中坏了没)。→ `43.TCP如何保证可靠传输` 8. **错**。C++ 中 struct 和 class **功能完全相同**,都能放数据+方法;区别只是默认访问权限和默认继承方式。→ `44.C++-struct-vs-class` 9. **对**。struct 默认 public(`a.x` 可访问),class 默认 private(`a.x` 报错);只是关键字一换,权限就变。→ `44.C++-struct-vs-class` 10. **错**。同样的成员,struct 和 class 内存布局、对齐、大小完全一致,**sizeof 无区别**。→ `44.C++-struct-vs-class` 11. **对**。RAII = 栈对象自动析构,无论正常 return 还是异常栈展开(stack unwinding)析构都执行。→ `45.C++-构造析构` 12. **错**。移动是**偷指针 + 原对象置空**,O(1) 搬资源不复制数据;拷贝才复制整份数据(O(n))。→ `45.C++-构造析构` 13. **错**。声明了析构函数会**抑制移动构造的隐式生成**(拷贝构造仍会生成)。→ `45.C++-构造析构` 14. **错**。多核关中断**只关当前核**,其他核照样能改共享数据;多核要用自旋锁或原子操作。→ `46.SMP-多核` 15. **错**(正好相反)。`arr[0]` 和 `arr[100]` 间隔 400 字节 > 64 缓存行,**绝不会**伪共享;反而 `arr[0]`/`arr[1]`(4 字节 < 64)会。→ `46.SMP-多核` 16. **错**。单核同一时刻只能执行一个线程(并发/时间片轮转);**并行**需要多核。→ `46.SMP-多核` ## 填空题 17. **wait()/waitpid()**——父进程不回收,子进程残留 PCB 成僵尸。→ `42.僵尸-孤儿-守护进程` 18. **init**(PID 1)——孤儿院,收养并等运行完再回收,不会变僵尸。→ `42.僵尸-孤儿-守护进程` 19. **setsid()**——创建新会话、成为 session leader、脱离控制终端。→ `42.僵尸-孤儿-守护进程` 20. **序号(Seq)/ 校验和(Checksum)**——序号判重复乱序,校验和查损坏。→ `43.TCP如何保证可靠传输` 21. **滑动窗口 / 拥塞控制 / 最小**——接收方能力 + 网络能力,两个窗口取最小值。→ `43.TCP如何保证可靠传输` 22. **ACK**——全双工半关闭:一方 FIN 只表示不再发,还能收,所以 ACK 和 FIN 分开。→ `43.TCP如何保证可靠传输` 23. **public / private**——struct 默认公开,class 默认私有。→ `44.C++-struct-vs-class` 24. **public / private**——继承方式也有默认差异。→ `44.C++-struct-vs-class` 25. **ClassName&&**——右值引用参数。→ `45.C++-构造析构` 26. **转移资源 / 原对象置空**——转移后把原指针置 nullptr,防析构双重释放。→ `45.C++-构造析构` 27. **移动 / 拷贝**——移动优先原则:默认走移动,移动不可用(=delete/未定义/非 noexcept)才拷贝。→ `45.C++-构造析构` 28. **noexcept**——移动可能抛异常时 vector 无法保证强异常安全,会回退用拷贝。→ `45.C++-构造析构` 29. **保证复制省略(Guaranteed Copy Elision)**——`return T();` 直接构造,C++11/14 不行。→ `45.C++-构造析构` 30. **自旋锁**——多核临界区要忙等锁;关中断只关本核无效。→ `46.SMP-多核` 31. **小于**——地址间隔 < 缓存行大小(64 字节)才可能伪共享。→ `46.SMP-多核` ## 场景 / 代码判断 32. **线程**。要共享数据 + 轻快切换 → 线程(共享地址空间、切换只换寄存器/栈指针)。线程崩 = 进程崩:线程共享进程的地址空间和资源,一个线程写坏共享部分,整个进程资源跟着坏;进程有独立地址空间(隔离墙)。→ `41.进程-vs-线程` 33. **方案一**:`signal(SIGCHLD, SIG_IGN)` 忽略退出信号,内核自动回收;**方案二**:**双 fork**——子进程再 fork 孙进程后自己立刻退出,孙进程变孤儿被 init 收养自动回收,父进程完全不用管。→ `42.僵尸-孤儿-守护进程` 34. **UDP**。视频直播可容忍**少量丢包**(丢几帧没关系),但不能容忍**延迟**;TCP 要确认/重传/握手,慢且可能卡顿。→ `43.TCP如何保证可靠传输` 35. **能**。`unique_ptr` 只移动不拷贝,vector 扩容时调用它的**移动构造**(偷走资源、原指针置空),安全;因为容器默认走移动。→ `45.C++-构造析构` 36. **不一定对**。`count++` 是"读→改→写"三步,多核同时执行被切开:A 读 0、B 也读 0,都写 1,结果 1 不是 2(**丢失更新/数据竞争**)。必须用原子操作或锁。→ `46.SMP-多核` --- _错题 > 3 道:回到对应主题页重学第 5 步变体验证。_