7.4.4.3.2. Обновление кэш-памяти
Работая с кэш-памятью, необходимо помнить, что одновременно
могут существовать две копии одних и тех
же данных: одна в кэш-памяти, а другая в основной памяти. Если изменяется только одна из этих копий, то по одному и тому
же адресу будут существовать два
набора информации. Кэш-память должна содержать систему обновления для
предотвращения использования устаревших данных в качестве достоверных. Рис. 4.7 иллюстрирует, как данные могут стать
устаревшими и неправильными. Для согласования содержимого кэш-памяти с основной
памятью используются три общих метода: сквозная запись, буферизованная сквозная
запись и обратная запись.
Сквозная запись. При обновлении кэш-памяти методом сквозной записи кэш-контроллер одновременно
обновляет содержимое основной памяти (рис. 4.8). Иначе говоря, основная память отражает текущее
содержимое кэш-памяти. Быстрое обновление позволяет перезаписывать любой блок в
кэш-памяти в любое время без потери данных. Система со сквозной записью проста, но время, требуемое
для записи в
основную память, снижает производительность и увеличивает количество обращений по магистрали (что
особенно заметно в мультипроцессорной системе).
Буферизованная сквозная запись. В схеме обновления в
буферизованной сквозной
записью любая запись в основную память буферизуется, т.е. информация задерживается в кэш-памяти
перед записью в основную память (схемы кэш-памяти управляют доступом к основной памяти асинхронно по
отношению к работе процессора). Затем
процессор начинает новый цикл до завершения цикла записи в основную память. Если за записью следует чтение,
то это кэш-попадание, так как чтение
может быть выполнено в то время, когда кэш-контроллер занят обновлением основной памяти. Эта буферизация позволяет
избежать снижения производительности,
характерного для системы со сквозной записью (рис. 4.9).
У этого метода есть один существенный недостаток. Так
как обычно буферизуется
только одиночная запись, то две последовательные записи в основную

Рис. 4.7. Создание
устаревших или неправильных данных, а -МП 80386 требует данные и фиксирует
кэш-промах. Данные копируются
из основной памяти и пересылаются в процессор, б -МП 80386 модифицирует данные и отсылает их для записи, в - позже МП 80386 запрашивает новые данные. Данные в кэш-памяти, помеченные перекрестной штриховкой в п. б, перекрываются новыми данными,
г - МП 80386 запрашивает модифицированные данные, однако получает исходные, так
как данные были модифицированы только в
кэш-памяти, а в основную память переписаны
не были.

Рис. 4.8. Пример сквозной
записи.

Рис. 4.9. Пример буферизованной сквозной
записи.
память требуют цикла ожидания процессора. Кроме этого,
запись с пропущенным последующим
чтением также требует ожидания процессора. Состояние ожидания-это внутреннее состояние, в
которое входит процессор при отсутствии синхронизирующих сигналов. Состояние
ожидания используется для синхронизации процессора с медленной памятью.
Обратная
запись. В схеме обновления с
обратной записью используется бит «изменения»
в поле тега. Этот бит устанавливается, если блок был обновлен новыми данными и
является более поздним, чем его оригинальная копия в основной памяти. Перед тем как перезаписать блок в кэш-памяти,
контроллер проверяет состояние этого
бита. Если он установлен, то контроллер переписывает данный блок в основную память перед загрузкой новых данных в
кэш-память.
Обратная запись быстрее сквозной, так как обычно число
случаев, когда блок изменяется
и должен быть переписан в основную память, меньше числа случаев, когда эти блоки считываются и
перезаписываются.
Однако обратная запись имеет несколько недостатков.
Во-первых, все измененные блоки должны быть переписаны в основную память перед тем, как другое
устройство сможет
получить к ним доступ. Во-вторых, в случае катастрофического отказа, например отключения
питания, когда содержимое кэш-памяти теряется, но содержимое основной памяти
сохраняется, нельзя определить, какие места в основной памяти содержат устаревшие данные. Наконец,
кэш-контроллер для обратной
записи содержит больше (и более сложных) логических микросхем, чем контроллер для сквозной записи.
Например, когда система с обратной записью осуществляет запись измененного блока в память, то
она формирует адрес записи из тега и выполняет цикл обратной записи точно так же, как и вновь
запрашиваемый доступ.
Согласованность кэш-памяти. Устаревшие данные в основной
памяти, вызванные
операциями записи, виртуально уничтожаются сквозной и обратной записью. Существует категория устаревших
данных, появляющаяся когда кэш-память используется в системе с доступом к памяти более чем из
одного устройства. Например,
пусть два устройства копируют раздел памяти и устройство 1 обновляет его
первым. Когда устройство 2 производит запись в память, оно разрушит любые
изменения, сделанные устройством 1. При этом говорят, что нарушается согласованность кэш-памяти. В общем
случае существуют три подхода к обеспечению согласованности кэш-памяти.
Очистка кэш-памяти. При этой операции измененные данные записываются в
основную память, а
кэш-память очищается. Если все кэш-памяти в системе очищаются перед операцией записи
устройствами в память совместного пользования, то возможность появления
устаревших данных в любой кэш-памяти исключается. Преимуществом этого метода является простая аппаратная
реализация. Главный
недостаток в том, что следующий за очисткой доступ в память должен по определению быть кэш-промахом до
тех пор, пока кэш-память не заполнится новыми данными.
Аппаратная прозрачность. Аппаратное решение проблемы
устаревших данных дает
уверенность, что все обращения к основной памяти (т.е. к той ее части, что
отображается в кэш-память) проводятся через кэш-память. Это может быть сделано либо (1) путем копирования всех
кэш-записей, как в основную память, так и во все другие кэш-памяти, либо (2)
пересылкой всех кэш-записей через единственную кэш-память. На рис. 4.10 показаны различные
аппаратные подходы.
Некэшируемая память. Другой метод решения проблемы согласованности кэш-памяти - это использование общей памяти как
некэшируемой. В системе, основанной на этом
методе, все обращения к общей памяти являются кэш-промахами, поскольку эта
память никогда не копируется в кэш. Некэшируемая память может быть идентифицирована путем использования
старших битов адреса или с помощью
логики выбора микросхем памяти.
Конструкторы
систем имеют тенденцию применять некоторую комбинацию этих трех методов для уверенности в достоверности данных. Например, одна система может использовать некэшируемую память
для медленных задач ввода-вывода,
таких как вывод на печать, и аппаратную прозрачность для критичных по времени
операций ввода-вывода, подобных разбиению на страницы.