0

ラージページと連続した通常ページを取得することは可能ですか?

ランタイムを作成していて、単一の 4K ガード ページで 2M スタックを作成したいと考えています。そして、それぞれ 10 個のスレッドを持つ 10 個のプロセスに拡張する必要があります。

TLB ミスのために 2 メガ ページを使用することを考慮すると、これは通常 C / C++ では問題になりませんが、領域分析では、スタック上のデータ (領域全体) が増えるため、ホットな最後のページだけではありません。

ベン

4

1 に答える 1

1

Linux について言えば、大きなページを割り当てた後、通常どおり割り当てられた小さな領域を割り当てることは、それ自体確かに可能です。

mmap(base, 1 << 21, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED, -1, 0);
mmap(base + (1 << 21), 1 << 12, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);

ただし、カーネルにアドレスを適切に管理させて、それに続く空きページが保証されているようなアドレスを見つけながら、自動的にアドレスを割り当てさせる方法はほとんどないと思います。アドレス割り当てを手動で行う必要があります。

編集: 実際には、そのステートメントを修正する必要があります。少なくとも同時に割り当てを行う可能性のある複数のスレッドを実行していない限り、その保証を得るかなり簡単な方法があります。2 つの大きなページを割り当て、後者の割り当てを解除し、空いているスペースに小さなページを割り当てるだけです。

p = mmap(NULL, 2 << 21, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
mremap(p, 2 << 21, 1 << 21, 0);
mmap(p + (1 << 21), 1 << 12, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
于 2013-11-01T00:45:32.767 に答える