Skip to content
标签
note
字数
1460 字
阅读时间
6 分钟

由于进程的内存空间是相互独立的,一个进程不能直接访问另一个进程的内存。因此,操作系统内核提供了一系列机制来实现进程间通信(IPC, Inter-Process Communication)

Linux 进程间通信方式

1. 管道 (Pipe)

管道是最简单的一种 IPC 方式。

  • 匿名管道 (|):

    • 特点: 只能用于具有亲缘关系的进程之间(如父子进程)。
    • 本质: 内核中的一块缓冲区,没有文件实体。
    • 通信方式: 半双工(单向通信),数据以无格式的字节流形式传输。
    • 生命周期: 随进程的创建而建立,随进程的终止而消失。
    • 示例: Shell 命令中的 |,如 ls | grep .js
  • 命名管道 (FIFO):

    • 特点: 允许无亲缘关系的进程之间通信。
    • 本质: 在文件系统中以一个特殊设备文件(类型为 p)的形式存在。
    • 通信方式: 仍然是半双工,遵循先进先出(FIFO)原则。

2. 消息队列 (Message Queue)

消息队列克服了管道通信数据无格式、缓冲区大小受限的问题。

  • 特点: 允许一个或多个进程向它写入与读取消息。
  • 本质: 内核中维护的一个消息链表
  • 通信方式: 消息体具有用户自定义的类型和大小,实现了格式化的数据传输。
  • 缺点: 每次读写都需要在用户态和内核态之间进行数据拷贝,有一定开销,通信不是最实时的。

3. 共享内存 (Shared Memory)

共享内存是速度最快的 IPC 方式。

  • 特点: 允许多个进程直接访问同一块物理内存空间。
  • 本质: 内核在物理内存中分配一块共享空间,并将其映射到各个进程自己的虚拟地址空间中。
  • 通信方式: 进程可以像读写自己的内存一样直接读写共享内存,无需陷入内核态,也无需数据拷贝,因此速度极快。
  • 缺点: 必须自行处理多进程间的同步和互斥问题,否则会造成数据错乱。通常需要与信号量等同步机制配合使用。

4. 信号量 (Semaphore)

信号量通常不用于传输数据,而是用于进程间的同步与互斥,以保护共享资源。

  • 特点: 允许多个进程同步访问共享资源。
  • 本质: 内核中的一个计数器。
  • 通信方式: 通过两个原子操作来控制:
    • P 操作 (wait): 申请资源,使计数器减 1。如果计数器为 0,则进程阻塞。
    • V 操作 (signal): 释放资源,使计数器加 1。如果存在等待该资源的进程,则唤醒一个。

5. 信号 (Signal)

信号是一种异步通信机制,用于在进程间传递简单的通知。

  • 特点: 可以在任何时候由一个进程发送给另一个进程,用于通知接收进程某个事件已经发生。
  • 来源:
    • 硬件: 如键盘输入 Ctrl+C 产生 SIGINT 信号。
    • 软件: 如 kill 命令产生 SIGKILL 信号。
  • 响应方式: 进程收到信号后,可以有三种处理方式:
    1. 执行默认操作: 如 SIGTERM 的默认操作是终止进程。
    2. 捕捉信号: 执行用户自定义的信号处理函数。
    3. 忽略信号: 对信号不作任何处理。
  • 注意: SIGKILLSIGSTOP 这两个信号无法被捕捉或忽略,以确保管理员能随时终止或暂停任何进程。

6. 套接字 (Socket)

套接字是功能最强大的 IPC 机制,它不仅支持同一台主机上的进程间通信,还支持不同主机之间的网络通信。

  • 特点: 通用性强,是所有网络编程的基础。
  • 类型:
    • 流式套接字 (TCP): 提供面向连接、可靠的数据传输服务。
    • 数据报套接字 (UDP): 提供无连接、不可靠的数据传输服务。
    • 本地套接字 (Unix Domain Socket): 用于同一台主机上的进程间通信,它不走网络协议栈,效率比 TCP/UDP 更高。

线程间通信方式

同一进程下的多个线程共享该进程的绝大部分资源(如内存地址空间、全局变量、文件描述符等)。

因此,线程间通信非常简单,可以直接读写共享变量。

线程间通信的关注点不在于“如何通信”,而在于“如何安全地通信”,即如何处理多线程对共享资源的竞争问题。常用的同步机制包括:

  • 互斥锁 (Mutex): 保证任意时刻只有一个线程能访问被保护的资源。
  • 信号量 (Semaphore): 控制同时访问某一资源的线程数量。
  • 条件变量 (Condition Variable): 允许线程阻塞等待,直到某个条件成立时再被唤醒。

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写