进程与线程通信复习
进程与线程通信复习
介绍 线程通信 和 进程通信。各自具体方式、区别、共同点
by deepseek v4:
线程通信和进程通信的核心区别在于:进程拥有独立的资源空间,而线程共享所属进程的资源。这导致两者的通信方式、复杂度和风险有很大不同。
一、线程通信
线程共享进程的堆、全局变量和静态变量,但拥有独立的栈和寄存器状态。因此,它们通信天然方便,但也容易产生冲突。
具体方式:
- 锁(互斥量)
- 本质:不是传递数据,而是控制访问顺序。通过锁定共享资源,确保同一时间只有一个线程操作它。
- 应用:保护共享变量、队列等。
- 信号量
- 本质:一个非负整数计数器。P操作(等待)减1,V操作(释放)加1。当计数为0时,P操作阻塞。
- 应用:控制同时访问某资源的线程数量(如数据库连接池)。
- 条件变量
- 本质:与互斥量配合。允许线程在某个条件不满足时(如队列为空)进入等待状态,直到其他线程改变条件并发送信号唤醒它。
- 应用:典型的生产者-消费者模式。
- 事件
- 本质:一个布尔标志。一个线程设置事件,另一个线程等待该事件发生。
- 应用:线程间的简单信号通知。
- 局部变量 / 参数传递
- 本质:创建线程时直接通过函数参数传递值,但因栈独立,传递的是“值拷贝”,并非真正共享。
特点:简单、高速(无内核介入,除竞争外),但需小心处理竞态条件和死锁。
二、进程通信
进程拥有独立的地址空间,一个进程无法直接访问另一个进程的内存。因此,需要操作系统提供的特殊机制。
具体方式:
- 共享内存
- 本质:将同一块物理内存映射到多个进程的地址空间中。这是最快的IPC方式,因数据拷贝最少。
- 问题:本身无同步机制,必须配合信号量或互斥锁使用。
- 管道(Pipe)
- 本质:内核中的缓冲区,以“流”形式传输数据。匿名管道用于父子进程;命名管道(FIFO) 可在任意进程间使用,文件系统中有路径名。
- 应用:
ls | grep txt中的|。
- 消息队列
- 本质:内核中的链表结构,消息有类型和优先级。进程可以读写指定类型的消息。
- 特点:比管道灵活,可随机读取特定消息,消息有边界。
- 信号(Signal)
- 本质:软件中断。用于通知进程发生了某种异步事件(如
SIGTERM终止、SIGINT中断)。 - 特点:信息量极少(仅信号编号),开销小,常用于异常处理或进程控制。
- 本质:软件中断。用于通知进程发生了某种异步事件(如
- 套接字(Socket)
- 本质:网络编程接口。既可跨主机通信,也可用于本机进程通信(Unix域套接字更高效)。
- 应用:浏览器与Web服务器,本机
mysql客户端与服务器。
- 文件
- 本质:进程通过对同一文件的读写交换信息。非常原始且低效,但简单。
特点:较复杂、开销大(通常需要内核介入拷贝数据),但安全性高(地址空间隔离)。
三、区别总结
| 维度 | 线程通信 | 进程通信 |
|---|---|---|
| 地址空间 | 共享进程的地址空间 | 各自独立,互不可见 |
| 速度与开销 | 快速,不涉及内核拷贝(锁除外) | 较慢,常需内核缓冲区拷贝数据 |
| 数据传递 | 主要靠共享变量,几乎无额外复制 | 显式发送/接收,存在数据复制 |
| 同步必要性 | 天然需要,因为共享资源极易冲突 | 选择性需要(如共享内存必须同步,管道/消息队列本身有同步) |
| 实现难度 | 容易出死锁、竞态,但代码灵活 | 接口更规范,但代码量一般较大 |
| 可靠性 | 一个线程崩溃常导致整个进程崩溃 | 一个进程崩溃不影响其他进程(共享内存损坏除外) |
四、共同点
- 目的相同:都是实现并发实体间的数据交换与协作。
- 都需要同步(有时):
- 线程通信几乎总是需要锁或条件变量。
- 进程通信如果使用共享内存,也必须加同步机制(如信号量)。
- 都面临竞争风险:当两个实体同时操作共享资源时,都会产生竞态条件。
- 都有阻塞/非阻塞模式:读写管道、消息队列、套接字时,都可选择阻塞等待数据或立即返回。
- 存在重叠的机制:
信号量既是线程同步工具,也是进程同步工具(POSIX命名信号量);
共享内存也可用于线程(但没必要)。
一句话记忆:
线程通信靠共享变量 + 锁保护;进程通信靠OS提供的管道、消息、共享内存等,成本更高但更安全。
链接到当前文件 0
没有文件链接到当前文件