1. 进程、线程、协程的区别?

🎯 面试要点

  • 进程 = 资源边界 + 隔离;线程 = 并发执行;协程 = 超高并发(IO 密集场景)
  • 线程模型:1:1(Java 线程 = 内核线程,创建成本高)→ 用户态 M:N(协程)
  • Java 21 的虚拟线程(Virtual Threads)就是协程式线程——提一句显前沿

2. 进程间通信(IPC)方式?

🎯 面试要点

  • 线程间通信更轻:共享内存(进程内天然共享)+ 锁/条件变量
  • Java 的 IPC 抽象:RMI/Socket/NIO;跨进程共享内存用 MappedByteBuffer
  • 排序:共享内存 > 消息队列 > 管道 > Socket(性能)

3. 用户态与内核态?系统调用?

🎯 面试要点

  • 高并发性能优化核心之一:减少系统调用/内核切换(零拷贝、批量、用户态协议栈)
  • 上下文切换 = 线程切换成本:线程数不是越多越好(见并发模块线程池)

4. 进程调度算法?

🎯 面试要点

  • Linux CFS(完全公平调度):按虚拟运行时间(vruntime)排序,红黑树选最小——公平基于"等待时长"
  • I/O 密集型进程应优先(它很快让出 CPU),MLFQ 的实现思路

🎤 常见面试追问

  1. 进程和线程的区别?(必背)——进程是资源分配单位(独立地址空间,隔离);线程是 CPU 调度单位(共享进程内存,切换快)。一个进程可有多个线程(一个 JVM 多线程)。
  2. 进程间通信方式?——管道(|)、消息队列、共享内存(最快,要信号量同步)、信号量、信号、Socket(跨机器)。
  3. 用户态和内核态是什么?——应用跑在用户态(受限),需要系统能力(读写文件/网络/创建线程)时通过系统调用陷入内核态执行。频繁切换有开销。
  4. 上下文切换的成本?——保存/恢复寄存器 + 内核切换 + 缓存失效(TLB/L1 清空)——切换频繁吞吐暴跌。线程数匹配核数、减少阻塞是优化方向。
  5. 协程和线程的区别?——协程是用户态调度(无内核切换,一个线程跑上万个协程);线程是内核调度。Java 21 的虚拟线程就是协程。

📖 名词解释(本页术语)

术语 大白话解释
进程(Process)运行中的程序:有独立的地址空间和资源。进程间互相隔离(一个崩了不影响其他)。
线程(Thread)进程内的执行流:共享进程内存,切换快,但有共享数据竞争问题。
协程(Coroutine)用户态轻量线程(Go goroutine、Java 虚拟线程),调度不经过内核,数量可达百万级。
IPC(进程间通信)进程间交换数据的方式:管道/消息队列/共享内存/信号量/Socket。
系统调用(syscall)应用向内核请求服务的入口(open/read/socket...),触发用户态→内核态切换。
用户态 / 内核态两种 CPU 运行模式:用户态受限(应用)、内核态特权(OS)。切换有成本。
上下文切换CPU 从一任务切到另一任务:存寄存器、换页表、缓存失效——性能开销的主要来源。
调度算法OS 决定"下一个谁用 CPU":FCFS/时间片轮转/优先级/多级反馈队列(Linux CFS 是公平调度)。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。