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

相关推荐
IT WorryFree9 小时前
FGT-KVM 完整部署极简教程(CentOS 7 + KVM 环境)
linux·运维·centos
上海云盾安全满满10 小时前
网站被攻击了,高防CDN相比与高防服务器有什么优点
运维·服务器
一袋米扛几楼9810 小时前
【报错问题】彻底解决 TypeScript 报错 TS2769: No overload matches this call (JWT 篇)
linux·javascript·typescript
@encryption10 小时前
计算机网络 --- NAT
运维·服务器·计算机网络
goyeer10 小时前
【ITIL4】32服务实践 - 服务变更管理
linux·运维·服务器·数字化·价值·itil
程序员Linc10 小时前
双击nginx.exe5次之后,我的项目管理平台挂了
运维·nginx
扛枪的书生10 小时前
Git 学习总结
linux
liuyao_xianhui10 小时前
进程概念与进程状态_Linux
linux·运维·服务器·数据结构·c++·哈希算法·宽度优先
znhb9910 小时前
九九AI驱动脱硫脱硝及氨逃逸精准控制技术,实现环保、经济、运维三重升级
运维·人工智能
wang090710 小时前
Linux性能优化之磁盘基础介绍
linux·运维·性能优化