一般 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 写入磁盘。
问题:-
- 什么是“使用磁盘支持的文件分配内存,即没有 MAP_ANONYMOUS 和 MAP_PRIVATE 到 mmap。” 除了这两个,我应该使用哪个标志。
- 我如何创建分配给应用程序的内存的写入备份。