Hvornår er en CPU's cache skyllet tilbage til hovedhukommelsen?
Hvis du lige er begyndt at lære, hvordan multi-core-CPU'er, caching, cache-sammenhæng og hukommelse virker, kan det virke lidt forvirrende i starten. Med det for øje har dagens SuperUser Q & A-post svar på en nysgerrig læsers spørgsmål.
Dagens Spørgsmål & Svar session kommer til os med venlig hilsen af SuperUser-en underafdeling af Stack Exchange, en community-driven gruppe af Q & A-websteder.
Spørgsmålet
SuperUser-læser CarmeloS ønsker at vide, hvornår en CPU's cache spolas tilbage til hovedhukommelsen:
Hvis jeg har en CPU med to kerner, og hver kerne har sin egen L1-cache, er det muligt, at Core1 og Core2 begge cache samme del af hukommelsen på samme tid? Hvis det er muligt, hvad vil værdien af hovedhukommelsen være, hvis både Core1 og Core2 har redigeret deres værdier i cache?
Hvornår er en CPU's cache skyllet tilbage til hovedhukommelsen?
Svaret
SuperUser bidragsydere David Schwartz, sleske og Kimberly W har svaret for os. Først op, David Schwartz:
Hvis jeg har en CPU med to kerner, og hver kerne har sin egen L1-cache, er det muligt, at Core1 og Core2 begge cache samme del af hukommelsen på samme tid?
Ja, ydeevne ville være forfærdeligt, hvis det ikke var tilfældet. Overvej to tråde, der kører den samme kode. Du vil have den kode i begge L1 caches.
Hvis det er muligt, hvad vil værdien af hovedhukommelsen være, hvis både Core1 og Core2 har redigeret deres værdier i cache?
Den gamle værdi vil være i hovedhukommelse, hvilket ikke er afgørende, da hverken kernen vil læse den. Inden du udsender en ændret værdi fra cachen, skal den skrives til hukommelse. Typisk anvendes en variant af MESI-protokollen. I den traditionelle implementering af MESI, hvis en værdi er ændret i en cache, kan den slet ikke være til stede i en anden cache på samme niveau.
Efterfulgt af svaret fra sleske:
Ja, at have to caches cache det samme hukommelsesområde kan ske og er faktisk et problem, der forekommer meget i praksis. Der findes forskellige løsninger, for eksempel:
- De to caches kan kommunikere for at sikre, at de ikke er uenige
- Du kan have en form for tilsynsførende, som overvåger alle caches og opdaterer dem i overensstemmelse hermed
- Hver processor overvåger de hukommelsesområder, som den har cachelagret, og når den registrerer en skrive, kaster den sin (nu ugyldige) cache
Problemet hedder cache-sammenhæng og Wikipedia-artiklen om emnet har et godt overblik over problemet og mulige løsninger.
Og vores sidste svar fra Kimberly W:
For at besvare spørgsmålet i dit indlægs titel afhænger det af, hvad cacheprotokollen er. Hvis det er tilbagekald, vil cachen kun blive skyllet tilbage til hovedhukommelsen, når cachecontrolleren ikke har andet valg end at sætte en ny cache-blok i allerede optaget rum. Blokken, der tidligere besatte rummet, fjernes, og dens værdi skrives tilbage til hovedhukommelsen.
Den anden protokol er gennemskrivning. I så fald er cacheblokken som helst skrevet på niveau n, den tilsvarende blok på niveau n + 1 er opdateret. Det er ens i konceptet at udfylde en formular med kulbrinterpapir nedenunder; uanset hvad du skriver på toppen kopieres på nedenstående ark. Dette er langsommere, fordi det naturligvis indebærer flere skriveoperationer, men værdierne mellem caches er mere konsekvente. I tilbagekoblingsskemaet vil kun cache på højeste niveau have den mest ajourførte værdi for en bestemt hukommelsesblok.
Har du noget at tilføje til forklaringen? Lyde af i kommentarerne. Vil du læse flere svar fra andre tech-savvy Stack Exchange brugere? Tjek den fulde diskussionstråd her.
Billedkredit: Lemsipmatt (Flickr)