进程与线程
2025年4月4日大约 4 分钟
进程与线程
一、什么是进程(Process)
✅定义
进程是操作系统资源分配的最小单位,是一个正在运行的程序实例。
一个程序在执行时,操作系统会为它分配专属的资源(内存、文件描述符、CPU 时间等),这个资源集合 执行状态就组成了一个进程。
✅组成结构
一个进程通常包括:
组成部分 | 描述 |
---|---|
程序代码 | 可执行指令 |
数据段 | 全局变量、静态变量等 |
堆(Heap) | 动态分配内存(如 malloc /new ) |
栈(Stack) | 函数调用、局部变量、返回地址等 |
PCB(进程控制块) | 操作系统内保存该进程的元信息 |
✅进程的生命周期(状态图)

状态 | 描述 |
---|---|
新建 | 正在创建中的进程 |
就绪 | 等待被调度运行 |
执行 | 正在CPU上执行 |
阻塞 | 等待事件(如IO、信号) |
终止 | 执行完成或被杀死 |
二、什么是线程(Thread)
✅定义
线程是系统调度的最小单位,是程序的一个执行流。
一个线程属于某个进程。多个线程共享进程的资源,但每个线程也有自己的执行状态。也称为轻量级进程(LWP: Lightweight Process)。
✅每个线程独有的资源
- 程序计数器(PC)
- 寄存器
- 堆栈(Stack)
✅多个线程共享的资源
- 代码段
- 数据段
- 堆
- 文件描述符等
三、进程 vs 线程对比
进程 | 线程 | |
---|---|---|
基本概念 | 独立的运行单位,资源分配和拥有的基本单位 | 程序执行的基本单位,进程中的执行单位 |
内存空间 | 拥有独立的内存空间 | 共享进程的内存空间 |
系统开销 | 创建/切换开销较大 | 创建/切换开销较小 |
通信方式 | 进程间通信较复杂,需要借助操作系统 | 同一进程内通信非常简单,可以直接读写进程数据段 |
稳定性 | 稳定性高,一个进程崩溃不影响其他进程 | 稳定性低,一个线程崩溃可能影响整个进程 |
为什么操作系统需要“线程”?
- 提高并发性:线程可以在多核 上并行执行,提高系统效率。
- 资源利用率高:多个线程共享资源,减少冗余。
- 响应更快:比如点击按钮后,界面不卡顿,因为有专门的线程处理用户输入。
四、进程与线程的调度机制
操作系统中,调度是关键。它决定哪个任务被 CPU 执行。
1.时间片轮转调度(Round-Robin)
- 每个进程/线程获得一段时间
- 时间到就切换
2.抢占式调度
- 高优先级任务会中断低优先级任务
3.非抢占式调度
- 直到任务完成/放弃控制权才切换
4.多级反馈队列调度(MLFQ)
- 根据行为调整优先级,响应快又能防饿死
五、线程模型与实现方式
1.用户级线程(User-Level Thread)
- 线程由用户库管理(非操作系统)
- 切换快,不依赖内核
- 缺点:一个线程阻塞,整个进程阻塞
2.内核级线程(Kernel-Level Thread)
- 线程由操作系统内核调度
- 真正的并行性(适配多核)
- 切换慢,开销大
3.混合模型(Hybrid Model)
- 常见于现代系统,如Linux/NPTL
- 用户管理线程池,内核调度轻量线程
六、进程间通信(IPC)
由于进程是独立内存空间,需要借助操作系统机制来通信。
常见IPC方式如下:
方式 | 特点 | 举例用途 |
---|---|---|
管道(Pipe) | 父子进程通信,单向 | shell管道 |
命名管道(FIFO) | 不相关进程通信,路径命名 | 系统服务通信 |
消息队列 | 操作系统维护消息缓冲区 | 多任务控制中心 |
信号量(Semaphore) | 同步或互斥控制 | 控制访问共享资源 |
共享内存 | 内存共享,最快,但需同步手段 | 视频共享、数据库缓存 |
套接字(Socket) | 网络/本地通信通用,最灵活 | 客户端-服务端模型 |
信号(Signal) | 异步事件通知 | kill、闹钟 |
七、进程与线程的世纪应用
场景 | 使用方式 |
---|---|
Web服务器 | 多线程响应请求 |
浏览器 | 每个标签页一个进程 |
视频播放器 | 解码线程 + 播放线程 + 渲染线程 |
操作系统自身 | 守护进程(Process) + 内核线程(Thread) |
数据库系统 | 线程池处理查询请求 |
八、线程/进程可能遇到的问题
1.竞态条件(Race Condition)
- 多线程同时访问数据,未加锁导致数据混乱
2.死锁(Deadlock)
- 线程 等线程 的资源, 又等 ,互相卡死
3.活锁/饥饿
- 一直被抢占或让出,永远得不到执行机会
4.创建过多线程
- 比如每个连接都开线程,系统资源耗尽