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

相关推荐
nazisami10 分钟前
操作系统进程状态
linux·进程状态
xbzb17 分钟前
Linux 文件查找命令 locate 与 find 完全指南
linux·运维
ITxiaobing202324 分钟前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk55526 分钟前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
Julien200426 分钟前
Docker 容器存储原理(一)
linux·运维·服务器·ssh·学习方法
半仙白桑32 分钟前
内核篇第四讲:wait () 函数
linux·wait函数
zhangrelay35 分钟前
《机器人控制器设计与编程》课程习题资料-2026
linux·笔记·学习·ubuntu
邪修king35 分钟前
Re:Linux 系统篇(三十四):进程间通信开篇Chapter1 —— 匿名管道 pipe 深度拆解与代码实战
android·linux·运维·开发语言
筝筝ba37 分钟前
GUI 测试之只读用户恢复BMC出厂设置
服务器
花间相见40 分钟前
【计算基础|网络04】—— HTTP接口实战(下):接口测试、鉴权与跨域排错
java·linux·人工智能·后端·python·计算机网络·postman