В простейшей схеме ЛЗУ, изображенной на рис. 1, в ЛЗУ загружается целиком блок последовательно расположенных данных из ОЗУ. Размер этого блока определяется размером ЛЗУ.
Рис. 1.
Когда МП запрашивает данные по определенному адресу, контроллер ЛЗУ проверяет, есть ли они в ЛЗУ и в случае "кэш-попадания", возвращает их в МП. В случае "кэш-промаха", контроллер ЛЗУ обновляет полностью все данные в ЛЗУ.
Достоинство данной схемы — ее простота. Недостаток — данные в ЛЗУ обновляются всем блоком. При большом количестве промахов это будет приводить к задержкам в работе ЛЗУ и потере его эффективности.
Такая простейшая схема будет эффективно работать только при очень хорошо оптимизированной программе, когда максимальное количество данных сразу попадает в ЛЗУ.
Переключающееся ЛЗУ
Рис. 2.
Идея переключающегося ЛЗУ представлена на рис. 2. По сути дела мы имеем здесь два ЛЗУ, которые работают независимо, но под управлением одного контроллера. Например, одно ЛЗУ может использоваться для данных, другое — для команд. В этом случае вероятность "кэш-промахов" снижается, так как данные и команды как правило лежат компактно, но отдельно.
Другой вариант использования такой схемы — разделение ЛЗУ на две части. Пока осуществляется поиск данных в одной части ЛЗУ, может "подкачиваться" информация в другую часть. Таким образом, экономится время на обновление ЛЗУ в случае фиксации "кэш-промаха".
Двухпортовое ЛЗУ
Двухпортовое ЛЗУ строится на основе двухпортового ЗУ, архитектура которого представлена на рис. 3.
Рис. 3.
Двухпортовое ЗУ позволяет выполнять одновременный доступ по двум каналам, например, одновременно считывать и записывать. Таким образом, подкачка данных в ЛЗУ может выполняться одновременно с поиском данных в нем.
Недостатоком двухпортового ЛЗУ является большая стоимость двухпортового ЗУ.
Главной отличительной чертой всех простейших ЛЗУ и их главным недостатком является необходимость переноса из ОЗУ в ЛЗУ сразу целого блока данных. Это приводит к большим потерям времени в случае "кэш-промаха", так как нужно подгружать из ОЗУ большой объем данных.
Ассоциативное ЛЗУ
Попытка уйти от перезагрузки полного блока сделана в архитектуре ассоциативного ЛЗУ. В данном случае из ОЗУ в ЛЗУ может загружаться содержимое отдельной ячейки. Таким образом, каждая ячейка ЛЗУ содержит информацию из какой-либо ячейки ОЗУ. Но в этом случае для каждой ячейки ЛЗУ необходимо хранить адрес той ячейки основного ЗУ, данные которой она содержит. Этот адрес называется тэгом адреса (tag) и хранится он в таблице тэгов.
Рис. 1.
При поступлении от МП запроса на чтение данных, контроллер ЛЗУ проверяет по таблице тэгов, есть ли данные, соответствующие данному адресу, в ЛЗУ. Если есть — они возвращаются МП, если нет (случай "кэш-промаха"), данные загружаются из основной памяти, помещаются в одну из ячеек ЛЗУ и выдаются в МП. Таким образом, в ситуации "кэш-промаха" перезагружается только одна ячейка ЛЗУ. Это экономит время и является главным преимуществом данной архитектуры.
Однако в такой схеме есть один серьезный недостаток. Для того чтобы определить, есть ли нужные данные в ЛЗУ, контроллер должен просмотреть всю таблицу тэгов. Длина ее равна количеству ячеек. Такой поиск может занять сравнительно много времени, сводя таким образом на нет выигрыш, полученный путем минимизации перезагрузок. Именно поэтому такая схема не получила большого распространения на практике и применяется в настоящий момент только в небольшом внутреннем кеше некоторых быстродействующих МП.
Недостатком является также необходимость хранения в таблице тэгов полных адресов ячеек. За счет этого таблица тэгов занимает много места, соответственно полезный объем ЛЗУ (пригодный для хранения данных) уменьшается.