我的程序正在使用巨大的頁面。這樣做,它打開的文件如下:使用O_TMPFILE清理巨大的頁面或其他方法?
oflags = O_RDWR | O_CREAT | O_TRUNC;
fd = open(filename, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
凡filename
在hugetlb文件系統。 這是有效的。然後我的程序可以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的moint點。 與下面的錯誤失敗(原因我無法解釋):
open failed for /dev/hugepages: Operation not supported
爲什麼?更重要的是:我如何保證我的程序使用的所有大頁面都被釋放了?
是的:我可以捕捉到一些信號(例如SIGTERM
);但不是所有(SIGKILL
)
是:我可以使用第一種方法,但如果open()
和unlink()
之間收到SIGKILL
什麼儘快unlink()
文件。
內核像保證。我也是如此。無論何時或如何終止我的程序,什麼是保證100%清理的正確方法。
難道你不能簡單地調用'mmap(NULL,bytes,PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_HUGETLB,-1,0);'而不是使用'hugetlbfs'文件系統?根據[巨大的TLB文檔](https://www.kernel.org/doc/Documentation/vm/hugetlbpage。txt):「另外,需要注意的是,**如果 應用程序將僅使用shmat/shmget系統調用或mmap與 MAP_HUGETLB,則不需要此類安裝命令。 –
@Andrew:我的程序在不同的進程之間共享內存,所以我需要文件描述符。你的評論是有道理的,我應該在我原來的問題中指出這一點。 – user1159290
假設你的程序會重新創建文件,如果文件在你的進程可能被殺死後被清除,重用現有的'hugetlbfs'文件是否工作?如果你只是重新創建文件,它是否真的很重要,如果它沒有清理? –