Одним из немаловажных факторов повышающих производительность процессора, является наличие кэш-памяти, а точнее её объём, скорость доступа и распределение по уровням.
Уже достаточно давно практически все процессоры оснащаются данным типом памяти, что ещё раз доказывает полезность её наличия. В данной статье, мы поговорим о структуре, уровнях и практическом назначении кэш-памяти, как об очень немаловажной характеристике процессора
билет 25 тема 1
33 Назначение и характеристики КЭШпамяти.
Одним из немаловажных факторов повышающих производительность процессора, является наличие
кэшпамяти, а точнее её объём, скорость доступа и распределение по уровням.
Уже достаточно давно практически все процессоры оснащаются данным типом памяти, что ещё раз
доказывает полезность её наличия. В данной статье, мы поговорим о структуре, уровнях и
практическом назначении кэшпамяти, как об очень немаловажной характеристике процессора.
Что такое кэшпамять и её структура
Кэшпамять – это сверхбыстрая память используемая процессором, для временного хранения данных,
которые наиболее часто используются. Вот так, вкратце, можно описать данный тип памяти.
Кэшпамять построена на триггерах, которые, в свою очередь, состоят из транзисторов. Группа
транзисторов занимает гораздо больше места, нежели те же самые конденсаторы, из которых состоит
оперативная память. Это тянет за собой множество трудностей в производстве, а также ограничения в
объёмах. Именно поэтому кэш память является очень дорогой памятью, при этом обладая
ничтожными объёмами. Но из такой структуры, вытекает главное преимущество такой памяти –
скорость. Так как триггеры не нуждаются в регенерации, а время задержки вентиля, на которых они
собраны, невелико, то время переключения триггера из одного состояния в другое происходит очень
быстро. Это и позволяет кэшпамяти работать на таких же частотах, что и современные процессоры.
Кэширование памяти
Производительность ПК зависит не только от процессора.
Большой потенциал
производительности ПК связан с организацией и способом функционирования памяти. Важную роль
при этом играет кэшпамять.
Кэшпамять выполняет функцию буфера между процессором и оперативной памятью.
Буфер – область памяти, используемая для временного хранения информации.
Данные, которые процессор уже получил из оперативной памяти, остаются в быстрой кэш
памяти, несмотря на то, что они уже обработаны. Подразумевается, что при обмене данными и при
выполнении большого числа операций процессор будет часто запрашивать одни и те же данные и
команды. При обращении микропроцессора к памяти сначала производится поиск нужных данных в
кэшпамяти.
При отсутствии кэшпамяти данные каждый раз считываются из относительно медленной
оперативной памяти компьютера. Процессор прерывает свою текущую работу и ждет, пока будут
получены необходимые данные для дальнейшей обработки.
При наличии кэшпамяти данные находятся в специально предназначенной для процессора
исключительно быстрой памяти, и при их запросе циклы ожидания отсутствуют.
При управлении кэшпамятью речь идет не о простой памяти, организованной по принципу стека,
которая теряет старые данные, если в нее считываются новые. С помощью специальных алгоритмов,
наиболее простым из которых является алгоритм LRU (Least Recently Used – алгоритм удаления
наиболее давно использовавшихся данных), чаще используемые данные хранятся в этой памяти доль
ше, чем другие. Благодаря этому необходимость доступа к основной памяти сводится к минимуму, и
компьютер в целом работает быстрей.
В современных компьютерах кэш обычно строится по двухуровневой схеме. Первичный кэш (LI
Cache) встроен во все процессоры класса 486 и выше; это внутренний кэш. Объем этого кэша невелик(832 Кбайт). Чтобы повысить производительность, для данных и команд часто используется
раздельный кэш (так называемая Гарвардская архитектура – противоположность Принстонской,
использующей общую память для команд и данных). Вторичный кэш (L2 Cache) для процессоров 486
и Pentium является внешним (устанавливается на системной плате), а у Р6 и Pentium 4 располагается в
одной упаковке с ядром и подключается к специальной внутренней шине процессора, благодаря чему
обеспечивается работа на полной тактовой частоте процессора.
Кэшконтроллер должен обеспечивать когерентность (coherency) – согласованность данных кэш
памяти обоих уровней с данными в основной памяти при том условии, что обращение к этим данным
может производиться не только процессором, но и другими активными (bus master) адаптерами,
подключенными к шинам (PCI, VLB, ISA и т. д.). Следует также учесть, что процессоров может быть
несколько, и у каждого может быть свой внутренний кэш.
Кэшпамять первого уровня, интегрированная внутри процессора, работает на полной внутренней
тактовой частоте процессора, кэшпамять второго уровня обычно работает на внешней тактовой
частоте процессора.
Принципы кэширования
Основная память компьютеров реализуется на относительно медленной динамической памяти
(DRAM), обращение к ней приводит к простою процессора – появляются такты ожидания (wait states).
Статическая память (SRAM), построенная, как и процессор, на триггерных ячейках, по своей природе
способна догнать современные процессоры по быстродействию и сделать ненужными такты ожидания
(или хотя бы сократить их количество). Разумным компромиссом для построения экономичных и
производительных систем явился иерархический способ организации оперативной памяти. Идея
заключается в сочетании основной памяти большого объема на DRAM с относительно небольшой кэш
памятью на быстродействующих микросхемах SRAM.
Кэш является дополнительным быстродействующим хранилищем копий блоков информации из
основной памяти, вероятность обращения к которым в ближайшее время велика. Кэш не может
хранить копию всей основной памяти, поскольку его объем во много раз меньше основной памяти. Он
хранит лишь ограниченное количество блоков данных и каталог (cache directory) – список их текущего
соответствия областям основной памяти. Кроме того, кэшироваться может не вся память, доступная
процессору.
Кэш прямого отображения
В кэшпамяти прямого отображения адрес памяти, по которому происходит обращение,
однозначно определяет строку кэша, в которой может находиться требуемый блок. Принцип работы
такого кэша поясним на примере несекторированного кэша объемом 256 Кбайт с размером строки 32
байта и объемом кэшируемой основной памяти 64 Мбайт – типичный кэш системной платы для
Pentium. Структуру памяти в такой системе иллюстрирует рис. 5.
Кэшируемая основная память условно разбивается на страницы (в данном случае по 256
Кбайт), размер которых совпадает с размером кэшпамяти (256 Кбайт). Кэшпамять (и, условно,
страницы основной памяти) делятся на строки (256 Кбайт/32= 8 Кбайт строк). Архитектура прямого
отображения подразумевает, что каждая строка кэша может отображать из любой страницы
кэшируемой памяти только соответствующую ей строку (на рис. 5 они находятся на одном
горизонтальном уровне). Поскольку объем основной памяти много больше объема кэша, на каждую
строку кэша может претендовать множество блоков памяти с одинаковой младшей частью адреса
(смещением внутри страницы). Одна строка в определенный момент может, естественно, содержать
копию только одного из этих блоков. Номер (адрес) строки в кэшпамяти называется индексом
(index). Тег несет информацию о том, какой именно блок занимает данную строку (то есть старшая
часть адреса или номер страницы). Память тегов должна иметь количество ячеек, равное количеству
строк кэша, а ее разрядность должна быть достаточной, чтобы вместить старшие биты адресакэшируемой памяти, не попавшие на шину адреса кэшпамяти. Кроме адресной части тега, с каждой
строкой кэша связаны биты признаков действительности и модифицированности данных. В начале
каждого обращения к кэшируемой памяти контроллер вначале считывает ячейку каталога с заданным
индексом, сравнивает биты адреса тега со старшими битами адреса памяти и анализирует признак
действительности. Этот анализ выполняется в специальном цикле слежения (snoop cycle), иногда его
называют циклом запроса (inquire). Если в результате анализа выясняется, что требуемого блока нет в
кэше, генерируется (или продолжается) цикл обращения к основной памяти (случай кэшпромаха). В
случае попадания запрос обслуживается кэшпамятью. В случае промаха после считывания основной
памяти приемником информации новые данные помещаются в строку кэша (если она чистая), а в ее
тег помещаются старшие биты адреса и устанавливается признак действительности данных.
Независимо от объема затребованных данных в кэш из основной памяти строка переписывается вся
целиком (поскольку признак действительности относится ко всем ее байтам). Если контроллер кэша
реализует упреждающее считывание (read ahead), то в последующие свободные циклы шины также
обновится и следующая строка (если она была чистой). Чтение «про запас» позволяет при
необходимости осуществлять пакетный цикл чтения из кэша через границу строки.
Такой кэш имеет самую простую аппаратную реализацию и применяется во вторичном кэше
большинства системных плат. Однако ему присущ серьезный недостаток, вполне очевидный при
рассмотрении рис. 5. Если в процессе выполнения программы процессору поочередно будут
требоваться блоки памяти, смещенные относительно друг друга на величину, кратную размеру
страницы (на рисунке эти блоки расположены на одной горизонтали в разных страницах), то кэш будет
работать интенсивно, но вхолостую (cache trashing). Очередное обращение будет замещать данные,
считанные в предыдущем и необходимые в следующем обращении, – т.е. будет сплошная череда кэш
промахов. Переключение страниц в многозадачных ОС также снижает количество кэшпопаданий, что
отражается на производительности системы. Увеличение размера кэша при сохранении архитектуры
прямого отображения даст не очень существенный эффект, поскольку разные задачи будут
претендовать на одни и те же строки кэша. Не увеличивая объема, можно повысить эффективность
кэширования изменением структуры кэша, о чем пойдет речь ниже.
Объем кэшируемой памяти (Мcached) при архитектуре прямого отображения определяется объемом
кэшпамяти (Vcache) и разрядностью памяти тегов (N):
Мcached = Vcache ∙ 2N, в нашем случае Мcached = 256 Кбайт ∙ 28 = 64 Мбайт.
Иногда в описании кэша прямого отображения фигурирует понятие набор (set), что может ввести
в заблуждение. Оно применяется вместо термина строка (line) в секторированном кэше прямого
отображения, а сектор тогда называют строкой. С набором (как и строкой несекторированного кэша)
связана информация о теге, относящаяся ко всем элементам набора (строкам или секторам). Кроме
того, каждый элемент набора (строка или сектор) имеет собственный бит действительности в кэш
каталоге
Наборноассоциативный кэш
Наборноассоциативная архитектура кэша позволяет каждому блоку кэшируемой памяти
претендовать на одну из нескольких строк кэша, объединенных в набор (set). Можно считать, что в
этой архитектуре есть несколько параллельно и согласованно работающих каналов прямого
отображения, где контроллеру кэша приходится принимать решение о том, в какую из строк набора
помещать очередной блок данных.
В простейшем случае каждый блок памяти может помещаться в одну из двух строк (Two Way Set
Associative Cache – двухканальный наборноассоциативный кэш). Такой кэш должен содержать два
банка памяти тегов (рис. 7).Номер набора (индекс), в котором может отображаться затребованный блок данных, однозначно
определяется средней частью адреса (как номер строки в кэше прямого отображения). Строка набора,
отображающая требуемый
52 блок, определяется сравнением тегов (как и в ассоциативном кэше), параллельно выполняемым
для всех каналов кэша. Кроме того, с каждым набором должен быть связан признак, определяющий
строку набора, подлежащую замещению новым блоком данных в случае кэшпромаха. Кандидатом на
замещение обычно выбирается строка, к которой дольше всего не обращались (алгоритм LRU– Least
Recently Used). При относительно большом количестве каналов (строк в наборе) прибегают к
некоторому упрощению – алгоритм PseudoLRU для четырех строк (Four Way Set Associative Cache)
позволяет принимать решения, используя всего 3 бита. Возможно также применение алгоритма
замещения FIFO (первым вошел – первым вышел) или даже случайного (random) замещения, что
проще, но менее эффективно.
Наборноассоциативная архитектура широко применяется для первичного кэша современных
процессоров. Объем кэшируемой памяти определяется так же, как и в предыдущем варианте, но здесь
фигурируют объем одного банка (а не всего кэша) и разрядность относящихся к нему ячеек тега.
Ассоциативный кэш
В отличие от предыдущих у полностью ассоциативного кэша любая его строка может
отображать любой блок памяти, что существенно повышает эффективность использования его
ограниченного объема. При этом все биты адреса кэшированного блока, за вычетом битов,
определяющих положение (смещение) данных в строке, хранятся в памяти тегов. В такой архитектуре
для определения наличия затребованных данных в кэшпамяти требуется сравнение со старшей
частью адреса тегов всех строк, а не одной или нескольких, как при прямом отображении или
наборноассоциативной архитектуре. Естественно, последовательный перебор ячеек памяти тегов
отпадает – на это может уйти слишком много времени. Остается параллельный анализ всех ячеек, что
является сложной аппаратной задачей, которая пока решена только для небольших объемов
первичного кэша в некоторых процессорах. Применение полностью ассоциативной архитектуры во
вторичном кэше пока не предвидится.