Организация кэш памяти

Мы уже не раз отмечали, что оперативная память вычислительных систем реализуется на относительно медленных микросхемах динамической памяти. Если процессор работает непосредственно с памятью такого типа, требуется вводить такты ожидания для процессора. В этом случае процессор частично простаивает. Статическая память, построенная на триггерах, имеет то же быстродействие, что и процессоры и использование такой памяти позволило бы работать процессору без тактов ожидания, но параметр цена/производительность диктует поиски другого выхода из этой ситуации. Разумным компромиссом для построения экономичных и производительных систем явился иерархический способ построения памяти. Обмен процессора с оперативной памятью производится при помощи промежуточной относительно небольшой кэш-памяти на быстродействующих микросхемах SRAM.
В переводе слово кэш (cache) означает склад или тайник. Для выполняемой программы он не представляет собой дополнительной адресуемой памяти. Он выполняет роль быстродействующего хранилища копий блоков информации основной памяти, к которым в ближайшее время ожидается обращение. Объем кэш во много раз меньше объема оперативной памяти. Контроллер кэш памяти ведет каталог и при каждом обращении к кэш памяти по каталогу проверяет, есть ли действительная копия затребованных данных в кэше? Если она там есть, то это случай кэш попадания (cache hit), и обращение за данными происходит только к кэш-памяти. Если действительной копии там нет, то это случай кэш-промаха (cache miss), и данные берутся из основной памяти.
Отношение числа попаданий к общему числу обращений к памяти называется коэффициентом эффективности поиска. Если этот коэффициент достаточно высок, большая часть времени затрачивается на обращение к кэш-памяти, что эквивалентно использованию быстродействующей основной памяти при выполнении программы. Обычно коэффициент эффективности поиска превышает 95%.
Обращение к основной памяти может начинаться одновременно с поиском данных в каталоге кэш, и в случае попадания - прерывается (архитектура Look Aside). При параллельном поиске из - за параллельного обращении к оперативной памяти возрастают затраты энергии.
В другом варианте обращение к внешней памяти начинается только после фиксации случая промаха (архитектура Look Through), на этом теряется, по крайней мере, один такт процессора, зато значительно экономится энергия.
В современных процессорах кэш обычно строится по двухуровневой схеме. Первичный кэш (L1 Cache) имеет сравнительно небольшой объем и для повышения производительности обычно используется раздельный кэш для данных и команд (так называемая Гарвардская архитектура - противоположность Принстонской, использующей общий кэш для команд и данных). Вторичный кэш (L2 Cache) тоже включается в микросхему микропроцессора, но не разделяется на кэш команд и данных. Работает встроенный кэш на внутренней тактовой частоте процессора.

Принципы взаимодействия кэш памяти с оперативной памятью.
Кэш память может быть построена как синхронная или асинхронная память.
Асинхронный кэш
При обращении к памяти контроллер асинхронного кэш производит поиск адреса данных в таблицах, поэтому при каждом обращении необходим дополнительный цикл для просмотра таблиц (тегов), можно реализовать кэш с быстрым циклом 3-2-2-2, но чаще цикл асинхронного кэш составляет 4-2-2-2 такта.
Синхронный кэш
Контроллер синхронного кэш помещает поступающие адреса в буфер. В первом такте запрашиваемый адрес запоминается в регистре. Во втором такте данные устанавливаются на шине данных и читаются процессором, в это же время осуществляется чтение в буфер следующего адреса. Для последовательных элементов данных (без дополнительной дешифрации адреса) в оптимальном варианте может быть обеспечен цикл 2-1-1-1 по высокоскоростной шине.
Контроллер кэш
Контроллер кэш памяти оперирует со строками данных (cache line) фиксированной длины (или блоками данных). С каждой строкой кэш (блоком) связана информация об адресе скопированного в нее блока основной памяти и признаки ее состояния. Строка может быть действительной (valid) - это означает, что в текущий момент времени она достоверно отражает соответствующий блок основной памяти, или недействительной (пустой).
Строки кэш памяти обычно выделяются только при операциях чтения. Запись блока, не имеющего копии в кэш памяти, производится только в основную память. Поведение кэш-контроллера при операции записи в память, когда копия затребованной области находится в некоторой строке кэш памяти, определяется его политикой записи (Write Policy).
Существуют два основных алгоритма записи данных из кэш памяти в оперативную память: сквозная запись WT (Write Through) и обратная запись WB (Write Back).
Алгоритм сквозной записи (WT) предусматривает выполнение каждой операции записи (даже однобайтной) одновременно и в строку кэш памяти, и в основную память. Алгоритм достаточно прост в реализации и легко обеспечивает целостность данных за счет постоянного совпадения копий данных в кэш и в основной памяти. Но эта простота оплачивается низкой эффективностью записи.
Алгоритм обратной записи (WB) позволяет уменьшить количество операций записи в оперативную память. Если блок памяти, в который должна производиться запись, отображен и в кэш памяти, то физическая запись сначала будет произведена в эту действительную строку кэш памяти, и будет отмечена как грязная (dirty), или модифицированная, то есть требующая записи в оперативную память. Только после записи в оперативную память строка станет чистой (clean). Данный алгоритм сложнее в реализации, но существенно эффективнее, чем алгоритм сквозной записи (WT).

В зависимости от способа определения взаимного соответствия строки кэш памяти и области основной памяти различают три архитектуры кэш-памяти: кэш прямого отображения (direct-mapped cache), полностью ассоциативный кэш (fully associative cache) и их комбинация - частично или наборно-ассоциативный кэш (set-associative cache).

Архитектура кэш-памяти