Kad CPU kešatmiņa ir nospiesta atpakaļ uz galveno atmiņu?
Ja jūs tikai sākat uzzināt, kā darbojas vairāku kodolu CPU, kešatmiņa, kešatmiņas saskaņotība un atmiņa, sākumā tas var šķist mazliet mulsinoši. Paturot to prātā, šodienas SuperUser Q&A post ir atbildes uz ziņkārīgo lasītāju jautājumu.
Šodienas jautājumu un atbilžu sesija mums dod pieklājību no SuperUser-Stack Exchange apakšnodaļas, kas ir kopienas orientēta Q & A tīmekļa vietņu grupa.
Jautājums
SuperUser lasītājs CarmeloS vēlas uzzināt, kad CPU kešatmiņa tiek izskalota atpakaļ uz galveno atmiņu:
Ja man ir CPU ar diviem kodoliem un katram kodolam ir savs L1 kešatmiņš, vai ir iespējams, ka Core1 un Core2 kešatmiņas tajā pašā laikā saglabā vienu un to pašu atmiņas daļu? Ja tas ir iespējams, kāda būs galvenā atmiņas vērtība, ja gan Core1, gan Core2 ir rediģējušas savas vērtības kešatmiņā?
Kad CPU kešatmiņa ir noskalota atpakaļ uz galveno atmiņu?
Atbilde
SuperUser ieguldītājiem David Schwartz, sleske un Kimberly W ir atbilde mums. Pirmkārt, David Schwartz:
Ja man ir CPU ar diviem kodoliem, un katram kodam ir savs L1 kešatmiņš, vai ir iespējams, ka Core1 un Core2 kešatmiņas tajā pašā atmiņā tajā pašā laikā?
Jā, izpildījums būtu briesmīgs, ja tas tā nebūtu. Apsveriet divas tēmas, kurās darbojas tas pats kods. Jūs vēlaties šo kodu abos L1 kešatmiņos.
Ja tas ir iespējams, kāda būs galvenā atmiņas vērtība, ja gan Core1, gan Core2 ir rediģējušas savas vērtības kešatmiņā?
Vecā vērtība būs galvenā atmiņā, kas nebūs svarīgi, jo neviens no kodoliem to neizlasīs. Pirms izdzēst no kešatmiņas izmainītu vērtību, tas ir jāieraksta atmiņā. Parasti tiek izmantots kāds no MESI protokola variantiem. Tradicionālajā MESI ieviešanā, ja vērtība ir mainīta vienā kešatmiņā, tā nevar būt nekādā citā kešatmiņā tajā pašā līmenī.
Seko atbilde no sleske:
Jā, var notikt divas kešatmiņas kešatmiņas, kas var notikt vienā un tajā pašā atmiņas reģionā, un faktiski ir problēma, kas praksē notiek daudz. Ir dažādi risinājumi, piemēram:
- Abas kešatmiņas var sazināties, lai pārliecinātos, ka tās nepiekrīt
- Jums var būt sava veida vadītājs, kas uzrauga visus kešatmiņas un tos attiecīgi atjaunina
- Katrs procesors uzrauga atmiņas zonas, kuras tas ir saglabājis kešatmiņā, un, kad tas atklāj rakstu, izspiež tās (tagad nederīgo) kešatmiņu
Problēma tiek saukta par kešatmiņas saskaņotību, un Wikipedia rakstam par šo tēmu ir labs pārskats par problēmu un iespējamiem risinājumiem.
Un mūsu galīgā atbilde no Kimberly W:
Lai atbildētu uz jautājumu sava amata nosaukumā, tas ir atkarīgs no kešatmiņas protokola. Ja tas ir norakstīšana, kešatmiņa tiks izskalota tikai atpakaļ uz galveno atmiņu, kad kešatmiņas kontrolierim nav citas izvēles, kā ievietot jaunu kešatmiņas bloku jau aizņemtajā telpā. Bloks, kas iepriekš bija aizņemts, tiek noņemts un tā vērtība tiek ierakstīta atpakaļ galvenajā atmiņā.
Otrais protokols ir pierakstīšana. Tādā gadījumā jebkurā laikā kešatmiņas bloks tiek rakstīts uz līmeņa n, atbilstošo bloku līmenī n + 1 tiek atjaunināts. Koncepcijā tā ir līdzīga, aizpildot formu ar oglekļa papīru; viss, ko jūs uzrakstāt uz augšu, ir nokopēts zemāk esošajā lapā. Tas ir lēnāks, jo tas acīmredzami ietver vairāk rakstīšanas operāciju, bet vērtības starp kešatmiņām ir konsekventākas. Atpakaļnosūtīšanas shēmā tikai visaugstākā līmeņa kešatmiņā būtu visjaunākā vērtība konkrētam atmiņas blokam.
Vai kaut kas jāpievieno paskaidrojumam? Skaņas izslēgšana komentāros. Vai vēlaties lasīt vairāk atbildes no citiem tehnoloģiju gudriem Stack Exchange lietotājiem? Apskatiet pilnu diskusiju pavedienu šeit.
Attēla kredīts: Lemsipmatt (Flickr)