If-Koubou

Кога е кеш паметта на процесора обратно в главната памет?

Кога е кеш паметта на процесора обратно в главната памет? (Как да)

Ако току-що започвате да научите как работят многоядрените процесори, кеширането, кеширането и паметта, това може да изглежда малко объркващо отначало. С оглед на това, днешната публикация "SuperUser Q & A" има отговори на въпроса на любознателен читател.

Днешната сесия за въпроси и отговори ни идва с любезното съдействие на SuperUser - подразделение на Stack Exchange - обединяване на уеб сайтове с въпроси и отговори.

Въпроса

Reader на SuperUser CarmeloS иска да разбере кога кешът на процесора се запълва обратно в главната памет:

Ако имам процесор с две ядра и всяко ядро ​​има свой L1 кеш, е възможно Core1 и Core2 да кешират едновременно една и съща част от паметта едновременно? Ако е възможно, какво ще бъде стойността на основната памет, ако Core1 и Core2 са редактирали своите стойности в кеша?

Кога кешът на процесора се връща обратно в главната памет?

Отговорът

Служителите на SuperUser David Schwartz, sleske и Kimberly W имат отговора за нас. Първо, Дейвид Шварц:

Ако имам процесор с две ядра и всяко ядро ​​има свой L1 кеш, е възможно Core1 и Core2 да кешират едновременно една и съща част от паметта едновременно?

Да, изпълнението е ужасно, ако случаят не е такъв. Помислете за две нишки, изпълняващи един и същ код. Искате този код и в двата кеша L1.

Ако е възможно, какво ще бъде стойността на основната памет, ако Core1 и Core2 са редактирали своите стойности в кеша?

Старата стойност ще бъде в основната памет, която няма значение, тъй като нито ядрото няма да я прочете. Преди да извади променена стойност от кеш паметта, тя трябва да бъде записана в паметта. Обикновено се използва някакъв вариант на протокола MESI. При традиционната внедряването на MESI, ако дадена стойност се променя в един кеш, тя изобщо не може да присъства в никой друг кеш на същото ниво.

Следва отговор от sleske:

Да, като има два кеша кеш, може да се случи същият регион на паметта и всъщност е проблем, който се случва много на практика. Има различни решения, например:

  • Двата кеша могат да комуникират, за да се уверят, че не са несъгласни
  • Можете да имате някакъв надзорен орган, който следи всички кешове и ги актуализира съобразно това
  • Всеки процесор следи зоните на паметта, които са съхранени в кеширане, и когато открие запис, той изхвърля своя (сега невалиден) кеш

Проблемът се нарича кохерентност на кеша, а статията в Wikipedia по темата има хубав преглед на проблема и възможните решения.

И нашият последен отговор от Кимбърли У:

За да отговорите на въпроса в заглавието на публикацията си, това зависи от това какво е кеширащият протокол. Ако това е записване, кешът ще бъде пуснат обратно в главната памет, когато контролерът на кеша няма друг избор освен да постави нов кеширащ блок в вече заемано пространство. Блокът, който преди това е заемал мястото, се премахва и стойността му се записва в главната памет.

Другият протокол е записване. В този случай, по всяко време кешът блок е на ниво п, съответния блок на ниво п + 1 се актуализира. Подобно е понятието за попълване на формуляр с въглеродна хартия отдолу; всичко, което пишете на върха, се копира на листа по-долу. Това е по-бавно, тъй като очевидно включва повече операции за писане, но стойностите между кеш са по-последователни. В схемата за отписване само кеша с най-високо ниво би имал най-актуалната стойност за конкретен блок на паметта.

Имате ли нещо, което да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други потребители на Stack Exchange? Вижте цялата тема на дискусията тук.

Image Credit: Lemsipmatt (Flickr)