Predpomnjenje je izraz, ki se uporablja v računalništvu. Ideja predpomnilnika (izgovori se "keš" /kæʃ/) je preprosta: pridobivanje ali izračun nekaterih podatkov je lahko zamudno ali računsko drago, zato se pogosto izplača rezultat shraniti in ga ob ponovnem zahtevku uporabiti namesto ponovnega računanja ali počasnega branja iz izvirnega vira. Za predpomnjenje se navadno uporabljata dve vrsti pomnilniških medijev: eden je običajno zelo velik, a počasnejši (npr. disk ali oddaljena strežnica), drugi pa je manjši in hitrejši (npr. DRAM ali registri procesorja). Osnovna zamisel je, da pogosto uporabljene podatke hranimo v hitrem mediju – predpomnilniku – tako da je dostop do njih občutno hitrejši kot dostop do izvirnika. Če je kopija podatkov v predpomnilniku, je hitreje uporabiti to kopijo, kot pa ponovno pridobiti ali izračunati izvirne podatke. Tako se zniža povprečen čas dostopa do podatkov.
V predpomnilniku so kopije podatkov začasne in se občasno zamenjajo z novimi. Vnos nove vrednosti običajno zahteva odstranitev ali zamenjavo starejše vrednosti; za izbiro, kateri vnos zamenjati, obstajajo različne strategije zamenjave (npr. LRU, FIFO, LFU). Poleg tega so pomembne tudi politike zapisovanja (npr. write-through in write-back) ter mehanizmi za ohranjanje doslednosti med predpomnilnikom in izvirnimi podatki.
Predpomnilnik je po funkciji podoben vmesnemu (buffer) pomnilniku, vendar se razlikujeta v namenu in vidnosti za uporabnika oziroma aplikacijo. Vmesni pomnilnik (buffer) se pogosto uporablja za začasno zadrževanje podatkov med prenosom (na primer pri vhodno/izhodnih operacijah) in je lahko za aplikacijo transparenten; predpomnilnik pa je posebej namenjen hitremu ponovnemu dostopu do pogosto uporabljenih podatkov, pri čemer so lahko aplikacije ali sistem zavestni obstoja in upravljanja predpomnilnika.
Princip delovanja: zadetek in zgrešek
Osnovna metrika predpomnilnika je hit rate (delež zadetkov) oziroma miss rate (delež zgreškov). Ko aplikacija zahteva podatek:
- če se podatek nahaja v predpomnilniku (cache hit), se ga hitro vrne;
- če ga ni (cache miss), je treba podatek pridobiti iz počasnejšega vira, ga (običajno) vstaviti v predpomnilnik in nato vrniti aplikaciji.
Razlikujemo tudi vrste zgreškov: compulsory (prvič zahtevani podatki), capacity (zadetek bi bil mogoč, če bi bil predpomnilnik večji) in conflict (pri določenih organizacijah, npr. direct-mapped, ko več podatkov tekmuje za isti prostor).
Vrste in raba predpomnilnikov
- CPU predpomnilniki (L1, L2, L3): hitri (SRAM) predpomnilniki, ki zmanjšajo čas dostopa do navideznega glavnega pomnilnika. L1 je najhitrejši in najmanjši, L2 in L3 pa večji in počasnejši.
- Datotečni/diski predpomnilniki: sistemski predpomnilnik (buffer cache) ali disk cache za pospešitev dostopa do blokov na disku.
- Spletni predpomnilniki (HTTP cache, CDN): shranjujejo kopije spletnih vsebin bliže uporabniku, zmanjšujejo zakasnitev in porabo pasovne širine.
- Baze podatkov in aplikacijski predpomnilniki: npr. podatkovne strukture v pomnilniku (Memcached, Redis) za hitro dostavo rezultatov poizvedb.
- Predpomnilniki na nivoju brskalnika: zmanjšajo ponovno nalaganje statičnih virov (slike, skripte).
Strategije zamenjave
Najpogostejše strategije so:
- LRU (Least Recently Used) – odstrani element, ki ga je sistem najmanj dolgo uporabljal;
- FIFO (First-In, First-Out) – odstrani najdlje prisoten element;
- LFU (Least Frequently Used) – odstrani najmanj pogosto uporabljen element;
- Random – odstrani naključni element (preprosto in hitro);
- ter različne kombinacije in aproksimacije (npr. CLOCK) za učinkovito izvajanje v strojni ali programski opremi.
Politike zapisovanja
Pomembna odločitev je, kako obravnavati pisanje v predpomnilnik:
- Write-through: vsaka sprememba se takoj zapiše tudi v izvirni medij; enostavno zagotovljena konsistenca, a počasnejše pri zapisih.
- Write-back (write-behind): spremembe prvotno ostanejo le v predpomnilniku in se kasneje ujamejo v izvirnik; hitrejše zapisovanje, a zahteva mehanizem za sledenje "umazanih" (dirty) vnosov in več pozornosti pri izgubi energije ali napakah.
Lokalnost sklicevanja
Predpomnilniki temeljijo na principu lokalnosti sklicevanja:
- Temporalna lokalnost: če je nek podatek uporabljen zdaj, bo verjetno uporabljen ponovno kmalu;
- Prostorska (spatialna) lokalnost: če je uporabljen podatek na določenem naslovu, bodo verjetno uporabljeni tudi podatki v njegovi bližini.
Prav ti pojavi omogočajo, da majhen, hiter predpomnilnik zajame velik delež zahtev in znatno pospeši delovanje.
Organizacija in lastnosti
Pri načrtovanju predpomnilnika se upoštevajo:
- velikost (manjši predpomnilniki so hitrejši in cenejši, a imajo nižji hit rate);
- povezljivost (associativity) – direct-mapped, fully associative ali set-associative, kar vpliva na konfliktne zgreške in kompleksnost;
- velikost bloka (block/line size) – vpliva na prostorsko lokalnost in pasovno širino;
- stroški – hitrejši pomnilnik (SRAM) je dražji kot počasnejši (DRAM, disk);
- mehanizmi predhodnega nalaganja (prefetching) – napovedovanje naslednjih zahtev in nalaganje v predpomnilnik za zmanjšanje zgreškov;
- upravljanje vzporednega dostopa in coherence – pri večjedrnih sistemih je treba zagotoviti skladnost med predpomnilniki jeder (coherency protocols, npr. MESI).
Merila uspešnosti
Najpomembnejši kazalniki so hit rate, miss rate in miss penalty (strošek zgreška: čas, potreben za pridobitev podatka iz počasnejšega vira). Cilj je minimizirati povprečni čas dostopa (average memory access time – AMAT) in stroške pri danih stroškovnih omejitvah (poraba silicija, energija, cena).
Praktični nasveti in kompromisi
- Večji predpomnilnik običajno poveča hit rate, a rastejo stroški in latenca iskanja; zato so običajno uporabljeni večstopenjski predpomnilniki (npr. L1, L2, L3).
- Pri aplikacijah je koristno oblikovati dostopne vzorce, ki izkoriščajo lokalnost (npr. zaradi učinkovitega vzorčenja nizov, blokovno obdelavo matrik).
- Pri razvoju sistemov je treba tehtati med doslednostjo, hitrostjo zapisov in tveganji izgube podatkov (izbira med write-back in write-through).
Predpomnilniki so torej temeljni gradnik sodobnih računalniških sistemov: od procesorjev do spletnih strežnikov in baz podatkov. Z ustrezno organizacijo, politiko zamenjave in upoštevanjem lokalnosti lahko predpomnilnik znatno izboljša zmogljivost in odzivnost sistema.

