我正在使用需要使用大块内存的 Barnes-Hut 算法用 C 语言编写 N 体模拟。我追求速度和效率。有什么方法可以保证这些内存块将保留在 RAM 中而不被分页到硬盘驱动器?
编辑:我想分配多达 2GB,但是可以想象我最终可能会运行一些具有更多内存的模拟。
编辑:解决方案应该支持 Windows7(可能是 Windows8 出来的时候?)和 Ubuntu
有一些操作系统原语可以满足您的需求:mlock
在 Unix 上(Ubuntu 只是其中一个例子¹),以及VirtualLock
在 Windows 上。(忽略评论中关于 VirtualLock 确切语义的争论;它们与您的用例无关。)
Unix 原语root
在调用过程中需要特权(一些系统允许在没有特权的情况下锁定少量内存,但您想要的远不止这些)。Windows 原语似乎不需要特殊权限。
¹ “Linux 不是 UNIX” 的反对意见被注意到并被偏见地忽略了。
对于 Linux: mlock(2) 将完成这项工作。
https://www.kernel.org/doc/man-pages/online/pages/man2/mlock.2.html
但请注意,标准系统上的用户可锁定内存量通常是有限的ulimit -l
。
Windows 版本是 VirtualLock。不知道有没有限制,怎么查询。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366895%28v=vs.85%29.aspx