进程、线程与协程

共 17 题
#

1. 进程、线程、协程的本质区别,地址空间、调度主体、切换成本三个维度如何对比?

A 进程、线程、协程的切换成本相同,都需进入内核态
B 进程切换只需保存寄存器,无需处理 TLB 失效
C 协程切换由内核调度器完成,成本与线程相当
D 线程切换无需切换页表,因此成本低于进程切换 ✓ 正确答案
#

2. 进程间通信(IPC)方式全景,管道、消息队列、共享内存、信号量、Socket 各自的性能与适用场景如何?

A 匿名管道
B 共享内存 ✓ 正确答案
C 消息队列
D Socket
#

3. 线程上下文切换的具体开销构成(寄存器、内核栈、TLB/缓存失效)?如何测量与减少?

A TLB 失效与缓存冷失效 ✓ 正确答案
B 内核栈切换
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 一定复制父进程全部内存
#

16. 进程间通信方式,管道、共享内存、消息队列与信号如何选择?

A 异步通知进程事件,不能承载复杂数据 ✓ 正确答案
B 能传递大量结构化数据
C 需要两次内核拷贝
D 只适用于亲缘进程
#

17. 线程的同步原语,互斥锁、条件变量与读写锁如何应用?

A 条件变量本身就能保证互斥
B wait 需要原子地释放锁并阻塞,避免竞争与丢失唤醒 ✓ 正确答案
C 条件变量不能独立创建
D 互斥锁必须在条件变量内部实现