Caching on termin, mida kasutatakse arvutiteaduses. Vahemälu (hääldatakse "cash" /ˈkæʃ/ KASH) idee on väga lihtne: sageli võtab mingi andme- või arvutustulemuse saamine palju aega või ressursse, seega on mõistlik salvestada selle tulemus ajutiselt edaspidiseks kasutamiseks. Vahemälu on lühiajaline salvestusruum, kus hoitakse koopiad sageli kasutatavatest andmetest, et neid oleks hiljem kiiremini võimalik kätte saada.

Kuidas vahemälu töötab

Üldiselt kasutatakse kahte tüüpi salvestusruume: üks on suur, aga aeglasem; teine on kiire, aga väiksem. Vahemälu hoiab andmete kiiret koopiat kiiremas meediumis. Kui programm vajab andet, kontrollitakse esmalt vahemälu (see on cache lookup). Kui vajalik andmeüksus on vahemälus (cache hit), saab selle kiiresti kätte. Kui see puudub (cache miss), tuleb andmeallikast (originaal) laadida või arvutada tulemus ning sageli salvestada see vahemällu tulevaste päringute jaoks.

Andmed jagatakse tihti plokkideks või lehekülgedeks, millele pääsetakse üksikult juurde. Kui rakendus kasutab ühte plokki, kasutab ta sageli ka naabriplokke — seda nähtust nimetatakse viitamise lokaalsuseks (locality of reference). Lokaalsus võib olla ajaline (sama andmeelement kasutatakse korduvalt lühikese aja jooksul) või ruumiline (kasutatakse andmeid, mis asuvad üksteisele lähedal). See omadus teeb vahemällu salvestamise tõhusaks.

Tüübid ja näited

  • CPU vahemälu — protsessori sees olevad L1, L2, L3 vahemälud, mis hoiavad sageli vajalikke käsklusi ja andmeid, et vähendada ligipääsu aeglasemale mälule.
  • Lehekülje- ja kettuvahemälu — operatsioonisüsteemi kasutatav mälu, et vältida sagedasi piirdkäitusid kettaadresst.
  • Brauseri vahemälu — salvestab veebilehe ressursse (pildid, CSS, JS), et lehti kiiremini laadida.
  • CDN ja serverivahemälud — sisu edastamise võrgud (CDN) ja veebiserverid hoiavad sageli staatilisi andmeid lähemal kasutajatele.
  • Rakenduse-taseme vahemälud — nagu Redis või Memcached, mida arendajad kasutavad andmete kiireks salvestamiseks ja lugemiseks.
  • DNS vahemälu — salvestab domeeninimede vasted IP-aadressidele, et kiirendada nime lahendamist.

Asendamis- ja kirjutusstrateegiad

Kui vahemälu on täis, tuleb otsustada, millist kirjet asendada. Levinud asendamisstrateegiad:

  • LRU (Least Recently Used) — asendatakse kõige varem kasutatud kirje.
  • FIFO (First In, First Out) — kasutatakse järjekorra printsiipi.
  • LFU (Least Frequently Used) — asendatakse kõige vähem kasutatud kirje.
  • Random — juhuslik valik, lihtne ja kiire rakendada.

Kirjutusstrateegiad määravad, kuidas kirjeid kirjutatakse tagasi originaalallikasse:

  • Write-through — iga kirjutus jõuab kohe nii vahemällu kui ka põhiandmehoidlasse, mis hoiab andmed järjepidevana, aga on aeglasem.
  • Write-back — muudatus salvestatakse esmalt ainult vahemällu ja kirjutatakse tagantjärele (eviction või perioodiliselt) põhihoidlasse, mis võib parandada jõudlust, aga lisab keerukust ja riski andmete kaotsimineku korral.

Struktuur ja assotsiatiivsus

Vahemälu struktuur mõjutab otsingukiirust ja keerukust. Levinud mudelid on:

  • Direct-mapped — iga plokk põhiandmetes vastab ühele kindlale vahemälukohta; lihtne, aga konfliktide oht suurem.
  • Set-associative — iga plokk võib asuda väheses arvus kohtades (set), hea kompromiss kiiruse ja paindlikkuse vahel.
  • Fully associative — plokk võib asuda suvalisse vahemälukohta; väldib konflikte, aga otsingu- ja riistvarukulukus suurem.

Mõõdikud ja terminid

  • Cache hit — andmeüksus leitakse vahemälust.
  • Cache miss — andmeüksust vahemälus ei ole ning tuleb laadida originaalist.
  • Hit rate / Miss rate — hit-rate on osakaal päringutest, mis lõppevad vahemälust leidmisega; kõrge hit-rate tähendab paremat jõudlust.
  • Latency — ligipääsu aeg; vahemälu vähendab keskmist latentsust.

Kasu ja piirangud

Vahemälu parandab jõudlust ja vähendab koormust aeglasematele süsteemidele. Samas on ka varjuküljed:

  • Vahemälus võib olla aegunud või mittesünkroniseeritud informatsioon (stale data), eriti kui kasutatakse write-back strateegiat või mitut vahemälu tase paralleelselt.
  • Vahemälu haldamine lisab keerukust — tuleb valida sobivad suurused, strateegiad ja sünkroonimismehhanismid.
  • Kui vahemälu on liiga väike, võib tekkida sagedane asendamine (thrashing), mis halvendab jõudlust.

Vahemälu vs puhver

Puhver on vahemäluga sarnane, kuid nende eesmärgid erinevad. Puhverit haldab tavaliselt rakendus ning puhvri kasutaja teab, et andmed asuvad puhvris — puhver koondab andmeid ajutiselt, et töödelda neid järjekorras või ühes tükis. Vahemälu on enamasti läbipaistev: kliendi ei pea teadma, et andmed pärinevad vahemälust, ja vahemälu haldamine toimub madalamal tasemel.

Parimad praktikad

  • Mõtle välja sobiv vahemälusuurus ja assotsiatiivsus vastavalt andmemustritele.
  • Kombineeri asendamis- ja kirjutusstrateegiaid vastavalt rakenduse nõudmistele (töökindlus vs jõudlus).
  • Kasu lokaalsusest: disaini andmestruktuurid ja ligipääsumustrid nii, et need kasutaksid ruumilist ja ajalist lokaalsust.
  • Monitoori hit-rate’e ja latentsust ning kohanda seadeid vastavalt tegelikule koormusele.

Vahemälu on üks kõige levinumaid ja tõhusamaid tehnikaid arvutisüsteemide kiirendamiseks. Õigesti disainitud vahemälulahendus vähendab ooteaega ja koormust, parandades kogu süsteemi reageerimisvõimet ja läbilaskevõimet.