实现由磁盘文件支持的malloc(dmalloc)

时间:2014-02-09 09:21:21

标签: memory-management malloc mmap file-mapping

一般malloc和mmap描述

malloc(或任何分配函数)应该为应用程序分配内存。标准的glibc malloc实现使用sbrk()系统调用来分配内存。分配给应用程序的内存不是磁盘备份。只有当应用程序被清除时,内存的内容才会被移动到磁盘(预先配置的交换磁盘)。

分配内存的另一种方法是使用mmap。 mmap系统调用在虚拟地址空间中创建映射以用于调用进程。以下是根据POSIX标准的mmap函数声明。

void * mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset);

/ *描述mmap * /

的几个重要参数的含义

mmap系统调用也可用于分配内存。通常,这用于加载,应用程序二进制文件或静态库。例如,在mmap调用之后将分配内存,而不需要后备文件。

address = __mmap(0,length,PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_PRIVATE,-1,0);

标志 MAP_ANONYMOUS:映射不受任何文件的支持;它的内容  被初始化为零。

MAP_PRIVATE:创建私有的写时复制映射。映射的更新对于映射同一文件的其他进程是不可见的,并且不会传递到基础文件。

dmalloc dmalloc是一个新的API,它使用磁盘备份文件分配内存,即没有MAP_ANONYMOUS和MAP_PRIVATE到mmap。对于SSD来说,dmalloc特别有用,与HDD相比,它具有非常低的读/写延迟。由于文件被映射到RAM,因此dlmalloc也将受益于高速RAM。

替代

SSD也可以配置为最高优先级的交换设备,但是这种方法在Linux内核中受到HDD优化的交换算法的影响。交换算法尝试在交换上集群应用程序页面。当需要来自交换的数据时,它会读取  完整的集群(预读)。如果应用程序正在执行随机IO,则预读数据将导致不必要的IO到磁盘。

问题: -

  1. 什么是“使用磁盘备份文件分配内存,即没有MAP_ANONYMOUS和MAP_PRIVATE到mmap”。除了那两个之外我应该使用哪个国旗。
  2. 我如何创建分配给应用程序的内存的写入备份。

1 个答案:

答案 0 :(得分:0)

我从来没有听说过dmalloc但是就像你提到的那样,它看起来像是malloc(纯内存分配)和mmap(内存直接映射到磁盘)之间的混合。 dmalloc似乎分配了由磁盘支持的内存,但在慢速磁盘(例如SSD)上的性能比mmap更高。我可以想象它在实际将写入刷新到磁盘之前对写操作进行分组,而mmap或多或少是磁盘文件上的“虚拟内存窗口”。

关于你的问题。

1)MAP_ANONYMOUS和MAP_PRIVATE是用于mmap的标志。提到这些标志没有被使用的事实让我觉得dmalloc是一个全新的实现,与mmap没有任何关系。

2)dmalloc似乎适合你所说的:它“备份”内存到磁盘,类似于mmap。您可能需要阅读文档的详细信息,以确定何时确保数据在磁盘上有效(缓存,...)