字数
1097 字
阅读时间
5 分钟
概念
在操作系统层面,进程和线程是两个核心且紧密相关的概念。
进程 (Process):是操作系统进行资源分配和调度的基本单位。可以看作是一个正在运行的程序的实例。它拥有自己独立的内存空间、文件句柄、设备等系统资源。
线程 (Thread):是CPU 调度和执行的基本单位。它被包含在进程之中,是进程中的实际运行单位。一个进程可以包含一个或多个线程。
简单来说:进程是资源容器,线程是执行实体。
在单线程的进程中,进程和线程的概念几乎重合。但在多线程进程中,多个线程共享同一个进程的资源,但各自有独立的执行栈和程序计数器。
进程的组成
一个进程通常由以下几个部分组成:
- 文本区域 (Text Region):存储处理器要执行的机器代码。
- 数据区域 (Data Region):存储全局变量和静态变量。
- 堆 (Heap):用于存储进程在运行时动态分配的内存。
- 栈 (Stack):存储函数调用时的指令、局部变量和上下文。
由于创建和销毁进程涉及到独立的内存空间和大量系统资源的分配与回收,因此这是一个相对“昂贵”的操作。
进程的三种基本状态
- 就绪态 (Ready):进程已准备好运行,正在等待操作系统分配 CPU 时间。
- 运行态 (Running):进程正在占用 CPU 并执行其代码。
- 阻塞态 (Blocked/Waiting):进程因等待某个事件(如 I/O 操作完成、等待锁)而暂停执行。
并发与并行
- 并发 (Concurrency):在单核 CPU 上,通过快速地在多个进程/线程之间切换(时间片轮转),使得宏观上看起来像是多个任务在“同时”执行。实际上在任何一个微小的时间点,只有一个任务在运行。
- 并行 (Parallelism):在多核 CPU 上,多个进程/线程可以真正在物理上同时运行在不同的核心上。
进程与线程的对比
| 特性 | 进程 (Process) | 线程 (Thread) |
|---|---|---|
| 角色 | 资源分配的基本单位 | CPU 调度的基本单位 |
| 资源开销 | 大(拥有独立地址空间和资源) | 小(共享进程资源) |
| 切换开销 | 大(需要切换页表和内核栈) | 小(只需切换少量寄存器和执行栈) |
| 内存空间 | 独立,不共享 | 共享所属进程的内存空间 |
| 通信 | 复杂,需使用 IPC (管道、消息队列、共享内存等) | 简单,可直接读写共享变量 |
| 健壮性 | 高,一个进程崩溃不影响其他进程 | 低,一个线程崩溃会导致整个进程崩溃 |
| 关系 | 进程可以包含多个线程 | 线程必须属于一个进程 |
通信问题
- 进程间通信 (IPC, Inter-Process Communication):由于进程的内存空间是相互隔离的,一个进程不能直接访问另一个进程的内存。因此,内核提供了一系列机制来实现进程间的数据交换,如管道、消息队列、共享内存、信号量和套接字等。
- 线程间通信:同一进程下的多个线程共享相同的内存空间(如全局变量、堆内存),因此它们可以通过直接读写共享变量来进行通信。但也正因如此,必须使用锁、信号量等同步机制来避免数据竞争和保证线程安全。