NiceOffer

八股文解析

进程与线程区别(含协程)

操作系统进程线程八股文后端

进程与线程区别(含协程)

一句话结论

  • 进程:资源分配最小单位,独立地址空间,切换成本高
  • 线程:CPU 调度最小单位,共享进程资源,切换成本低
  • 协程:用户态轻量线程,由程序自己调度,切换成本最低

面试标准答法

核心区别

维度进程线程协程
资源开销独立地址空间、文件描述符等共享进程资源几乎无额外开销
切换成本高(切页表、刷新 TLB)中(保存/恢复寄存器)低(用户态切换)
通信方式IPC(管道/消息队列/共享内存)共享内存 + 锁channel / 共享变量
调度者OS 内核OS 内核程序自己
崩溃影响互不影响一个线程崩可能拖垮进程通常由运行时恢复

为什么线程切换比进程轻?

  • 线程共享地址空间,无需切换页表
  • TLB(快表)不用全刷新
  • 内核只需保存/恢复少量寄存器和栈指针

Go 协程(goroutine)优势

  • 栈初始小(2KB),可动态扩容
  • GMP 调度模型:M 个内核线程跑 N 个 goroutine,N 远大于 M
  • 阻塞时自动让出(channel、网络 IO、定时器),不占内核线程

适用场景

场景推荐
需要强隔离、多核利用多进程
共享数据多、高并发 IO多线程 + 连接池
超高并发、轻量任务协程(Go / Erlang / Python asyncio)

常见追问

追问要点
什么是线程安全?多线程访问共享数据时结果正确,需同步或不可变设计
进程间通信方式?管道、消息队列、共享内存、信号量、socket
为什么 Go 适合高并发?goroutine 轻量、GMP 调度、channel 简化同步

面试回答模板(30 秒版)

延伸准备

  • 能解释 fork() 的 COW 机制
  • 能对比 Java 线程与 Go goroutine 的内存占用
  • 能说出 volatile / synchronized / CAS 的适用层级