Windows – 64位大型mallocs

malloc()会失败的原因是什么,特别是在64位?

我的具体问题是尝试在64位系统上配置一个巨大的10GB大块RAM.
该机器具有12GB的RAM和32 GB的互换.
是的,malloc是极端的,但为什么会是一个问题?这是在Windows XP64与英特尔和MSFT编译器. malloc有时会成功,有时候不会达到约50%. 8GB的mallocs一直工作,20GB的malloc总是失败.如果一个malloc失败,重复的请求将不起作用,除非我退出该过程,并重新开始一个新的进程(然后这将有50%的成功).没有其他大型应用程序正在运行.它会在新的重新启动后立即发生.

如果您使用了32位(或31)位的可用地址空间,我可以想象一个malloc失败的32位,这样就没有足够大的地址范围来分配给您的请求.

如果您用完了物理RAM和硬盘驱动器交换空间,我也可以想象malloc失败.对我来说不是这样.

但是为什么malloc也可能失败?我不能想到其他原因.

我对一般的malloc问题比我的具体例子更感兴趣,我可能会替代内存映射文件.失败的malloc()只是一个比其他任何东西更难的东西…,希望了解你的工具,而不是让基础知识感到惊讶.

malloc尝试分配一个连续的内存范围,这首先是由于交换内存的工作原理(至少在我记得的时候)才会在真正的内存中.可能很容易的是,您的操作系统有时无法找到10gb的内存的连续块,并且仍然将所有需要真正内存的进程同时留在RAM中(此时您的malloc将失败).

你实际上是否需要10gb的连续内存,或者你能够围绕几个更小的块包装一个存储类/结构体,而不是使用你的内存块呢?这放宽了巨大的连续需求,并且还应允许您的程序使用交换文件来使用较少使用的块.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...