我正在编写一个自定义内存分配例程,旨在替换malloc(),或者与malloc()一起安静地生活,并在不同情况下调用不同的内存分配器。
现在,不同的内存分配例程对虚拟地址空间提出了不同的要求。使用免费列表,您基本上可以继续向操作系统询问mmap()的更多内存页面,一次一个内存页面。您可以随意将数据放入这些页面,即使这些页面遍布整个虚拟地址空间,因为您可以将页面与指针元数据链接在一起。另一方面,像伙伴分配器这样的东西不能随意添加页面。好友分配器需要有大块的虚拟内存空间,没有漏洞。
所以,我的问题是:malloc()如何利用虚拟内存空间?不同的实现可能有所不同,但我对任何常见的上下文中的答案感兴趣:OS X,Windows,Linux,各种BSD,iOS和Android。
如果我在32位计算机上运行,并且我要求mmap()为自定义伙伴分配器之类的3gig连续内存空间,那么malloc()可能会感到不安吗? malloc()做类似的事情吗?一般来说,如何使一个人自己的mmap()代码在虚拟地址空间中表现为一个好公民?或者只是那里狂野的西部?