操作系统中的共享内存与消息传递

2025年7月3日 | 6分钟阅读

在本文中,您将了解共享内存和消息传递之间的区别。但在讨论区别之前,您必须了解共享内存消息传递

什么是共享内存?

进程间通信的基本模型是共享内存系统。在共享内存系统中,协作进程通过在地址空间区域中建立共享内存区域来相互通信。

如果进程希望发起通信并有数据要共享,它会在其地址空间中创建一个共享内存区域。之后,如果另一个进程希望通信并尝试读取共享数据,它必须附加到起始进程的共享地址空间。

共享内存的应用:-

  1. 高性能计算 (HPC):在高性能计算环境中需要访问大量数据时,共享内存是必需的,主要用于模拟和建模类应用程序。
  2. 嵌入式实时系统:共享内存促进了传感器与控制系统之间的数据快速交换,并在汽车和航空工业中得到了应用。
  3. 多媒体处理:共享视频编辑或支持相关功能的应用程序,由于进程间通信的效率,可以缩短处理时间。
  4. 数据库系统:共享内存促进了事务处理并发性的提高,这源于数据库管理系统中对数据的快速访问。
  5. 操作系统:现代操作系统在其进程间通信中使用共享内存。

共享内存模型的优点

  • 通信速度快:正如所见,所有进程都可以直接访问内存,因此通信速率很快。
  • 高效的大数据传输:数据结构可以一次性以大块的形式从一个进程传递到另一个进程,而无需将其复制到每个进程的内存空间。
  • 内核参与度低:这是因为在建立共享内存空间后,内核不必不断地在进程之间传输数据,而这最终是昂贵的。

共享内存模型的缺点

  • 同步复杂:进程必须处理信号量或互斥锁等同步工具和机制,以防止竞态条件。
  • 安全风险:共享内存存在缺点,因为在此位置运行的进程容易受到安全威胁,因为可以访问数据的任何人都可以访问它。
  • 仅限于单台机器:在分布式系统中,它只能用于同一台机器内的进程。

什么是消息传递?

在这种消息传递进程模型中,进程通过交换消息与其他进程通信。为此需要一个通信链接,并且它必须提供至少两个操作:transmit (message)receive (message)。消息大小可以是灵活的或固定的。

消息传递的应用:-

  1. 分布式系统:它广泛应用于云计算和微服务。这些进程块利用消息传递进行并行处理,并具有节点之间通信开销小的优点。
  2. 网络应用:消息传递是实时游戏和聊天应用程序的关键应用。消息传递保证了用户会话的隔离并提高了可扩展性。
  3. Android/ROS:ROS 在多个机器人代理之间使用消息传递,从而更容易构建复杂的应用程序。
  4. 容错系统:消息传递用于隔离进程,也使得应用程序具有容错性,例如航空航天和医疗应用。

消息传递模型的优点

  • 简单性:消息传递模型隐藏了内存管理,这使得实际的进程通信更加直接。
  • 无需同步:对于进程而言,无需通信内存,因为它们无法访问它,因此没有同步问题。
  • 对分布式系统友好:由于支持不同机器上的进程之间的通信,因此该模型被用于分布式系统。

消息传递模型的缺点

  • 通信速度慢:消息传递的使用涉及数据在进程之间传输过程中进行数据复制,这会增加通信延迟,尤其是在处理大量数据集时。
  • 内核参与度高:由于交互发生在内核中,因此开销很高,因为每发送或接收一条消息都需要进行交互。
  • 资源消耗更高:消息传输可能比直接访问内存更昂贵,尤其是当数据量很大时。

在共享内存系统上模拟消息传递(MP → SM)

  • 共享内存系统可以被配置为充当消息传递系统。共享地址空间可以划分为不相交的部分;每个部分分配给一个处理器。
  • 通过向目标/发送方处理器的地址空间写入和从其地址空间读取来实现发送和接收操作。读写操作是同步的。
  • 具体来说,可以为每对有序进程保留一个单独的位置作为邮箱。

在消息传递系统上模拟共享内存(SM → MP)

  • 这也通过读写操作来实现。每个共享位置都可以建模为一个单独的进程。写入共享位置的操作通过向相应的所有者进程发送更新消息来模拟,而读取共享位置的操作通过向所有者进程发送查询消息来模拟。
  • 这种模拟成本很高,因为进程必须能够访问其他进程的内存位置。即使在使用共享内存模拟时,读写操作的延迟也可能很高,因为读写操作是通过网络范围的通信来实现的。

共享内存与消息传递之间的主要区别

Difference between Shared Memory and Message Passing in Operating System

在这里,您将了解共享内存和消息传递之间的各种主要区别。共享内存和消息传递之间的各种区别如下:

  1. 共享内存用于单处理器和多处理器系统之间的通信。通信进程位于同一台机器上,共享相同的地址空间。另一方面,消息传递最常用于分布式环境中,当通信进程分布在由网络连接的多个设备上时。
  2. 共享内存提供最大计算速度,因为通信是通过共享内存完成的,因此只需要系统调用来建立共享内存。另一方面,消息传递需要时间,因为它通过内核(系统调用)进行。
  3. 共享内存区域主要用于数据通信。另一方面,消息传递主要用于通信。
  4. 确保共享内存中的进程不会同时写入同一地址。另一方面,消息传递对于共享少量数据而不会引起冲突很有用。
  5. 开发人员应显式编写从共享内存读取和写入数据的代码。另一方面,在这种情况下不需要这样的代码,因为消息传递功能提供了通信和通信进程执行的活动同步的方法。

共享内存与消息传递的逐项比较

在这里,您将了解共享内存和消息传递之间的逐项比较。共享内存和消息传递之间的主要区别如下:

共享内存消息传递
它主要用于数据通信。它主要用于通信。
它提供最大计算速度,因为通信是通过共享内存完成的,因此只需要系统调用来建立共享内存。它需要大量时间,因为它通过内核(系统调用)进行。
开发人员应显式编写从共享内存读取和写入数据的代码。在这种情况下不需要这样的代码,因为消息传递功能提供了通信和通信进程执行的活动同步的方法。
它用于单处理器和多处理器系统之间的通信,其中要通信的进程位于同一台机器上并共享相同的地址空间。它最常用于分布式环境中,当通信进程分布在由网络连接的多个设备上时。
它比消息传递更快。通信策略。它比共享内存慢。通信策略。
确保共享内存中的进程不会同时写入同一地址。它对于共享少量数据而不会引起冲突很有用。

常见问题解答:-

在共享内存系统中,缓存一致性如何成为一个挑战,以及如何处理?

在共享内存系统中,多个进程或线程可能同时访问和修改相同的内存位置。这会导致 CPU 缓存不一致,称为缓存一致性问题。为了解决这个问题,硬件协议,如MESI(修改、独占、共享、无效)MOESI,用于确保所有缓存都反映内存的一致视图。相比之下,消息传递系统由于没有共享内存,因此本质上避免了这个问题。

在哪些场景下,消息传递在分布式系统中优于共享内存?

在进程运行在没有共享物理内存的独立物理机器上的分布式系统中,消息传递优于共享内存。它提供了更好的容错性可扩展性和模块化。例如,在微服务架构中,消息队列(如 RabbitMQ 或 Kafka)可以有效地处理服务之间的通信,而共享内存在这种情况下不可行。