Кога кешът на процесора се изчиства обратно към основната памет?
Ако току-що започвате да научавате как работят многоядрените процесори, кеширането, кохерентността на кеша и паметта, в началото може да изглежда малко объркващо. Имайки предвид това, днешната публикация за въпроси и отговори на суперпотребителя отговаря на един любопитен въпрос на читателя.
Днешната сесия за въпроси и отговори идва при нас с любезното съдействие на SuperUser - подразделение на Stack Exchange, групирано от общността уеб сайтове за въпроси и отговори.
Въпроса
Reader от суперпотребител CarmeloS иска да знае кога кешът на процесора е промит обратно в основната памет:
Ако имам процесор с две ядра и всяко ядро има свой собствен L1 кеш, възможно ли е Core1 и Core2 да кешират една и съща част от паметта едновременно? Ако е възможно, каква ще бъде стойността на основната памет, ако и Core1, и Core2 са редактирали своите стойности в кеша?
Когато кешът на процесора е изчистен обратно в основната памет?
Отговорът
Участниците в SuperUser Дейвид Шварц, sleske и Kimberly W имат отговор за нас. Първо, Дейвид Шварц:
Ако имам процесор с две ядра и всяко ядро има свой собствен L1 кеш, възможно ли е Core1 и Core2 едновременно да кешират една и съща част от паметта едновременно.?
Да, представянето щеше да е ужасно, ако това не беше така. Помислете за две нишки, които изпълняват същия код. Искаш този код и в двата L1 кеша.
Ако е възможно, каква ще бъде стойността на основната памет, ако и Core1, и Core2 са редактирали своите стойности в кеша?
Старата стойност ще бъде в основната памет, което няма да има значение, тъй като нито едно ядро няма да го прочете. Преди да извадите модифицирана стойност от кеша, тя трябва да бъде записана в паметта. Обикновено се използва някакъв вариант на протокола MESI. При традиционната реализация на MESI, ако дадена стойност е променена в един кеш, тя не може да присъства изобщо във всеки друг кеш на същото ниво.
Следван от отговора от sleske:
Да, имаме два кеша кеш една и съща област памет може да се случи и всъщност е проблем, който се случва много в практиката. Има различни решения, например:
- Двата кеша могат да комуникират, за да се уверят, че не са съгласни
- Можете да имате някакъв надзорен орган, който да следи всички кешове и да ги актуализира съответно
- Всеки процесор следи областта на паметта, която е кеширана и когато открие запис, изхвърля своя (сега невалиден) кеш
Проблемът се нарича cache coherency, а статията на Wikipedia по темата има хубав преглед на проблема и възможните решения.
И нашият последен отговор от Кимбърли У:
За да отговорите на въпроса в заглавието на публикацията, това зависи от това, което е протоколът за кеширане. Ако е обратно записване, кешът ще бъде изчистен обратно само в основната памет, когато контролерът на кеша няма друг избор, освен да постави нов блок кеш във вече заетото пространство. Блокът, който преди това е заемал мястото, се премахва и неговата стойност се записва обратно в основната памет.
Другият протокол е запис. В този случай, всеки път, когато блокът за кеш се записва на ниво п, съответния блок на ниво п + 1 се актуализира. По подобен начин той е подобен на попълването на формуляр с въглеродна хартия отдолу; това, което пишете отгоре, се копира на листа по-долу. Това е по-бавно, защото очевидно включва повече операции по писане, но стойностите между кешовете са по-последователни. В схемата за обратно записване само най-високото ниво на кеша ще има най-актуалната стойност за конкретен блок памет.
Имате ли какво да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други технологични потребители на Stack Exchange? Вижте пълната тема за дискусия тук.
Кредит за изображения: Lemsipmatt (Flickr)