26

Linux マシンで使用されているヒュージページにメモリを割り当てたいと考えています。mmapこれを行うには、とを使用する 2 つの方法があることがわかりますmadvise

つまり、呼び出しでMAP_HUGETLBフラグを使用する -mmap

base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);

そして、コールのMADV_HUGEPAGEフラグ-madvise

madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);

誰かが2つの違いを説明できますか?

4

1 に答える 1

26

どちらの関数も異なる操作を実行しますが、これはコンテキストで重要な場合とそうでない場合があります。

  • madvise渡された領域に対応するすべてのメモリ マッピングのフラグを設定し、ヒュージkhugepagedページへの昇格のために前述のマッピングを考慮することができることをカーネル スレッドに伝えます。これは、transparent hugepage サポートが有効になっている場合にのみ機能します (transparent hugepage サポートのステータスは で利用可能です/sys/kernel/mm/transparent_hugepage/enabled)。これはほとんどのディストリビューションに当てはまりますが、組み込みシステムでは無効になっている場合があります。

  • mmapは実際に先に進み、カーネルの内部hugetlbfsマウントからページを予約します。そのステータスは で確認できます/sys/kernel/mm/hugepages。問題のページは、mmap呼び出されるまでに使用可能である必要があり( を参照)、そうでない場合は失敗します。HugePages_Free/proc/meminfommap

2 つのメカニズムには、カーネル ツリーに独自の doc ファイルがあります: hugetlbpage.txttranshuge.txt

于 2015-05-27T04:48:56.207 に答える