web-dev-qa-db-ja.com

巨大なページにmmapとmadviseを使用する

Linuxマシンで使用されているhugepagesにメモリを割り当てたい。これを行うには、mmapmadviseを使用する2つの方法があることがわかります。

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

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

そして、madvise呼び出しを伴うMADV_HUGEPAGEフラグ-

madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);

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

16
ssb

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

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

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

2つのメカニズムは、カーネルツリーに独自のドキュメントファイルを持っています: hugetlbpage.txt および transhuge.txt

19