上下文是进程间通信,其中一个进程(“服务器”)必须向同一台机器上运行的多个监听进程(“客户端”)发送固定大小的结构。
我在 Socket 编程中做这件事很舒服。 为了让服务器和客户端之间的通信更快,减少拷贝的数量,我想尝试使用共享内存(shm)或mmaps。
操作系统是 RHEL 64 位。
由于我是新手,请建议我应该使用哪个。 如果有人能指点我一本书或在线资源来学习同样的东西,我将不胜感激。
感谢您的回答。我想补充一点,服务器(市场数据服务器)通常会接收多播数据,这将导致它每秒向“客户端”“发送”大约 200,000 个结构,其中每个结构大约为 100 个字节。 shm_open/mmap 实现是否仅在处理大数据 block 或大量小结构时优于套接字?
最佳答案
我会使用 mmap
和 shm_open
将共享内存映射到进程的虚拟地址空间。这个比较直接干净:
- 您确定了您的共享内存
带有某种象征意义的片段
名称,类似于
"/myRegion"
- 用
shm_open
打开一个文件 该区域的描述符 - 使用
ftruncate
您可以将片段放大到您需要的大小 - 使用
mmap
你将它映射到你的 地址空间
shmat
和 Co 接口(interface)(至少从历史上看)的缺点是它们可能会限制您可以映射的最大内存量。
然后,所有的 POSIX 线程同步工具(pthread_mutex_t
、pthread_cond_t
、sem_t
、pthread_rwlock_t
、.. .) 具有允许您在进程共享上下文中使用它们的初始化接口(interface)。所有现代 Linux 发行版都支持这一点。
这是否比套接字更可取?在性能方面,它可能会有所不同,因为您不必复制东西。但我想主要的一点是,一旦你初始化了你的段,这在概念上会更简单一些。要访问某个项目,您只需在共享锁上加锁,读取数据,然后再次解锁。
正如@R 建议的那样,如果您有多个阅读器,pthread_rwlock_t
可能是最好使用的锁结构。
关于c++ - 共享内存或 mmap - Linux C/C++ IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836863/