Početna » kako da » Kada je procesorska memorija isprana na glavnu memoriju?

    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)