一、什么是进程?
定义
进程(Process) 是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位。
形象理解
📁 Java程序(代码文件) = 静态的"菜谱"
🔄 进程 = 正在按菜谱做饭的"厨房"
进程的核心特征
| 特征 | 说明 | Java场景举例 |
|---|---|---|
| 独立性 | 进程有独立的地址空间 | 每个JVM进程内存隔离,互不影响 |
| 并发性 | 多个进程可"同时"执行 | Tomcat + MySQL + Redis 多进程协作 |
| 动态性 | 进程有创建、执行、销毁的生命周期 | java -jar 启动 → 运行 → kill 停止 |
| 异步性 | 进程按各自独立的速度推进 | GC线程、业务线程、IO线程异步执行 |
二、进程的五种状态
图来自5.1 进程、线程基础知识 | 小林coding | Java面试学习

状态详解 + Java场景
| 状态 | 触发条件 | Java后端典型场景 |
|---|---|---|
| 创建态 | 进程被创建 | Runtime.exec() 启动子进程 |
| 就绪态 | 已加载到内存,等待CPU | JVM启动完成,等待处理请求 |
| 运行态 | 获得CPU时间片执行 | Tomcat线程处理HTTP请求 |
| 阻塞态 | 等待I/O、锁、信号量等 | socket.read()、synchronized等待锁、Thread.sleep() |
| 终止态 | 执行完成或被强制终止 | System.exit()、kill -9 |
三、进程控制块(PCB)
什么是PCB?
Process Control Block 是操作系统内核为每个进程维护的数据结构,记录进程的所有信息,是进程存在的唯一标志。
PCB核心字段(简化版)
struct PCB {
// 进程标识
pid_t pid; // 进程ID
// 处理机状态(用于上下文切换)
registers { // CPU寄存器快照
pc; // 程序计数器(下一条指令地址)
sp; // 栈指针
general_registers[16]; // 通用寄存器
};
// 进程调度信息
enum State state; // 当前状态
int priority; // 优先级
long elapsed_time; // 已执行时间
// 内存管理信息
page_table *pg_tbl; // 页表基址
memory_segment code, data, heap, stack;
// I/O和资源信息
file_descriptor *open_files; // 打开的文件
signal_handler *handlers; // 信号处理函数
// 进程关系
pid_t parent_pid; // 父进程ID
list_t children; // 子进程列表
};
Java视角理解PCB
当你执行 `jmap -heap <pid>` 时:
JVM进程的PCB中记录了:
├── 堆内存起始地址和大小 ← memory_segment.heap
├── 栈指针位置 ← registers.sp
├── 当前执行的字节码位置 ← registers.pc
├── 打开的Socket连接 ← open_files
└── 线程调度优先级 ← priority
这就是为什么操作系统能"暂停"一个Java进程,
稍后从断点继续执行------所有状态都保存在PCB中!
四、上下文切换(Context Switch)
什么是上下文切换?
当CPU从一个进程/线程切换到另一个时,需要:
- 保存当前执行上下文(寄存器、PC、栈指针等)到原进程的PCB
- 加载新进程的上下文到CPU寄存器
- 跳转到新进程的程序计数器位置继续执行
切换过程图解

一、什么是线程?
定义
线程(Thread) 是进程内的执行单元,是操作系统进行调度的基本单位。一个进程可以包含多个线程,它们共享进程的资源。
形象理解
🏢 进程 = 一家公司(拥有办公室、资金、设备等资源)
👥 线程 = 公司员工(共享公司资源,各自执行不同任务)
📦 JVM进程
├── 🧵 main线程 # 启动入口
├── 🧵 GC线程 # 垃圾回收
├── 🧵 Finalizer线程 # 对象清理
├── 🧵 Tomcat工作线程池 # 处理HTTP请求(50-200个)
├── 🧵 业务异步线程 # @Async任务
└── 🧵 ...
线程的核心特征
| 特征 | 说明 | Java场景 |
|---|---|---|
| 轻量性 | 线程比进程创建/切换开销小 | 可创建数百~数千线程处理并发请求 |
| 共享性 | 同进程线程共享内存、文件描述符等 | 多线程共享Heap对象,需注意线程安全 |
| 并发性 | 多个线程可并发/并行执行 | Tomcat多线程同时处理多个HTTP请求 |
| 独立性 | 每个线程有独立栈、寄存器、程序计数器 | 方法调用栈互不干扰,局部变量线程私有 |
二、线程 vs 进程:核心对比
资源对比表
| 对比维度 | 进程(Process) | 线程(Thread) |
|---|---|---|
| 基本单位 | 资源分配的基本单位 | 调度执行的基本单位 |
| 内存空间 | 独立地址空间(代码/数据/堆/栈) | 共享进程内存,独占栈+寄存器+PC |
| 创建开销 | 大(需分配独立内存、加载资源) | 小(只需分配栈和寄存器上下文) |
| 切换开销 | 大(需切换页表、刷新TLB/缓存) | 小(同进程线程共享页表,只需切换栈/寄存器) |
| 通信方式 | IPC:管道/消息队列/共享内存/Socket | 直接读写共享变量(需同步机制) |
| 隔离性 | 强(一个进程崩溃不影响其他) | 弱(一个线程崩溃可能导致整个进程挂掉) |
| 适用场景 | 多服务隔离、安全边界 | 高并发任务、协作计算 |
三、线程的上下文切换 🔄
什么是线程上下文切换?
当CPU从一个线程切换到另一个线程时,需要:
- 保存当前线程的执行上下文(寄存器、PC、栈指针等)
- 加载目标线程的上下文
- 跳转到目标线程的程序计数器位置继续执行