通用malloc和mmap描述
malloc(或任何分配函数)应该为应用程序分配内存。标准的glibcmalloc实现使用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:在写入映射时创建专用副本。映射的更新对于映射同一文件的其他进程是不可见的,并且不会传递到基础文件。
dmallocdmalloc是一种新的API,它使用磁盘支持的文件分配内存,即不向mmap分配MAP_ANONYMOUS和MAP_PRIVATE。dmalloc对SSD特别有用,与HDD相比,SSD的读/写延迟非常低。由于文件被映射到RAM中,因此dlmalloc也将受益于高速RAM。
替代
SSD也可以配置为最高优先级的交换设备,但这种方法受到Linux内核中HDD优化交换算法的影响。交换算法尝试在交换时对应用程序页面进行集群。当需要交换数据时,它会读取完整的集群(预读)。如果应用程序正在执行随机IO,预读数据将导致磁盘出现不必要的IO。
问题:-
- 什么是"使用磁盘备份文件分配内存,即没有MAP_ANOYMOUS和MAP_PRIVATE到mmap。"除了这两个标志之外,我应该使用哪个标志
- 如何创建分配给应用程序的内存的写备份
我从未听说过dmalloc,但就像你提到的那样,它看起来像是malloc(纯内存分配)和mmap(内存到磁盘的直接映射)之间的混合。dmalloc似乎分配由磁盘支持的内存,但在慢速磁盘(如SSD)上比mmap更具性能。我可以想象,它在实际将写操作刷新到磁盘之前对写操作进行分组,而mmap或多或少是磁盘文件上的"虚拟内存窗口"。
至于你的问题。
1) MAP_ANONYMOUS和MAP_PRIVATE是用于mmap的标志。事实上,这些标志被提到没有被使用,这让我认为dmalloc是一个新的实现,与mmap没有关系。
2) dmalloc似乎适合您所说的:它将内存"备份"到磁盘,类似于mmap。您可能需要阅读文档的详细信息,以了解何时可以保证数据有效地存储在磁盘上(缓存…)