c++ - 共享内存或 mmap - Linux C/C++ IPC

标签 c++ c ipc shared-memory mmap

上下文是进程间通信,其中一个进程(“服务器”)必须向同一台机器上运行的多个监听进程(“客户端”)发送固定大小的结构。

我在 Socket 编程中做这件事很舒服。 为了让服务器和客户端之间的通信更快,减少拷贝的数量,我想尝试使用共享内存(shm)或mmaps。

操作系统是 RHEL 64 位。

由于我是新手,请建议我应该使用哪个。 如果有人能指点我一本书或在线资源来学习同样的东西,我将不胜感激。

感谢您的回答。我想补充一点,服务器(市场数据服务器)通常会接收多播数据,这将导致它每秒向“客户端”“发送”大约 200,000 个结构,其中每个结构大约为 100 个字节。 shm_open/mmap 实现是否仅在处理大数据 block 或大量小结构时优于套接字?

最佳答案

我会使用 mmapshm_open 将共享内存映射到进程的虚拟地址空间。这个比较直接干净:

  • 您确定了您的共享内存 带有某种象征意义的片段 名称,类似于 "/myRegion"
  • shm_open 打开一个文件 该区域的描述符
  • 使用 ftruncate 您可以将片段放大到您需要的大小
  • 使用 mmap 你将它映射到你的 地址空间

shmat 和 Co 接口(interface)(至少从历史上看)的缺点是它们可能会限制您可以映射的最大内存量。

然后,所有的 POSIX 线程同步工具(pthread_mutex_tpthread_cond_tsem_tpthread_rwlock_t、.. .) 具有允许您在进程共享上下文中使用它们的初始化接口(interface)。所有现代 Linux 发行版都支持这一点。

这是否比套接字更可取?在性能方面,它可能会有所不同,因为您不必复制东西。但我想主要的一点是,一旦你初始化了你的段,这在概念上会更简单一些。要访问某个项目,您只需在共享锁上加锁,读取数据,然后再次解锁。

正如@R 建议的那样,如果您有多个阅读器,pthread_rwlock_t 可能是最好使用的锁结构。

关于c++ - 共享内存或 mmap - Linux C/C++ IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836863/

相关文章:

创建线程

gulp - FSEvents_connect 无效目标端口阻塞 gulp 进程

c - 进程间共享数据队列

c++ - g++ 将字段的基本构造函数错误并忽略它的参数

c++ - 类可以用作指针吗?

c++ - C/C++ strcmp 无法将参数 1 从 'char' 转换为 'const char *'

c - 这三个问题相似但不相同。如何?

c++ - 是否有一些 escaped_list_separator 反向函数?

c++ - 为什么找到 2 个不同大小的排序数组的中位数需要 O(log(min(n,m)))

c - pthread 条件和进程终止