Почему обратная запись в кэш происходит именно так?
Когда система записывает данные в кэш, она должна в какой-то момент также записать эти данные в резервное хранилище.
Зачем? Моя записка о курсе не оправдывает это. Любой компонент, кроме процессора, интересуется тем, что находится в кеше? Очевидно, это зеркалирование даже не очень актуально, так как мы можем отложить записи...
Время этой записи контролируется так называемой политикой записи.
Существует два основных подхода к написанию:
...
Обратная запись (или обратная запись): изначально запись выполняется только в кэш. Запись в резервное хранилище откладывается до тех пор, пока блоки кеша, содержащие данные, не будут изменены / заменены новым контентом.
Таким образом, он отложен до тех пор, пока не будет заменен? Как это имеет смысл - вы отражаете информацию, которая, как вы знаете, может измениться! Почему бы не сделать это, когда блоки добавляются?
1 ответ
Давайте предположим, что речь идет о кэш-памяти процессора. На самом деле, следующие правила верны для всех типов кэшей обратной записи (например, базы данных и тому подобное).
Одна из целей кэширования - использовать временную локальность: небольшое количество адресов памяти очень часто записывается в ("горячие" адреса), тогда как все остальные адреса "холодные". Примером "горячих" адресов является стек программы, потому что каждый раз, когда ваша программа входит в функцию, аргументы копируются в стек, и каждый раз, когда ваша программа существует, аргументы удаляются из нее. Таким образом, одни и те же адреса стека постоянно используются повторно. В этом случае работа с ОЗУ будет очень медленной (задержка ОЗУ составляет ~200 тактов ЦП, а задержка кэша L1 - всего ~4 такта). Вот почему при выполнении операции записи она изменяет только записи в кэше, и эта запись в кэше также помечается как "грязная". Эта запись в кеше будет синхронизирована с ОЗУ позже, когда произойдет одно из следующих событий:
- Операция записи была выполнена по некоторому адресу, которого нет в кэше. Поскольку все записи в кеше обычно заняты, нам нужно искать запись в "жертве". Если эта запись в "жертве" загрязнена (а), то ее необходимо скопировать в основную память (медленная работа, ЦП блокируется во время выполнения). Если нет (b), то эта запись в кэше просто удаляется (быстро).
- Подсистема памяти пытается уменьшить вероятность (а) в пользу (б). Это достигается путем периодического копирования всех записей грязного кэша в фоновом режиме и удаления из них грязного флага.