【发布时间】:2015-05-07 02:04:06
【问题描述】:
我了解 mmap 请求的内存在被读取或写入之前不会被实际使用。所以在下面的测试用例中:
int main()
{
char *A=mmap(NULL,1073741824/4, PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
*A='a';
char *B=mmap(NULL,1073741824/4, PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
*B='b';
char *C=mmap(NULL,1073741824/4, PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
*C='c';
char *D=mmap(NULL,1073741824/4, PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
*D='d'
char *E=mmap(NULL,1073741824/4, PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
}
我是否正确假设其他程序可用的内存仅减少了 16k (4 x 4096)?我没有看到使用free() 会进一步减少可用内存,所以我假设是这样。
在这种情况下,假设我的应用程序通常使用 10MB 内存,但在极少数情况下可能突然需要高达 1GB(尽可能少的延迟)。一开始就映射 1GB 内存是一个可行的解决方案吗?据推测,虽然只使用了 10MB,但剩余的 990MB 可用于其他应用程序。当需要 1GB 的罕见情况发生时,我认为延迟会比 malloc 或 realloc 少得多。
当不再需要额外的 990MB 时,将 mremap 到 10MB 然后回到 1GB 以释放不再立即需要的 990MB 是否是一个可行的解决方案,但仍然可以为下次提供即时访问?我认为这会比重新分配操作快得多?
我在这里的一些假设可能是不正确的。我试图更好地了解 mmap 如何影响空闲内存,以及 mremap 与使用 malloc 和 realloc 的性能影响。
以上内容基于现代 linux 内核,使用 gcc,假设 4k 页面大小和超出此范围的可移植性,不是重要的优先事项。
【问题讨论】:
-
当您不再需要内存时,请考虑使用
madvise(...., MADV_DONTNEED)而不是取消映射/重新映射。如果您不再需要内容,但希望保留它以供以后使用,这也可以用于(部分)大型 malloc 块。
标签: c linux memory memory-management