- •8. Система памяти
- •8.1. Базовые концепции
- •8.2. Быстродействие, объем и стоимость
- •8.3.1. Функция отображения
- •8.3.2. Алгоритмы замещения
- •8.3.3. Примеры технологий отображения
- •8.3.4. Организация Кэша в коммерческих процессорах
- •8.4. Производительность
- •8.4.1. Чередование операций
- •8.4.2. Частота попаданий и накладные расходы при промахах
- •8.4.3. Кэши на микросхеме процессора
- •8.4.4. Другие способы увеличения быстродействия
- •8.5. Виртуальная память
- •8.5.1. Преобразование адресов
- •8.6. Требования к управлению памятью
8.3.1. Функция отображения
Чтобы показать, как происходит выборка блоков данных из памяти в кэш, мы обратимся к простому примеру. Предположим, у нас имеется кэш, состоящий из 128 блоков по 16 слов в каждом, то есть с общим количеством слов, равным 2048 (2 К), и основная память, адресуемая с помощью 16-разрядных адресов. Основная память имеет объем 64 К слов, который мы будем рассматривать как 4 К блоков по 16 слов. Чтобы облегчить восприятие излагаемого материала, будем считать, что последовательные адреса указывают на последовательные слова.
Прямое отображение
Простейшим способом сопоставления адресов блоков в кэше и в памяти является прямое отображение. При использовании этой технологии блок j основной памяти отображается на блок j по модулю 128 кэша, как показано на рис. 8.4. Таким образом, когда загружается один из блоков основной памяти, начинающихся по адресам 0,128,256 и т. д., он записывается в блок кэша 0. Блоки 1,129, 257 и т. д. записываются в блок кэша 1 и т. д. Поскольку на каждый блок кэша отображается более одного блока основной памяти, то даже при не до конца заполненном кэше может возникнуть состязание за некоторую позицию. Например, команды программы, начавшиеся в блоке 1, после перехода могут продолжиться в блоке 129. В результате выполнения программы оба эти блока должны быть скопированы в блок 1 кэша. Конфликт разрешается просто: старый блок заменяется новым.
Таким образом, местоположение блока в кэше определяется на основе его адреса в памяти. Адрес в памяти может быть разделен на три поля (рис. 8.4). Четыре младших разряда задают одно из 16 слов блока. Когда в кэш записывается новый блок, 7-разрядное поле номера блока данного кэша определяет его местоположение. Пять старших разрядов задают адрес блока в памяти. При записи блока в кэш они указываются в специальном поле тега (дескрипторе). Такое поле имеется в кэше для каждого из его блоков — оно определяет, какому из 32 блоков памяти, отображаемых на данный блок кэша, соответствует хранящаяся здесь информация. Во время выполнения программы процессор генерирует адреса, в каждом из которых 7-разрядное поле номера блока кэша указывает на конкретный блок в нем. Тег этого блока сравнивается со старшими 5 разрядами адреса, и если они совпадают, значит, данное слово уже находится в кэше. В противном случае блок, содержащий данное слово, нужно извлечь из основной памяти и поместить в кэш. Технология прямого отображения очень проста, но ей недостает гибкости.
Рис. 8.4. Кэш с прямым отображением
Ассоциативное отображение
На рис. 8.5 показана схема гораздо более гибкого метода отображения, согласно которому блок основной памяти можно помещать в любой блок кэша. При этом для идентификации хранящегося в кэше блока памяти необходимо иметь уже не 5, а 12 бит. При выполнении программы теговые биты сгенерированного процессором адреса по очереди сравниваются с теговыми битами каждого блока кэша. Если совпадение найдено, значит, содержащий данное слово блок уже присутствует в кэше. Такая технология называется ассоциативным отображением. Она предоставляет полную свободу выбора местоположения блока в кэше, благодаря чему пространство кэша может использоваться более эффективно. Новые блоки заменяют уже хранящиеся в кэше только в том случае, если кэш заполнен, причем для этой цели необходим алгоритм выбора удаляемого блока. Подобных алгоритмов, как станет ясно из раздела 8.3.2, довольно много. Стоимость ассоциативного кэша выше, чем кэша с прямым отображением, поскольку в нем выполняется просмотр всех 128 тегов блоков. Поиск блока в кэше называется ассоциативным поиском. Для того чтобы он выполнялся достаточно быстро, теги должны просматриваться параллельно.
Рис. 8.5. Ассоциативный кэш
Множественно-ассоциативное отображение
Технологии прямого и ассоциативного отображения могут использоваться совместно. В этом случае блоки кэша объединяются в множества, и каждый блок основной памяти может располагаться в любом из блоков определенного множества. Причем вероятность конфликтов, являющихся одним из недостатков прямого отображения, значительно снижается. Такой кэш, получивший название множественно-ассоциативного, дешевле полностью ассоциативного кэша, поскольку в нем уменьшена область ассоциативного поиска. Рассмотрим принцип множественно-ассоциативного отображения на примере кэша с 64 множествами по два блока в каждом (рис. 8.6). Блоки памяти 0,64,128,..., 4032 отображаются на множество 0 и могут занимать любую из двух позиций в этом множестве. Наличие 64 множеств блоков означает, что 6-разрядное поле множества в составе адреса слова определяет, какое множество кэша может содержать это слово. Поле тега адреса ассоциативным путем сравнивается с тегами двух блоков найденного множества, и если оно совпадет с одним из тегов, значит, соответствующий блок уже находится в кэше. Реализовать такой поиск очень просто.
Количество блоков во множестве задается в соответствии с требованиями конкретного компьютера. В случае основной памяти и кэша, показанных на рис. 8.6, для четырех блоков в множестве потребуется 5-разрядное поле множества, для восьми блоков — 4-разрядное и т. д. Граничное значение 128 блоков в множестве не требует поля множества и соответствует полностью ассоциативному кэшу с 12 теговыми битами. Другое граничное значение — один блок в множестве — соответствует методу прямого отображения. Кэш с k блоками во множестве называется k-канальным множественно-ассоциативным кэшем.
Рис. 8.6. Множественно-ассоциативный кэш с двумя блоками в множестве
Для каждого блока в кэше должен храниться еще один управляющий бит, называемый битом достоверности. Он указывает, содержит ли блок достоверные данные. Его не следует путать с упоминавшимся ранее битом изменения, указывающим, был ли блок модифицирован за то время, пока он находится в кэше. Бит модификации нужен только в тех системах, в которых не используется сквозная запись. При включении питания системы и при загрузке с диска в основную память новой программы и данных все биты достоверности устанавливаются в 0. Пересылка данных между диском и основной памятью управляется механизмом прямого доступа к памяти ПДП (DMA). Обычно эти данные минуют кэш, что вызвано соображениями стоимости и производительности. Когда блок кэша в первый раз загружается из основной памяти, его бит достоверности устанавливается в 1. Если блок основной памяти обновляется из другого источника, минуя кэш, система проверяет, находится ли загружаемый блок в кэше. Если да, его бит достоверности устанавливается в 0, чтобы в кэше не оказалось устаревших данных.
Подобная же проблема возникает и при ПДП-пересылке данных из основной памяти на диск, если используется кэш с обратной записью. Данные, находящиеся в памяти, могут не отражать изменений, внесенных в кэшируемую копию. Поэтому перед их копированием на диск нужно записать измененные данные из кэша в основную память. Операционная система легко справляется с этой задачей, и это не отражается на ее производительности, поскольку пересылка данных между диском и основной памятью происходит нечасто. Обязательное использование двумя разными элементами (в данном случае процессором и подсистемой ПДП) одинаковых копий данных называется согласованностью кэша.