私のプログラムは巨大なページを使用しています。実行するには、次のようにファイルを開きます。
oflags = O_RDWR | O_CREAT | O_TRUNC;
fd = open(filename, oflag, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
hugetlbfilename
ファイル システム内の場所。それはうまくいきます。私のプログラムは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% のクリーンアップを保証する適切な方法は何ですか。