一般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到磁盘。
问题: -
答案 0 :(得分:0)
我从来没有听说过dmalloc但是就像你提到的那样,它看起来像是malloc(纯内存分配)和mmap(内存直接映射到磁盘)之间的混合。 dmalloc似乎分配了由磁盘支持的内存,但在慢速磁盘(例如SSD)上的性能比mmap更高。我可以想象它在实际将写入刷新到磁盘之前对写操作进行分组,而mmap或多或少是磁盘文件上的“虚拟内存窗口”。
关于你的问题。
1)MAP_ANONYMOUS和MAP_PRIVATE是用于mmap的标志。提到这些标志没有被使用的事实让我觉得dmalloc是一个全新的实现,与mmap没有任何关系。
2)dmalloc似乎适合你所说的:它“备份”内存到磁盘,类似于mmap。您可能需要阅读文档的详细信息,以确定何时确保数据在磁盘上有效(缓存,...)