操作系统中的进程间通信 (IPC)

⚡ 智能摘要

进程间通信 (IPC) 是一组操作系统机制,它允许进程和线程交换数据、协调活动和同步操作,无论它们是在一台计算机上运行,​​还是在通过网络连接的多台机器上运行。

  • 🔗 定义: IPC 允许并发进程交换数据和协调工作,因此一个程序可以同时处理多个用户请求。
  • 🛠️ 方法: 常用的方法包括管道、消息传递、消息队列、直接和间接通信、共享内存和先进先出 (FIFO)。
  • 🧠 两种模型: 共享内存是最快的方法,但需要同步;而消息传递更安全,并且可以在联网机器之间工作。
  • 🔔 关键术语: Semaphores 信号和控制资源访问,而信号则通知由数字标识的目标进程。
  • ⚙️ 为什么它的事项: IPC 支持模块化、计算加速、权限分离以及进程间便捷的数据共享。
  • 🤖 人工智能视角: 分布式人工智能系统依赖于服务之间的消息传递,而 Copilot 可以帮助生成管道、套接字和共享内存代码。

操作系统中的进程间通信 (IPC)

什么是进程间通信?

进程间通信 (IPC) 用于在一个或多个进程或程序中的多个线程之间交换数据。这些进程可以运行在单台计算机上,也可以运行在通过网络连接的多台计算机上。IPC 的全称是进程间通信(inter-process communication)。

它是一组编程接口,允许程序员协调操作系统中可以并发运行的各种程序进程之间的活动。这使得单个程序能够同时处理多个用户请求。

由于每个用户请求都可能导致操作系统中运行多个进程,这些进程可能需要相互通信。每种进程间通信(IPC)方法都有其自身的优势和局限性,因此单个程序使用多种IPC方法并不罕见。

进程间通信的方法

以下是一些重要的进程间通信方法:

进程间通信的方法

进程间通信方法

管道

管道广泛用于两个相关进程之间的通信。这是一种半双工方式,因此第一个进程与第二个进程通信。然而,要实现全双工通信,则需要另一条管道。

讯息传递

它是一种用于进程间通信和同步的机制。通过消息传递,进程之间无需共享变量即可相互通信。

IPC机制提供两种操作:

  • 发送(消息)——消息大小可以是固定的,也可以是可变的。
  • 接收(消息)

消息队列

消息队列是存储在 核心。它由消息队列标识符标识。此方法提供具有全双工能力的单个或多个进程之间的通信。

直接沟通

在这种进程间通信方式中,进程必须显式地相互命名。这种方法会在一对通信进程之间建立链接,并且每对进程之间只存在一个链接。

间接沟通

只有当进程共享同一个邮箱时,才能建立间接通信。每对进程可以共享多个通信链路,而单个链路可以与多个进程通信。链路可以是双向的,也可以是单向的。

共享内存

共享内存是指两个或多个进程共享的内存区域。必须通过同步使用该内存的进程来防止并发访问。

FIFO

先进先出(FIFO)用于两个不相关进程之间的通信。它是一种全双工方法,这意味着第一个进程可以与第二个进程通信,反之亦然。

为什么选择 IPC?

以下是使用进程间通信协议进行信息共享的原因:

  • 它有助于加快模块化进程。
  • 计算速度提升。
  • 特权分离。
  • 方便。
  • 它有助于进程和操作系统进行通信并同步其操作。

IPC 中使用的术语

以下是IPC中使用的几个重要术语:

Semaphores: 信号量是一种信号机制。这种操作系统方法根据其设置方式,允许或禁止访问某个资源。

Signals: 信号是一种通过信令在多个进程间进行通信的方法。源进程发送一个信号,该信号由一个数字识别,目标进程处理该信号。

阅读建议: 什么是 Semaphore? 二进制、计数类型示例

FIFOS 类似什么,FIFOS 又不同于什么

下表比较了同向先进先出法 (FIFO) 和非同向先进先出法 (FIFO):

类似FIFOS 与 FIFOS 不同
它遵循先进先出(FIFO)原则。 它采用一种方法,在特定的紧急消息到达前台之前将其提取出来。
先进先出 (FIFO) 独立于发送过程和接收过程。 始终处于就绪状态,无需打开或关闭。
允许在不相关的进程之间传输数据。 打开和关闭之间没有任何同步问题。

常见问题

套接字是一种通信端点,由 IP 地址和端口号标识。套接字允许进程在同一台机器上或跨网络交换数据,这使得它们成为分布式系统和客户端-服务器系统中常用的进程间通信 (IPC) 方法。

当进程共享内存等资源时,同步机制可以确保它们访问的有序性。它通过使用信号量、互斥锁和锁等工具,防止出现竞态条件和数据不一致的情况,从而保证每次只有一个进程可以更新共享数据。

普通管道连接两个相关的进程,它没有名称,并且仅在这些进程运行时存在。命名管道(或称先进先出管道,FIFO)在文件系统中有一个名称,在进程结束后仍然存在,并且允许不相关的进程进行通信。

内核创建并管理进程间通信(IPC)对象,例如消息队列、共享内存段和信号量。它强制执行访问权限,并且在消息传递过程中,会在进程之间复制数据,以便它们能够在不直接访问彼此内存的情况下安全地通信。

当两个或多个进程同时访问共享数据,且结果取决于它们访问的时序时,就会发生竞态条件。使用信号量或锁进行适当的同步可以防止竞态条件导致的输出不一致。

人工智能系统将工作分散到多个进程中,因此消息传递和共享内存用于在数据加载、训练和模型服务组件之间移动数据。分布式机器学习框架依赖进程间通信(IPC)来协调联网机器上的GPU和服务。

是的。GitHub Copilot 可以生成 C 语言编写的管道、套接字、消息队列和共享内存示例。 Python 或 Java以及同步逻辑。开发人员仍然应该测试代码是否存在死锁、竞态条件,以及是否正确清理了进程间通信 (IPC) 资源。

IPC 是允许进程在一台机器或网络上交换数据的通用方法集。 远程过程调用(RPC) 这是一种允许程序像在本地一样调用另一个进程或远程计算机上的过程的方法。

总结一下这篇文章: