# 1. 进程、线程、协程的本质区别,地址空间、调度主体、切换成本三个维度如何对比? A 进程、线程、协程的切换成本相同,都需进入内核态 B 进程切换只需保存寄存器,无需处理 TLB 失效 C 协程切换由内核调度器完成,成本与线程相当 D 线程切换无需切换页表,因此成本低于进程切换 ✓ 正确答案
# 4. 进程/线程/协程在"上下文切换成本、资源占用、通信方式"三个维度如何对比? A 进程上下文切换成本最高,因需切换地址空间并刷新 TLB B 线程共享进程的地址空间,切换无需换页表 C 协程切换成本低于线程,但无法由内核调度 D 协程之间必须通过内核 IPC 通信 ✓ 正确答案
# 5. Linux 中线程为何是轻量级进程,tgid 与 pid 的关系,线程组与进程组的区别是什么? A 内核唯一的线程 pid B 进程组 id(pgid) C 线程组 id(tgid) ✓ 正确答案 D 会话 id(sid)
# 6. 孤儿进程与僵尸进程的产生与处理,为什么僵尸进程无法被 kill -9 清除? A 向僵尸进程发送 kill -9 B 向僵尸进程发送 SIGTERM C 让父进程调用 wait/waitpid 回收,或杀死父进程 ✓ 正确答案 D 重启内核对僵尸进程
# 7. 用户态线程与内核态线程的映射模型(1:1、N:1、M:N)及现代语言运行时的选择? A Go 的 goroutine 采用 M:N 思路,将大量用户任务调度到少量内核线程 ✓ 正确答案 B N:1 模型能充分利用多核并行 C 1:1 模型切换成本最低,适合高并发 D 1:1 模型线程数可以无限增长
# 8. 线程局部存储(TLS)、栈大小与虚拟地址空间的关系? A 线程栈按需提交物理内存,但会在虚拟地址空间中预留栈区域 ✓ 正确答案 B 线程栈一经创建就立即分配全部物理内存 C 栈溢出不会触发任何信号 D TLS 变量在所有线程间共享同一份存储
# 9. 进程/线程/协程的切换成本,内核态 vs 用户态调度如何对比? A 协程切换完全不需要保存任何寄存器状态 B 协程切换不需要切换栈,共用同一个调用栈 C 协程切换不进入内核态,仅由用户态运行时保存寄存器与栈 ✓ 正确答案 D 协程由内核调度器统一调度,因此路径更短
# 10. 进程的内存模型,虚拟地址空间与共享库如何组织? A 每个进程共享库的物理页与虚拟地址都相同 B 共享库映射到堆区 C 共享库通过 mmap 映射,物理页共享但各进程虚拟地址独立 ✓ 正确答案 D 共享库不使用地址空间随机化
# 11. 进程的 R/S/D/T/Z 状态机,为什么 D 状态(不可中断睡眠)无法被 kill,通常由什么导致? A D 状态进程已退出 B D 状态进程没有权限 C 进程在内核不可中断的 IO 等待中,信号被挂起无法处理 ✓ 正确答案 D kill 命令不支持 D 状态进程
# 12. x86 上线程切换的硬件细节,内核栈如何切换,TSS 在现代 OS 中为何基本不再用于任务切换? A 硬件任务切换 B 页表切换 C 提供内核态(Ring0)栈指针与 IO 位图 ✓ 正确答案 D 中断描述符表
# 13. 为什么说"并发不等于并行",多核场景下如何利用? A 单核系统既能并发也能并行 B 单核系统只能并发不能并行,并行需要多核 ✓ 正确答案 C 并发是多个任务在物理上同时执行 D 并发与并行是同一概念
# 14. 协程 vs 线程,调度模型与适用场景如何对比? A 高并发 IO 场景,需要创建大量并发的轻量任务 ✓ 正确答案 B 需要真正利用多核并行做 CPU 密集计算 C 必须依赖内核抢占式调度的实时任务 D 需要调用阻塞式系统库
# 15. 进程的 fork 与 exec,写时复制(COW)如何起作用? A 写时复制使 fork 时父子共享物理页,仅写入时复制 ✓ 正确答案 B fork 与 exec 都会改变进程号 C exec 会创建新的进程号 D fork 一定复制父进程全部内存
# 17. 线程的同步原语,互斥锁、条件变量与读写锁如何应用? A 条件变量本身就能保证互斥 B wait 需要原子地释放锁并阻塞,避免竞争与丢失唤醒 ✓ 正确答案 C 条件变量不能独立创建 D 互斥锁必须在条件变量内部实现