Відповіді:
Якщо у мене є процесор з двома ядрами, у кожного ядра є власний кеш L1, чи можливо Core1 та Core2 кешувати одну і ту ж частину пам'яті одночасно?
Так. Виступ був би жахливим, якби цього не було. Розглянемо два потоки з одним і тим же кодом. Цей код потрібно в обох кешах L1.
Якщо можливо, яке значення основної пам'яті буде, якщо і Core1, і Core2 відредагували своє значення в кеші?
Старе значення буде в основній пам'яті, що не має значення, оскільки жоден процесор не прочитає його. Перед тим, як вийняти змінене значення з кешу, його потрібно записати в пам'ять. Зазвичай використовується якийсь варіант протоколу MESI . У традиційній реалізації MESI, якщо значення модифіковане в одному кеші, воно взагалі не може бути присутнім у будь-якому іншому кеші на тому самому рівні.
Так, це може мати місце (якщо два кеші зберігаються в одній області пам’яті), насправді це проблема, яка на практиці виникає багато. Існують різні рішення, наприклад:
Проблема називається кеш-когерентністю . Стаття у Вікіпедії з цієї теми має хороший огляд проблеми та можливі шляхи їх вирішення.
Щоб відповісти на запитання у своєму заголовку, залежить від протоколу кешування. Якщо це режим зворотного запису, кеш повернеться в основну пам'ять лише тоді, коли кеш-керуючий не має іншого вибору, крім того, щоб помістити новий блок кешу у вже зайняте місце. Блок, який раніше займав простір, видаляється і його значення записується назад в основну пам'ять.
Інший протокол - це протокол. У цьому випадку, щоразу, коли кеш-блок записується на рівні n, відповідний блок на рівні (n + 1) оновлюється. (Це за концепцією схоже на заповнення форми під вуглецевим папером під нею; все, що ви пишете вгорі, копіюється на аркуші нижче.) Це повільніше, оскільки, очевидно, передбачає більше операцій написання, але значення між кешами є більш послідовними. У схемі зворотного запису лише кеш найвищого рівня мав би найсвіжіше значення для певного блоку пам'яті.