- •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.2. Быстродействие, объем и стоимость
Мы уже говорили о том, что в идеале память должна быть быстрой, большой и дешевой. Для реализации очень быстрой памяти лучше всего использовать микросхемы SRAM (Static RAM). Однако они довольно дороги, поскольку каждая ячейка такой памяти содержит шесть транзисторов, из-за чего на одной микросхеме невозможно разместить много ячеек. Таким образом, большую память на основе микросхем SRAM нецелесообразно создавать из чисто экономических соображений. Для нее применяются гораздо более дешевые микросхемы динамическая RAM (Dynamic RAM, DRAM), синхронная DRAM (SDRAM) и Rambus DRAM, с очень простыми ячейками, объединенные в модули большого объема SIMM, DIMM и RIMM. Правда, работает такая память медленнее SRAM.
Хотя в компьютер за вполне разумную цену можно установить сотни мегабайтов динамической памяти, этого все равно недостаточно для современных программ, обрабатывающих огромные объемы данных. Поэтому для увеличения адресного пространства памяти используются внешние запоминающие устройства, прежде всего магнитные диски. Современные диски имеют очень большую емкость и, как правило, приемлемую цену, поэтому они достаточно интенсивно применяются в компьютерных системах. Однако функционируют магнитные диски значительно медленнее полупроводниковой памяти. Из всего сказанного следует такой вывод: очень большой объем памяти за приемлемую цену можно получить только в виде жесткого диска. Для реализации основной памяти большого объема подходит технология DRAM/SDRAM. А микросхемы SRAM можно использовать для создания очень быстрых запоминающих устройств небольшого объема, таких как кэш-память.
Как правило, в компьютере используются все три типа памяти. Таким образом, систему памяти компьютера можно представить в виде иерархии, показанной на рис. 8.2. Быстрее всего осуществляется доступ к данным, хранящимся в регистрах процессора. Поэтому, если рассматривать эти регистры как составляющую иерархии памяти, то с точки зрения быстродействия они располагаются на самом верху, хотя по объему составляют ничтожно малую часть всей памяти компьютера.
Рис. 8.2. Иерархия памяти
На следующем уровне иерархии располагается сравнительно небольшой объем памяти, который можно реализовать прямо в микросхеме процессора. Эта память, называемая кэшем процессора, содержит копии команд и данных, хранящихся во внешней по отношению к процессору и намного большей основной памяти. Идея кэш-памяти, проиллюстрированная на рис. 8.2, подробно рассматривается в разделе 8.3. Обычно в компьютере имеется два уровня кэш-памяти. Первичный кэш располагается на микросхеме процессора и называется кэшем первого уровня (L1). Вторичный кэш имеет больший объем, располагается между первичным кэшем и остальной памятью и называется кэшем второго уровня (L2). Для его реализации обычно используются микросхемы SRAM.
Типичный компьютер содержит кэш первого уровня, располагаемый на микросхеме процессора, и внешний по отношению к процессору кэш второго уровня, несколько большего объема. Однако это не всегда так. Бывает, что микросхема процессора вообще не содержит кэша или же, напротив, содержит кэш обоих уровней.
Ниже по иерархии располагается основная память. Она довольно велика и реализуется на основе микросхем динамической памяти, как правило, в виде модулей SIMM, DIMM и RIMM. Основная память значительно больше и намного медленнее кэша. В типичном компьютере время доступа к основной памяти в десять раз больше времени доступа к кэшу L1.
Дисковые устройства предоставляют, можно сказать, огромный объем недорогой памяти, но по сравнению с полупроводниковыми устройствами они очень медленные.
Для выполнения программ исключительное значение имеет скорость доступа к памяти. Идея управления иерархической системой памяти состоит в том, чтобы переместить команды и данные, которые будут использоваться в ближайшее время, как можно ближе к процессору. Для этого применяются специальные механизмы, описанные в следующих разделах. Их анализ мы начнем с кэш-памяти.
8.3. Кэш-память
По сравнению с быстродействием современных процессоров скорость функционирования основной памяти очень мала. Однако процессор не может тратить много времени в ожидании команд и данных из основной памяти. Поэтому нужны механизмы, сокращающие время доступа к необходимой информации. Поскольку быстродействие основной памяти физически ограничено, здесь требуется архитектурное решение. Таким решением является использование быстрой кэш-памяти, благодаря которой основная память представляется процессору более быстрой, чем есть на самом деле.
Эффективность механизма кэширования основывается на свойстве компьютерных программ, называемом локализацией ссылок. Анализ процесса реализации различных программ показывает, что большую часть времени в них выполняется код, в котором определенные группы команд повторяются помногу раз. Это простые и вложенные циклы, а также многократно вызываемые подпрограммы. Причем последовательность выполнения команд не имеет значения — важно то, что многие из них в локализированных областях программы многократно повторяются в течение определенного промежутка времени, а доступ к оставшейся части программы осуществляется сравнительно редко. Это и называется локализацией ссылок. Локализация ссылок происходит и во времени, и в пространстве. Локализация во времени означает, что недавно выполнявшиеся команды, скорее всего, очень скоро будут выполнены снова. А локализация в пространстве означает большую вероятность того, что очень скоро будут выполнены команды, расположенные в непосредственной близости от только что реализованных команд (имеется в виду близость адресов команд).
Если поместить активные сегменты программы в быструю кэш-память, общее время их выполнения значительно сократится. Идея кэширования команд очень проста. Управляющие схемы памяти разрабатываются таким образом, чтобы можно было использовать свойство локализации ссылок. Исходя из принципа локализации во времени, каждый элемент, к которому обращается процессор, будь то команда программы или элемент данных, копируется в кэш, где он остается до тех пор, пока не потребуется снова. Исходя из принципа локализации в пространстве, в кэш копируется не только текущий элемент программы или данных, но еще и несколько близлежащих элементов. Набор элементов с последовательными адресами определенного размера мы будем называть блоком или строкой кэша.
Обратимся к простой схеме, показанной на рис. 8.3. Если процессор выдает запрос чтения, содержимое блока памяти считывается по заданному адресу по одному слову в кэш. Когда впоследствии программа обратится к любому элементу этого блока, он будет прочитан не с диска, а прямо из кэша. Обычно в каждый конкретный момент времени в кэш-памяти может храниться достаточно много блоков, но по сравнению с их общим количеством в основной памяти это очень мало. Соответствие между блоками в основной памяти и блоками в кэше определяется функцией отображения. Когда кэш полон и производится обращение к отсутствующему в нем слову памяти (команде или данным), управляющее кэшем аппаратное обеспечение должно решить, какой из блоков удалить из кэша, чтобы добавить в него новый блок, содержащий требуемое слово. Набор правил для принятия такого решения составляет алгоритм замещения.
Рис. 8.3. Использование кэш-памяти
Процессор ничего не знает о существовании кэша. Он просто выдает запросы чтения и записи, используя адреса, которые указывают на память. В ответ схема управления кэшем выясняет, имеется ли в таковом запрошенное слово. Если да, то в операции чтения или записи задействуется слово из кэша. При этом говорят, что имеет место попадание в кэш. В случае операции считывания обращение к основной памяти вообще не происходит. Если же выполняется операция записи, система может действовать одним из двух способов. При использовании первого из них, называемого протоколом сквозной записи, предполагается, что кэш и основная память обновляются одновременно. Второй способ подразумевает, что данные обновляются только в кэше, после чего помечаются с помощью соответствующего битового флага. Упомянутый бит называют флагом изменения или модификации. Соответствующее слово в основной памяти обновляется позже, при удалении из кэша того блока, который содержит помеченное слово. Описанная технология называется протоколом обратной записи или обратного копирования. Протокол сквозной записи проще, но при его использовании производятся лишние операции записи в основную память — в том случае, если некоторое слово обновляется в кэше несколько раз подряд. Конечно, подобное происходит и при обратной записи, поскольку при удалении блока из кэша в память записываются все его слова, даже если изменилось только одно из них.
Ситуация, при которой слово, адресуемое операцией считывания, отсутствует в кэше, называется промахом чтения. В этом случае из основной памяти в кэш копируется блок, содержащий такое слово. Запрошенное слово передается в процессор после загрузки в кэш всего блока. В качестве альтернативы оно может быть передано в процессор сразу после его прочтения из основной памяти. Последний подход, называемый сквозной загрузкой, сокращает время ожидания слова процессором, но для его реализации требуется более сложная схема.
Если в кэше не оказывается слова, адресуемого операцией записи, мы говорим, что возникла ситуация, называемая промахом записи. В таком случае, при использовании протокола сквозной записи, информация записывается прямо в основную память. Но если применяется протокол обратной записи, в кэш сначала копируется блок, содержащий заданное слово, а затем это слово перезаписывается в кэше и помечается как измененное.