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



Основная память, реализуемая на относительно медленных по своей природе микросхемах динамической памяти, обычно требует ввода тактов ожидания про­цессора (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).

Кэш прямого отображения

В кэш-памяти прямого отображения адрес памяти, по которому происходит обращение, однозначно определяет строку, в которой может находиться отобра­жение требуемого блока. Принцип его работы поясним на примере несекто-рированного кэша объемом 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!