Кэширование оперативной памяти
Основная память, реализуемая на относительно медленных по своей природе микросхемах динамической памяти, обычно требует ввода тактов ожидания процессора (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 Policy). Существуют два основных алгоритма записи данных из кэша в основную память: сквозная запись WT (Write Through) и обратная запись WB (Write Back).
Алгоритм WT предусматривает выполнение каждой операции записи (даже однобайтной), попадающей в кэшированный блок, одновременно и в строку кэша, и в основную память. При этом процессору при каждой операции записи придется ожидать окончания относительно длительной записи в основную память. Алгоритм достаточно прост в реализации и легко обеспечивает целостность данных за счет постоянного совпадения копий данных в кэше и основной памяти. Для него нет необходимости хранения признаков присутствия и модифицированное™ — вполне достаточно только информации тега (при этом считается, что любая строка всегда отражает какой-либо блок, а какой именно — указывает тег). Но эта простота оплачивается низкой эффективностью записи. Существуют варианты этого алгоритма с применением отложенной буферированной записи, при которой данные в основную память переписываются через 'FIFO-буфер во время свободных тактов шины.
Алгоритм WB позволяет уменьшить количество операций записи на шине основной памяти. Если блок памяти, в который должна производиться запись, отображен и в кэше, то физическая запись сначала будет произведена в эту действительную строку кэша, и она будет отмечена как грязная (dirty), или модифицированная, то есть требующая выгрузки в основную память. Только после этой выгрузки (записи в основную память) строка станет чистой (clean), и ее можно будет использовать для кэширования других блоков без потери целостности данных. В основную память данные переписываются только целой строкой (после заполнения всех ее секторов в случае секторированного кэша) или непосредственно перед ее замещением в кэше новыми данными. Данный алгоритм сложнее в реализации, но существенно эффективнее, чем WT. Поддержка системной платой кэширования с обратной записью требует обработки дополнительных интерфейсных сигналов для обеспечения выгрузки модифицированных строк в основную память, если к этой области производится обращение со стороны таких контроллеров шины, как графические адаптеры, контроллеры дисков, сетевые адаптеры и т. п.
В зависимости от способа определения взаимного соответствия строки кэша и области основной памяти различают три архитектуры кэш-памяти: кэш прямого отображения (direct-mapped cache), полностью ассоциативный кэш (fully associative cache) и их комбинация — частично- или наборно-ассоциативный кэш (set-associative cache).
Кэш прямого отображения
В кэш-памяти прямого отображения адрес памяти, по которому происходит обращение, однозначно определяет строку, в которой может находиться отображение требуемого блока. Принцип его работы поясним на примере несекто-рированного кэша объемом 256 Кбайт с размером строки 32 байта и объемом кэшируемой основной памяти 64 Мбайт — типичный кэш системной платы для Pentium. Структуру памяти в такой системе иллюстрирует рис.
Кэш прямого отображения
Кэшируемая основная память условно разбивается на страницы (в данном случае 256), размер которых совпадает с размером кэш-памяти. Кэш-память (и опять-таки условно страницы основной памяти) делится на строки (256К/32 = 8К строк). Архитектура прямого отображения подразумевает, что каждая строка кэша может отображать из любой страницы кэшируемой памяти только соответствующую ей строку (на рис. 5.1 они находятся на одном горизонтальном уровне). Поскольку объем основной памяти много больше объема кэша, на каждую строку кэша может претендовать множество блоков памяти с одинаковой младшей частью адреса (смещением внутри страницы). Одна строкав определенный момент может, естественно, содержать копию только одного из этих блоков. Номер (адрес) строки в кэш-памяти называется индексом (index). Информация о том, какой именно блок занимает данную строку (то есть старшая часть адреса или номер страницы), называется тегом (tag) и хранится в связанной с данной строкой ячейке специальной памяти тегов (tag RAM). Самые младшие биты адреса определяют положение байта в банке памяти (А[0:2]) и в строке (A3, А4), но для работы кэш-контроллера они несущественны. Память тегов должна иметь количество ячеек, равное количеству строк кэша, а ее разрядность должна умещать старшие биты адреса кэшируемой памяти, не попавшие на шину адреса кэш-памяти. Кроме адресной части тега с каждой строкой кэша связаны биты признаков действительности и модифицированнос-ти данных.
В начале каждого обращения к кэшируемой памяти контроллер первьш делом считывает ячейку каталога с заданным индексом, сравнивает биты адреса тега со старшими битами адреса памяти и анализирует признак действительности. Этот анализ выполняется в специальном цикле слежения (snoop cycle), иногда его называют циклом запроса (inquire). Если в результате анализа выясняется, что требуемый блок не находится в кэше, то генерируется (или продолжается) цикл обращения к основной памяти (случай кэш-промаха); в случае попадания запрос обслуживается кэш-памятью. В случае промаха после считывания основной памяти новые данные помещаются ив строку кэша (если она чистая), а в ее тег помещаются старшие биты адреса и устанавливается признак действительности данных. Независимо от объема затребованных данных в кэш из основной памяти, строка переписывается вся целиком (поскольку признак действительности относится ко всем ее байтам). Если контроллер кэша реализует упреждающее считывание (read ahead), то в последующие свободные циклы шины обновится и следующая за ней строка (если она была чистой). Это чтение «про запас» позволит при необходимости осуществлять пакетный цикл чтения из кэша через границу строки.
Этот кэш имеет самую простую аппаратную реализацию и применяется во вторичном кэше большинства системных плат. Однако ему присущ серьезный недостаток, вполне очевидный при рассмотрении рисунка. Если в процессе выполнения программы процессору поочередно будут требоваться блоки памяти, смещенные относительно друг друга на величину, кратную размеру страницы, то кэш будет работать интенсивно, но вхолостую (cache trashing). Очередное обращение будет замещать данные, считанные в предыдущем и потребующиеся в последующем обращении — то есть будет сплошная череда кэш-промахов. Переключение страниц в многозадачных ОС также снижает количество кэш-попаданий, что отражается на производительности системы. Увеличение размера кэша при его архитектуре прямого отображения даст не очень существенный эффект, поскольку разные задачи будут претендовать на одни и те же строки кэша.
Иногда в описании кэша прямого отображения фигурирует понятие набор (set), что может сбить с толку. Оно применяется вместо термина строка (line) в секторированном кэше прямого отображения, а сектор тогда называют стро-кой, С набором (как и строкой несекторированного кэша) связана информация о теге, относящаяся ко всем элементам набора (строкам или секторам). Кроме того, каждый его элемент (строка или сектор) имеет собственный бит действительности (Valid Bit) в кэш-каталоге .
Наборно-ассоциативный кэш
Недостаток кэша прямого отображения более эффективно, чем простое увеличение его объема, смягчает изменение его структуры. Наборно-ассоциатшная архитектура кэша позволяет каждому блоку кэшируемой памяти претендовать на одну из нескольких строк кэша, объединенных в набор (set). Эту архитектуру можно рассматривать как несколько параллельно и согласованно работающих каналов прямого отображения, где контроллеру кэша приходится еще и принимать решение о том, в какую из строк набора помещать очередной блок данных.
В простейшем случае каждый блок памяти может помещаться в одну из двух строк (Two Way Set-Associative Cache). Такой кэш должен содержать два банка памяти тегов.
Номер набора (индекс), в котором может отображаться затребованный блок данных, однозначно определяется средней частью адреса (как номер строки в кэше прямого отображения). Строка набора, отображающая требуемый блок, определяется сравнением тегов (как в ассоциативном кэше), параллельно выполняемым для всех каналов кэша. Кроме того, с каждым набором должен быть связан признак, определяющий строку набора, подлежащую замещению новым блоком данных в случае кэш-промаха (на рис. 5.3 в ее сторону указывает стрелка). Кандидатом на замещения обычно выбирается строка, последнее обращение к которой было раньше ( LRU — Least Recently Used). При относительно большом количестве каналов (строк в наборе) прибегают к некоторому упрощению — алгоритм Pseudo-LRU для четырех строк (Four Way Set Associative Cache) позволяет принимать решения, используя всего 3 бита. Возможно также применение алгоритма замещения FIFO (первый вошел — первым и вышел) или даже случайного (random), что проще, но менее эффективно.
Наборно-ассоциативная архитектура широко применяется для первичного кэша современных процессоров. Для вторичного кэша такую архитектуру для 386 и i486 обеспечивают микросхемы 82385 и 82485 соответственно, включающие в себя собственно контроллер и память тегов. К ним в комплект требуются только микросхемы кэш-памяти данных.
Ассоциативный кэш
В отличие от предыдущих у полностью ассоциативного кэша любая его строка может отображать любой блок памяти, что существенно повышает эффективность использования его ограниченного объема. При этом все биты адреса кэ-шированного блока, за вычетом бит, определяющих положение (смещение) данных в строке, хранятся в памяти тегов. В такой архитектуре для определения наличия затребованных данньхх в кэш-памяти требуется сравнение со старшей частью адреса тегов всех строк, а не одной или нескольких, как при прямомотображении или наборно-ассоциативной архитектуре. Естественно, последовательный перебор ячеек памяти тегов отпадает — на это может уйти слишком много времени. Остается параллельный анализ всех ячеек, что является очень объемной аппаратной задачей, которая пока решается только для небольших объемов первичного кэша в некоторых процессорах. Применение полностью ассоциативной архитектуры во вторичном кэше пока не предвидится.
Варианты защиты памяти.
2 базовых подхода:
1). по граничным адресам
2). по ключам
1). когда выполняется программа известно, с какими данными она работает, это определятся при трансляции на уровне логических адресов. Известен начальный и конечный адрес программы, передача управления за пределы зоны - ошибка.
2). классический вариант для 32 –х разрядных с длинным логическим адресом и коротким физическим. Изначально использовался именно при страничной организации памяти. Каждой странице присваивается некоторый код доступа, который определяет возможно ли обращение по:
- чтению
- записи
- исполнению.
создается уровень приоритетов для исполн. программ. Программа с наибольшим приоритетом может делать все. Программа самого нижнего уровня может работать только со своими страницами или со страницами своего уровня привилегий. Как правило приоритет определяется в начальной странице программы.
Дата добавления: 2018-10-26; просмотров: 544; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!