Kada je procesorska memorija isprana na glavnu memoriju?
Ako tek počinjete učiti kako radi višejezgreni CPU-ovi, caching, koherentnost cache-a i memorija, možda se isprva čini pomalo zbunjujućim. Imajući to na umu, današnja postova s pitanjima o odgovorima korisnika imaju odgovore na znatiželjno pitanje čitatelja.
Današnja sesija pitanja i odgovora dolazi nam ljubaznošću SuperUser-a, podjele Stack Exchangea, grupiranja web-lokacija za pitanja i odgovore u zajednici.
Pitanje
Čitač superkorisnika CarmeloS želi znati kada se procesorska memorija isprazni natrag u glavnu memoriju:
Ako imam CPU s dvije jezgre i svaka jezgra ima vlastiti L1 cache, je li moguće da Core1 i Core2 istodobno predmemoriraju isti dio memorije? Ako je moguće, kakva će biti vrijednost glavne memorije ako su i Core1 i Core2 uredili svoje vrijednosti u predmemoriji?
Kada je predmemorija procesora isprana u glavnu memoriju?
Odgovor
SuperUser suradnici David Schwartz, sleske i Kimberly W imaju odgovor za nas. Prvo gore, David Schwartz:
Ako imam CPU s dvije jezgre i svaka jezgra ima vlastiti L1 cache, je li moguće da Core1 i Core2 istovremeno pohranjuju isti dio memorije u isto vrijeme?
Da, izvedba bi bila strašna da to nije slučaj. Razmotrite dvije niti koje pokreću isti kod. Želite taj kod u oba L1 keša.
Ako je moguće, kakva će biti vrijednost glavne memorije ako su i Core1 i Core2 uredili svoje vrijednosti u predmemoriji?
Stara vrijednost bit će u glavnoj memoriji, što neće biti važno jer je niti jedna jezgra neće čitati. Prije izbacivanja izmijenjene vrijednosti iz predmemorije, ona mora biti zapisana u memoriju. Obično se koristi neka varijanta MESI protokola. U tradicionalnoj implementaciji MESI, ako je vrijednost modificirana u jednoj cache-u, ona ne može biti prisutna u bilo kojoj drugoj predmemoriji na istoj razini.
Slijedi odgovor sleske:
Da, imati dvije predmemorije cache iste regije memorije može dogoditi i zapravo je problem koji se događa puno u praksi. Postoje različita rješenja, na primjer:
- Dva spremnika mogu komunicirati kako bi se uvjerili da se ne slažu
- Možete imati neku vrstu supervizora koji nadzire sve predmemorije i prema tome ih ažurira
- Svaki procesor nadzire memorijska područja koja je spremio u memoriju, a kada otkrije pisanje, izbacuje svoju (sada nevažeću) predmemoriju
Problem se naziva koherencija predmemorije, a članak Wikipedije o toj temi ima lijep pregled problema i mogućih rješenja.
I naš konačni odgovor od Kimberly W:
Da biste odgovorili na pitanje u naslovu posta, to ovisi o tome što je protokol za spremanje. Ako je to povratno kopiranje, predmemorija će biti vraćena natrag u glavnu memoriju samo ako kontroler predmemorije nema izbora nego da stavi novi blok predmemorije u već zauzeti prostor. Blok koji je prethodno zauzimao prostor je uklonjen i njegova se vrijednost vraća natrag u glavnu memoriju.
Drugi protokol je pisanje. U tom slučaju, bilo kada kad se cache blok napiše na razini n, odgovarajući blok na razini n + 1 je ažurirano. Koncept je sličan popunjavanju obrasca s ugljičnim papirom ispod; sve što pišete na vrhu kopira se na donji list. Ovo je sporije jer očito uključuje više operacija pisanja, ali su vrijednosti između spremnika konzistentnije. U shemi vraćanja-povratka, samo najviša razina predmemorije imala bi najnoviju vrijednost za određeni memorijski blok.
Imate li što dodati objašnjenju? Zvuk isključen u komentarima. Želite li pročitati više odgovora od drugih tehničkih korisnika Stack Exchangea? Pogledajte cjelokupnu temu za raspravu ovdje.
Kredit za slike: Lemsipmatt (Flickr)