Архитектура кэш-памяти
А.Смит
Smith A. Cache Memories. – Computing Surveys. – Sept. 1982. – vol. 14. – P. 473-475.
Кэш – это особое место, которое автоматически считывает данные, когда они нам нужны, и возможно извлекает новые данные по
требованию процессора. Однако хорошим вопросом является «Как именно кэш это делает?»
или «Что происходит, когда кэш полон, а процессор запрашивает данные, которых
нет в КЭШе? ». В этой статье мы рассмотрим внутреннюю организацию кэш – памяти
и попытаемся ответить на эти и другие вопросы.
Основная идея КЭШа в том, что в
данный момент времени программа обращается к малому числу данных. Ели размер
КЭШа и данных, доступных для программы в данный момент одинаков, тогда мы можем
поместить эти данные в кэш и обращаться к ним с высокой скоростью. К сожалению,
данные редко лежат в близких друг от друга областях памяти. Обычно бывает
несколько данных здесь несколько данных там и несколько данных где-нибудь еще.
В общем случае данные распространяются по всему адресному пространству.
Поэтому, при разработке КЭШа должен учитываться тот факт, что он должен
отображать данные из широко изменяющегося адресного пространства памяти.
Идея кэш-системы в том, что мы можем
связать разные, не близлежащие адреса с каждой строкой КЭШа. Таким образом,
строка КЭШа #0 может соответствовать адресам $10000..$1000F, а стока КЭШа 1 может
соответствовать адресам $21400..$2140F. В общем случае, если строка КЭШа
длиной n байт (n- обычно некоторое число в степени двойки), тогда в строку КЭШа будет
считываться n-байт с основной памяти.
Когда кэш контроллер считывает строку
кэш-памяти с более низкого уровня иерархии памяти, возникает вопрос «Как данные
размещаются в КЭШе?». Наиболее гибкая кэш система это полностью ассоциативный
кэш. В подсистеме полностью ассоциативного КЭШа кэш контроллер может поместить
блок байт в любую строку кэш памяти. Пока эта самая гибкая и дорогая система.
Другой вид кэш памяти – это кэш
память с прямым отображением. В кэш памяти с прямым отображением блок из
основной памяти всегда загружается в одну и туже строку кэш памяти. В общем
случае, некоторое число битов в адресном пространстве основной памяти выбирают
строку кэш-памяти. Например, на рисунке 6.3 показано как кэш контроллер может
выбирать строку кэш памяти для 8 килобайтного КЭШа со строками в 16 байт и 32-
разрядным адресным пространством основной памяти. Схема кэш памяти с прямым
отображением очень легко представляется.
Возможно самая большая проблема в
кэш-памяти с прямым отображением это
неэффективное использование всей кэш памяти. Например, схема КЭШа на
рис.6.3 показывает отображение адреса 0 на строку КЭШе #0. Так же отображаются
адреса $2000 (8K), $4000 (16K), $6000 (24K), $8000 (32K), таким образом, отображается каждый
адрес даже более 8 Кбайт на строку кэш памяти #0. Это означает, что если программа
постоянно обращается к данным в диапазоне адресов более 8 кбайт и не обращается
к другим областям, система будет использовать только строку КЭШа #0 , оставляя
остальные строки КЭШа неиспользованными. В каждый момент времени процессор
запрашивает данные по адресу, который не
связан со строкой КЭШа #0, и процессор должен будет спускаться вниз по иерархии
памяти, чтобы получить доступ к данным. В этом патологическом случае, кэш в
действительности ограничен одной строкой.
Организация кэш-памяти полностью
ассоциативного типа - слишком комплексная, дорогая и медленная. Но организация
кэш памяти с прямым отображением не такая эффективная, как бы хотелось.
Появляется вопрос, есть ли компромисс, который может дать нам больше
возможностей для кэш памяти с прямым отображением без сложностей полностью
ассоциативного КЭШа. Такой компромисс есть – это n-way set ассоциативный кэш. Идея
здесь состоит в том, чтобы разбить кэш на множества строк КЭШа. Процессор
выбирает отдельное множество, используя некоторое подмножество адресных битов,
так же как для кэш памяти с прямым отображением. В пределах каждого множества
существуют n-кэш
строк. Кэш контроллер использует полностью ассоциативный алгоритм, чтобы
выбрать одну из n
кэш строк в пределах множества.
Например,
8 Килобайтная two – way set
ассоциативная кэш система с размером кэш
строк в 16 байт организовывает кэш как последовательность 256 множеств, причем
каждое множество содержит 2 кэш-строки (two – way set). Восьми разрядный
адрес в памяти выбирает одно из этих 256 различных множеств. Тогда кэш
контроллер может отобразить блок байтов в любую кэш строку в пределах
множества. Превосходство two
– way
set
ассоциативного КЭШа в том, что мы имеем двойной доступ в пределах 8 кбайт, и
получаем разные строки при каждом доступе. Однако если вы пытаетесь получить
доступ во второстепенную область памяти в диапазон адресов более 8 килобайт ,
то получится конфликтная ситуация.