Кэширование оперативной памяти

Кэширование оперативной памяти

Основная
память, реализуемая на относительно
медленных по своей природе микросхемах
динамической памяти, обычно требует
ввода тактов ожидания про­цессора
(wait
states)
в циклы обращения к памяти. Статическая
память, пост­роенная, как и процессор,
на триггерных ячейках, по своей природе
способна догонять современные процессоры
по быстродействию и избежать (или хотя
бы сократить количество) тактов ожидания.
Реализация основной памяти на микросхемах
SRAM
технически и экономически не оправдана,
поскольку плот­ность упаковки
информации у них существенно ниже, а
удельная стоимость хранения и
энергопотребление (или, что важнее,
тепловыделение) существенно выше, чем
у DRAM.
Разумным компромиссом для построения
экономичных и производительных систем
явился иерархический способ построения
оператив­ной памяти, пришедший в
архитектуру PC
с появлением процессора 386, у которого
тактовая частота уже значительно
отрывалась от возможностей мик­росхем
DRAM
того времени. Идея этого способа
заключается в сочетании основной памяти
большого объема на DRAM
с относительно небольшой кэш-памятью
на быстродействующих микросхемах SRAM.
Идея, конечно, далеко не нова —
сверхоперативная память применялась
давно, еще в «больших» компь­ютерах.

В
переводе слово «кэш»
(cache)
означает склад или тайник («заначка»).
Тайна этого склада заключается в его
«прозрачности» — для программы он не
представляет собой дополнительной
адресуемой области памяти. Он является
дополнительным и быстродействующим
хранилищем копий блоков информа­ции
основной памяти, к которым, вероятно, в
ближайшее время будет обраще­ние. Кэш
не может хранить копию всей основной
памяти, поскольку его объем во много
раз меньше объема основной памяти. Он
хранит лишь ограниченное количество
блоков данных и каталог
(cache
directory)
— список их текущего соответствия
областям основной памяти. Кроме того,
кэшироваться может не вся память,
доступная процессору: обычно кэшируется
только основная дина­мическая память
системной платы (память, установленная
на адаптерах, не кэшируется), и из этой
памяти кэшируется только часть
(распространенные версии чипсетов для
Pentium
часто позволяют кэшировать только
первые 64 Мбайт ОЗУ).

При
каждом обращении к кэшируемой памяти
контроллер кэш-памяти по каталогу
проверяет, есть ли действительная копия
затребованных данных в кэше. Если она
там есть, то это случай кэш-попадания
(cache
hit),
и обращение за данными происходит только
к кэш-памяти. Если действительной копии
там нет, то это случай кэш-промаха
(cache
miss),
и данные берутся из основной памяти. В
соответствии с алгоритмом кэширования
блок данных, считанный из основной
памяти при определенных условиях,
заместит один из блоков кэша. От «ловкости»
и «предусмотрительности» алгоритма
зависит процент попада­ний и,
следовательно, эффективность кэширования.
Поиск блока в списке дол­жен производиться
достаточно быстро, чтобы «задумчивостью»
в принятии решения не свести на нет
выигрыш от применения быстродействующей
памяти. Обращение к основной памяти
может начинаться одновременно с поиском
в каталоге,
а в случае попадания — прерываться
(архитектура Look
Aside).
Это экономит время, но лишние обращения
к основной памяти ведут к излишнему
энергопотреблению. Другой вариант —
обращение к внешней памяти начинает­ся
только после фиксации случая промаха
(архитектура Look
Through),
но на этом теряется, по крайней мере,
один такт процессора, зато экономится
энергия.

В
современных компьютерах кэш обычно
строится по двухуровневой схеме.
Первичный
кэш (
Li
Cache)
встроен во все процессоры класса 486 и
старше, он имеется и у некоторых моделей
386. Объем его невелик (8-32 Кбайт), и для
повышения производительности для данных
и команд часто используется раз­дельный
кэш (так называемая Гарвардская
архитектура — противоположность
Принстонской, использующей общую память
для команд и данных). Быстро­действие
его таково, что он работает на внутренней
тактовой частоте процессора (CPU
Clock),
уже достигшей 333 МГц. Вторичный
кэш

(L2
Cache)
обычно ус­танавливается на системной
плате. Типовым для компьютеров на
процессоре i486 считается объем 64-256 Кбайт,
для Pentium
— 256-512 Кбайт, новые чипсеты поддерживают
до 2 Мбайт L2 Cache.
Его быстродействие обеспечивает ра­боту
на внешней тактовой частоте процессора
— частоте системной шины (Host
Bus
Clock),
типовое значение которой от диапазона
50-66 МГц уже переходит к 75, 83 и даже 100-125
МГц. В Pentium
Pro
синхронный L2 Cache
располо­жен в одном корпусе с процессором
и работает на его внутренней частоте.

Кэш-контроллер
должен обеспечивать когерентность
(coherency)
— согласо­ванность данных кэш-памяти
обоих уровней с данными в основной
памяти, причем обращение к этим данным
может производиться не только со стороны
процессора (а процессоров может быть и
несколько, и у каждого может быть свой
внутренний кэш), но и со стороны других
активных (bus-master)
адаптеров, подключенных к шинам (PCI,
VLB,
ISA...).

Контроллер
кэша оперирует строками
(cache
line)
фиксированной длины. Строка может
хранить копию блока основной памяти,
размер которого, естес­твенно, совпадает
с длиной строки. С каждой строкой кэша
связана информация об адресе скопированного
в нее блока основной памяти и признаки
ее состоя­ния. Строка может быть
действительной
(valid)
— это означает, что в текущий момент
времени она достоверно отражает
соответствующий блок основной па­мяти,
или недействительной
(пустой). Информация о том, какой именно
блок занимает данную строку (то есть
старшая часть адреса или номер страницы),
и ее состояние называется тегом
(tag)
и хранится в связанной с данной строкой
ячейке специальной памяти
тегов

(tag
RAM).
В операциях обмена с основной памятью
обычно строка участвует целиком
(несекторированный кэш), для про­цессоров
i486 и старше длина строки совпадает с
объемом данных, передаваемых за один
пакетный цикл (для 486 это 4х4 = 16 байт, для
Pentium
— 4х8=32 байт). Возможен и вариант
секторированного
(sectored)
кэша, при котором одна строка содержит
несколько смежных ячеек — секторов,
размер которых соответствует минимальной
порции обмена данных кэша с основной
памятью. При этом в записи каталога,
соответствующей каждой строке, должны
храниться биты дей­ствительности для
каждого сектора данной строки.
Секторирование позволяет экономить
память, необходимую для хранения каталога
при увеличении объема кэша, поскольку
большее количество бит каталога отводится
под тег и выгоднееиспользовать
дополнительные биты действительности,
чем увеличивать глубину индекса
(количество элементов) каталога.

Строки
кэша под отображение блока памяти обычно
выделяются только при операциях чтения.
Запись блока, не имеющего копии в кэше,
производится только в основную память
(для повышения быстродействия она может
производиться через буфер отложенной
записи, но это отдельный механизм, не
имеющий не­посредственного отношения
к рассматриваемому кэшированию).
Поведение кэш-контроллера при операции
записи в память, когда копия затребованной
области находится в некоторой строке
кэша, определяется его политикой
записи

(Write
Po­licy).
Существуют два основных алгоритма
записи данных из кэша в основную память:
сквозная
запись
WT
(Write
Through)
и обратная
запись
WB
(Write
Back).

Алгоритм
WT

предусматривает выполнение каждой
операции записи (даже однобайтной),
попадающей в кэшированный блок,
одновременно и в строку кэша, и в основную
память. При этом процессору при каждой
операции записи придется ожидать
окончания относительно длительной
записи в основную па­мять. Алгоритм
достаточно прост в реализации и легко
обеспечивает целост­ность данных за
счет постоянного совпадения копий
данных в кэше и основной памяти. Для
него нет необходимости хранения признаков
присутствия и моди­фицированное™ —
вполне достаточно только информации
тега (при этом счи­тается, что любая
строка всегда отражает какой-либо блок,
а какой именно — указывает тег). Но эта
простота оплачивается низкой эффективностью
записи. Существуют варианты этого
алгоритма с применением отложенной
буфериро­ванной записи, при которой
данные в основную память переписываются
через 'FIFO-буфер во время свободных тактов
шины.

Алгоритм
WB

позволяет уменьшить количество операций
записи на шине основной памяти. Если
блок памяти, в который должна производиться
запись, отображен и в кэше, то физическая
запись сначала будет произведена в эту
действительную строку кэша, и она будет
отмечена как грязная
(dirty),
или модифицированная, то есть требующая
выгрузки в основную память. Только после
этой выгрузки (записи в основную память)
строка станет чистой
(clean),
и ее можно будет использовать для
кэширования других блоков без потери
целостности данных. В основную память
данные переписываются только целой
строкой (после заполнения всех ее
секторов в случае секторированного
кэша) или непосредственно перед ее
замещением в кэше новыми данными. Данный
алгоритм сложнее в реализации, но
существенно эффективнее, чем WT. Под­держка
системной платой кэширования с обратной
записью требует обработки дополнительных
интерфейсных сигналов для обеспечения
выгрузки модифи­цированных строк в
основную память, если к этой области
производится обра­щение со стороны
таких контроллеров шины, как графические
адаптеры, контроллеры дисков, сетевые
адаптеры и т. п.

В
зависимости от способа определения
взаимного соответствия строки кэша и
области основной памяти различают три
архитектуры кэш-памяти: кэш
пря­мого отображения

(direct-mapped
cache),
полностью
ассоциативный кэш

(fully
associative
cache)
и их комбинация — частично-
или наборно-ассоциативный кэш
(set-associative
cache).

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

79 − = 71