一、何为进程和线程
进程
- 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位。
- 是操作系统结构的基础。
- 进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程
- 线程是操作系统最小的运算调度单位。
- 线程包含在进程中,是进程中实际执行任务的单位。
- 在一些操作系统中,线程也被称为轻量级进程
二、两者的区别
单位区别
- 线程是进程的一部分,是进程内的实际执行单位,而进程则是操作系统分配资源的基本单位。
资源区别
- 每个进程都有独立的地址空间和系统资源,而线程共享同一进程的地址空间和系统资源。
切换区别
- 线程之间的切换比进程之间的切换更快,因为线程共享相同的上下文和资源。
通信区别
- 线程间通信更加方便,可以直接读写共享内存,而进程间通信需要通过特定的机制(如管道、消息队列等)。
开销区别
- 进程的创建和销毁比线程的开销更大。
独立区别
- 进程是相对独立的,一个进程的崩溃不会影响其他进程,而线程是相互依赖的,一个线程的崩溃会导致整个进程的崩溃。
三、内存分配过程
进程分配内存过程
进程作为资源分配的基本单位,其内存分配通过虚拟内存管理实现。
1. 虚拟地址空间创建
进程创建时,操作系统分配独立的虚拟地址空间(通常32位系统为4GB,64位更大),包含代码段、数据段、堆和栈等逻辑分区。
虚拟地址通过内存管理单元(MMU) 转换为物理地址,实现进程间的内存隔离与保护。
2. 物理内存分配与映射
分页机制:将虚拟地址按固定大小(如4KB)划分为页,物理内存划分为页框。操作系统维护页表记录虚拟页到物理页框的映射关系。
按需分配:当进程首次访问某虚拟页时触发缺页中断,内核从物理内存或磁盘(Swap空间)加载数据到空闲页框,并更新页表。
3. 动态内存扩展
堆内存管理:进程通过系统调用(如malloc)请求动态内存时,内核根据算法(如伙伴系统)从堆区分配连续或非连续内存块。
4. 内存回收与碎片处理
进程终止时,其占用的所有物理页框被标记为空闲;运行期间释放内存时,通过空闲链表或位图管理回收的内存块。
外部碎片通过内存紧缩或分页机制缓解,内部碎片由固定分页大小导致,需算法优化。
线程的内存分配过程
线程作为执行调度的基本单位,共享进程的虚拟地址空间,但拥有私有栈和线程本地存储。
1. 栈内存分配
私有栈:每个线程启动时分配独立的栈空间(默认1~10MB),存储局部变量、函数调用链及返回值。栈帧随方法调用动态压入/弹出,无需显式管理。
2. 堆内存共享与优化
共享堆:线程通过进程的堆区分配对象,需同步机制(如锁)避免竞态条件。
线程本地分配缓冲区(TLAB):在堆的Eden区为每个线程预分配小块内存(默认占Eden 1%),避免频繁全局锁竞争,提升分配效率。若TLAB不足,则退化为全局堆分配。
四、使用场景
进程
高隔离性、稳定性
1、需要独立的地址空间和系统资源:如果任务需要运行在独立的环境中,不同任务之间的数据隔离较为重要,那么可以选择使用进程。
2、需要更高的安全性和稳定性:如果一个任务的崩溃不应该影响其他任务的正常运行,使用进程可以保证更高的安全性和稳定性。
典型场景:
1、直播平台的多服务隔离
直播平台需同时运行视频推流服务、弹幕处理服务等。每个服务作为独立进程运行,避免一个服务崩溃导致整体瘫痪。
例如:
视频推流进程使用 FFmpeg 编码并通过 RTMP 协议传输;
弹幕进程通过 WebSocket 独立处理消息队列;
进程间通信(IPC)可通过共享内存或消息队列传递控制信号。
2、跨硬件单元的视频编解码
由于一个开发板有不同的硬件单元,比如 ARM、NPU、FPGA、DSP什么的。但是每个硬件单元都是需要分配独立进程的。
例如:
ARM 负责视频采集,DSP 负责 H.264 编解码;
ARM 与 DSP 分属不同进程,通过 Codec Engine 机制交互,确保硬件资源独占性。
隔离 CPU 与 DSP 的运算负载,避免内存竞争导致的帧丢失。
线程
资源共享、高并发、低延迟
1、共享数据和资源:如果任务之间需要共享数据和资源,并且数据同步和通信较为频繁,使用线程可以更方便地访问和操作共享资源。
2、轻量级任务:如果任务比较轻量级,且并行执行可以提高效率,使用线程可以进行更快速的切换和调度,减少开销。
3、实时性要求:如果任务对实时性要求较高,使用线程可以更快响应事件和处理任务。
典型场景
1、视频传输中的多任务并行
局域网视频传输系统需同时处理 Socket 数据接收、解码、显示。
例如:
接收线程:持续监听 Socket 端口,将数据存入缓冲区;
解码线程:从缓冲区取数据,调用 H.264 解码器生成 YUV 帧;
显示线程:将 YUV 转换为 RGB 并渲染到屏幕。
2、直播流的实时处理
直播中需同时处理视频采集、美颜滤镜、网络推流。
例如:
采集线程:基于 V4L2 驱动(海思MPP,Sensor——VO——VPSS)从摄像头获取原始帧;
处理线程:应用 OpenCV 进行人脸识别或滤镜渲染;
推流线程:通过 RTMP 协议发送至 CDN
两者混用
兼顾隔离性与效率
典型场景:
智能监控系统的行为分析
进程级:视频采集、存储服务作为独立进程,保障 24/7 稳定性;
线程级:在采集进程内启动多个线程,分别处理人脸检测、运动跟踪、告警生成。