进程间的通信方式比较多,首先需要理解下面这几个概念:
-
竞态条件:即两个或多个线程同时对一共享数据进行修改,从而影响程序运行的正确性时,这种就被称为
竞态条件(race condition)
。 -
临界区:不仅
共享资源
会造成竞态条件,事实上共享文件、共享内存也会造成竞态条件、那么该如何避免呢?或许一句话可以概括说明:禁止一个或多个进程在同一时刻对共享资源(包括共享内存、共享文件等)进行读写。换句话说,我们需要一种互斥(mutual exclusion)
条件,这也就是说,如果一个进程在某种方式下使用共享变量和文件的话,除该进程之外的其他进程就禁止做这种事(访问统一资源)。一个好的解决方案,应该包含下面四种条件
- 任何时候两个进程不能同时处于临界区
- 不应对 CPU 的速度和数量做任何假设
- 位于临界区外的进程不得阻塞其他进程
- 不能使任何进程无限等待进入临界区
-
忙等互斥:当一个进程在对资源进行修改时,其他进程必须进行等待,进程之间要具有互斥性,我们讨论的解决方案其实都是基于忙等互斥提出的。
进程通信(IPC,InterProcess Communication)
进程之间通讯(Inter-Process Communication, IPC)是一个进程(一个运行中的程序的实例)与另一个进程共享数据和信息的机制。操作系统提供了多种IPC机制,以适应不同场景下的需求。以下是一些常见的IPC技术:
-
管道(Pipes):
- 有名管道(Named Pipes)和无名管道(Unnamed Pipes)。
- 无名管道通常用于父子进程或兄弟进程之间的通信。
- 有名管道则可以在任意两个进程间进行通信。
-
消息队列(Message Queues):
- 允许一个或多个进程向消息队列中写入或读取消息。
- 提供了一种异步通信机制,进程可以通信而无需实时接收数据。
-
信号(Signals):
- 一种用于进程间通信的简单方式,一个进程可以发送信号给另一进程。
- 信号可用于告知进程发生了哪些系统级事件。
-
共享内存(Shared Memory):
- 允许两个或多个进程共享一个给定的存储区。
- 是最快的IPC形式,因为数据不需要在客户进程和服务进程间复制。
-
信号量(Semaphores):
- 主要用于两个目的:一是多个程序可以访问同一资源的同步;二是两个或多个进程间的通信。
-
套接字(Sockets):
- 用于不同机器上的进程间通信。
- 支持基于流和基于数据报的通信。
- 可用于网络之间的通信,也可用于同一机器上的进程间通信。
-
文件映射(Memory-mapped files):
- 允许进程创建一个文件的内存映射部分。这部分内存可以被不同的进程共享,从而作为通信的手段,同时文件内容也会持久化。