1

私のプログラムは巨大なページを使用しています。実行するには、次のようにファイルを開きます。

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% のクリーンアップを保証する適切な方法は何ですか。

4

1 に答える 1

1

hugetlbfs には O_TMPFILE がまだ実装されていないようです。実際、このオプションには下層のファイルシステムのサポートが必要です:

O_TMPFILE は、基礎となるファイルシステムによるサポートを必要とします。Linux ファイルシステムのサブセットのみがそのサポートを提供します。最初の実装では、サポートは ex2、ext3、ext4、UDF、Minix、および shmem ファイルシステムで提供されました。XFS サポートは Linux 3.15 で追加されました。

これは、hugetlbfs にinode_ops->tmpfile()実装がないカーネル ソース コードを調べることで確認できます。

ここでの正しい答えは、この実装に取り​​組むことだと思います...


unlink() オプションに関するあなたのコメントに気づきましたが、おそらく次のアプローチはそれほど危険ではありません。

  • TRUNCATE を使用して (名前で) ファイルを開きます (そのため、サイズが 0 であると想定できます)
  • リンクを解除する
  • mmap() ターゲットサイズで

プログラムが途中で強制終了された場合、最悪のケースは空のファイルを残すことです。

于 2016-12-01T16:14:37.190 に答える