Što je predmemorija?

Kada se traže podaci iz bilo kojeg izvora, uvijek postoji određeno kašnjenje. Ping prema web poslužiteljima mjeri se u milisekundama, vrijeme pristupa pohrani može imati latencije u mikrosekundama, dok se latencija RAM-a mjeri u ciklusima CPU takta. Naravno, ove vrste brzina bile bi nezamislive prije samo nekoliko desetljeća, ali u sadašnjosti nikada nisu dovoljno velike. Brzina pristupa redovito je neki oblik uskog grla u izvedbi. Jedan od načina na koji se to može riješiti je predmemoriranje.

Spremanje u predmemoriju je proces pohranjivanja privremene kopije resursa na način da mu se može pristupiti brže nego inače. Postoji veliki raspon implementacija u softveru i hardveru. Predmemorije mogu djelovati kao predmemorije za čitanje, predmemorije za pisanje ili oboje.

Čitaj predmemorije

U predmemoriju za čitanje podaci koji su prethodno zatraženi pohranjuju se u predmemoriju radi bržeg pristupa. U nekim scenarijima, predmemorija se čak može preventivno učitati podacima koji omogućuju posluživanje prvog zahtjeva iz predmemorije, a ne samo sljedećih zahtjeva.

Predmemorija za čitanje koja vam je najvjerojatnije poznata je predmemorija preglednika. Ovdje preglednik pohranjuje lokalnu kopiju traženih resursa. To znači da ako i kada se web stranica ponovno učita ili se učita slična stranica koja koristi veći dio istog sadržaja, taj se sadržaj može poslužiti iz predmemorije, a ne s web poslužitelja. Ne samo da to znači da se web stranica može brže učitavati, već i smanjuje opterećenje weba poslužitelja i smanjuje količinu podataka koje korisnik treba preuzeti, što može biti važno na metered veze.

Sam RAM također djeluje kao predmemorija za čitanje podataka na tvrdom disku. U ovom slučaju, podaci za pokrenuti program se preventivno učitavaju u RAM kako bi im CPU mogao brže pristupiti. Podaci iz RAM-a zatim se dalje pohranjuju u predmemoriju CPU-a, iako je postupak za to puno složeniji jer se predmemorija CPU-a mjeri u megabajtima, a ne u gigabajtima.

Predmemorije pisanja

Predmemorija pisanja je predmemorija koja može apsorbirati podatke koji se zapisuju na sporiji uređaj. Uobičajeni primjer za to bila bi SLC predmemorija u modernim SSD-ovima. Ova predmemorija ne dopušta brže čitanje podataka, međutim, puno je brže pisati na njega nego na TLC ili QLC flash koji čini ostatak SSD-a. SLC predmemorija može apsorbirati brze operacije pisanja, a zatim prebacuje te podatke što je prije moguće na TLC flash koji nudi puno bolju gustoću pohrane, ali je također puno sporiji za pisanje. Korištenje flash memorije na ovaj način optimizira je za velike brzine pisanja i visoku gustoću pohrane.

Hibridne predmemorije

Postoji mnogo načina za rukovanje predmemorijama koji im mogu omogućiti da djeluju i kao predmemorija za čitanje i pisanje. Svaka od ovih metoda drugačije obrađuje operacije pisanja i ima prednosti i nedostatke. Tri opcije su pisanje okolo, pisanje kroz i ponovno pisanje. Predmemorija za pisanje u potpunosti preskače predmemoriju prilikom pisanja, predmemorija za pisanje piše u predmemoriju, ali operaciju smatra dovršenom tek kada je zapisana u pohranu. Predmemorija za povratno pisanje zapisuje u predmemoriju i zatim smatra operaciju dovršenom, oslanjajući se na predmemoriju da je prenese u pohranu ako je potrebno.

Write-around može biti koristan ako očekujete veliku količinu pisanja jer minimizira odljev predmemorije. To, međutim, znači da će se operacija koja zatim čita bilo koji od tih zapisanih podataka prvi put suočiti s barem jednim promašajem predmemorije. Predmemorije za pisanje odmah spremaju operacije pisanja u predmemoriju, što znači da se rezultat može poslužiti iz predmemorije prvi put kada se zatraži. Međutim, da bi se smatrala dovršenom, operacija pisanja također treba zapisati podatke na disk što dodaje kašnjenje. Predmemorija za povratno upisivanje ima istu prednost kao i predmemorija za upisivanje, dopuštajući da se pisani podaci odmah poslužuju iz predmemorije. Ipak, ne zahtijeva operacije pisanja za pisanje na disk da bi se smatralo dovršenim. To smanjuje latenciju pisanja, ali dolazi s rizikom od gubitka podataka ako je predmemorija nepostojana i ne dovrši zapisivanje podataka natrag u pohranu prije nego što nestane struje.

Kako ukloniti podatke iz predmemorije?

Jedan od ograničavajućih faktora svake predmemorije je kapacitet. Velika predmemorija traži dugo vremena za pretraživanje, negirajući dobar dio prednosti korištenja predmemorije. Memorijske tehnologije koje se koriste za predmemoriranje također su skuplje od memorije iz koje predmemoriraju. Da to nije slučaj, vjerojatno bi taj memorijski sloj promijenio memorijske tehnologije kako bi poboljšao performanse. Oba ova faktora znače da su predmemorije obično relativno male, posebno u usporedbi s medijem za pohranu s kojeg predmemoriraju. RAM ima manji kapacitet od pohrane, a CPU cache ima manji kapacitet od RAM-a. SLC predmemorija ima manji kapacitet od TLC memorije.

Sve to znači da je često potrebno ciklički izbaciti podatke iz predmemorije kako bi se oslobodio prostor za nove podatke koje je potrebno predmemorirati. Postoji niz različitih pristupa tome. "Rijeđe korišteno", preferira izbacivanje unosa iz predmemorije koji imaju najmanji broj pristupa. Ovo može biti korisno za predviđanje koji će unosi imati najmanji učinak na buduće promašaje predmemorije, ali također će računati nedavno dodane unose kao one koji imaju mali broj pristupa, što može dovesti do predmemorije bućkalica

"Najrjeđe korišteno" preferira izbacivanje unosa iz predmemorije koji nisu korišteni neko vrijeme. Ovo pretpostavlja da se trenutačno ne koriste, ali ne uzima u obzir jesu li se intenzivno koristili prije nekog vremena. "Posljednje korišteno" preferira izbacivanje nedavno korištenih unosa iz predmemorije, pod pretpostavkom da su korišteni i da se neće morati ponovno upotrijebiti. Najbolji pristup općenito je kombinacija sva tri, na temelju statistike korištenja.

Zastarjele informacije i sigurnosni rizici

Glavni rizik od predmemorija je da informacije koje sadrže mogu postati ustajale. Unos u predmemoriju smatra se zastarjelim kada su izvorni podaci ažurirani ostavljajući unos u predmemoriju zastarjelim. Važno je redovito provjeravati podudara li se živa kopija koja se poslužuje s predmemoriranom kopijom.

Konkretno na web stranicama, također je iznimno važno identificirati koji se podaci mogu, a koji ne mogu pohraniti u predmemoriju. Na primjer, savršeno je u redu da se velika nepromjenjiva JavaScript datoteka sprema u predmemoriju. Ovo štedi korisnika da ga ne preuzima svaki put, a može čak biti od koristi drugim korisnicima koji poslužuju istu predmemoriju. Međutim, ne možete predmemorirati podatke specifične za sesiju. Zamislite što bi se dogodilo da ste pregledavali aplikaciju za razmjenu poruka dok ste prijavljeni kao vi, samo da biste otkrili da vam je poslužena predmemorirana verzija poruka drugog korisnika. Srećom, web poslužitelji mogu odrediti koji se resursi mogu, a koji ne mogu pohraniti u predmemoriju i ti su problemi općenito dobro poznati pa je malo ovakvih problema.

Zaključak

Predmemorija je dio memorije koji može pohraniti neke nedavno korištene podatke na način pohranjivanja kojem je pristup brži nego što bi bio ponovni dovršetak normalnog procesa pristupa podacima. Predmemorija je obično ograničenog kapaciteta što znači da treba izbaciti unose nakon što se napuni. Predmemorije su općenito transparentne za korisnika, što znači da je latencija jedini pokazatelj da je rezultat poslužen putem predmemorije.