【发布时间】:2013-09-01 07:23:11
【问题描述】:
我正在寻找有关在 Windows 上的共享内存段中存储少量数据(只有几个字节)的建议和建议。
现在,每当我们映射共享内存时,我们都会将映射大小四舍五入到最接近的 4KB,因此我们得到了多个映射的页面。
mem_size = ((mem_size + 4095) / 4096) * 4096;
但是,我想映射足够的内存以在进程之间共享一个命名整数。或者更具体地说,进程之间有许多不同名称的整数。我正在查看大约一千个整数,它们都具有不同的名称,并且每个都由一个或多个进程映射。
我不想将 4 个字节四舍五入到 4KB,因为这将是巨大的浪费。在创建了大约一千页之后,当我只需要一个时,我会使用大约一千页。
但我担心为仅 4 个字节创建命名内存段的开销。操作系统是否足够“合理”以尝试在可能的情况下将不同的映射安装到同一页面上? (没有保证,我知道)。还是会很快爆发?
我曾考虑映射一大块内存,但仍需要按名称引用各个整数。在共享内存中维护哈希表似乎只是在复制操作系统的工作。
是否有替代CreateFileMapping/OpenFileMapping 和MapViewOfFile 技术的替代方案更适合在进程之间共享非常少量的数据?还是我什么都不担心?
【问题讨论】:
-
你在说多少个整数(大约)?
-
@JonathanPotter 粗略估计大约有 1000 个,所有名称都不同。每一个都将由一个或多个进程映射。
-
如果您不想复制/实现自己的哈希系统,我所能想到的就是使用
GlobalAddAtom()为每个名称获取一个原子,将一个数据块维护为atom->indices 和另一个数据块来存储实际数据。这并不理想,因为它需要对原子映射进行线性搜索才能将原子转换为索引。 -
我刚刚想到的另一个想法是创建一个使用
SetProp()/GetProp()维护整数的单例窗口。我不确定GetProp()是否可以跨进程工作,但如果可以,您可以通过查找窗口句柄并调用GetProp()直接读取整数。如果它不能跨进程工作,您仍然可以通过向窗口发送消息并让它返回GetProp()调用的结果来执行此操作。唯一的缺点是性能,因为这肯定比直接访问共享内存要慢。 -
实际上,如果您通过
SendMessage()进行操作,那么您甚至不需要使用窗口属性——您可以使用std::map。
标签: c++ c winapi ipc shared-memory