进程线程 → 调度 → 上下文切换 → 协程 追问链#
追问路径#
Q: 进程和线程有什么区别?
→ 进程是资源分配的最小单位(独立地址空间),线程是调度的最小单位(共享进程资源)
Q: 线程之间共享什么?不共享什么?
→ 共享:堆内存/代码段/全局变量/文件描述符;不共享:栈/寄存器/程序计数器/TLS(线程本地存储)
Q: 上下文切换的开销有哪些?
→ 保存恢复CPU寄存器+切换内核栈+TLB刷新(页表缓存失效)+CPU缓存冷启动;一次约3-5μs
├─ Q: 怎么减少上下文切换?
│ → 无锁编程(CAS)/减少线程数/使用协程/避免频繁锁竞争/绑定CPU核心
│ Q: 协程是什么?和线程有什么区别?
│ → 协程是用户态轻量级线程,由用户态调度器切换而非内核,切换只需保存少量寄存器无需TLB刷新
│ Q: Java有协程吗?
│ → JDK21正式引入虚拟线程(Project Loom),底层由ForkJoinPool调度,一个平台线程可以承载数千虚拟线程
│ Q: 虚拟线程和线程池怎么选?
│ → IO密集型用虚拟线程(阻塞时自动卸载不占平台线程);CPU密集型仍用平台线程(虚拟线程切换无意义)
└─ Q: 进程间通信(IPC)有哪些方式?
→ 管道(匿名/命名) / 消息队列 / 共享内存 / 信号量 / Signal / Socket
Q: 共享内存为什么最快?
→ 数据不需要在用户态和内核态之间拷贝,两个进程直接读写同一块物理内存
Q: 共享内存的同步问题怎么解决?
→ 需要配合信号量或互斥锁保证读写原子性,否则会出现数据竞争plaintext涉及知识点#
- 进程与线程区别 — 资源分配 vs 调度单位
- 上下文切换开销 — 寄存器/内核栈/TLB/缓存
- 进程间通信方式 — 7种IPC机制对比
- 协程原理 — 用户态调度与无栈/有栈协程
- 用户态与内核态 — 特权级与系统调用开销
- 虚拟内存原理 — 页表与地址空间隔离
- 死锁与处理策略 — 四必要条件与预防
- 线程生命周期与状态转换 — NEW/RUNNABLE/BLOCKED/WAITING/TERMINATED
- 线程间通信方式 — wait/notify/Condition/LockSupport
- 文件描述符 — 进程共享资源的句柄
核心串联逻辑#
- 进程 vs 线程:进程有独立地址空间(隔离安全但创建开销大~ms级),线程共享地址空间(轻量但需同步)
- 上下文切换成本:Linux上一次线程切换约 3-5μs,进程切换因TLB全刷新约 10-20μs
- 协程优势:用户态切换只需 ~100ns,一个线程可承载数万协程,Go/Kotlin/JDK21都有原生支持
- 虚拟线程关键点:阻塞IO时自动从平台线程卸载(unmount),不占线程资源;但synchronized会pin住平台线程,推荐用ReentrantLock
- IPC选型:同机高性能选共享内存(零拷贝),跨机选Socket,简单通知选Signal
- 代码示例:
java// JDK21虚拟线程 try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10000).forEach(i -> executor.submit(() -> { /* IO密集型任务 */ })); } // 10000个虚拟线程,底层可能只用几个平台线程
面试回答串联#
30秒速答#
“进程是资源分配单位,线程是调度单位。上下文切换涉及寄存器保存、TLB刷新和缓存冷启动,约3-5μs。协程是用户态调度,切换约100ns。JDK21虚拟线程适合IO密集型,阻塞时自动卸载不占平台线程。“
2分钟展开答#
“进程拥有独立地址空间,创建开销大(ms级)但隔离性好;线程共享进程资源,轻量但需要同步机制。上下文切换的开销包括保存恢复CPU寄存器、切换内核栈、刷新TLB(页表缓存)以及CPU缓存冷启动,Linux上线程切换约3-5μs,进程切换因TLB全刷新约10-20μs。减少上下文切换可以用CAS无锁编程、减少线程数、使用协程。协程在用户态切换只需约100ns,JDK21通过Project Loom引入虚拟线程——底层由ForkJoinPool调度,一个平台线程可承载数千虚拟线程。IO密集型任务用虚拟线程很合适,阻塞IO时自动从平台线程卸载让其他虚拟线程运行;但CPU密集型仍用平台线程因为虚拟线程切换没有意义。注意虚拟线程遇到synchronized会pin住平台线程,推荐用ReentrantLock替代。进程间通信最快的是共享内存(零拷贝不经过内核),但需要信号量配合保证同步。“
相关追问链#
- 线程池-Spring异步-MQ消费追问链 — 线程池与线程调度的关系
- JVM-GC-内存泄漏-OOM追问链 — JVM线程栈OOM与线程数的关系
- TCP握手-Socket-Netty追问链 — IO模型与线程模型的演进