Ich möchte Speicher auf den riesigen Seiten reservieren, die von einem Linux-Rechner benutzt werden. Ich sehe, dass es zwei Möglichkeiten gibt, dies zu tun, mit mmap
und madvise
.
Das heißt, das MAP_HUGETLB
Flag mit dem mmap
Aufruf verwenden -
Und das MADV_HUGEPAGE
Flag mit dem madvise
Aufruf -
Könnte jemand den Unterschied zwischen den beiden erklären?
Beide Funktionen führen verschiedene Operationen aus, die in Ihrem Kontext von Bedeutung sein können oder nicht:
madvise
setzt eine Markierung für alle Speicherzuordnungen, die der an sie übergebenen Region entsprechen, und teilt dem khugepaged
-Kernel-Thread mit, dass er diese Zuordnungen für die Hochstufung auf große Seiten berücksichtigen kann. Das funktioniert nur, wenn die transparente Unterstützung für riesige Seiten aktiviert ist (Der Status der transparenten Unterstützung für riesige Seiten ist unter /sys/kernel/mm/transparent_hugepage/enabled
verfügbar), was in den meisten Distributionen der Fall sein wird, aber auf eingebetteten Systemen möglicherweise deaktiviert ist.
mmap
wird tatsächlich fortfahren und die Seiten vom internen hugetlbfs
-Monitor des Kerns reservieren, dessen Status unter /sys/kernel/mm/hugepages
zu sehen ist. Die betroffenen Seiten müssen bis zum Aufruf von mmap
verfügbar sein (siehe HugePages_Free
in /proc/meminfo
), oder mmap
wird fehlschlagen.
Die beiden Mechanismen haben ihre eigene doc-Datei in der Kernbaumstruktur: hugetlbpage.txt und transhuge.txt
Tags und Links c linux memory-management mmap huge-pages