免费`mmap()-ed`私人大页

时间:2019-08-29 03:39:35

标签: c linux centos7 mmap huge-pages

我有以下代码:

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

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

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

谢谢!

2 个答案:

答案 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之前删除这些文件。这样,您就不会在空间上迷路。

现在要告诫。

  1. 如果该页面由其他应用程序共享,并且您的应用程序崩溃后退回,则将导致致命事故。因此,请谨慎使用此解决方案。我建议这样做是因为据我所知,您没有与其他应用程序共享页面。

  2. 在删除文件后,这段时间内另一个应用程序mmap的大页面才可以分配,您将无法使用大页面。