欢迎光临
我们一直在努力

Linux IPC全揭秘(一):进程间通信:概念与目的

目录

    • 一、进程间通信目的
      • 1. **数据传输**
      • 2. **资源共享**
      • 3. **通知事件**
      • 4. **进程控制**
    • 二、进程间通信发展历程
      • 1. **管道(1969年)**
      • 2. **System V IPC(1983年)**
      • 3. **POSIX IPC(1990年代)**
    • 三、进程间通信分类详解
      • 1. **管道体系**
        • 1.1 匿名管道(pipe)
        • 1.2 命名管道(FIFO)
      • 2. **System V IPC**
        • 2.1 System V 消息队列
        • 2.2 System V 共享内存
        • 2.3 System V 信号量
      • 3. **POSIX IPC**
        • 3.1 POSIX 消息队列
        • 3.2 POSIX 共享内存
        • 3.3 POSIX 信号量
        • 3.4 互斥量(Mutex)
        • 3.5 条件变量(Condition Variable)
        • 3.6 读写锁(Read-Write Lock)
    • 四、IPC选择指南

一、进程间通信目的

1. 数据传输

  • 核心需求:一个进程需要将数据发送给另一个进程
  • 应用场景:
    • 客户端向服务器发送请求
    • 生产者-消费者模型中的数据处理
    • 插件系统与主程序间的数据交换
  • 技术要求:可靠性、有序性、数据完整性

2. 资源共享

  • 核心需求:多个进程之间共享同样的资源
  • 资源类型:
    • 硬件资源:打印机、扫描仪
    • 软件资源:数据库连接、配置文件
    • 内存资源:共享缓存、全局数据结构
  • 关键技术:互斥访问、并发控制、死锁避免

3. 通知事件

  • 核心需求:进程间状态变化通知
  • 典型场景:
    • 子进程终止时通知父进程(SIGCHLD信号)
    • 定时器超时通知
    • 硬件事件通知(如设备就绪)
  • 通信特点:异步、低延迟、轻量级

4. 进程控制

  • 核心需求:控制另一个进程的执行
  • 应用场景:
    • 调试器控制被调试进程
    • 进程监控和管理
    • 系统服务管理
  • 技术实现:拦截系统调用、处理异常、状态监控

二、进程间通信发展历程

1. 管道(1969年)

  • 起源:Unix操作系统的最早IPC机制
  • 设计者:Ken Thompson
  • 特点:简单、单向的字节流
  • 影响:奠定了Unix"一切皆文件"的哲学基础

2. System V IPC(1983年)

  • 背景:商业Unix系统的发展需求
  • 包含组件:消息队列、共享内存、信号量
  • 特点:功能全面但设计复杂
  • 遗留问题:资源泄露、权限管理复杂

3. POSIX IPC(1990年代)

  • 标准化:IEEE POSIX标准化成果
  • 设计理念:简洁、一致、可移植
  • 改进点:
    • 基于文件系统路径的命名
    • 更好的资源管理
    • 更现代的API设计

三、进程间通信分类详解

1. 管道体系

1.1 匿名管道(pipe)

// 创建匿名管道
int pipe(int pipefd[2]);
// pipefd[0]: 读端
// pipefd[1]: 写端

特性:

  • 单向通信
  • 仅用于有亲缘关系的进程(通常为父子进程)
  • 内核缓冲区大小有限(Linux默认64KB)
  • 无数据边界概念(字节流)

使用示例:

# Shell中的管道使用
ls -l | grep ".txt" | wc -l

1.2 命名管道(FIFO)

// 创建命名管道
int mkfifo(const char *pathname, mode_t mode);

特性:

  • 有文件系统路径,可在无关进程间使用
  • 支持多读多写(需外部同步)
  • 数据以先进先出顺序处理
  • 可通过标准文件I/O函数操作

2. System V IPC

2.1 System V 消息队列

数据结构:

struct msgbuf {
long mtype; // 消息类型
char mtext[1]; // 消息数据
};

特性:

  • 消息链表结构,支持类型过滤
  • 异步通信,发送者无需等待接收者
  • 消息优先级支持
  • 系统范围资源,需显式删除

API函数:

msgget() // 创建/获取消息队列
msgsnd() // 发送消息
msgrcv() // 接收消息
msgctl() // 控制操作

2.2 System V 共享内存

工作原理:

进程A地址空间 进程B地址空间
↓ ↓
————————-
| 共享内存段 |
————————-

特性:

  • 最快的IPC方式(无需内核复制)
  • 需要显式同步机制(如信号量)
  • 需考虑缓存一致性问题
  • 系统范围资源管理

API函数:

shmget() // 创建/获取共享内存段
shmat() // 附加到进程地址空间
shmdt() // 分离共享内存
shmctl() // 控制操作

2.3 System V 信号量

数据结构:

union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};

类型:

  • 计数信号量:资源计数
  • 二值信号量:互斥锁

操作:

  • P操作(wait):申请资源
  • V操作(signal):释放资源

API函数:

semget() // 创建/获取信号量集
semop() // 执行信号量操作
semctl() // 控制操作

3. POSIX IPC

3.1 POSIX 消息队列

// 打开消息队列
mqd_t mq_open(const char *name, int oflag,
mode_t mode, struct mq_attr *attr);

改进:

  • 基于文件描述符的API
  • 支持消息优先级
  • 支持异步通知(信号或线程)
  • 更好的可移植性
3.2 POSIX 共享内存

// 创建共享内存对象
int shm_open(const char *name, int oflag, mode_t mode);

改进:

  • 使用内存映射文件机制
  • 基于文件系统路径命名
  • 更好的资源生命周期管理
  • 支持大小调整
3.3 POSIX 信号量

类型:

  • 命名信号量:用于进程间同步

    sem_open() / sem_close() / sem_unlink()

  • 未命名信号量:用于线程间或进程间(在共享内存中)

    sem_init() / sem_destroy()

  • 3.4 互斥量(Mutex)

    进程间互斥量特点:

    • 需放置在共享内存中
    • 需设置PTHREAD_PROCESS_SHARED属性
    • 防止多个进程同时访问临界区

    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

    3.5 条件变量(Condition Variable)

    作用:线程/进程间的条件等待和通知 使用模式:

    // 等待条件
    pthread_cond_wait(&cond, &mutex);

    // 通知条件
    pthread_cond_signal(&cond); // 通知一个等待者
    pthread_cond_broadcast(&cond); // 通知所有等待者

    3.6 读写锁(Read-Write Lock)

    特性:

    • 允许多个读者同时访问
    • 只允许一个写者访问
    • 读者优先或写者优先策略

    pthread_rwlockattr_t attr;
    pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

    四、IPC选择指南

    通信需求推荐机制理由
    简单数据流,有亲缘关系 匿名管道 简单高效,无需同步
    简单数据流,无亲缘关系 命名管道 类似文件操作,易用
    结构化消息,异步通信 消息队列 支持类型、优先级
    高性能大数据传输 共享内存 零拷贝,性能最佳
    进程同步与互斥 信号量/互斥量 专门设计用于同步
    条件等待与通知 条件变量 高效的事件等待机制
    读多写少的数据共享 读写锁 提高并发性能
    赞(0)
    未经允许不得转载:171主机测评 » Linux IPC全揭秘(一):进程间通信:概念与目的
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址