目录

  1. 什么是进程间通信(IPC)?
  2. IPC 的几种常见方式
  3. 共享内存的基本概念
  4. 共享内存的优缺点
  5. Linux 共享内存的系统调用接口
  6. 共享内存的创建与连接流程
  7. 共享内存同步机制:信号量和互斥锁
  8. 共享内存的读写实现范例(C语言)
  9. 共享内存通信的完整示例代码讲解
  10. 常见问题及排查
  11. 性能分析与优化建议
  12. 扩展阅读和参考资料

1️⃣ 什么是进程间通信(IPC)?

进程间通信指多个进程之间交换数据和信息的机制。由于不同进程有各自独立的地址空间,直接访问彼此内存是不可能的,IPC 机制就应运而生。


2️⃣ IPC 的几种常见方式

方式描述适用场景优缺点
管道(Pipe)单向通信,亲缘进程间父子进程通信简单,半双工
命名管道支持无亲缘进程通信无亲缘进程间可靠,类似文件
消息队列基于消息的异步通信异步消息传递支持优先级,消息有界
信号量进程同步、互斥控制资源访问不能传递数据,只同步
共享内存多进程共享同一段物理内存大量数据高速通信高效但需同步控制
套接字跨网络的进程通信分布式进程间通信灵活,支持网络

3️⃣ 共享内存的基本概念

  • 共享内存是把一块物理内存映射到多个进程的虚拟地址空间中,从而实现数据共享。
  • 各进程对这块内存的读写都是直接操作物理内存,速度极快。

4️⃣ 共享内存的优缺点

优点缺点
速度快,无数据复制开销需要用户程序自行同步,易产生竞态条件
适合大数据量交换操作复杂,调试难度大
支持多进程同时访问内存管理需要谨慎,避免泄漏

5️⃣ Linux 共享内存的系统调用接口

Linux 共享内存主要有两套接口:

接口类型头文件函数示例说明
System V IPC<sys/shm.h>shmget()shmat()shmdt()shmctl()经典接口,功能齐全
POSIX IPC<sys/mman.h>shm_open()mmap()munmap()shm_unlink()新接口,文件映射机制

6️⃣ 共享内存的创建与连接流程(System V 示例)

  1. 创建共享内存段 shmget
  2. 进程映射共享内存 shmat
  3. 访问共享内存
  4. 解除映射 shmdt
  5. 删除共享内存 shmctl(IPC_RMID)

7️⃣ 共享内存同步机制:信号量和互斥锁

  • 共享内存读写需防止竞态,常用信号量(semget)或 POSIX 互斥锁(pthread_mutex_t)进行同步
  • 共享内存内放置互斥锁结构,跨进程同步

8️⃣ 共享内存的读写实现范例(C语言)

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <unistd.h>

#define SHM_SIZE 1024

int main() {
    key_t key = ftok("/tmp", 'R');
    if (key == -1) {
        perror("ftok");
        exit(1);
    }

    int shmid = shmget(key, SHM_SIZE, 0666|IPC_CREAT);
    if (shmid == -1) {
        perror("shmget");
        exit(1);
    }

    char *data = (char *)shmat(shmid, (void*)0, 0);
    if (data == (char *)(-1)) {
        perror("shmat");
        exit(1);
    }

    // 写入数据
    strncpy(data, "Hello from shared memory!", SHM_SIZE);

    printf("Written to shared memory: %s\n", data);

    // 解除映射
    shmdt(data);

    return 0;
}

9️⃣ 共享内存通信的完整示例代码讲解

  • 发送端与接收端如何建立共享内存并通信
  • 同步信号量控制读写顺序
  • 防止竞态和死锁的实践建议

🔧 10️⃣ 常见问题及排查

  • 共享内存段未释放导致内存泄漏
  • 权限不足无法创建或访问共享内存
  • 同步机制不当导致数据错误或死锁
  • 进程异常退出造成僵尸共享内存

⚡ 11️⃣ 性能分析与优化建议

  • 避免频繁创建/销毁共享内存
  • 利用锁机制实现高效同步
  • 内存对齐与缓存优化
  • 避免数据拷贝,尽量零拷贝设计

📚 12️⃣ 扩展阅读和参考资料

  • 《Linux高性能服务器编程》—— 游双
  • 《UNIX环境高级编程》—— W. Richard Stevens
  • man 手册:man shmgetman shmatman semgetman mmap

需要我帮你继续写完整代码示例,或者整理一份可执行的共享内存通信项目模板吗?