我有以下代码:
mmap(NULL, 2048, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, -1, 0);
我想知道在我的应用程序异常退出(例如崩溃)后如何释放大页面。
重新启动机器将释放所有大页面。但这对生产服务器有点破坏性。因此,我正在寻找一种不破坏现有流程的方法。
提前致谢!
我有以下代码:
mmap(NULL, 2048, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, -1, 0);
我想知道在我的应用程序异常退出(例如崩溃)后如何释放大页面。
重新启动机器将释放所有大页面。但这对生产服务器有点破坏性。因此,我正在寻找一种不破坏现有流程的方法。
提前致谢!
当程序终止时,映射将自动取消映射。
以下陈述来自“The Linux Programming Interface”一书。
当进程终止或执行 exec() 时,所有进程的映射都会自动取消映射。
这是解决问题的一种可能方法,但不是唯一的方法。
您在mmap
FD 设置为 -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
. 这样,您就不会失去空间。
现在要注意了。
如果此页面被其他应用程序共享并且您的应用程序从崩溃中恢复,那么事情将变得致命。因此,请谨慎使用此解决方案。我建议这样做是因为据我所知,您没有与其他应用程序共享您的页面。
删除文件后,其他应用程序mmap
的巨页在这段时间内还可以分配,您将无法使用巨页。