1

我有以下代码:

mmap(NULL, 2048, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, -1, 0);

我想知道在我的应用程序异常退出(例如崩溃)后如何释放大页面。

重新启动机器将释放所有大页面。但这对生产服务器有点破坏性。因此,我正在寻找一种不破坏现有流程的方法。

提前致谢!

4

2 回答 2

0

当程序终止时,映射将自动取消映射。

以下陈述来自“The Linux Programming Interface”一书。

当进程终止或执行 exec() 时,所有进程的映射都会自动取消映射。

于 2019-08-29T03:49:21.900 回答
0

这是解决问题的一种可能方法,但不是唯一的方法。

您在mmapFD 设置为 -1 的情况下打开。相反,尝试使用这样的文件:

char page_file[256];
static unsigned page_counter;
int fd;

/* page_counter must be counted up and must be unique. */
snprintf(page_file, sizeof(page_file), "/var/huge/my_page_%u", page_counter);

fd = open(page_file, O_CREAT | O_RDWR, 0755);
if (fd == -1) {
    /* Handle error. */
}

addr = mmap(NULL, 2048, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, fd, 0);

然后,您的应用程序初始化过程可以查找带有前缀的文件/var/huge/my_page_*或您为应用程序选择的任何文件,并在调用mmap. 这样,您就不会失去空间。

现在要注意了。

  1. 如果此页面被其他应用程序共享并且您的应用程序从崩溃中恢复,那么事情将变得致命。因此,请谨慎使用此解决方案。我建议这样做是因为据我所知,您没有与其他应用程序共享您的页面。

  2. 删除文件后,其他应用程序mmap的巨页在这段时间内还可以分配,您将无法使用巨页。

于 2019-08-29T05:01:14.923 回答