共享内存通信,偶尔会出现连接者的参数大小没有对上的问题。
不使用mmap,而是普通的连接共享内存,只有linux支持:
如果创建者小,使用者大,会报错;而创建者大,使用者小,可正常使用。
只能使用mmap类似的机制:
window:
MapViewOfFile -> MapViewOfFile
即先创建句柄,然后映射。
linux:
mmap
区别在于:
你虽然只请求映射了"小尺寸",但操作系统是以"内存页"为单位进行映射的,且多映射了一点点作为缓冲,直到触碰到真正的物理边界。
以下是详细的技术原理解析:
. 核心原因:内存页对齐 (Page Alignment)
Windows 的内存管理不是以"字节"为单位的,而是以"页(Page)"为单位的。
在 x86/x64 架构的 Windows 上,标准内存页大小通常是 4KB (4096 字节)。
当你调用 MapViewOfFile(hMap, ..., size=SmallSize) 时,操作系统不会精确地只映射 SmallSize 个字节。
系统行为:它会将 SmallSize 向上取整到最近的整数倍页大小。
而linux只要连接上了就能用了。
简单来说:
Linux (mmap):倾向于"全有或全无"。一旦你打开了共享内存对象(fd),映射时通常直接映射整个对象,或者允许你访问整个对象的大小,忽略你请求的映射长度限制(在某些参数配置下)。
Windows (MapViewOfFile):倾向于"严格契约"。你请求映射多少字节,系统就只保证这多少字节(向上取整到页)是合法的。超出部分直接触发硬件级保护异常
会出现只有在window上的异常:
使用者的前4096的数据正常使用,然后使用到后面突然崩溃了,哈哈,小小的Bug查一天。