进程间通信 (IPC - Inter-Process Communication):
痛点:进程拥有独立的虚拟内存地址空间。一个进程无法直接访问另一个进程的内存数据。
核心目标:突破隔离壁垒,在不同的地址空间之间交换数据。
本质:通信需要经过操作系统内核的协助,或者通过一块双方都能访问的共享区域。
由于进程间内存隔离,通信必须通过操作系统内核或共享区域中介。主要方式有:
管道:一种单向的、先进先出的通信通道。它就像一根水管,数据像水一样从一端流入,从另一端流出。分为只能在有亲缘关系进程间使用的匿名管道和允许无亲缘关系进程通信的命名管道。简单,但效率较低且容量有限。
消息队列:内核维护的一个消息链表。进程可以向队列中写入特定格式和优先级的数据块,其他进程可以按类型读取。它克服了管道字节流模型的缺点,实现了消息的格式化,生命周期也与进程无关。
共享内存:这是最快的IPC方式。它映射同一块物理内存到多个进程的虚拟地址空间,使得多个进程可以直接读写该内存,数据无需在内核和用户空间之间来回拷贝。但正因其高效,也带来了复杂的同步问题,必须结合信号量或互斥锁等机制来保护共享数据。
信号量:它本质上是一个计数器,主要用于进程间同步,而不是直接传递数据。通过P(等待)、V(发送)操作来控制多个进程对共享资源的访问,防止它们同时进入临界区。
信号:一种异步通信机制。用于通知接收进程某个事件已经发生(如强制终止进程的SIGKILL信号)。它携带的信息量极少,通常只用于简单的控制,不用于复杂数据交换。
套接字:功能最强大的通信机制,不仅可用于不同主机上的进程通信,也可用于同一主机的进程间通信。它提供了网络协议的抽象,虽然设置稍复杂,但通用性最强。
线程间通信 (ITC - Inter-Thread Communication):
痛点:同一进程下的所有线程共享进程的内存地址空间(堆、全局变量)。线程A可以轻易地修改线程B也能访问的变量。
核心目标:安全、有序地访问共享资源,防止出现数据竞争(Data Race)等问题,保证数据的一致性。
本质:通信通过操作共享内存来实现,关键在于使用同步机制来管理访问顺序。
线程间通信的本质是安全地操作共享内存,因此核心是同步机制。
全局变量和共享内存:这是通信的基础。线程可以直接读写进程的全局变量或堆内存来传递数据。
互斥锁:最基础的同步原语。它保证了互斥访问,即同一时刻只有一个线程能进入临界区(访问共享资源的代码段),其他线程必须等待,直到锁被释放。这解决了“写”冲突。
条件变量:它允许线程在某个条件不满足时主动阻塞并释放已持有的互斥锁。当其他线程改变了条件时,再通知唤醒等待的线程。它常与互斥锁配合使用,用于线程间的等待和通知机制,避免了“忙等待”,提高了效率。
读写锁:一种改进的锁,允许多个线程同时读共享数据,但只允许一个线程写。适用于“读多写少”的场景,提高了并发性能。
信号量:与进程间的信号量类似,用于控制访问共享资源的线程数量。
评论区