我有以下代码:
mmap(NULL, 2048, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_HUGETLB, -1, 0);
我想知道在我的应用程序异常退出(例如崩溃)之后如何释放大页面。
重新启动计算机将释放所有大页面。但这对生产服务器有一定的干扰。因此,我正在寻找一种不破坏现有流程的方法。
谢谢!
答案 0 :(得分:0)
程序终止时,映射将自动取消映射。
以下声明摘自《 Linux编程接口》一书。
所有进程的映射在其被自动取消映射时 终止或执行exec()。
答案 1 :(得分:0)
这是解决问题的一种可能方法,但不是唯一的方法。
您正在将FD设置为-1来打开mmap
。而是尝试使用以下文件:
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
的大页面才可以分配,您将无法使用大页面。