繁体   English   中英

Linux共享内存:shmget()vs mmap()?

[英]Linux shared memory: shmget() vs mmap()?

这个线程中,OP建议使用mmap()而不是shmget()来获取Linux中的共享内存。 我访问了页面和页面以获取一些文档,但第二个给出了一个关于mmap()的模糊示例。

几乎是一个新手,需要在两个进程之间共享一些信息(以文本形式),我应该使用shmget()方法还是mmap() 为什么?

两种方法都是可行的。 mmap方法比shmget更具限制性,但更容易使用。 shmget是旧的System V共享内存模型,具有最广泛的支持。 mmap / shm_open是新的POSIX方式来共享内存并且更容易使用。 如果您的操作系统允许使用POSIX共享内存,那么我建议继续使用它。

一些提示:

  • 如果您通过fork创建子项,则使用MAP_ANONYMOUS | MAP_SHARED创建mmap MAP_ANONYMOUS | MAP_SHARED是迄今为止最简单的方法 - 只需一次通话。 但是, MAP_ANONYMOUSPOSIX未指定的Linux扩展。
  • 如果您独立启动进程,但可以为它们提供共享内存名称,那么shm_open (+ ftruncate )+ mmap with MAP_SHARED是两次/三次调用。 某些操作系统需要librt
  • 如果你的操作系统有/dev/shm/那么shm_open相当于在/dev/shm/打开一个文件。

这很大程度上与历史和未来方向有关。

曾几何时,有两个主要(有点竞争)版本的unix - 系统V和BSD。 SysV有自己的IPC版本,包括大型3共享内存,信号量和消息队列。 POSIX来试图团结一致。

所以目前我们有两个版本 - posix共享内存,MQ和信号量以及sysV版本。 只是为了让事情变得更混乱,sysV版本也是 posix的一部分。

所以基本上你的问题是你想使用Posix或sysV风格的共享内存吗? 一般来说,大多数人都采用长期观点并选择Posix,因为这似乎是通向未来的道路。 但是,实际上,sysV的东西是如此嵌入在如此多的系统中,你必须怀疑它会永远消失。

因此,消除长期的东西,它归结为对您的项目和您的品味有意义的东西。 一般来说,sysV版本实际上往往更强大,但它们有一个笨重的界面,大多数人在第一次接触时发现有点困惑。 sysV信号量和消息队列尤其如此。 就共享内存而言,可以认为sysV和posix都很尴尬。 sysV版本带有笨重的ftok和关键内容,而posix最终需要多次调用和一些竞争条件来设置。 从外部来看,posix版本的优势在于它们利用文件系统并且可以使用标准命令行函数(如“rm”)进行维护,而不是依赖于sysV所需的单独的实用程序(例如ipcs )。

那你应该用哪个? 作为一项规则,posix版本。 但是你应该熟悉sysV版本。 它们具有超出posix版本功能的一些功能,您可能希望在特定情况下利用这些功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM