进程和线程是操作系统面试的基础。
核心区别
| 特性 | 进程 | 线程 |
|---|---|---|
| 资源 | 独立的内存空间 | 共享进程的内存 |
| 创建开销 | 大(分配内存、复制页表) | 小 |
| 通信 | IPC(管道、共享内存等) | 直接读写共享变量 |
| 切换开销 | 大(切换页表、刷新 TLB) | 小 |
| 独立性 | 一个挂了不影响其他 | 一个线程 OOM,整个进程挂 |
| 调度 | 操作系统调度 | 操作系统调度(内核线程) |
进程间通信(IPC)
- 管道:父子进程间单向通信,
ps aux | grep java - 消息队列:独立于进程,异步通信
- 共享内存:最快但需要同步机制
- Socket:跨网络通信
线程同步
synchronized(Java)
synchronized 保证原子性 + 可见性 + 有序性。JMM 的 happens-before 原则:解锁 happens-before 后续的加锁。
volatile
保证可见性 + 有序性(禁止指令重排),但不保证原子性。经典使用:DCL 单例中的 instance 变量必须用 volatile。
CAS(Compare And Swap)
无锁同步。AtomicInteger 底层就是 CAS + 自旋。ABA 问题:值从 A 变成 B 又变成 A,CAS 检测不到变化。解决:加版本号(AtomicStampedReference)。
死锁的条件
- 互斥:资源不能共享
- 持有并等待:持有资源的同时等待新资源
- 不可剥夺:别人不能抢你的资源
- 循环等待:A 等 B,B 等 C,C 等 A
破坏任意一个即可避免死锁。
面试话术
进程是资源分配的最小单位,线程是 CPU 调度的最小单位。进程间通信需要 IPC,线程间直接共享内存但需要同步。线程同步的核心是保证原子性、可见性和有序性。
OS 基础决定了你能走多远——优化到最后都是在跟操作系统打交道。
评论
评论已关闭。