14-bo‘lim

Xotira ierarxiyasi va kesh

Registrdan diskgacha bo'lgan qatlamlar, kesh qatori tushunchasi, o'lchangan murojaat tartibi ta'siri va kesh modeli.

🕑 7 daqiqa o‘qish 📄 1 094 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Qatlamlar
  2. Kesh qatori
  3. Haqiqiy mashinada o'lchash
  4. Uch xil kesh xatosi
  5. Xulosa

9-bo'limda registr xotiradan yuz barobar tez ekanini aytdik. Bu jiddiy muammo: protsessor tez, xotira sekin.

Yechim - ierarxiya: bir necha qatlamli xotira, har biri o'zidan yuqoridagidan kattaroq va sekinroq.

Qatlamlar #

QatlamHajmiMurojaat vaqtiNisbat
Registr~1 KB~1 takt1
L1 kesh32-64 KB~4 takt4
L2 kesh0,5-2 MB~14 takt14
L3 kesh8-64 MB~50 takt50
Asosiy xotira8-64 GB~200-300 takt~250
SSD0,5-4 TB~100 000 takt100 000
Qattiq disk1-20 TB~10 000 000 takt10⁷

Bu jadvaldagi raqamlar taxminiy va modelga qarab o'zgaradi, lekin tartib barqaror.

Masshtabni tasavvur qilish

Bir taktni bir soniya deb faraz qilaylik. U holda:

MurojaatInson vaqtida
Registr1 soniya
L1 kesh4 soniya
L3 kesh1 daqiqa
Asosiy xotira4 daqiqa
SSD1,5 kun
Qattiq disk4 oy

Protsessor uchun xotiraga borish - bu "to'rt daqiqa kutish". Diskka borish esa "to'rt oy kutish".

Aynan shuning uchun kesh mavjud - va shuning uchun ma'lumotlar bazasi indekslari shunchalik muhim.

Kesh qatori #

Kesh bitta baytni emas, butun qatorni olib keladi. Odatda 64 bayt.

Bu asosiy natijani beradi: agar siz bitta elementni so'rasangiz, uning qo'shnilari ham keshga tushadi.

Kesh qatori 64 bayt, ya'ni 8 ta element birdan olib keladi. Bitta massivni uch xil tartibda 65 536 marta o'qib ko'ramiz:

O'qish tartibiKeshda topildiTopilmadiFoiz
Qator bo'ylab57 3448 19287%
Ustun bo'ylab065 5360%
Teskari tartibda57 3448 19287%

Qator bo'ylab o'qishda har 8 elementdan 7 tasi keshda topiladi - chunki bitta kesh qatori 8 ta elementni birdan olib keladi.

Uchinchi qatorga e'tibor bering: teskari tartibda o'qish ham 87% beradi. Muhimi yo'nalish emas, qo'shnilik.

87% va 0%. Bir xil sondagi o'qish, bir xil ma'lumot - faqat tartib boshqa.

Teskari tartib ham 87% berganiga e'tibor bering: muhimi tartib oldinga yoki orqaga emas, qo'shni bo'lishi.

Bitta element so'ralsa, butun qator keladi qator bo'ylab bitta kesh qatori - 8 element 1 ta o'qish -> 8 ta element tayyor ustun bo'ylab har o'qish YANGI qatorni talab qiladi 7 ta element bekorga olib kelinadi Amaliy xulosa Ma'lumotni xotirada ishlatiladigan tartibda joylashtiring Bu ko'pincha algoritmni o'zgartirishdan ko'ra ko'proq foyda beradi
Kesh - bu tezlik emas, bu QO'SHNILIKKA qilingan garov

Haqiqiy mashinada o'lchash #

Model yaxshi, lekin uni tekshirish kerak. Quyidagi kod haqiqiy vaqtni o'lchaydi:

Butun ierarxiyani bitta rasmda ko'rsak:

Xotira ierarxiyasi TEZ va KICHIK kechikish Registrlar ~1 KB 1 takt L1 kesh 32-64 KB 4 takt L2 kesh 0,5-2 MB 14 takt L3 kesh 8-64 MB 50 takt Asosiy xotira 8-64 GB ~250 takt SSD 0,5-4 TB Qattiq disk 1-20 TB SEKIN va KATTA 100 000 takt 10 million takt hajm oshadi
Har pastki qatlam kattaroq, lekin sezilarli darajada sekinroq

Endi eng muhim tajriba. Bir xil sondagi elementni ikki xil tartibda o'qiymiz:

O'qish tartibiBajarilgan amallarTezlik
Qator bo'ylab (qo'shni elementlar)bir xiltez
Ustun bo'ylab (har qadamda sakrash)bir xilsezilarli sekin

Ikkala holatda ham bir xil sondagi qo'shish va o'qish bajarildi. Farq faqat murojaat tartibida.

Sabab keyingi bo'limda batafsil ochiladi, lekin qisqasi shunday: qo'shni elementlarni o'qiganda protsessor allaqachon olib kelgan kesh qatoridan foydalanadi. Sakrab o'qiganda esa har safar yangi qator kerak bo'ladi.

Nima uchun aniq raqam emas, "sekinroqmi" deb chop etildi?

Aniq vaqt har mashinada, har ishga tushirishda boshqacha bo'ladi: protsessor modeli, kesh hajmi, fon jarayonlari - hammasi ta'sir qiladi.

Shuning uchun bu darslikda o'lchov natijalari shart sifatida chop etiladi. Shunda kitobdagi natija sizning mashinangizda ham to'g'ri chiqadi.

O'zingiz aniq raqamni ko'rmoqchi bo'lsangiz, print qatorlarini o'zgartiring - lekin taqqoslaganda bir xil sharoitda o'lchaganingizga ishonch hosil qiling.

Uch xil kesh xatosi #

TuriSababYechim
MajburiyMa'lumot birinchi marta o'qilyaptiOldindan o'qish
Sig'imIshchi to'plam keshdan kattaBo'laklab ishlash
KonfliktIkki manzil bir joyga tushadiTartibni o'zgartirish

Uchinchisi eng nozik: bizning modelimizda ustun bo'ylab o'qish 0% berdi. Sabab shundaki, N = 256 va kesh qatorlari soni ham 64 - manzillar doim bir xil joyga tushdi.

Massiv o'lchamini bir oz o'zgartirish (masalan 257 ga) natijani sezilarli yaxshilashi mumkin. Bu haqiqiy optimallashtirish usuli va u massiv to'ldirish (*array padding*) deb ataladi.

Bu bilim qayerda kerak bo'ladi?

Kesh haqida bilim kundalik kodda ham foyda beradi:

VaziyatTo'g'ri tanlov
Katta massivni aylanishXotiradagi tartibda
Tuzilmalar massiviMaydonlarni 7-bo'limdagidek tartiblang
Ko'p kichik obyektBitta katta massiv afzalroq
Bog'langan ro'yxat va massivMassiv ko'pincha tezroq

Oxirgisi ko'pchilikni ajablantiradi: nazariy jihatdan bog'langan ro'yxatga qo'shish O(1), massivga esa O(n).

Lekin amalda massiv ko'pincha yutadi - chunki uning elementlari qo'shni va kesh ular bilan yaxshi ishlaydi. Bog'langan ro'yxat esa xotira bo'ylab tarqalib ketadi.

Algoritmlar darsligidagi Big-O tahlili xotirani bir xil tezlikda deb hisoblaydi. Haqiqatda esa bunday emas - shuning uchun nazariy baho va amaliy o'lchov ba'zan farq qiladi.

Keshni faqat tezlik deb bilmang

Kesh xavfsizlikka ham ta'sir qiladi. Ma'lumot keshda bormi yoki yo'qmi - buni vaqt bo'yicha aniqlash mumkin.

Shu asosda yon kanal hujumlari quriladi: hujumchi o'zining kodini ishlatib, boshqa jarayon qaysi manzillarga murojaat qilganini taxmin qiladi.

2018-yilda e'lon qilingan Spectre va Meltdown zaifliklari aynan shunga asoslangan edi: ular spekulyativ bajarish (16-bo'lim) va kesh vaqtini birga ishlatgan.

Himoya operatsion tizim va kompilyator darajasida qilinadi. Kriptografik kod yozayotgan bo'lsangiz, vaqt bo'yicha barqaror algoritmlar ishlatish kerak - bu "Amaliy kriptografiya" darsligida ko'rilgan.

Amaliy topshiriq
  1. Ierarxiyaning olti qatlamini yoddan tartib bilan yozing.
  2. Registr va asosiy xotira o'rtasidagi tezlik farqi necha barobar?
  3. Bir taktni bir soniya deb olsak, SSD ga murojaat qancha vaqt oladi?
  4. Kesh qatori 64 bayt bo'lsa, 4 baytli sondan nechtasi sig'adi?
  5. Qator bo'ylab o'qishda nima uchun 87% chiqishini hisoblab ko'rsating.
  6. Teskari tartibda o'qish nima uchun ham 87% berishini tushuntiring.
  7. Ustun bo'ylab o'qishda nima uchun 0% chiqadi?
  8. Kesh qatori 128 bayt bo'lsa, foiz qanday o'zgarardi?
  9. Bog'langan ro'yxat massivdan nima uchun sekinroq ekanini ayting.
  10. Kompyuteringiz kesh hajmlarini toping (lscpu yoki tizim ma'lumoti).

Xulosa #

  • Protsessor tez, xotira sekin - yechim ko'p qatlamli ierarxiya.
  • Registrdan diskkacha farq o'n million barobargacha yetadi.
  • Kesh bitta baytni emas, butun qatorni (odatda 64 bayt) olib keladi.
  • Shuning uchun qo'shni elementlarni o'qish juda arzon.
  • Modelda qator bo'ylab o'qish 87%, ustun bo'ylab 0% berdi.
  • Bir xil ish, bir xil ma'lumot - farq faqat murojaat tartibida.
  • Uch xil kesh xatosi: majburiy, sig'im va konflikt.
  • Konflikt xatolarini massiv o'lchamini o'zgartirib kamaytirish mumkin.
  • Amalda massiv bog'langan ro'yxatdan tezroq bo'lishi mumkin - kesh tufayli.
  • Kesh vaqti yon kanal hujumlariga ham asos bo'ladi (Spectre, Meltdown).

Keyingi bo'limda bu bilimni amalda qo'llaymiz - keshga do'st kod yozishni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.