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

相关推荐
SPC的存折17 分钟前
8、Ansible之Playbook---Roles
linux·服务器·ansible
Kira Skyler21 分钟前
BPF KPROBE编程中的ctx是什么?
linux
珠海西格电力29 分钟前
鄂尔多斯零碳产业园管理系统的核心功能解析
大数据·运维·人工智能·物联网·能源
爱学习的小囧33 分钟前
VCF 9.0+Harbor 搭建私有 AI 模型仓库(PAIS)超详细教程
服务器·人工智能·虚拟化·esxi8.0
春日见1 小时前
Tool文件夹:瑞士军刀库
运维·服务器·windows·深度学习·自动驾驶
AC赳赳老秦1 小时前
Windows 系统 OpenClaw 执行策略报错及管理员权限设置深度解析与实操指南
运维·人工智能·python·django·自动化·媒体·openclaw
Gofarlic_OMS2 小时前
SolidEdge专业许可证管理工具选型关键评估标准
java·大数据·运维·服务器·人工智能
三万棵雪松2 小时前
【Linux 物联网网关主控系统-Linux主控部分(三)】
linux·物联网·嵌入式linux
萝卜白菜。2 小时前
TongWeb7.0 集中管理heimdall配置文件说明
linux·运维·服务器
bingHHB2 小时前
金蝶云星空旗舰版 × 赛狐ERP:亚马逊卖家业财一体化的最后一公里
运维·数据库·集成学习