【发布时间】:2014-02-21 07:13:32
【问题描述】:
我从here 了解到共享内存。根据文档,两个不同的程序生成两个不同的虚拟地址,这些虚拟地址映射到 RAM 中的同一物理页面。
所以当program1访问共享内存的数据时,它会从主内存加载到缓存中,下次program2/process2会从缓存中获取数据,因此program2/process2对相同数据的访问时间会更短。
我已经成功地用 C 语言为 IPC 编写了一个程序,它使用共享内存在两个程序之间进行通信,并修改一个程序中的变量并从另一个程序中读取。
现在,我的问题如下:
可以在两个独立程序之间自动创建“共享内存”吗? 意味着两个独立的程序是否有可能自动自行或由操作系统创建共享内存,而无需像 IPC (shmget/shmat) 那样手动/以编程方式创建共享内存?
当两个不同的虚拟地址使用共享内存映射到同一个物理内存时,这两个程序的公共数据是否存在总是正确的,或者在该共享内存位置可能存在不同的数据(这会导致更多的缓存未命中)?
我们能否在不了解其他程序的情况下决定或创建两个独立程序之间的共享内存?
假设,在程序 1 中我声明了大小为 1 MB 的 Array-A,在程序 2 中我声明了 Array-B 大小为 16KB。现在在两个程序中执行求和操作时,它是否仍会因共享内存而受益?
意味着当一个元素被加载到缓存中进行求和时,其他程序将使用该缓存值。
或
没有共享内存的可能性,因为我们使用了两个不同的数组,并且其中的元素对其他程序/进程没有用。
我在 Linux 下使用 GCC。
【问题讨论】:
-
旁注:
shm_open优于shmget。 -
我想你不认为分叉程序独立于其父程序?
-
@SirDarius,我正在考虑两个不同的程序,我没有使用任何 fork 来创建子进程。
标签: c linux memory-management cpu-architecture cpu-cache