【发布时间】:2014-03-06 14:40:06
【问题描述】:
一般 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。”除了这两个,我应该使用哪个标志。
- 我如何创建分配给应用程序的内存的写入时备份。
【问题讨论】:
标签: memory-management malloc mmap file-mapping