Windows 中跨进程的共享内存是不是一致?

Posted

技术标签:

【中文标题】Windows 中跨进程的共享内存是不是一致?【英文标题】:Is shared memory coherent across processes in Windows?Windows 中跨进程的共享内存是否一致? 【发布时间】:2016-03-01 18:31:37 【问题描述】:

我需要在同一台机器上的两个进程之间进行一些高比特率流传输。为了避免过度复制,我的想法是分配一个包含实际数据的大型共享内存缓冲区(通过 CreateFileMapping),并使用管道来控制消息。

这个想法是生产者将一大块数据写入共享内存,然后通过管道发送消息,有效地将所有权传递给消费者。消费者直接在共享内存上进行业务,然后发送另一条消息将内存释放回生产者。无限重复。

这种同步机制是否保证在内存一致性方面是安全的?即消费者在收到控制消息后是否保证看到生产者写入的完整效果?

【问题讨论】:

【参考方案1】:

出于实际目的,跨进程共享内存与单个进程的两个线程共享的普通内存具有相同的属性。也就是说,理论上你需要一个内存栅栏/屏障。我怀疑在实践中 IPC 控制消息就足够了。

在 CPU 级别,共享内存在物理上是两个进程中相同的 RAM。这只是在各个页表中具有兼容的虚拟到物理映射的问题。

【讨论】:

这是关键点:“在实践中,IPC 控制消息就足够了”【参考方案2】:

来自MSDN:

除了一个重要的例外,从由同一文件支持的任何文件映射对象派生的文件视图在特定时间是连贯的或相同的。一个进程内的视图和不同进程映射的视图的一致性得到保证。

异常与远程文件有关。

即使不能保证这一点,MSalters 是正确的,通过命名管道发送消息几乎可以肯定足以确保已写入共享内存的数据准备好被另一个进程读取.

另外,我开发了一个完全按照您描述的那样处理 IPC 的应用程序,并且从来没有任何与数据竞争相关的错误。

【讨论】:

以上是关于Windows 中跨进程的共享内存是不是一致?的主要内容,如果未能解决你的问题,请参考以下文章

安卓执法仪录像之进程间共享内存

安卓执法仪录像之进程间共享内存

安卓执法仪录像之进程间共享内存

使用 TCP 跨进程共享内存

nodejs 有没有可以跨进程的全局变量

Android 基于共享内存实现跨进程大数据的高效传输