Kaj je predpomnilnik?

Pri zahtevanju podatkov iz katerega koli vira vedno pride do zamude. Ping do spletnih strežnikov se meri v milisekundah, čas dostopa do shrambe ima lahko zakasnitve v mikrosekundah, medtem ko se zakasnitev RAM-a meri v taktih procesorja. Seveda bi si bile te vrste hitrosti nepredstavljive pred nekaj desetletji, toda v sedanjosti nikoli niso dovolj hitre. Hitrost dostopa je redno neke vrste ozko grlo pri delovanju. Eden od načinov, kako to rešiti, je predpomnjenje.

Predpomnjenje je postopek shranjevanja začasne kopije vira na način, da je do njega mogoče dostopati hitreje, kot bi lahko bilo običajno. Obstaja ogromno izvedb tako v programski kot strojni opremi. Predpomnilniki lahko delujejo kot predpomnilniki za branje, predpomnilniki za pisanje ali oboje.

Branje predpomnilnikov

V predpomnilniku za branje so podatki, ki so bili predhodno zahtevani, shranjeni v predpomnilniku za hitrejši dostop. V nekaterih scenarijih je predpomnilnik morda celo vnaprej naložen s podatki, ki omogočajo, da se prva zahteva streže iz predpomnilnika in ne samo naslednjih zahtev.

Bralni predpomnilnik, ki ga verjetno poznate, je predpomnilnik brskalnika. Tukaj brskalnik shrani lokalno kopijo zahtevanih virov. To pomeni, da če in ko se spletna stran znova naloži ali se naloži podobna stran, ki uporablja večino enake vsebine, se ta vsebina lahko servira iz predpomnilnika in ne iz spletnega strežnika. Ne samo, da to pomeni, da se lahko spletna stran hitreje naloži, ampak tudi zmanjša obremenitev spleta strežniku in zmanjša količino podatkov, ki jih mora uporabnik prenesti, kar je lahko pomembno pri metered povezave.

Sam RAM deluje tudi kot bralni predpomnilnik za podatke na trdem disku. V tem primeru se podatki za delujoči program vnaprej naložijo v RAM, da lahko CPE do njih hitreje dostopa. Podatki iz RAM-a se nato dodatno shranijo v predpomnilnik procesorja, čeprav je postopek za to veliko bolj zapleten, saj se predpomnilnik procesorja meri v megabajtih in ne v gigabajtih.

Predpomnilniki pisanja

Zapisovalni predpomnilnik je predpomnilnik, ki lahko absorbira podatke, ki se zapisujejo v počasnejšo napravo. Pogost primer tega bi bil predpomnilnik SLC v sodobnih SSD-jih. Ta predpomnilnik ne omogoča hitrejšega branja podatkov, vendar pa je pisanje veliko hitrejše kot pisanje na TLC ali QLC flash, ki sestavlja preostali del SSD. Predpomnilnik SLC lahko absorbira hitre zapisovalne operacije in nato te podatke takoj, ko lahko, prenese na bliskovni pomnilnik TLC, ki ponuja veliko boljšo gostoto shranjevanja, vendar je tudi veliko počasnejši za pisanje. Uporaba bliskovnega pomnilnika na ta način ga optimizira za visoke hitrosti zapisovanja in visoko gostoto shranjevanja.

Hibridni predpomnilniki

Obstaja veliko načinov za ravnanje s predpomnilniki, ki jim lahko omogočijo, da delujejo kot bralni in pisalni predpomnilnik. Vsaka od teh metod drugače obravnava operacije pisanja in ima prednosti in slabosti. Tri možnosti so pisanje naokoli, pisanje skozi in povratno pisanje. Pisani predpomnilnik med pisanjem v celoti preskoči predpomnilnik, pisalni predpomnilnik piše v predpomnilnik, vendar meni, da je operacija dokončana šele, ko je zapisana v shrambo. Predpomnilnik za povratno pisanje zapisuje v predpomnilnik in nato meni, da je operacija dokončana, pri čemer se zanaša na predpomnilnik, da jo prenese v shrambo, če je to potrebno.

Pisanje naokoli je lahko koristno, če pričakujete veliko količino pisanja, saj zmanjša odliv predpomnilnika. Vendar pa to pomeni, da bo operacija, ki nato prebere katere koli od teh zapisanih podatkov, prvič vsaj enkrat zgrešila predpomnilnik. Zapisni predpomnilniki takoj predpomnijo zapisovalne operacije, kar pomeni, da je rezultat mogoče servirati iz predpomnilnika, ko je prvič zahtevan. Da pa se operacija pisanja šteje za popolno, mora podatke zapisati tudi na disk, kar doda zakasnitev. Predpomnilnik za povratno pisanje ima enake prednosti kot predpomnilnik za pisanje, saj omogoča, da se zapisani podatki takoj servirajo iz predpomnilnika. Vendar ne zahteva pisalnih operacij za pisanje na disk, da se šteje za dokončano. To zmanjša zakasnitev pisanja, vendar prinaša tveganje izgube podatkov, če je predpomnilnik nestanoviten in ne konča zapisovanja podatkov nazaj v shrambo, preden se prekine napajanje.

Kako odstraniti podatke iz predpomnilnika?

Eden od omejevalnih dejavnikov vsakega predpomnilnika je zmogljivost. Iskanje velikega predpomnilnika traja dolgo časa, kar izniči dobršen del prednosti uporabe predpomnilnika. Pomnilniške tehnologije, ki se uporabljajo za predpomnjenje, so običajno tudi dražje od pomnilnika, iz katerega predpomnijo. Če temu ne bi bilo tako, je verjetno, da bi ta pomnilniška raven zamenjala pomnilniške tehnologije za izboljšanje zmogljivosti. Oba dejavnika pomenita, da so predpomnilniki razmeroma majhni, zlasti v primerjavi z medijem za shranjevanje, iz katerega predpomnijo. RAM ima manjšo zmogljivost kot pomnilnik in predpomnilnik procesorja ima manjšo zmogljivost kot RAM. Predpomnilnik SLC ima manjšo zmogljivost kot pomnilnik TLC.

Vse to pomeni, da je pogosto treba ciklično izključiti podatke iz predpomnilnika, da se sprosti prostor za nove podatke, ki jih je treba predpomniti. Obstaja vrsta različnih pristopov k temu. »Najmanj pogosto uporabljen« raje izloči vnose iz predpomnilnika, ki imajo najmanjše število dostopov. To je lahko uporabno za predvidevanje, kateri vnosi bodo imeli najmanjši učinek na prihodnje zgrešene predpomnilnike prav tako šteje nedavno dodane vnose kot tiste, ki imajo majhno število dostopov, kar lahko povzroči predpomnilnik churn.

»Najmanj uporabljeno« raje izloči vnose iz predpomnilnika, ki že nekaj časa niso bili uporabljeni. To predpostavlja, da se trenutno ne uporabljajo, vendar ne upošteva, če so bili pred časom močno uporabljeni. »Nazadnje uporabljeno« raje izloči nazadnje uporabljene vnose iz predpomnilnika, ob predpostavki, da so bili uporabljeni in jih ne bo treba ponovno uporabiti. Najboljši pristop je na splošno kombinacija vseh treh, ki temelji na statistiki uporabe.

Zastarele informacije in varnostna tveganja

Glavno tveganje predpomnilnikov je, da lahko informacije, ki jih vsebujejo, postanejo zastarele. Vnos v predpomnilnik velja za zastarelega, ko so bili izvirni podatki posodobljeni, zaradi česar je vnos v predpomnilnik zastarel. Pomembno je, da redno preverjate, ali se živa kopija, ki se streže, še vedno ujema s predpomnjeno kopijo.

Posebej na spletnih mestih je zelo pomembno tudi, da ugotovite, katere podatke je mogoče predpomniti in katere ne. Na primer, povsem v redu je, da se velika nespremenljiva datoteka JavaScript shrani v predpomnilnik. To uporabniku prihrani vsakokratno prenašanje in lahko celo koristi drugim uporabnikom, ki jih streže isti predpomnilnik. Podatkov, specifičnih za sejo, pa ne morete predpomniti. Predstavljajte si, kaj bi se zgodilo, če bi brskali po aplikaciji za sporočanje, medtem ko ste prijavljeni kot vi, in ugotovili, da vam je bila postrežena s predpomnjeno različico sporočil drugega uporabnika. Na srečo lahko spletni strežniki določijo, katere vire je mogoče predpomniti in katere ne, in te težave so na splošno dobro znane, zato je takšnih težav malo.

Zaključek

Predpomnilnik je del pomnilnika, ki lahko shrani nekaj nedavno uporabljenih podatkov na način shranjevanja, do katerega je dostop hitrejši, kot bi bil, če bi znova dokončali običajen postopek dostopa do podatkov. Kapaciteta predpomnilnika je običajno omejena, kar pomeni, da mora izločiti vnose, ko je poln. Predpomnilniki so na splošno pregledni za uporabnika, kar pomeni, da je zakasnitev edini znak, da je bil rezultat postrežen prek predpomnilnika.