-1

一般 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 调用将分配内存,没有后备文件。

地址 = __mmap (0, 长度, PROT_READ|PROT_WRITE,MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);

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

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

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

备择方案

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

问题:-

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

1 回答 1

-1

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

至于你的问题。

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

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

于 2014-02-09T10:18:02.167 回答