多次连接共享内存大小不一致在win和linux的区别

共享内存通信,偶尔会出现连接者的参数大小没有对上的问题。

不使用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查一天。

相关推荐
嵌入式×边缘AI:打怪升级日志2 小时前
2.3.1 Linux 命令行介绍:Shell、PATH与第一个Hello程序
linux·运维·服务器
猪猪侠|ZZXia2 小时前
# Openssl关键知识
linux·网络
徐子元竟然被占了!!2 小时前
docker-dockerfile练习
运维·docker·容器
机 _ 长2 小时前
NVIDIA 显卡驱动安装指南 (CentOS Stream 9 / RTX 5090)
linux·运维·centos
赛博云推-Twitter热门霸屏工具2 小时前
推特自动化营销软件推荐:赛博云推实现Twitter热门霸屏与精准获客
运维·自动化·媒体·twitter
网云工程师手记3 小时前
企业多出口负载与故障切换实战:4 种调度模式 + 主备线路高可用
运维·服务器·网络·安全·网络安全
深圳市恒讯科技3 小时前
大带宽服务器和CDN加速如何配合使用?
运维·服务器
济6173 小时前
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(互斥体实现 LED 设备互斥访问)--- Ubuntu20.04互斥体实验
linux·stm32·嵌入式linux驱动开发
16Miku3 小时前
OpenClaw-Linux+飞书官方Plugin安装指南
linux·ai·飞书·agent·openclaw·feishu