เบ‚เปเป‰เบ”เบตเปเบฅเบฐเบ‚เปเป‰เป€เบชเบเบ‚เบญเบ‡ HugePages

เบ‚เปเป‰เบ”เบตเปเบฅเบฐเบ‚เปเป‰เป€เบชเบเบ‚เบญเบ‡ HugePages

เบเบฒเบ™โ€‹เปเบ›โ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบเบฐโ€‹เบเบฝเบกโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ™เบฑเบโ€‹เบฎเบฝเบ™โ€‹เบซเบผเบฑเบโ€‹เบชเบนเบ”โ€‹ "เบœเบนเป‰เป€เบšเบดเปˆเบ‡เปเบเบ‡เบฅเบฐเบšเบปเบš Linux".

เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเป€เบ›เบตเบ”เปƒเบŠเป‰ Hugepages เปƒเบ™ Linux.
เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบกเบตเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ Hugepages. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบปเบšเบเบฑเบšเบซเบผเบฒเบเป†เบ„เบปเบ™เบ—เบตเปˆเบ–เบทเบเบซเบฅเบญเบเบฅเบงเบ‡เป‚เบ”เบเบ„เบงเบฒเบกเบชเบปเบ”เปƒเบชเบ”เป‰เบฒเบ™เบ—เบตเปˆ Hugepages เบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบขเปˆเบฒเบ‡เบกเบฐเบซเบฑเบ”เบชเบฐเบˆเบฑเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, hugepaging เป€เบ›เบฑเบ™เบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบฅเบปเบ‡เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡.

เบชเปˆเบงเบ™เบ—เบต 1: เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบงเปˆเบฒเปœเป‰เบฒเปƒเบซเบเปˆเบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เปƒเบ™ Linux (เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš เบ—เบตเปˆเบ™เบตเป‰)

เบšเบฑเบ™เบซเบฒ:
เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒ HugePages เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เบขเบนเปˆเปƒเบ™เบฅเบฐเบšเบปเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบเบฒเบ™เปเบเป‰เป„เบ‚:
เบกเบฑเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ:

cat /sys/kernel/mm/transparent_hugepage/enabled

เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

always [madvise] never

เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบฅเบฒเบเบเบฒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบกเบต (เบชเบฐเป€เบซเบกเบต, madvise, เบšเปเปˆเป€เบ„เบตเบ), เปเบฅเบฐเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบˆเบฐเบ–เบทเบเบซเบธเป‰เบกเบขเบนเปˆเปƒเบ™เบงเบปเบ‡เป€เบฅเบฑเบš (เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ Madvise).

Madvise เปเบฒเบ เบ„เบงเบฒเบกเบงเปˆเบฒ transparent hugepages เป€เบ›เบตเบ”เปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบกเบตเบซเบ™เป‰เบฒเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป‚เบ”เบเปƒเบŠเป‰ Madvise(2).

เบชเบฐเป€เบซเบกเบตเป„เบ› เปเบฒเบ เบ„เบงเบฒเบกเบงเปˆเบฒ transparent hugepages เป€เบ›เบตเบ”เปƒเบŠเป‰เบ‡เบฒเบ™เบชเบฐเป€เปเบตเบชเปเบฒเบฅเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบฑเบ‡เปเบปเบ”. เบ™เบตเป‰เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบ›เบฑเบšเบ›เบธเบ‡เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เปเบ•เปˆเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบกเบตเบเปเบฅเบฐเบ™เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบเปเบฒเบฅเบฑเบ‡เบšเปเบฅเบดเป‚เบžเบเบˆเปเบฒเบ™เบงเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เป‚เบซเบผเบ”เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเป‚เบ”เบเบฅเบงเบกเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ.

เบšเปเปˆเป€เบ„เบตเบ เปเบฒเบ เบ„เบงเบฒเบกเบงเปˆเบฒ transparent hugepages เบˆเบฐเบšเปเปˆเบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบˆเบฐเบ–เบทเบเบฎเป‰เบญเบ‡เบ‚เปเป‚เบ”เบเปƒเบŠเป‰ madvise. เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ•เบดเบ”เบ•เปเปˆ เป€เบญเบเบฐเบชเบฒเบ™ Linux kernels.

เบงเบดเบ—เบตเบเบฒเบ™เบ›เปˆเบฝเบ™เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™

Option 1: เบ›เปˆเบฝเบ™เปเบ›เบ‡เป‚เบ”เบเบเบปเบ‡ sysfs (เบซเบผเบฑเบ‡เบˆเบฒเบ reboot เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบˆเบฐเบเบฑเบšเบ„เบทเบ™เป„เบ›เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบกเบฑเบ™):

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. เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเปเบฅเบฐ pedantic เบญเบฒเบ”เบˆเบฐเบเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบ–เบทเบเบซเบผเบญเบเบฅเบงเบ‡เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ Hugepages เปเบกเปˆเบ™ panacea, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบชเบเบชเบฐเบฅเบฐเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบ. เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบซเบผเบฒเบเบซเบปเบงเบ‚เปเป‰เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เปเบ—เป‰เป†เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ.

เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบš 64-bit x86 เบ—เบตเปˆเปƒเบŠเป‰ Linux, เปเบฅเบฐเบ‚เป‰เบญเบเบžเบฝเบ‡เปเบ•เปˆเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบฅเบฐเบšเบปเบšเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ—เบตเปˆเป‚เบ›เปˆเบ‡เปƒเบช (เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบ‚เปเป‰เป€เบชเบเบ—เบตเปˆ hugepages เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เบ—เบฑเบš), เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเป€เบเบทเบญเบšเบ—เบธเบ Linux เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก. เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบ„เบฑเบ”เบ•เบดเบ”เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

เปœเปˆเบงเบเบ„เบงเบฒเบกเบˆเบณเบชเบฐเป€เปเบทเบญเบ™

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบ›เบฑเบ™เป‚เบ›เบฅเปเบเบฅเบก C++, เบ—เปˆเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒเบงเบฑเบ”เบ–เบธเปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบกเบตเบ—เบตเปˆเบขเบนเปˆเบชเบฐเป€เบžเบฒเบฐ (เบ„เปˆเบฒเบ•เบปเบงเบŠเบตเป‰).

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ—เบตเปˆเบขเบนเปˆเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบฐเบ—เป‰เบญเบ™เป€เบ–เบดเบ‡เบ—เบตเปˆเบขเบนเปˆเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ (เบ—เบตเปˆเบขเบนเปˆ RAM). เบžเบงเบเป€เบ‚เบปเบฒเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ virtual. เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบกเบตเป‚เบกเบ”เบนเบ™ MMU เบžเบดเป€เบชเบ” (เบซเบ™เปˆเบงเบเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ) เบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰ kernel เปเบœเบ™เบ—เบตเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ virtual เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบ.

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบกเบตเบ‚เปเป‰เบ”เบตเบซเบผเบฒเบ, เปเบ•เปˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™:

  • เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” (เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ•เปˆเบฒเบ‡เป†);
  • เบเบฒเบ™เปเบเบเป‚เบ„เบ‡เบเบฒเบ™, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบšเปเปˆเบกเบตเป‚เบ›เบฅเปเบเบฅเบกเปƒเบ”เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบˆเบฒเบเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ‚เบญเบ‡เป‚เบ›เปเบเบผเบกเบญเบทเปˆเบ™.

เปœเป‰เบฒเปเบกเปˆเบ™เบซเบเบฑเบ‡?

เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ virtual เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบซเบ™เป‰เบฒ. เปเบ•เปˆเบฅเบฐเบซเบ™เป‰เบฒเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเบชเบฐเป€เบžเบฒเบฐ, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบŠเบตเป‰เป„เบ›เบซเบฒเบžเบทเป‰เบ™เบ—เบตเปˆเปƒเบ™ RAM, เบซเบผเบทเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบŠเบตเป‰เป„เบ›เบซเบฒเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบเบฑเบšเบญเบธเบ›เบฐเบเบญเบ™เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเป€เบŠเบฑเปˆเบ™เบšเบฑเบ”เบงเบตเบ”เบตเป‚เบญ.

เบซเบ™เป‰เบฒเบชเปˆเบงเบ™เปƒเบซเบเปˆเบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบˆเบธเบ”เบ—เบตเปˆ RAM เบซเบผเบทเบ–เบทเบเบ›เปˆเบฝเบ™, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบžเบงเบเบกเบฑเบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบฎเบฒเบ”เป„เบ”เบซเบผเบท SSD เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. kernel เบˆเบฑเบ”เบเบฒเบ™เบฎเบนเบšเปเบšเบšเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบซเบ™เป‰เบฒ. เบ–เป‰เบฒเบซเบ™เป‰เบฒ spoofed เบ–เบทเบเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡, kernel เบˆเบฐเบขเบธเบ” thread เบ—เบตเปˆเบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ, เบญเปˆเบฒเบ™เบซเบ™เป‰เบฒเบˆเบฒเบเบฎเบฒเบ”เป„เบ” / SSD เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ RAM, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบทเบšเบ•เปเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ thread.

เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เป‚เบ›เปˆเบ‡เปƒเบช, เบŠเบถเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบญเปˆเบฒเบ™เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบ HDD / SSD. เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™ 4096 bytes. เบ‚เบฐเปœเบฒเบ”เปœเป‰เบฒเปƒเบซเบเปˆเปเบกเปˆเบ™ 2 megabytes.

Translation-associative buffer (TLB)

เป€เบกเบทเปˆเบญเป‚เบ„เบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบ™เป‰เบฒเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ, CPU เบ•เป‰เบญเบ‡เบฎเบนเป‰เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบตเปเบœเบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ virtual).

kernel เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™ (เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เป‰เบฒ) เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบเปˆเบฝเบงเบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบœเบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆ virtual เบเบฑเบšเบ—เบตเปˆเบขเบนเปˆเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบ.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เป‰เบฒเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบชเบฑเบšเบชเบปเบ™เปเบฅเบฐเบŠเป‰เบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบงเบดเป€เบ„เบฒเบฐเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ.

เป‚เบŠเบเบ”เบต, เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบต TLB เบ—เบตเปˆเป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปเบœเบ™เบ—เบตเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ—เบตเปˆเบขเบนเปˆ virtual เปเบฅเบฐเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบ. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เปเบเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เป‰เบฒเปƒเบ™เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เบ—เบธเบเป†เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ•เปเปˆเป„เบ›เปƒเบ™เบซเบ™เป‰เบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบˆเบฑเบ”เบเบฒเบ™เบขเบนเปˆเปƒเบ™ TLB, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป„เบ”เป‰เป„เบง.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เบญเบธเบ›เบฐเบเบญเบ™เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบ (เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เป„เบงเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เปเบฒเบญเบดเบ”), เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบˆเปเบฒเบเบฑเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบซเบฒเบซเบ™เป‰เบฒเบซเบผเบฒเบ, TLB เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบœเบ™เบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เป‚เบ›เบผเปเบเบผเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบŠเป‰เบฒเบฅเบปเบ‡เบซเบผเบฒเบ.

Hugepages เบกเบฒเบเบนเป‰เป„เบž

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™ overflow TLB? (เบžเบงเบเป€เบฎเบปเบฒเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ”เบฝเบงเบเบฑเบ™).

เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆ Hugepages เป€เบ‚เบปเป‰เบฒเบกเบฒ. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ 4096 bytes เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡ TLB entry, เบซเบ™เบถเปˆเบ‡ TLB entry เบ›เบฐเบˆเบธเบšเบฑเบ™เบชเบฒเบกเบฒเบ”เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡ 2 megabytes เบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆ. เปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒ TLB เบกเบต 512 เบฅเบฒเบเบเบฒเบ™, เบ—เบตเปˆเบ™เบตเป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Hugepages เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบˆเบฑเบšเบ„เบนเปˆเป„เบ”เป‰:

4096 bโ‹…512=2 MB

เปเบฅเป‰เบงเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เปเบ™เบงเปƒเบ”:

2 MBโ‹…512=1 GB

เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบงเปˆเบฒ Hugepages เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบซเบงเบฒเบ”เบชเบฝเบง. เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เบœเบปเบ™เบœเบฐเบฅเบดเบ”เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบผเบฒเบ. เปเบ•เปˆเบกเบตเบ‚เปเป‰เบ„เบงเบ™เบฅเบฐเบงเบฑเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰.

เบเบฒเบ™เบซเบผเบญเบเบฅเบงเบ‡เปœเป‰เบฒเปƒเบซเบเปˆ

kernel เบ•เบดเบ”เบ•เบฒเบกเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบซเบ™เป‰เบฒเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบฅเบทเป‰เบญเบเป†เบชเปเปˆเบฒเปƒเบ”. เบ–เป‰เบฒเบšเปเปˆเบกเบตเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบ (RAM) เบžเบฝเบ‡เบžเป, เปเบเปˆเบ™เบˆเบฐเบเป‰เบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบซเบ™เป‰เบญเบ (เบซเบ™เป‰เบญเบเบ—เบตเปˆเปƒเบŠเป‰เป€เบฅเบทเป‰เบญเบเป†) เป„เบ›เบซเบฒเบฎเบฒเบ”เบ”เบดเบ”เป€เบžเบทเปˆเบญเบ‚เบฐเบซเบเบฒเบ RAM เบšเบฒเบ‡เบซเบ™เป‰เบฒเบชเปเบฒเบฅเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบเบงเปˆเบฒ.
เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบ”เบฝเบงเบเบฑเบ™เปƒเบŠเป‰เบเบฑเบš Hugepages. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, kernel เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เปเบฅเบเบ›เปˆเบฝเบ™เบซเบ™เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”, เบšเปเปˆเปเบกเปˆเบ™ bytes เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™.

เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰:

char* mymemory = malloc(2*1024*1024); // ะ’ะพะทัŒะผะตะผ ัั‚ะพ ะทะฐ ะพะดะฝัƒ Hugepage!
// ะ—ะฐะฟะพะปะฝะธะผ mymemory ะบะฐะบะธะผะธ-ะปะธะฑะพ ะดะฐะฝะฝั‹ะผะธ
// ะกะดะตะปะฐะตะผ ะผะฝะพะณะพ ะดั€ัƒะณะธั… ะฒะตั‰ะตะน,
// ะบะพั‚ะพั€ั‹ะต ะฟั€ะธะฒะตะดัƒั‚ ะบ ะฟะพะดะผะตะฝะต ัั‚ั€ะฐะฝะธั†ั‹ mymemory
// ...
// ะ—ะฐะฟั€ะพัะธะผ ะดะพัั‚ัƒะฟ ั‚ะพะปัŒะบะพ ะบ ะฟะตั€ะฒะพะผัƒ ะฑะฐะนั‚ัƒ
putchar(mymemory[0]); 

เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰โ€‹, kernel เบˆเบฐโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เบ—เบปเบ”โ€‹เปเบ—เบ™ (เบญเปˆเบฒเบ™โ€‹) เป€เบ›เบฑเบ™ 2 megabytes เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบˆเบฒเบโ€‹เบฎเบฒเบ”โ€‹เบ”เบดเบ” / SSD เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ—เปˆเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบญเปˆเบฒเบ™โ€‹เบซเบ™เบถเปˆเบ‡ byteโ€‹. เบชเปเบฒเบฅเบฑเบšเบซเบ™เป‰เบฒเบ›เบปเบเบเบฐเบ•เบด, เบžเบฝเบ‡เปเบ•เปˆ 4096 bytes เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™เบˆเบฒเบเบฎเบฒเบ”เป„เบ” / SSD.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบซเบ™เป‰เบฒเปƒเบซเบเปˆเบ–เบทเบ overridden, เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเป„เบงเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบซเบ™เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เบซเบฒเบชเปˆเบงเบ™เบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบšเบšเบชเบธเปˆเบกเปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบญเปˆเบฒเบ™เบชเบญเบ‡เบชเบฒเบกเบเบดเป‚เบฅเป„เบš, เบ—เปˆเบฒเบ™เบ„เบงเบ™เปƒเบŠเป‰เบซเบ™เป‰เบฒเบ›เบปเบเบเบฐเบ•เบดเปเบฅเบฐเบšเปเปˆเบเบฑเบ‡เบงเบปเบ™เบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เบญเบทเปˆเบ™.

เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš, เบซเบ™เป‰เบฒเปƒเบซเบเปˆเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ—เบปเบ”เบชเบญเบšเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡ (เบšเปเปˆเปเบกเปˆเบ™เบเบฑเบšเบŠเบญเบšเปเบง abstract) เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เป„เบงเบ‚เบถเป‰เบ™.

เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เปƒเบ™เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ‚เบฝเบ™ C, เบ—เปˆเบฒเบ™เบฎเบนเป‰เบงเปˆเบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบกเบตเบˆเปเบฒเบ™เบงเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ (เบซเบผเบทเป€เบเบทเบญเบšเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ) เบˆเบฒเบ heap เป‚เบ”เบเปƒเบŠเป‰ malloc(). เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ 30 bytes เบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ:

char* mymemory = malloc(30);

เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก, เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบ›เบฒเบเบปเบ”เบงเปˆเบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡ "เบฎเป‰เบญเบ‡เบ‚เป" เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ 30 bytes เบˆเบฒเบเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ virtual. เปเบ•เปˆเบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบง malloc () เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบŸเบฑเบ‡เบŠเบฑเบ™ C เบ—เบตเปˆเป‚เบ—เบซเบฒเบˆเบฒเบเบžเบฒเบเปƒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ brk เปเบฅเบฐ sbrk เป€เบžเบทเปˆเบญเบฎเป‰เบญเบ‡เบ‚เปเบซเบผเบทเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ—เบตเปˆเบšเปเปˆเป€เบชเบเบ„เปˆเบฒเบˆเบฒเบเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบซเบผเบฒเบเบ‚เบทเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš; เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เบงเปˆเบฒเบšเบฒเบ‡เบชเปˆเบงเบ™เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเป„เบ”เป‰เบ–เบทเบเบ›เบปเบ”เบ›เปˆเบญเบเปเบฅเป‰เบง (free()), เปเบฅเบฐโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ„เบทเบ™โ€‹เป„เบ”เป‰โ€‹. malloc() เบ›เบฐเบ•เบดเบšเบฑเบ” algorithms เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบชเบฑเบšเบชเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบ–เบทเบเบ›เบปเบ”เบ›เปˆเบญเบเบ„เบทเบ™.

เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป‚เบ”เบเบšเปเปˆเป„เบ”เป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบกเบฑเบ™เบ„เบงเบ™เบเบฑเบ‡เบงเบปเบ™เบ—เปˆเบฒเบ™? เปเบ•เปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบชเบดเปˆเบ‡เบ—เป‰เบฒเบ—เบฒเบ free() เบšเปเปˆเป„เบ”เป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบเบฑเบšเบ„เบทเบ™เบ—เบฑเบ™เบ—เบตเบเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™.

เบกเบตโ€‹เบชเบดเปˆเบ‡โ€‹เบ”เบฑเปˆเบ‡โ€‹เบเปˆเบฒเบงโ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เปเบšเปˆเบ‡โ€‹เปเบเบโ€‹เบ„เบงเบฒเบกโ€‹เบŠเบปเบ‡โ€‹เบˆเปเบฒโ€‹. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡, เบกเบตเบžเบฒเบเบชเปˆเบงเบ™ heap เบ—เบตเปˆเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบชเบญเบ‡เบชเบฒเบก bytes เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เป„เบ”เป‰เบ–เบทเบเบ›เบปเบ”เบ›เปˆเบญเบ. (free()).

เบเบฐโ€‹เบฅเบธโ€‹เบ™เบฒโ€‹เบชเบฑเบ‡โ€‹เป€เบเบ”โ€‹เบงเปˆเบฒ fragmentation เบ„เบงเบฒเบกโ€‹เบŠเบปเบ‡โ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบซเบปเบงโ€‹เบ‚เปเป‰โ€‹เบ—เบตเปˆโ€‹เบŠเบฑเบšโ€‹เบŠเป‰เบญเบ™โ€‹เบขเปˆเบฒเบ‡โ€‹เบšเปเปˆโ€‹เบซเบ™เป‰เบฒโ€‹เป€เบŠเบทเปˆเบญโ€‹, เปเบฅเบฐโ€‹เป€เบ–เบดเบ‡โ€‹เปเบกเปˆเบ™โ€‹เบงเปˆเบฒโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เป€เบฅเบฑเบโ€‹เบ™เป‰เบญเบโ€‹เบ‚เบญเบ‡โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบกเบตโ€‹เบœเบปเบ™โ€‹เบเบฐโ€‹เบ—เบปเบšโ€‹เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™โ€‹. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”, เป‚เบ›เบฅเปเบเบฅเบกเบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™, เปเบ•เปˆเบ—เปˆเบฒเบ™เบ„เบงเบ™เบฎเบนเป‰เบงเปˆเบฒเบ–เป‰เบฒเบกเบตเบšเบฑเบ™เบซเบฒเบเบฒเบ™เปเบ•เบเปเบเบเบขเบนเปˆเปƒเบ™เบšเบฒเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡ heap, hugepages เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบฎเป‰เบฒเบเปเบฎเบ‡เบ‚เบถเป‰เบ™.

เบเบฒเบ™โ€‹เบ„เบฑเบ”โ€‹เป€เบฅเบทเบญเบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ‚เบญเบ‡ hugepagesโ€‹

เบซเบผเบฑเบ‡เบˆเบฒเบเบญเปˆเบฒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ—เปˆเบฒเบ™เป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบžเบฒเบเบชเปˆเบงเบ™เปƒเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ hugepages เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบซเบ™เป‰เบฒเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ„เบงเบ™เบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบšเป?

เป‚เบŠเบเบ”เบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ madvise()เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰เบ‡เบฒเบ™เปƒเบซเบเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบžเบทเป‰เบ™เบ—เบตเปˆเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”.

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒ hugepages เบเปเบฒเบฅเบฑเบ‡เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เป‚เบซเบกเบ” madvise() เป‚เบ”เบเปƒเบŠเป‰ เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบŠเป‰ madvise()เป€เบžเบทเปˆเบญเบšเบญเบ kernel เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เบšเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ hugepages.

#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 เบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ hugepages เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰.

เบญเป‰เบฒเบ‡เป€เบ–เบดเบ‡เป€เบญเบเบฐเบชเบฒเบ™ (manpage)madviseเป€เบžเบทเปˆเบญเบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเปเบฅเบฐ madvise(), เบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เบกเบตเป€เบชเบฑเป‰เบ™เป‚เบ„เป‰เบ‡เบเบฒเบ™เบฎเบฝเบ™เบฎเบนเป‰เบ—เบตเปˆเบชเบนเบ‡เบŠเบฑเบ™เบขเปˆเบฒเบ‡เบšเปเปˆเปœเป‰เบฒเป€เบŠเบทเปˆเบญ. เบชเบฐเบ™เบฑเป‰เบ™, เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเบ•เบฑเป‰เบ‡เปƒเบˆเบˆเบฐเป€เบเบฑเปˆเบ‡เปเบ—เป‰เป†, เบเบฝเบกเบญเปˆเบฒเบ™ เปเบฅเบฐ เบ—เบปเบ”เบชเบญเบšเบชเบญเบ‡เบชเบฒเบกเบญเบฒเบ—เบดเบ”เบเปˆเบญเบ™เป€เบˆเบปเป‰เบฒเบˆเบฐเบ„เบฒเบ”เบซเบงเบฑเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ—เบฒเบ‡เบšเบงเบ.

เบญเปˆเบฒเบ™เบซเบเบฑเบ‡?

เบกเบตเบ„เบณเบ–เบฒเบกเบšเป? เบ‚เบฝเบ™เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™