2016-12-01 38 views
0

我的程序正在使用巨大的頁面。這樣做,它打開的文件如下:使用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%清理的正確方法。

+0

難道你不能簡單地調用'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,則不需要此類安裝命令。 –

+0

@Andrew:我的程序在不同的進程之間共享內存,所以我需要文件描述符。你的評論是有道理的,我應該在我原來的問題中指出這一點。 – user1159290

+0

假設你的程序會重新創建文件,如果文件在你的進程可能被殺死後被清除,重用現有的'hugetlbfs'文件是否工作?如果你只是重新創建文件,它是否真的很重要,如果它沒有清理? –

回答

1

看起來像O_TMPFILE尚未實現hugetlbfs;事實上,這個選項需要支持的底層文件系統:

O_TMPFILE requires support by the underlying filesystem; only a subset of Linux filesystems provide that support. In the initial implementation, support was provided in the ex2, ext3, ext4, UDF, Minix, and shmem filesystems. XFS support was added in Linux 3.15.

這是通過看內核源代碼中有一個在hugetlbfs的無inode_ops-> TMPFILE()實現證實。

我相信,這裏的正確答案是這個實施工作...


我注意到了有關取消鏈接()選項您的評論,不過,也許下面的方法是不是有風險的:

  • 與TRUNCATE打開文件(名稱)(所以你可以假設它的大小爲0)
  • 取消該關聯
  • mmap()的是與你的目標大小

如果您的程序在中途死亡,最壞的情況是留下一個空文件。

+0

嗯,看起來不正確,真的。你的建議是我現在正在做的。不是我真的很喜歡它,但是...謝謝 – user1159290

相關問題