进程间的通信

一、什么是进程间的通信

操作系统进程间通信(Inter-Process Communication,简称IPC)是指不同进程之间进行数据交换和通信的机制。在操作系统中,每个进程都是独立运行的,并拥有自己的内存空间和资源。为了实现进程之间的协作和数据共享,需要使用IPC机制。

并发进程之间的交互必须满足两个条件:同步和通信,进程同步本质上是一种仅传送信号量的进程通信,通过修改信号量,让进程之间建立联系,相互协调完成工作。但是它缺乏发送数据的能力。在多任务的系统中,可由多个进程分工协同完成任务,就需要进程间大量的传输数据和共享数据。因此需要进程通信机制来完成。进程间的通信方式有多种,低级通信机制:原子操作、锁机制、信号量和PV操作及管程,高级通信机制:消息传递、共享内存和管道机制。

二、管道通信机制(共享文件机制)

管道通信机制(Pipe)是一种进程间通信的方式,用于在进程之间传递数据。在类Unix操作系统中,管道通常是通过创建一个连接两个进程的单向通道来实现的。它是一个连接读写进程的特殊文件,允许以FIFO的方式传送数据,进程发出方以字符流的形式把大量的数据写入管道,进程接收方从管道的另一端读取文件,这种通道可以用于在一个进程中写入数据并在另一个进程中读取数据。管道可以分为匿名管道和命名管道。

1、匿名管道

匿名管道是在创建进程时自动创建的一种通信通道。它只能在具有亲缘关系(父子进程)的进程之间使用,例如父进程和子进程。匿名管道是单向的,具有固定的读端和写端。

(1)匿名管道的特点:

  • 只能在具有亲缘关系的进程之间使用,无法在无关进程之间进行通信。
  • 是半双工的,即数据只能在一个方向上流动。
  • 数据在管道中是先进先出的顺序。

2、命名管道


命名管道是一种具有持久性的管道,可以在不相关的进程之间进行通信。命名管道通过在文件系统中创建一个命名的FIFO(First-In-First-Out)文件来实现。

(1)命名管道的特点:

  • 可以在不相关的进程之间进行通信,无需具有亲缘关系。
  • 可以实现全双工通信,即数据可以在两个方向上同时流动。
  • 数据在管道中是先进先出的顺序。

3、管道通信机制的优缺点

(1)优点

  • 简单易用:管道通信机制相对简单,易于实现和使用,创建和使用管道通常不需要复杂的设置和配置。
  • 轻量级:管道是轻量级的通信机制,不会占用过多的系统资源。这使得它在一些轻量级通信需求的场景下非常适用。
  • 适用于亲缘关系进程:匿名管道适用于具有亲缘关系的进程之间的通信。
  • 无需显式同步:管道通信自带同步机制,无需额外的同步措施。
  • 高效性:在某些情况下,管道通信的性能比其他IPC机制更高效。

(2)缺点

  • 限制进程关系:匿名管道只能在具有亲缘关系的进程之间使用,无法在不相关的进程之间进行通信。
  • 单向通信:匿名管道是单向的,数据只能在一个方向上流动,无法实现双向通信。
  • 容量有限:管道的容量有限,当管道已满时,写入进程可能会被阻塞或数据可能会丢失。
  • 不支持网络通信:管道通信机制仅适用于本地机器上的进程通信,无法实现跨网络的通信。

三、共享内存通信机制

共享内存通信机制是一种高效的进程间通信方式,多个进程共同拥有一块内存区,允许多个进程共享同一块内存区域,从而实现数据的快速交换和共享。

在共享内存通信机制中,操作系统提供了一块特定的内存区域,多个进程可以将这块内存区域映射到各自的地址空间中,并直接读写其中的数据。这样,进程之间可以通过读写共享内存中的数据来进行通信。

1、共享内存通信机制的实现下步骤:

(1)创建共享内存区域

操作系统提供了一些系统调用或API,用于创建共享内存区域。进程可以通过这些调用来请求一块共享内存区域,并获取一个唯一的标识符。

(2)映射共享内存

进程通过将共享内存区域映射到自己的地址空间中,使得进程可以直接访问共享内存中的数据。

(3)读写共享内存

进程可以通过读写共享内存中的数据来进行通信。由于多个进程可以同时访问共享内存,因此需要使用同步机制(如信号量、互斥锁等)来保证数据的一致性和避免竞态条件。

(4)销毁共享内存

当进程不再需要使用共享内存时,需要显式地释放共享内存资源,以防止资源泄漏。操作系统提供了相应的系统调用或API,用于销毁共享内存区域。

(5)说明

需要注意的是,共享内存通信机制需要进程之间约定好共享内存的结构和数据格式,以确保数据的正确性和一致性。此外,由于共享内存是直接访问内存,因此需要谨慎处理并发访问和同步问题,以避免数据损坏和竞争条件的发生。

共享内存通信机制在某些场景下可以显著提高进程间通信的效率,但也需要开发者具备一定的操作系统和并发编程的知识来正确使用和管理共享内存。

四、消息传递通信机制

消息传递的复杂在于地址空间隔离,发送进程无法直接将消息直接发送到接收方的地址空间中,这项工作仅有操作系统能完成。消息传递通信机制是一种通过消息进行进程间通信的方式。在这种通信机制中,进程之间通过发送和接收消息来交换信息和进行协作。即发送方向一个给定的目标进程发送消息,接收方从给定的目标进程读取消息。

1、同步通信

发送者发送消息到目标进程后会等待接收者的响应,直到接收到响应后才继续执行,如果一直没有响应,则发送方会一直阻塞,停止发送消息,直到接收方返回响应,才能将发送方唤醒,继续发送消息。接收方这种通信方式用于需要等待结果的情况,发送者和接收者之间存在同步关系。

(1)优点

  • 简单易理解:同步通信机制相对于异步通信机制来说,更加直观和易于理解。发送方发送消息后会等待接收方的响应,这种同步关系更符合人类思维的直觉,易于编写和维护代码。
  • 顺序性和可控性:同步通信能够保证消息的顺序性和可控性。发送方发送消息后会等待接收方的响应,这样可以确保消息按照预期的顺序进行处理。同步通信更容易实现对消息的控制和管理。
  • 错误处理和异常处理:同步通信机制更容易进行错误处理和异常处理。发送方在等待接收方的响应时,可以检测超时或异常情况,并采取相应的措施进行错误处理。这样可以更好地控制和处理通信中的异常情况。
  • 同步性和一致性:同步通信能够保证发送方和接收方之间的同步性和一致性。发送方等待接收方的响应,确保了发送方和接收方在通信过程中的状态是一致的。这对于某些需要确保数据一致性和同步的场景非常重要。
  • 可靠性:同步通信机制相对于异步通信机制来说,更容易实现可靠性。发送方等待接收方的响应,可以确保消息的传递和处理是可靠的。这对于某些对数据准确性和可靠性要求较高的场景非常重要

(2)缺点

  • 阻塞:在同步通信中,发送者发送消息后会等待接收者的响应。这意味着发送者在等待期间会被阻塞,无法进行其他的操作。如果接收者响应时间过长或出现故障,发送者可能会一直等待,导致程序的执行效率降低。
  • 容易导致死锁:同步通信中,如果发送者和接收者之间的同步关系不正确处理,可能会导致死锁的发生。当多个进程相互等待对方的响应时,可能会出现死锁情况,导致程序无法继续执行。
  • 性能问题:同步通信需要发送者等待接收者的响应,这会增加通信的延迟。特别是在网络通信中,网络延迟可能会导致同步通信的性能下降。

2、异步通信

为了实现异步通信,必须采用间接通信方式,进程之间发送和接收消息通过一个共享数据结构--信箱进行,消息可以被理解为信件,每个信箱都有唯一的标识符,当两个以上的进程共享信箱时,他们就可以通信。一个进程可以和多个进程共享信箱,因此,一个进程可以和多个进程之间进行通信。当一个进程为其他进程提供服务的时候,这时的信箱又称作端口,端口通常划分为接收进程所有并由接收进程创建,服务被撤销,端口也随之销毁。

(1)信箱

信箱是用来存放消息的的存储区域,每个信箱可分为信箱头和信箱体,信箱头指出信箱容量、消息格式、存放消息的位置指针等。信箱体用来存放消息,信箱体分为若干区,每个区可容纳一条消息。

  • 存储消息:信箱用于存储消息,可以是一个队列、缓冲区或其他数据结构。发送方将消息放入信箱中,而接收方从信箱中获取消息。
  • 同步机制:信箱通常提供了同步机制,确保发送方和接收方在操作信箱时的同步和一致性。例如,发送方可能会等待接收方从信箱中获取消息后才能继续执行。
  • 缓冲区:信箱可以作为一个缓冲区,允许发送方在接收方准备好之前将消息存储在其中。这样,发送方不必等待接收方的即时响应。
  • 容量限制:信箱可能有容量限制,即只能存储特定数量的消息。如果信箱已满,发送方可能需要等待,直到有足够的空间来存储新的消息。

(2)异步通信优点

  • 提高并发性:异步通信允许发送方在发送消息后继续执行其他操作,而无需等待接收方的响应。这样可以提高系统的并发性,允许同时处理多个任务或请求,提高系统的吞吐量和性能。
  • 增强响应性:由于发送方不需要等待接收方的响应,异步通信可以提供更快的响应时间。发送方可以立即继续执行后续操作,而无需等待接收方的处理结果。这对于实时性要求较高的应用场景非常重要。
  • 减少资源占用:由于发送方不需要等待接收方的响应,异步通信可以减少资源的占用。发送方可以立即释放所占用的资源,而无需等待接收方的处理结果。这对于资源有限或需要高效利用资源的系统非常重要。
  • 避免阻塞和死锁:异步通信可以避免阻塞和死锁的发生。发送方不需要等待接收方的响应,因此不会因为等待而阻塞,也不会出现由于相互等待对方的情况而导致的死锁。

(3)异步通信的缺点

  • 复杂性增加:相对于同步通信来说,异步通信的设计和实现更加复杂。需要处理回调函数、事件驱动等异步编程模型,增加了代码的复杂性和理解难度。
  • 错误处理困难:异步通信中,发送方无法立即获得接收方的处理结果。如果在消息传递过程中发生错误,发送方可能无法及时获知,从而导致错误处理困难。需要额外的机制来处理错误和异常情况。
  • 可能引发竞态条件:由于异步通信的特性,多个消息可能会并发地传递和处理。这可能导致竞态条件的发生,即多个消息之间相互竞争共享资源,可能导致数据不一致或错误的结果。
  • 可能导致资源泄漏:在异步通信中,发送方在发送消息后不需要等待接收方的响应,这可能导致发送方无法准确地判断何时释放资源。如果没有正确处理资源的释放,可能会导致资源泄漏问题。