多次连接共享内存大小不一致在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查一天。

相关推荐
CodeMartain10 小时前
Dify Windows 原生部署(无 Docker、纯本地)
运维·docker·容器
xxx1x1x10 小时前
极客向:DLL/运行库故障的底层逻辑与自动化修复方案
运维·自动化·dll文件·dll·dll修复·dll缺失·dll一键修复
YuanDaima204810 小时前
Linux 进阶运维与 AI 环境实战:进程管理、网络排错与 GPU 监控
linux·运维·服务器·网络·人工智能
lolo大魔王11 小时前
Linux 数据文件处理实战:排序、搜索、压缩、归档一站式详解
linux·运维·服务器
llrraa201012 小时前
配置docker国内镜像源
运维·docker·容器
starvapour12 小时前
Ubuntu切换到Fcitx5中文输入法
linux·运维·ubuntu
1892280486112 小时前
NY382固态MT29F32T08GSLBHL8-24QM:B
大数据·服务器·人工智能·科技·缓存
xhbh66612 小时前
网关端口映射和路由器端口转发有什么区别?配置要点全解析
运维·服务器·网络·智能路由器·端口映射·映射·无痕网关
STDD12 小时前
Soulmask《灵魂面具》 专用服务器搭建教程
运维·服务器·github
lolo大魔王12 小时前
Linux的监测程序
linux·运维·github