áááºáááºážáá¬ážáá»á¬ážá¡ááœáẠááŒááºáááºáá¬ážáá±á¬ áá±á¬ááºážáá«ážááᯠáá¬áá¬ááŒááºááŒááºážá
ááááºáá Linux ááœáẠHugepages ááᯠá
ááºážáááºáááºážááŸáá·áº ááœáá·áºáááºážá¡ááŒá±á¬ááºáž ááŒá±á¬áá²á·áá°ážáááºá
ááá·áºááœáẠHugepages ááᯠá¡ááŸááºááááºá¡áá¯á¶ážááŒá¯ááẠáá±áá¬ááŸáááŸáᬠá€áá±á¬ááºážáá«ážááẠá¡áá¯á¶ážáááºáááºááŒá
áºáááºá Hugepages ááẠáá¯ááºáá¯ááºá
áœááºážá¡á¬ážááᯠá¡á¶á·ááááºážááá¯ážáááºá
á±ááá·áº á¡áá¬ážá¡áá¬ááŒá±á¬áá·áº ááŸáá·áºá
á¬ážáá¶ááá±á¬ áá°áá»á¬ážá
áœá¬ááᯠáá»áœááºá¯ááºááœá±á·áá°ážáá«áááºá ááá¯á·áá±á¬áº á§áá¬áá
á¬áá»ááºááŸá¬ááẠááŸá¯ááºááœá±ážáá±á¬á¡ááŒá±á¬ááºážá¡áá¬ááŒá
áºááŒá®áž ááŸá¬ážááœááºážá
áœá¬á¡áá¯á¶ážááŒá¯áá«á á
áœááºážáá±á¬ááºáááºááᯠáá»áááºážá
á±ááá¯ááºáááºá
á¡ááá¯ááºáž 1- ááŒá®ážáá¬ážáá±á¬á
á¬áá»ááºááŸá¬áá»á¬ážááᯠLinux ááœááºááœáá·áºáá¬ážááẠ(áá°áááºáž áá®ááŸá¬ )
ááŒá¿áá¬:
ááá·áºá
áá
áºááœáẠHugePages ááᯠááœáá·áºáá¬ážááŒááºáž ááŸááááŸá á
á
áºáá±ážááẠááá¯á¡ááºáááºá
ááŒá±ááŸááºážáá»ááº:
áá±á¬áºáá±á¬áºááá¯ážááŸááºážáá«áááº-
cat /sys/kernel/mm/transparent_hugepage/enabled
áááºá€áá²á·ááá¯á·áá±á¬áá áºáá¯áá¯ááá¯ááááá·áºáááº-
always [madvise] never
áááá¯ááºáá±á¬ááœá±ážáá»ááºá áá¬áá»á¬ážá á¬áááºážááᯠáááºááœá±á·áááá·áºááẠ(á¡ááŒá²áááºážá madviseá áááºáá±á¬á·ááŸ) ááŸáá·áº áááºááŸáá¡áá¯á¶ážááŒá¯áá±ááá·áº ááœá±ážáá»ááºááŸá¯á¡á¬áž ááœááºážá á¥áºáá»á¬ážááœáẠááá·áºááœááºážáá¬ážááẠ(áá¯á¶ááŸááºá¡á¬ážááŒáá·áº madvise).
madvise ááá¯ááá¯áááºááŸá¬á transparent hugepages
á§áá¬áá
á¬áá»ááºááŸá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á¡ááá¡áááºáž áá±á¬ááºážááá¯ááá·áº áááºááá¯áá®á§áááá¬áá»á¬ážá¡ááœááºáᬠááœáá·áºáá¬ážáááºá
á¡ááŒá² ááá¯ááá¯áááºááŸá¬á transparent hugepages
áá¯ááºáááºážá
ááºá¡á¬ážáá¯á¶ážá¡ááœáẠá¡ááŒá²ááœáá·áºáá¬ážáááºá áááºážááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº á
áœááºážáá±á¬ááºáááºááᯠááá¯ááá¯áá±á¬ááºážááœááºá
á±áá±á¬áºáááºáž ááá·áºááœáẠáá¯ááºáááºážá
ááºáá»á¬ážá
áœá¬ááẠáááºááá¯áá®ááá¬á á¡áááºážáááºá
á¬ážáá¯á¶ážááá·áº á¡áá¯á¶ážááŒá¯ááŸá¯ááá
á¹á
áá
áºáá¯ááŸááá«áá á¡áá¯á¶ážá
á¯á¶ááŸááºáá¬ááºáááºá¡á¬áž áááááá¬áá¬ááá¯ážáá¬ááá¯ááºáááºá
áááºáá±á¬á·á០ááá¯ááá¯áááºááŸá¬á transparent hugepages
madvise ááᯠá¡áá¯á¶ážááŒá¯á áá±á¬ááºážááá¯ááá·áºááá¯áẠááá«áááºáá«á ááá¯ááá¯ááááŸááááºá áááºááœááºáá«á
áá¯á¶áá±áááºááá¯ážááᯠáááºááá¯ááŒá±á¬ááºážááá²á
option ááᯠ1: ááá¯ááºááá¯ááºááŒá±á¬ááºážáá²áá«á sysfs
(ááŒááºáááºá
áááºááŒá®ážáá±á¬áẠáá«áá¬áá®áá¬ááẠáááºážááá°ááááºááá¯ážááá¯á· ááŒááºááœá¬ážáááá·áºáááº)á
echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled
option ááᯠ2â ááŒá¯ááŒááºáá¬ážáá±á¬ ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááŒáá·áº kernel ááᯠááŒááºáááºáá±á«ááºážá ááºážááŒááºážááŒáá·áº á áá áºáá¯á¶áá±ááᯠááŒá±á¬ááºážáá²áá« (áááºá áááºááŒáá¯áẠkernel ááá¯á¡áá¯á¶ážááŒá¯áá±ááŸáᬠá€ááœá±ážáá»ááºááŸá¯ááᯠá¡ááŒá¶ááŒá¯áá«áááº)á
- á¡ááŒá²áááºáž áá¯á¶áá±áááºááŸááºáááºá á¡áá¯á¶ážááŒá¯áá«-
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
- madvise ááᯠáá°áááºážá¡ááŒá
ẠáááºááŸááºáááºá á¡áá¯á¶ážááŒá¯áá«-
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
á¡ááá¯ááºáž 2- HugePages á á¡á¬ážáá¬áá»ááºáá»á¬ážááŸáá·áº á¡á¬ážáááºážáá»ááºáá»á¬áž
Hugepages ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá á¡á¬ážáá¬áá»ááºá á¡á¬ážáááºážáá»ááºáá»á¬ážááŸáá·áº ááŒá áºááá¯ááºáá»á±ááŸááá±á¬ áá»áá¯á·ááœááºážáá»ááºáá»á¬ážááᯠááœá±ážáá»ááºááŸááºážááŒááẠáá»áœááºá¯ááºááá¯á· ááŒáá¯ážá á¬ážáá«áááºá Hugepages ááẠpanacea ááŒá áºáááºáᯠá¡ááœá±ážáááºáá±áá°áá»á¬ážá¡ááœáẠáááºážááá¬á¡á ááŸá¯ááºááœá±ážááŒá®áž pedantic áá±á¬ááºážáá«ážááẠáá¬ážáááºááẠáááºáá²ááá¯ááºááá·áºá¡ááœááºááŒá±á¬áá·áºá ááá¯ážááŸááºážááŸá¯á¡ááœáẠáááá»ááŸá¯ááᯠáá»áœááºá¯ááºá áœáá·áºááœáŸááºáá«áááºá á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážá áœá¬ááẠá¡ááŸááºááááºááŸá¯ááºááœá±ážááŒá®áž á¡ááœááºááá¯ážááŸááºážááŒá±á¬ááºáž ááŸááºáá¬ážáá¬ážááá·áºáá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠLinux ááá¯á¡áá¯á¶ážááŒá¯ááá·áº 64-bit x86 á áá áºáá»á¬ážá¡ááŒá±á¬ááºážááŒá±á¬áá±ááŒááºážááŒá áºááŒá®ážá á áá áºááẠááœáá·áºáááºážááŒááºáá¬áá±á¬ á á¬áá»ááºááŸá¬áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºáᯠááá¯ážááŸááºážá áœá¬ áá°áááŒááºážááŒá áºááẠ(áááºážááẠááŒá®ážáá¬ážáá±á¬á á¬áá»ááºááŸá¬áá»á¬ážááᯠáááºááá±ážáááŒááºážá á¡á¬ážáááºážáá»ááºááá¯ááºáá±á¬ááŒá±á¬áá·áº)á áá±ááºáá ẠLinux ááá¯ááºážááá¯ááá¯ááœáẠááŒá áºááá²á·ááá¯á·á áááºáááºážáá»ááºá
áá»áœááºá¯ááºááẠá¡á±á¬ááºáá±á¬áºááŒáá« ááá·áºááºáá»á¬ážááœáẠáááºážááá¬ááá¯ááºáᬠá¡áá±ážá áááºáá±á¬áºááŒáá»ááºááᯠáá°ážááœá²áááºááŒáá«áááºá
Virtual Memory
á¡áááºá áááºááẠC++ áááá¯ááááºáá¬áá áºáŠážááŒá áºáá«áá ááŸááºáá¬ááºá¡ááœááºážááŸá á¡áá¬ááá¹áá¯áá»á¬ážááœáẠáá®ážááŒá¬ážááááºá á¬áá»á¬áž (ááœáŸááºááŒáááºááá¯ážáá»á¬áž) ááŸááááºááᯠáááºáááááºá
ááá¯á·áá±á¬áºá á€ááááºá á¬áá»á¬ážááẠááŸááºáá¬ááºá¡ááœááºážááŸá áá¯ááºááá¯ááºážááá¯ááºáá¬ááááºá á¬áá»á¬áž (RAM ááááºá á¬áá»á¬áž) ááᯠáá±á¬ááºááŒááºáááºááẠáááá¯á¡ááºáá«á áááºážááá¯á·ááẠvirtual memory ááŸáááááºá á¬áá»á¬ážááá¯ááá¯ááºá á¬ážááŒá¯áááºá áááá¯áááºáá¬ááœáẠkernel ááẠvirtual memory ááᯠáá¯ááºááá¯ááºážááá¯ááºáá¬áááºáá±áá¬ááá¯á· áá°áá®áá±ážááá·áº á¡áá°áž MMU (memory management unit) module áá áºáá¯ááŸááááºá
á€áááºážáááºážááẠá¡á¬ážáá¬áá»ááºáá»á¬ážá áœá¬ááŸááá±á¬áºáááºáž á¡áá±ážááŒá®ážáá¯á¶ážááŸá¬-
- á áœááºážáá±á¬ááºááẠ(á¡áá»áá¯ážáá»áá¯ážáá±á¬á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá¡ááœááº);
- áááá¯ááááºá¡áá®ážáá»ááºááŒááºážááá¯áááºááŸá¬ á¡ááŒá¬ážáááá¯ááááºáá áºáá¯áááŸááºáá¬ááºá០áááºááá·áºáááá¯ááááºá០ááááºááá¯ááºáá«á
á á¬áá»ááºááŸá¬ááœá±á áá¬ááœá±áá²á
Virtual memory ááᯠá á¬áá»ááºááŸá¬áá»á¬ážá¡ááŒá Ạááá¯ááºážááŒá¬ážáá¬ážáááºá á á¬áá»ááºááŸá¬áá áºáá¯á á®ááá¯ááºážááẠáá®ážááŒá¬ážáá¯ááºááá¯ááºážááá¯ááºáá¬ááŸááºáá¬ááºáá áºáá¯ááá¯á· ááœáŸááºááŒááá¯ááºááŒá®ážá áááºážááẠRAM á¡ááœááºážááŸá á§áááá¬áá áºáá¯ááᯠááœáŸááºááŒááá¯ááºáááºá ááá¯á·ááá¯áẠáá®áá®ááá¯áááºáá²á·ááá¯á·áá±á¬ áá¯ááºááá¯ááºážááá¯ááºáá¬á ááºáá á¹á ááºážáá áºáá¯á¡ááœáẠáááºááŸááºáá¬ážáá±á¬ááááºá á¬ááᯠááœáŸááºááŒááá¯ááºáááºá
RAM ááᯠááœáŸááºáá±ážáá±á¬ á á¬áá»ááºááŸá¬ á¡áá»á¬ážá ᯠááẠááá·áº hard drive (ááá¯á·) SSD ááœáẠááááºážáááºážáá¬áž áááºáᯠááá¯ááá¯áááºá kernel ááẠá á¬áá»ááºááŸá¬áá áºáá¯á á®á áá¯ááºááá¯ááºážááá¯ááºáᬠá¡ááŒááºá¡áááºááᯠá á®áá¶ááá·áºááœá²áááºá á¡áá±á¬ááºáá±á¬ááºáá¬ážáá±á¬ á á¬áá»ááºááŸá¬ááᯠáááºááŒáá·áºáá«áá kernel ááẠmemory ááá¯áááºáá±á¬ááºáááºááŒáá¯ážá á¬ážáá±áá±á¬ thread ááá¯áááºááá·áºááŒá®ážá á á¬áá»ááºááŸá¬ááᯠhard drive/SSD á០RAM ááá¯á·áááºáá¬á ááá¯á·áá±á¬áẠthread ááᯠáááºáááºáá¯ááºáá±á¬ááºáááºá
á€áá¯ááºáááºážá ááºááẠáá±á¬ááºááœááºážááŒááºááá±á¬ááŒá±á¬áá·áº HDD/SSD á០ááá¯ááºááá¯ááºáááºááẠáááá¯á¡ááºáá«á áá¯á¶ááŸááºá á¬áá»ááºááŸá¬áá»á¬ážá á¡ááœááºá¡á á¬ážááŸá¬ 4096 bytes ááŒá áºáááºá ááŒá®ážáá¬ážáá±á¬á á¬áá»ááºááŸá¬á¡ááœááºá¡á á¬ážááŸá¬ 2 megabytes ááŒá áºáááºá
áá¬áá¬ááŒááº-áááºá ááºááŒá¬ážáᶠ(TLB)
áááá¯ááááºáá áºáá¯ááẠáááºááá¯áá®á á¬áá»ááºááŸá¬áá áºáá¯ááᯠáááºáá±á¬ááºááá·áºá¡áá«á CPU á០á¡áá»ááºá¡áááºááá¯áááºááẠáááºááá·áºáá¯ááºááá¯ááºážááá¯ááºáá¬á á¬áá»ááºááŸá¬ááᯠáááááẠ(ááá¯ááá¯áááºááŸá¬á á¡áá¯áá²á·ááááºá á¬ááŒá±áá¯á¶áá áºáá¯áá«ááŸááááº)á
kernel ááœáẠá¡áá¯á¶ážááŒá¯áá±ááá·áº á á¬áá»ááºááŸá¬áá»á¬ážááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºá¡á¬ážáá¯á¶ážáá«áááºááá·áº áá±áá¬ááœá²á·á ááºážáá¯á¶ (á á¬áá»ááºááŸá¬ááá¬áž) ááŸááááºá á€áá±áá¬ááœá²á·á ááºážáá¯á¶ááᯠá¡áá¯á¶ážááŒá¯á áááºááẠvirtual ááááºá á¬áá áºáá¯á¡á¬áž áá¯ááºááá¯ááºážááá¯ááºáá¬ááááºá á¬áá áºáá¯ááá¯á· ááŒá±áá¯á¶ááœá²ááá¯ááºáá«áááºá
ááá¯á·áá±á¬áºá á á¬áá»ááºááŸá¬ááá¬ážááẠá¡ááœááºááŸá¯ááºááœá±ážááŒá®áž ááŸá±ážáá±á¬ááŒá±á¬áá·áº áá¯ááºáááºážá ááºáá áºáá¯ááẠmemory ááá¯áááºáá±á¬ááºááá·áºá¡áá«ááá¯ááºáž áá±áá¬ááœá²á·á ááºážáá¯á¶áá áºáá¯áá¯á¶ážááᯠááœá²ááŒááºážá áááºááŒá¬ááááá«á
áá¶áá±á¬ááºážáá±á¬ááºáá áœá¬á áá»áœááºá¯ááºááá¯á·ááááá¯áááºáá¬ááœáẠvirtual ááŸáá·áº áá¯ááºááá¯ááºážááá¯ááºáá¬ááááºá á¬áá»á¬ážááŒá¬ážááœáẠááŒá±áá¯á¶áá¯ááºááŒááºážááᯠááááºážáááºážáá¬ážááá·áº TLB áá áºáá¯ááŸááááºá ááá¯ááá¯áááºááŸá¬ áá»áœááºá¯ááºááá¯á·ááẠááááá¯á¶ážáááºáá±á¬ááºáááºááŒáá¯ážáááºážááŸá¯ááœáẠá á¬áá»ááºááŸá¬ááá¬ážááᯠááœá²ááŒááºážá áááºááŒá¬ááẠááá¯á¡ááºáá±á¬áºáááºážá á á¬áá»ááºááŸá¬ááá¯á· áá±á¬ááºáááºááœá²áááºáá±á¬ááºááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠTLB ááœáẠááá¯ááºááœááºááá¯ááºááŒá®áž áá»ááºááŒááºá áœá¬áá¯ááºáá±á¬ááºááá¯ááºá á±áááºááŒá áºáááºá
áááºážááᯠáá¯ááºááá¯ááºážááá¯ááºáᬠáááááá¬áá áºáá¯á¡ááŒá Ạá¡áá±á¬ááºá¡áááºáá±á¬áºáá¬ážáá±á¬ááŒá±á¬áá·áº (áááºážááᯠááááá±áá¬ááœáẠáá»ááºááŒááºá á±áááº)á áááºážáá áœááºážáááºááŸá¬ á¡ááá·áºá¡áááºááŸááááºá ááá¯á·ááŒá±á¬áá·áº áááºááẠáá±á¬ááºáááºá á¬áá»ááºááŸá¬áá»á¬ážááᯠáááºáá±á¬ááºááŒáá·áºááŸá¯ááá¯áá«áá TLB ááẠáááºážááá¯á·á¡á¬ážáá¯á¶ážá¡ááœáẠááŒá±áá¯á¶ááœá²ááŒááºážááᯠááááºážáááºážáá¬ážááá¯ááºáááºááá¯ááºáá±á¬ááŒá±á¬áá·áº áááºááááá¯ááááºááᯠáá»á¬ážá áœá¬ááŸá±ážááœá±ážááœá¬ážá á±áá«áááºá
á§áá¬áá á¬áá»ááºááŸá¬áá»á¬ážááẠáááºáááºááŒááºážááá¯á· áá±á¬ááºáá«áááºá
áá®áá±á¬á· TLB áá»áŸá¶áá»ááŸá¯ááᯠááŸá±á¬ááºááŸá¬ážááá¯á· áá»áœááºá¯ááºááá¯á· áá¬áá¯ááºááá¯ááºááá²á (áááá¯ááááºááẠáá°áá®áá±á¬ ááŸááºáá¬ááºááá¬á ááá¯á¡ááºáá±áá±ážáááºáᯠáá»áœááºá¯ááºááá¯á· áá°ááááº)á
á€áááºááŸá¬ Hugepages áááºáá¬áááºá TLB ááá·áºááœááºážááŸá¯áá áºáá¯áᬠááá¯á¡ááºááá·áº 4096 bytes á¡á á¬áž TLB áá áºáá¯ááẠááá¯á¡áá« á¡ááœááºááŒá®ážáá¬ážáá±á¬ 2 megabytes ááᯠááœáŸááºááŒááá¯ááºááŒá®ááŒá áºáááºá TLB ááœáẠááá·áºááœááºážááŸá¯ 512 áá¯ááŸááááºáᯠáá°áááŒáá«á áá¯á·á á€áá±áá¬ááœáẠHugepages ááá«áá² áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºáá®ááá¯ááºáááº-
4096 bâ
512=2 MB
ááá¯á·ááá¯áá»áŸáẠáááºážááá¯á·ááŸáá·áº áá»áœááºá¯ááºááá¯á· áááºááá¯á· ááŸáá¯ááºážááŸááºááá¯ááºáááºáááºážá
2 MBâ
512=1 GB
á¡á²áá«ááŒá±á¬áá·áº Hugepages á á¡áááºážááá¯ááºáááºá á¡á¬ážá áá¯ááºáá¯ááºá áá¬áááá¯áá² áá¯ááºáá¯ááºá áœááºážá¡á¬ážááᯠááŒáŸáá·áºáááºááá¯ááºáá«áááºá áá«áá±ááá·áº áá®áá±áá¬ááŸá¬ áááá¬áááºááŸá¬ážáá²á· ááááá±ážáá»ááºááœá±ááŸááááºá
á§áá¬áá á¬áá»ááºááŸá¬áá»á¬áž á¡áá¯á¡áá±á¬ááº
áá¬áááºááẠáááºááá¯áá®á
á¬áá»ááºááŸá¬áá
áºáá¯á
á®ááᯠáááºáá»áŸá¡áá¯á¶ážááŒá¯áááºááᯠá¡ááá¯á¡áá»á±á¬áẠá
á±á¬áá·áºááŒáá·áºáááºá áá¯ááºááá¯ááºážááá¯ááºáá¬ááŸááºáá¬áẠ(RAM) á¡áá¯á¶á¡áá±á¬ááºáááŸááá«áá kernel ááẠááá¯á¡áá±ážááŒá®ážáá±á¬á
á¬áá»ááºááŸá¬áá»á¬ážá¡ááœáẠRAM á¡áá»áá¯á·ááᯠááŸááºážáá¯ááºáááºá¡ááœáẠáá¬á·ááºáá
áºááœáẠá¡áá±ážááŒá®ážáá±á¬ áá»á±á¬á·áááºážáá±á¬ (áááŒá¬áá á¡áá¯á¶ážáááºážáá±á¬) á
á¬áá»ááºááŸá¬áá»á¬ážááᯠááœáŸá±á·áá«áááºá
áá°á¡áá Hugepages ááŸáá·áº á¡áá¬ážáá°áááºá ááá¯á·áá±á¬áºá kernel ááẠá
á¬áá»ááºááŸá¬áá
áºáá¯áá¯á¶ážááá¯áᬠáá²ááŸááºááá¯ááºááŒá®áž áá
áºáŠážáá»ááºáž bytes ááá¯ááºáá«á
áá»áœááºá¯ááºááá¯á·ááœáẠá€áá²á·ááá¯á·áá±á¬ á¡á á®á¡á ááºáá áºáá¯ááŸáááẠááá¯ááŒáá«á áá¯á·á
char* mymemory = malloc(2*1024*1024); // ÐПзÑЌеЌ ÑÑП за ÐŸÐŽÐœÑ Hugepage!
// ÐапПлМОЌ mymemory какОЌО-лОбП ЎаММÑЌО
// СЎелаеЌ ЌМПгП ÐŽÑÑгОÑ
веÑей,
// кПÑПÑÑе пÑОвеЎÑÑ Ðº пПЎЌеМе ÑÑÑаМОÑÑ mymemory
// ...
// ÐапÑПÑОЌ ЎПÑÑÑп ÑПлÑкП к пеÑÐ²ÐŸÐŒÑ Ð±Ð°Ð¹ÑÑ
putchar(mymemory[0]);
á€ááá á¹á ááœááºá kernel ááẠáááºáá áºááá¯ááºááá¯áááºáááºá¡ááœáẠhard drive/SSD á០á¡áá»ááºá¡ááẠ2 megabytes áá±á¬ááºá¡áá (áááºáááº) ááá¯á¡ááºáááºááŒá áºáááºá áá¯á¶ááŸááºá á¬áá»ááºááŸá¬áá»á¬ážá¡ááœáẠ4096 bytes ááá¯áᬠhard drive/SSD á០áááºááẠááá¯á¡ááºáááºá
ááá¯á·ááŒá±á¬áá·áº á§áá¬áá á¬áá»ááºááŸá¬ááᯠááœáŸááºážááá¯ážáá¬ážáá»áŸáẠá á¬áá»ááºááŸá¬áá áºáá¯áá¯á¶ážááᯠáááºáá±á¬ááºááŒáá·áºááŸá¯ááẠááá¯á¡ááºáá«á áááºááẠááá¯ááŒááºáá«áááºá ááá¯ááá¯áááºááŸá¬ áááºááẠáááºááá¯áá®á ááá°áá®áá±á¬ á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠáá»áááºážáááºáá±á¬ááºááẠááŒáá¯ážá á¬ážáá±ááŒá®áž áá®ááá¯ááá¯ááºá¡áááºážáááºáᬠáááºáá±áá«áá áááºááẠáá¯á¶ááŸááºá á¬áá»ááºááŸá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒá®áž á¡ááŒá¬ážáááºááá·áºá¡áá¬ááá¯áá»áŸ á áááºááá°áá«ááŸáá·áºá
á¡ááŒá¬ážáá áºáááºááœááºá áááºááẠmemory áááŒá®ážáá¬ážáá±á¬á¡á áááºá¡ááá¯ááºážááᯠáááºááá¯ááºáááºáá±á¬ááºááẠááá¯á¡ááºáá«áá á§áá¬áá á¬áá»ááºááŸá¬áá»á¬ážááẠáááºáá áœááºážáá±á¬ááºáááºááᯠááá¯ážáááºá á±áááºááŒá áºáááºá ááá¯á·áá±á¬áºá áááºááẠáááºážááᯠááá¯ááºááá¯ááºá ááºážáááºááẠááá¯á¡ááºááẠ( abstract software ááŒáá·áº ááá¯ááºáá²) ááŸáá·áº áááºááá·áºá¡áá¬á ááá¯ááŒááºáááºááᯠááŒáá·áºááẠááá¯á¡ááºáááºá
ááŸááºáá¬ááºááœáẠááœá²áá±ááŒááºážá
ááẠC áá±ážáá«áá áááºááẠáá±ážáááºáá±á¬ (ááá¯á·ááá¯áẠááá¯ááºáááºá
á®ážáááºážáá®ážáá«áž) memory ááá¬áááᯠá¡á
á¯á¡áá±ážá០ááá¯ááºáááºá
á®ážáááºáž áá±á¬ááºážááá¯ááá¯ááºáááºááᯠáááºáááá«áááºá malloc()
. 30 bytes memory ááá¯áááºááá¯áá«á
áá¯á·á
char* mymemory = malloc(30);
áááá¯ááááºáá¬áá
áºáŠážá¡ááœáẠáááºááẠáááºáááºááŸá¯á
áá
áºá០áááºááá¯áá® 30 bytes ááᯠ"áá±á¬ááºážááá¯áá±áááº" ááŸáá·áº pointer áá
áºáá¯ááᯠvirtual memory á¡áá»áá¯á·ááá¯á· ááŒááºáá±ážáá±ááŒá±á¬ááºáž áá±á«áºáá¬ááá¯ááºáááºá áá«áá±ááá·áº ááááºáá±á¬á· malloc ()
function ááẠfunction á¡ááœááºážááŸáá±á«áºááá¯áá±á¬ C function áá
áºáá¯ááŒá
áºáááºá
ááá¯á·áá¬ááœááºá ááœá²áá±ááŸá¯áá
áºáá¯á
á®á¡ááœáẠááŸááºáá¬ááºááá¯áá»á¬ážáá¬ááẠáá±á¬ááºážááá¯ááŒááºážááẠáááá±á¬ááºááŸá¯áááŸááá«á á¡áá»áá¯á·áá±á¬ memory segment ááẠááœááºááŒá±á¬ááºááŒá®ážááŒá
áºááœááºááŸááááºá (free())
ááŒá®ážáá±á¬á· á¡á²áá«ááᯠááŒááºáá¯á¶ážááá¯á·ááááºá malloc()
ááœááºáááºáá±á¬ááŸááºáá¬ááºááᯠááŒááºáááºá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠá¡ááœááºááŸá¯ááºááœá±ážáá±á¬ á¡ááºáááá¯áá®áááºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºá
áá
áºáá»áááºáááºážááŸá¬ááẠá¡áá¬á¡á¬ážáá¯á¶ážááẠááá·áºá¡ááœáẠááááááŒá¯áááá² ááŒá
áºáá±áááºá ááá¯á·ááŒá±á¬áá·áº ááá·áºá¡ááœáẠá¡áááºááŒá±á¬áá·áº á
áááºáá°ááááºáááºážá áá«áá±áá²á· á¡áááºá¡áá²ááŸáááá¯á· free()
ááá¯ááá¯áá¬ááá¯ááºáá«áá°ážá
Memory Fragmentation ááá¯áá¬áá»áá¯ážááŸááááºá ááœááºáá²áá±á¬ á¡ááŒá±á¡áá±áá»á¬ážááœááºá ááá¯ááºá¡áááºážáááºáᬠá¡áá¯á¶ážááŒá¯ááá·áº á¡á
á¯á¡áá±ážáá»á¬áž ááŸáááŒá®áž ááŒá¬ážááŸáá¡áá¬á¡á¬ážáá¯á¶áž ááœááºááŒá±á¬ááºááœá¬ážáá»áááºááœááºá (free())
.
ááŸááºáá¬ááºá¡ááá¯ááºážááá¯ááºážááœá²ááŒááºážááẠááá¯á¶ááá¯ááºáá±á¬ááºá¡á±á¬áẠááŸá¯ááºááœá±ážáá±á¬á¡ááŒá±á¬ááºážá¡áá¬áá áºáá¯ááŒá áºááŒá®áž áááá¯ááááºáá áºáá¯ááá¯á· á¡áá±ážá á¬ážááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠáááááá¬áá¬á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááŸáááá¯ááºáááºááᯠáááááŒá¯áá«á ááá á¹á á¡áá»á¬ážá á¯ááœááºá áááá¯ááááºáá»á¬ážááẠáááá¬áááºááŸá¬ážáá±á¬ ááŸááºáá¬ááºá¡ááá¯ááºážá¡á áá»á¬ážááᯠáááŒá áºáá±á«áºá á±áá±á¬áºáááºáž á¡ááŸáá¯ááºáá¯á¶áá¡áá»áá¯á·áá±áá¬áá»á¬ážááœáẠá¡ááœá²ááœá²á¡ááŒá¬ážááŒá¬ážááŒá¿áá¬ááŸááá»áŸáẠááŒá®ážáá¬ážáá±á¬á á¬áá»ááºááŸá¬áá»á¬ážááẠá¡ááŒá±á¡áá±ááᯠááá¯ááá¯ážá á±ááá¯ááºááŒá±á¬ááºáž áááááŒá¯ááá·áºáááºá
á§áá¬áá á¬áá»ááºááŸá¬áá»á¬ážááᯠááœá±ážáá»ááºá¡áá¯á¶ážááŒá¯ááŒááºážá
á€áá±á¬ááºážáá«ážááá¯áááºááŒá®ážáá±á¬ááºá ááá·áºáááá¯ááááºá áááºááá·áºá¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠá á¬áá»ááºááŸá¬á¡ááŒá®ážááŒá®ážáá¯á¶ážááŒááºážá០á¡áá»áá¯ážáá»á±ážáá°ážáááŸáááá¯ááºááŒá®áž áááºááá·áºá¡áá¬á ááá¯ááºááá¯ááºáááºááᯠáááºáá¯á¶ážááŒááºááŒá®ážááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áº á§áá¬áá á¬áá»ááºááŸá¬áá»á¬ážááᯠáá¯á¶ážáááœáá·áºáá¬ážááá·áºáá«ááá¬ážá
áá¶áá±á¬ááºážá
áœá¬áááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá madvise()
áááºážááẠá¡áá¯á¶ážáááºááá·áº ááᯠmemory á§áááá¬áá»á¬ážá¡ááœááºáᬠá§áá¬áá
á¬áá»ááºááŸá¬ááᯠááœáá·áºáááºá
ááááŠážá
áœá¬á á§áá¬áá
á¬áá»ááºááŸá¬áá»á¬ážááᯠmadvise() áá¯ááºááá¯á¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºáá±ááŒá±á¬ááºáž á
á
áºáá±ážáá«á
ááá¯á·áá±á¬ááºá¡áá¯á¶ážááŒá¯áá«á madvise()
á§áá¬áá
á¬áá»ááºááŸá¬áá»á¬ážááᯠáááºááá·áºáá±áá¬ááœáẠá¡áá¯á¶ážááŒá¯ááááºááᯠkernel á¡á¬áž á¡ááá¡áá»ááŒá±á¬ááŒáááºá
#include <sys/mman.h>
// ÐллПÑОÑÑйÑе бПлÑÑПе кПлОÑеÑÑвП паЌÑÑО, кПÑПÑÑÑ Ð±ÑЎеÑе ОÑпПлÑзПваÑÑ
size_t size = 256*1024*1024;
char* mymemory = malloc(size);
// ÐÑПÑÑП вклÑÑОÑе hugepagesâŠ
madvise(mymemory, size, MADV_HUGEPAGE);
// ⊠О заЎайÑе ÑлеЎÑÑÑее
madvise(mymemory, size, MADV_HUGEPAGE | MADV_SEQUENTIAL)
á€áááºážáááºážááẠááŸááºáá¬ááºááᯠá á®áá¶ááá·áºááœá²áááºážá¡ááœáẠkernel á¡ááœáẠááá¯ážááá¯ážááŸááºážááŸááºáž á¡ááŒá¶áá¬ááºááŒá áºááŒá±á¬ááºáž áááááŒá¯áá«á áááºážááẠkernel ááẠáá±ážáá¬ážáá±á¬ memory á¡ááœáẠá§áá¬áá á¬áá»ááºááŸá¬áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠá¡áá¯á¶ážááŒá¯áááºáᯠáááá¯ááá¯áá«á
á
á¬ááœááºá
á¬áááºážáá»á¬ážááá¯ááá¯ážáá¬ážáá«á madvise()
á€á¡ááŒá±á¬ááºážá¡áá¬ááẠááá¯á¶ááá¯ááºáá±á¬ááºá¡á±á¬áẠáááºáá²áá±á¬ áááºáá°ááŸá¯áá»ááºáž ááŸááááºá áá«ááŒá±á¬áá·áº áááºááááºáá±á¬ááºážáá±á¬ááºážáááºááá¯á· áááºááœááºáá¬ážáááºááá¯ááẠá¡ááŒá¯ááá±á¬áá±á¬ááºáá²á· ááááºááœá±ááᯠááá»áŸá±á¬áºááá·áºááẠáááºááá¹ááááºá¡áááºážáááºáá±á¬áẠáááºááŒá®áž á
ááºážáááºááá¯á· ááŒááºáááºáá«á
áá¬áááºáááá²á
á§áá¬áá á¬áá»ááºááŸá¬áá»á¬ážááœáẠIBM OpenStack áá±á¬ááºážáá«áž áá±á¬ááºááœááºážááŒááºááá±á¬ ááŒá®ážáá¬ážáá±á¬á á¬áá»ááºááŸá¬áá»á¬ážááŸáá·áº ááœáá·áºáááºážááŒááºáá¬ááŸá¯áááŸááá±á¬ á á¬áá»ááºááŸá¬ááŒá®ážáá»á¬áž TLB á¡ááŒá±á¬ááºáž Wikipedia áá±á¬ááºážáá«áž ááœáá·áºáááºážááŒááºáá¬áá±á¬á á¬áá»ááºááŸá¬áá»á¬ážááœáẠLinux kernel á á¬ááœááºá á¬áááºáž StackOverflow- ááŒá®ážáá¬ážáá±á¬á á¬áá»ááºááŸá¬áá»á¬ážááẠááŸááºáá¬ááºááœá²ááœá²ááŒááºážááá¯á· áá»áá±á¬ááºáááºáááºá Microsoft á virtual memory management á¡ááŒá±á¬ááºáž áá±á¬ááºážáá«áž
áá±ážá áá¬ááŸááá¬ážá ááŸááºáá»ááºáá»á¬ážááœááºáá±ážáá«á
source: www.habr.com