Linuxマシンで使用されているhugepagesにメモリを割り当てたい。これを行うには、mmap
とmadvise
を使用する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つの違いを説明できますか?
両方の関数は異なる操作を実行しますが、これはコンテキストで重要な場合と重要でない場合があります。
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