1. 核心概念
- 并发 (Concurrency):同一时间段内交替推进多任务,关注“能同时应对很多事”
- 并行 (Parallelism):同一时刻在不同硬件资源上同时执行,关注“真的同时做很多事”
- 进程/线程/协程:
- 进程:资源隔离与地址空间单位,由内核调度
- 线程:CPU 调度的基本单位,共享进程资源,由内核调度
- 协程:用户态的轻量并发实体,由语言/库运行时调度,通常复用少量线程(M:N)
进程间通信是操作系统提供的一种机制,用于不同的,相互资源隔离的进程之间交换信息。
进程间通信方式汇总如下:
| IPC方式 | 优点 | 缺点 | 典型用途 |
|---|---|---|---|
| 匿名管道 | - 实现简单 - 父子进程间快速通信 |
- 仅限亲缘进程 - 半双工通信 - 不支持随机访问 |
父子进程之间的数据传输 |
| 命名管道 (FIFO) | - 可用于无亲缘关系进程 - 文件系统中可见 |
- 半双工通信 - 性能一般 - 编程略复杂 |
多进程之间的简单通信 |
| 消息队列 | - 支持结构化消息 - 异步通信 - 可设置优先级 |
- 消息大小有限 - 内核态拷贝影响性能 - 编程复杂度中等 |
多进程异步消息传递 |
| 共享内存 | - 最快速的通信方式 - 支持大数据量传输 |
- 需额外同步机制(如信号量) - 编程复杂 - 易出错 |
高性能数据交换 图像/视频处理 |
| 信号量 | - 控制资源访问 - 支持进程同步与互斥 |
- 不传输数据 - 易死锁 - 编程复杂 |
临界区保护 生产者-消费者模型 |
| 信号 | - 异步事件通知 - 系统支持广泛 |
- 信息量少(仅编号) - 信号处理函数复杂 |
中断处理 定时器通知 |
| 套接字(Socket) | - 支持本地与网络通信 - 双向通信 - 灵活强大 |
- 编程复杂 - 性能略低于共享内存(协议栈开销) |
客户端-服务器模型 跨主机通信 |
| UNIX域套接字 | - 本地进程通信 - 支持双向传输 - 性能优于网络套接字 |
- 仅限本机使用 - 编程仍需处理协议细节 |
本地服务组件之间的通信 |
共享内存(Shared Memory)是一种高效的进程间通信(IPC)方式,简单来说,它直接操作的是内存,但它的初始化和持久化选项可以(并非必须)与文件关联
下面用一个表格帮你快速梳理两种主要共享内存方式的核心区别:
| 特性 | 文件支持的共享内存 (mmap with file) |
匿名共享内存 (mmap with MAP_ANONYMOUS) |
|---|---|---|
| 底层关联 | 磁盘上的一个具体文件 | 无文件关联,纯内存操作 |
| 映射方式 | 通过 mmap将文件映射到进程地址空间 |
通过 mmap设置 MAP_ANONYMOUS标志创建 |
| 数据持久化 | 可选择将修改同步至磁盘文件 (MS_SYNC) 或由内核决定稍后写入 (MS_ASYNC) | 进程退出后数据消失,仅用于进程间通信 |
| 典型应用 | 进程间大量数据共享、需持久化的数据交换 | 父子进程或有亲缘关系进程间的高速、临时数据共享 |
| 优点 | 数据可持久化;非亲缘进程也能共享 | 无需文件操作,极速;避免磁盘I/O瓶颈 |
| 缺点 | 仍需文件系统操作(创建/打开文件) | 数据不能持久化;只能用于有亲缘关系的进程 |
我们常说,在操作系统中,进程是资源分配的基本单位,它代表一个程序独立的执行环境,这通常包含了进程的地址空间、系统资源和执行上下文。而线程,它是进程内的执行单元,是操作系统调度的最小单位。线程通常共享所属进程的资源,但它也拥有一些独立的资源。当然,这里的线程主要指内核线程,用户态线程(如协程)并不被操作系统感知,但核心概念类似。另外,线程依赖于进程,不能独立存在。线程共享进程的大部分资源,但有自己的执行上下文。
简单理解,进程是操作系统为不同运行中的程序划分资源的一种手段,而线程是操作系统的基本调度单位,是并行编程中的核心设计。
按照进程和线程的资源是否可以进行共享的维度,可以作如下分类:
线程上下文切换是操作系统实现多任务并发的核心机制。它通过保存和恢复线程的运行状态,使得多个线程可以在单个CPU核心上“看起来像”同时运行。然而,这个过程会带来直接(CPU执行调度代码)和间接(CPU缓存失效)的性能开销。在高性能编程中,理解并设法减少不必要的上下文切换是一个非常重要的优化方向。
一直在谈论进程,线程,并发编程,异步编程的概念,一直没有从一个通俗的角度去理解过,结合自己这么多年的编程经验,回过头来重新思考一下,进程是什么,线程是什么,协程又是什么?
其实大家看很多书籍和资料,都会看到这样一个结论:进程是操作系统资源分配的最小单位,线程是操作系统调度的最小单位。嗯...,可能很多人看到这句话觉得自己理解了,但是不一定真正理解到这句话的精髓。
进程(process)这个单词在维基的释义如下:
In computing, a process is the instance of a computer program that is being executed by one or many threads.