当前位置: 首页 > news >正文

关于C/C++,Linux/MacOS/Windows 平台虚拟内存分配

在 Windows 平台上面建议通过 VirtualAlloca、VirtualAllocaEx 核心库函数来分配虚拟内存,而不是通过 MMF(Memory Mapping File / 内存映射文件)技术来载入虚拟内存。

这是因为,在 Windows 平台上面,通过MMF技术分配的虚拟内存,若程式运行过程中没有手动调用 FlushViewOfFile 刷入内存映射文件改变函数,就会导致程序在退出的时候,由于分配的虚拟内存过大涉及改动的虚拟内存页过多,这个时候内核就会挂住进程,以完成改变内存同步到文件的动作。

1、写入磁盘IO占用过大

2、程序一直无法退出(内核挂起进程)

MacOS 上面不建议使用匿名共享内存来分配虚拟内存,注意:并非不可用,单纯只是有OS X系统版本API兼容限制。

基于 boost 基础框架类库之中提供的:

<boost/interprocess/shared_memory_object.hpp> 

<boost/interprocess/mapped_region.hpp>

库头文件,大家可以轻松实现 MacOS、Windows、Linux 跨平台兼容性的匿名共享内存分配(:它们需要被映射,属于虚拟内存的一种)。

但上面也提到 MacOS 会有版本兼容限制,所以 Linux、MacOS,若希望统一虚拟内存访问的源实现,那么采用 MMF(内存映射文件)是一个很好的解决方案。

在大多数这两个平台上面需要分配虚拟内存的应用程序,都首选该方法,但可惜的是,这会占用一定的磁盘空间,但这个可以被缓解,即当文件被映射到内存之后,立即调用 unlink 函数删除被映射的文件,即可。

在 Windows 早前版本是无法删除正在被映射的文件的,但是在 Windows 11 及以上平台是允许删除正在映射过程之中的文件的,此时通过 PC Hunter、ProcExp 等系统工具,可以检索到进程内存映射的文件变成匿名文件。

http://www.lryc.cn/news/326894.html

相关文章:

  • 如何在服务器上传/下载文件
  • C++ 之多态虚函数原理及应用
  • 亮数据——让你的IP走出去,让价值返回来
  • spring boot-引入Redis并封装redistemplate操作工具类
  • android 11 SystemUI 状态栏打开之后的界面层级关系说明之一
  • C#___锁(lock)
  • JAVA的sort用法详解(二维数组排序,List<>排序,lambada表达式,自定义类型排序)
  • 数据分析能力模型分析与展示
  • BUG未解之谜01-指针引用之谜
  • 数据库事务编程
  • 专题二_滑动窗口(1)
  • 把本地文件上传到HDFS上操作步骤
  • Leo赠书活动-21期 《一篇讲明白 Hadoop 生态的三大部件》
  • 【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?
  • ArrayList和LinkedList有什么区别?
  • 离线数仓(八)【DWD 层开发】
  • Jenkins用户角色权限管理
  • 简明conan教程
  • LeetCode刷题--- 等差数列划分 II - 子序列
  • kubectl 启用shell自动补全功能
  • 极简wordpress网站模板
  • 【python】(16)python的字典dict按照key或value排序的不同方法
  • 微服务篇-C 深入理解第一代微服务(SpringCloud)_VI 深入理解Zuul服务网关
  • web CSS笔记1
  • js算法记录
  • 球面数据的几何深度学习--球形 CNN
  • MySQL学习笔记------SQL(1)
  • PMP能提前查成绩?还能改分数?别太离谱!
  • 【保姆级讲解服务器硬件的基础知识】
  • 并查集---力扣547省份的数量