ИЕРАРХИЯ ЗАПОМИНАЮЩИХ УСТРОЙСТВ

Конфигурация памяти компьютера в основном определяется тремя пара­метрами: объем, быстродействие, стоимость.

Вопрос об объеме решить не так просто. Какой большой ни была бы па­мять, все равно будут разработаны приложения, которым ее не хватит. В отно­шении быстродействия памяти все ясно: чем быстрее, тем лучше. Для достиже­ния высшей производительности память должна иметь возможность быстро об­мениваться данными с процессором. Но в реальной жизни едва ли не главным становится третий параметр. Стоимость памяти должна быть сравнима со стои­мостью других компонентов.

Очевидно, можно найти некоторый компромисс между перечисленными харак­теристиками памяти. На любом этапе развития технологий производства запоми­нающих устройств действуют следующие, достаточно устойчивые, соотношения.

• Чем меньше время доступа, тем дороже каждый бит.

• Чем выше емкость, тем ниже стоимость бита.

• Чем выше емкость, тем больше время доступа.

Теперь ясна дилемма, стоящая перед конструктором. Вследствие возраста­ния требований к ресурсам конструктор стремится использовать те технологии, которые обеспечивают производство устройств с большой емкостью. Однако что­бы удовлетворить потребности в высокой производительности, конструктор должен использовать дорогую память с меньшей емкостью (зато и с меньшим вре­менем доступа).

Чтобы найти выход из сложившейся ситуации, необходимо опираться не на отдельно взятый компонент памяти или технологию, а выстроить иерархию за­поминающих устройств. На рис. 1.14 показана типичная иерархическая пира­мида. При спуске к ее основанию происходит следующее.

1. Снижается стоимость бита.

2. Возрастает емкость.

3. Возрастает время доступа.

4. Снижается частота обращений процессора к памяти.

 

Таким образом, к более дорогим устройствам с меньшей емкостью и более высокой производительностью добавляются более емкие, дешевые, но менее производительные. При такой организации ключом к успеху является снижение частоты обращения к последним. Эта концепция будет рассмотрена более де­тально в следующих разделах данной главы, при обсуждении кэша и виртуаль­ной памяти. А теперь рассмотрим конкретный пример.

Предположим, процессор имеет доступ к памяти двух уровней. На первом уровне содержится 1000 слов, и он характеризуется временем доступа . Допустим, что к словам, расположенным на первом уровне, процессор может обращаться непосредственно. Если же нужно получить доступ к слову, находящемуся на второй уровне, то это слово сначала передается на первый уровень, и лишь потом процессор получает к нему доступ. Опустим для простоты вопрос о времени, которое требуется процессору для определения, на каком именно уровне находится слово. На рис. 1.15 показан вид кривой, описывающей данную ситуацию. На графике представлена зависимость среднего времени доступа к памяти второго уровня от результативности поиска Н. Символом Н обозначено отношение числа нахождений нужного слова в быстрой памяти (например, в кэше) к числу всех обращений, T1 — время доступа к уровню 1, T2 — время доступа к уровню 2. Видно, что при высокой частоте обращения к уровню 1 среднее время доступа намного ближе ко времени доступа к уровню 1, чем ко времени доступа к уровню 2.

 

Предположим, что в нашем примере 95% обращений к памяти приходится на кэш (Н = 0.95). Тогда среднее время доступа можно записать как

Получившийся результат довольно близок ко времени доступа к быстрой памяти. Таким образом, описанная стратегия работает, но лишь при соблюдении условий 1-4. Существует целый ряд разнообразных запоминающих устройств, созданных с применением различных технологий, для которых выполняются ус­ловия 1-3. К счастью, условие 4 тоже в целом справедливо.

Основой соблюдения условия 4 служит принцип, известный как принцип локализации обращений [DENN68]. Адреса, к которым во время исполнения про­граммы обращается процессор, имеют тенденцию собираться в группы. Как правило, программы содержат в себе повторяющиеся циклы и подпрограммы. Как только наступает очередь цикла или подпрограммы, процессор обращается лишь к небольшому повторяющемуся набору команд. Работа с таблицами и массивами также предполагает доступ к сгруппированным данным. Со временем одни используемые кластеры заменяются другими, но в течение небольших промежутков времени процессор преимущественно работает с фиксированными кластерами памяти.

Поэтому представляется возможным организовать данные в иерархической структуре так, чтобы частота обращений к каждому более низкому уровню была намного меньше, чем частота обращения к уровню, расположенному на ступень выше. Рассмотрим уже описанный пример с двумя уровнями памяти. Пусть на уровне 2 находятся все команды и данные программы. Обрабатываемые в данный момент кластеры можно поместить на уровень 1. При этом получится, что большинство обращений происходит к командам и данным, находящимся на уровне 1.

Этот принцип можно применять не только к памяти с двумя уровнями. Самую быструю, малоемкую и дорогую память образуют внутренние регистры процессора. Обычно в нем имеется несколько десятков таких регистров, хотя в некоторых процессорах могут быть сотни регистров. Спустимся на две ступени вниз, туда, где находится основная память, являющаяся важным внутренним запоминающим устройством компьютера. Каждая ее ячейка характеризуется своим уникальным адресом, и при выполнении большинства машинных команд обращения происходят по одному или нескольким адресам. Расширением основной памяти служит кэш, который обладает меньшей емкостью, но является бо­лее быстрым. Кэш обычно не виден программисту или, что по сути то же, про­цессору. Это устройство выступает в роли промежуточного хранилища данных при их перемещении между основной памятью и регистрами процессора, и по­зволяет повысить производительность.

Три только что описанных вида памяти являются обычно временными (при отключении питания находящаяся в них информация исчезает) и производятся на основе полупроводниковой технологии. Наличие этих уровней основано на том, что существуют различные по скорости и стоимости виды полупроводнико­вой памяти. Постоянными являются внешние устройства хранения большого объема данных, наиболее часто встречающиеся из которых — жесткий диск и такие съемные устройства, как переносные диски, ленты и оптические запоми­нающие устройства. Внешнюю, постоянную память называют также вторичной или вспомогательной памятью. Такие устройства используются для хранения файлов с программами и данными и доступны программисту чаще всего (но не всегда) только на уровне файлов и записей, а не отдельных слов или байтов. Диск используется также как расширение основной памяти, известное под на­званием виртуальной памяти (см. главу 8, "Виртуальная память"),

В описываемую иерархическую структуру памяти программное обеспечение может добавлять и дополнительные уровни. Например, часть основной памяти может быть использована как буфер для временного хранения считываемых с диска данных. Повышение производительности с применением такой техноло­гии, которую иногда называют дисковым кэшем (подробнее она рассматривается в главе 11, "Управление вводом-выводом и дисковое планирование"), достигает­ся за счет следующих ее особенностей.

Производительность памяти с несколькими уровнями рассматривается в приложении А к данной главе.