我的程序正在使用大页面。为此,它打开文件如下:
oflags = O_RDWR | O_CREAT | O_TRUNC;
fd = open(filename, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
hugetlb 文件系统在哪里filename
。这样可行。然后我的程序可以mmap()
创建文件描述符。但是如果我的程序被杀死,文件仍然存在......并且在大页面文件系统中,剩余文件被阻塞内存,如以下命令所示(876!= 1024):
cat /proc/meminfo | grep Huge
AnonHugePages: 741376 kB
HugePages_Total: 1024
HugePages_Free: 876
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
因此,由于我的程序没有将文件共享给其他任何人,因此使用 O_TMPFILE 标志创建临时文件对我来说是有意义的。所以我尝试了:
oflags = O_RDWR | O_TMPFILE;
fd = open(pathname, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
其中 pathname 是hugetlbfs 的点。失败(由于我无法解释的原因)并出现以下错误:
open failed for /dev/hugepages: Operation not supported
为什么?更重要的是:如何保证我的程序正在使用的所有大页面都被释放?
是的:我可以捕捉到一些信号(例如SIGTERM
);但不是全部 ( SIGKILL
)
是的:我可以unlink()
使用第一种方法尽快获得文件,但是如果在和SIGKILL
之间收到怎么办?open()
unlink()
内核喜欢保证。我也是。无论我的程序何时或如何终止,保证 100% 清理的正确方法是什么。