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

Bow*_*ark 55 c linux posix mmap shared-memory

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

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

Ser*_* L. 72

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

一些提示:

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

  • `/ dev/shm`是你的RAMdisk.如果您使用文件支持的共享内存`mmap`一个实际磁盘上的文件,那么将由操作系统来安排更新.通常,在您停止使用映射或者分页守护程序决定将页面交换出来之后,映射文件将不会更新.您可以通过调用`msync`来强制进行更新,这是使用您希望写入磁盘的文件支持的映射时的推荐做法. (7认同)
  • 使用MAP_ANONYMOUS映射的@BowPark内存不受文件支持. (6认同)
  • 但是使用mmap时,修改内存时会自动修改硬盘上的文件?所以你经常写文件到那个文件? (2认同)
  • 在OSX上,你希望mmap作为最大共享内存,shmget在所有进程中只有4mb. (2认同)

Duc*_*uck 36

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

曾几何时,有两个主要(有点竞争)版本的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")进行维护,而不是依赖于ipcssysV所需的单独的实用程序(例如).

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

  • 强大可能是错误的词.富勒特色或许?例如,sysv信号量范围从正数到负数,可以加或减,可以在进程死亡时撤消操作,可以报告最后一个进程对它们进行操作(如果扩展到报告线程会更有用),存在于内核中,因此您不必混淆共享内存,并且可以一次性创建它们的整个集合.sysv MQ具有msgtypes,允许许多进程轻松共享同一队列并只处理特定类型.Posix MQ始终读取具有优先级的最旧消息 (9认同)
  • 你能解释为什么你认为System V版本更强大吗? (3认同)