为什么使用SysV或POSIX共享内存vs mmap()?

时间:2009-07-14 04:55:04

标签: macos unix shared-memory

需要使用IPC将大量数据(200kb +)从子进程传递到OS X 10.4及更高版本的父进程,我读取了Unix上的共享内存,特别是System V和POSIX共享内存机制。然后我意识到mmap()可以与MAP_ANON和MAP_SHARED标志一起使用来做类似的事情(或者只是使用MAP_SHARED标志,如果我不介意正在创建常规文件)。

我的问题是,有没有理由不使用mmap()?它似乎更简单,内存仍然是共享的,如果我使用MAP_ANON,它不必创建真实的文件。我可以在父进程中创建文件,然后fork()和exec()子进程,并在子进程中使用它。

问题的第二部分是,这种方法不充分的原因是什么,并且必须使用SysV或POSIX共享内存机制?

请注意,我计划使用其他通信所需的管道进行同步,即父级通过管道请求数据,子级将其写入共享内存,并通过管道响应其准备就绪。没有涉及多个读者或作家。便携性不是优先考虑的事项。

4 个答案:

答案 0 :(得分:9)

如果您有父/子关系,那么使用mmap就完全没问题了。

sysv_shm是原始的unix实现,它允许相关和不相关的进程共享内存。 posix_shm标准化共享内存。

如果你在没有mmap的posix系统上,你可以使用posix_shm。如果你在没有posix_shm的unix上,你会使用sysv_shm。如果您只需要与父/子共享内存,则可以使用mmap。

答案 1 :(得分:1)

如果内存服务,使用SysV / POSIX而不是mmap的唯一原因是可移植性。在特别老的Unix系统中,不支持MAP_ANON。但是,Solaris,Linux,BSD和OS X ,所以在实践中,没有理由不使用mmap

答案 2 :(得分:1)

Linux中的

shm通常是通过获得/dev/shm ped的mmap文件实现的,因此,性能应该相同 - 我会选择mmap(w / MAP_ANONMAP_SHARED正如你所提到的那样简单,如果我知道可移植性没有问题,就像你说的那样。

答案 3 :(得分:0)

documentation所知,如果您想使用Xlib / XCB共享内存映像,必须使用SYSV共享内存。< / p>