Реферат по предмету: Информатика и Вычислительная Техника выполнил студент группы 4381С Гаффарова Р.З.
Камский Государственный Политехнический Институт
Кафедра ЭОУП
г. Набережные Челны
2003 г.
Одним из важнейших устройств компьютера является память, или запоминающее устройство (ОЗУ). По определению, данном в книге "Информатика в понятиях и терминах", ОЗУ - "функциональная часть цифровой вычислительной машины, предназначенной для записи, хранения и выдачи информации, представленных в цифровом виде." Однако под это определение попадает как собственно память, так и внешние запоминающие устройства (типа накопителей на жестких и гибких дисках, магнитной ленты, CD-ROM), которые лучше отнести к устройствам ввода/вывода информации. Таким образом под компьютерной памятью в дальнейшем будет пониматься только "внутренняя память компьютера: ОЗУ, ПЗУ, кэш память и флэш-память".
Однако ОЗУ работает намного медленнее процессора. Другое дело - кэш. Очень быстрая и очень дорогая память. Но именно из-за дороговизны в компьютерной системе объем кэш составляет всего 10-15% от объема обычной ОЗУ. А также используются специальные алгоритмы работы материнской платы и процессора, обеспечивающие максимальную производительность при наличии встроенной кэш-памяти.
1. Общие понятие о кэшировании и кэш-памяти
Существующая уже более 100 лет архитектура компьютера, предложенная еще Фон Нейманом, практически не претерпела изменения. Все также процессор окружает оперативная, постоянная и внешняя память. И все также оперативная память, являющаяся одной из скоростных элементов памяти внутри компьютера, не достигает по скорости процессор на несколько порядков.
Естественно, что такой «тормоз» в виде одного из необходимых элементов компьютера не устраивал его создателей. Тем более, что в больших компьютерах уже давно существовало понятие кэш-памяти (cashe-memory), более быстрой, чем ОЗУ, но меньшей емкости. Было решено перенести ее архитектуру с БЭВМ на обычные персональные компьютеры.
Принцип работы кэш-памяти заключается в следующем. Процессор редко использует весь объем ОЗУ практически одновременно. Скакать из одного угла памяти в другой, периодически пошвыриваясь по всему ее объему – это не лучший способ использования ресурсов компьютера. Зачастую все обращения процессора к памяти сосредоточены в небольшой области (как показывает статистика – 5-10% от общего объема). Если данные из этой области как либо аппаратно скопировать в кэш, а затем постоянно сверять кэш и ОЗУ на предмет целостности данных, то можно обеспечить режим работы, при котором процессор будет обращаться только к кэш-памяти, тратя на это значительно меньше ресурсов и времени, чем обычно.
Естественно, что весь объем ОЗУ скопировать в кэш нет возможности – такой объем кэш-памяти по цене сравнивается со стоимостью компьютера, а смысла уменьшать объем ОЗУ тоже нет. Было решено реализовать алгоритм работы процессора, кэш-памяти и ОЗУ аппаратно, чтобы не тратить ресурсы процессора.
Принцип заключается в следующем: когда процессор обращается к определенной ячейке памяти, сегмент памяти определенного объема (этот объем называется объемом страницы кэш) копируется в кэш полностью. Если процессор дальше не совершит глобальный скачек на другой, далекий от текущего, адрес памяти, то дальнейшая работа процессора будет происходить напрямую с кэш, минуя ОЗУ, а контроллер кэш-памяти в промежутках, когда процессор занят вычислениями (либо параллельно с работой процессора) будет восстанавливать верные данные в ОЗУ либо в кэш (в случае наличия устройств, напрямую работающих с памятью). Естественно, чем больше будет страниц и чем больше будет их объем – тем выше будет скорость работы процессора.
Начиная с 386-х процессоров кэш-память устанавливалась на большинство материнских плат. Все это позволяло повышать производительность систем не в разы, а на порядки. Но с выходом 486 процессора кэш-память была разделена: появился кэш, реализованный непосредственно на кристалле процессора (в 486DX). Несмотря на малый его объем – 1 Кб – это уже был скачек в производительности и очень большой: ведь кэш, расположенный на кристалле процессора работает на частоте процессора, что в несколько раз превышает скорость работы кэш-памяти, установленной на материнской плате.
Начиная с 486 процессоров кэш-память испытывает подобное разделение на кэш 1-го уровня – установленный на кристалле (или в одном корпусе) процессора и работающий с ним на одной частоте, и кэш 2-го уровня, установленный на материнской плате, работающий быстрее обычной ОЗУ, но медленнее КЭШа первого уровня.
Однако этим не ограничивается использования кэш-памяти. Ведь таким образом ее можно использовать там, где существует проблема быстродействия, но есть возможность упорядочить данные. К таким применениям относят:
аппаратное кэширование жестких дисков (кэш-память устанавливается непосредственно на жестком диске либо на специальном контроллере);
программное кэширование CD-ROM, а также прочих устройств хранения информации (программно – при помощи операционной системы, аппаратно – на самом устройстве либо на контроллере).
И не только: сегодня зачастую даже самое простейшее устройство обладает своей памятью, работающей быстрее, чем само устройство. К таким относят принтеры, сканеры, модемы и т.д.
Но все-таки наиболее популярной является кэш-память первого уровня (процессорная) и второго (установленная на материнской плате).
Внутренне кэширование обращений к памяти применяется в процессорах, начиная с 486-го. С кэшированием связаны новые функции процессоров, биты регистров и внешние сигналы.
Процессоры 486 и Pentium имеют внутренний кэш первого уровня, в PentiumPro и PentiumII имеется и вторичный кэш. Процессоры могут иметь как единый кэш инструкций и данных, так и общий. Выделенный кэш инструкций обычно используется только для чтения. Для внутреннего кэша обычно используется наборно-ассоциативная архитектура.
Строки в кэш-памяти выделяются только при чтении, политика записи первых процессоров 486 – только WriteThrough (сквозная запись) – полностью программно-прозрачная. Более поздние модификации 486-го и все старшие процессоры позволяют переключаться на политику WriteBack (обратная запись).
Работу кэша рассмотрим на примере четырехканального наборно-ассоциативного кэша процессора 486. Кэш является несекторированным – каждый бит достоверности (Validbit) относится к целой строке, так что стока не может являться “частично достоверной”.
Работу внутренней кэш-памяти характеризуют следующие процессы: обслуживание запросов процессора на обращение к памяти, выделение и замещение строк для кэширования областей физической памяти, обеспечение согласованности данных внутреннего кэша и оперативной памяти, управление кэшированием.
Любой внутренний запрос процессора на обращение к памяти направляется на внутренний кэш. Теги четырех строк набора, который обслуживает данный адрес, сравниваются со старшими битами запрошенного физического адреса. Если адресуемая область представлена в строке кэш-памяти (случая попадания –cachehit), запрос на чтение обслуживается только кэш-памятью, не выходя на внешнюю шину. Запрос на запись модифицирует данную строку, и в зависимости от политики записи либо сразу выходит на внешнюю шину (при сквозной записи), либо несколько позже (при использовании алгоритма обратной записи).
В случае промаха (CacheMiss) запрос на запись направляется только на внешнюю шину, а запрос на чтение обслуживается сложнее. Если этот зарос относится к кэшируемой области памяти, выполняется цикл заполнения целой строки кэша – все 16 байт (32 для Pentium) читаются из оперативной памяти и помещаются в одну из строк кэша, обслуживающего данный адрес. Если затребованные данные не укладываются в одной строке, заполняется и соседняя. Заполнение строки процессор старается выполнить самым быстрым способом – пакетным циклом с 32-битными передачами (64-битными для Pentiumи старше).
Внутренний запрос процессора на данные удовлетворяется сразу, как только затребованные данные считываются из ОЗУ – заполнение строки до конца может происходить параллельно с обработкой полученных данных. Если в наборе, который обслуживает данный адрес памяти, имеется свободная строка (с нулевым битом достоверности), заполнена будет она и для нее установится бит достоверности. Если свободных строк в наборе нет, будет замещена строка, к которой дольше всех не было обращений. Выбор строки для замещения выполняется на основе анализа бит LRU (LeastRecentlyUsed) по алгоритму “псевдо-LRU”. Эти биты (по три на каждый из наборов) модифицируются при каждом обращении к строке данного набора (кэш-попадании или замещении).
Таким образом, выделение и замещение строк выполнятся только кэш-промахов чтения, при промахах записи заполнение строк не производится. Если затребованная область памяти присутствует в строке внутреннего кэша, то он обслужит этот запрос. Управлять кэшированием можно только на этапе заполнения строк; кроме того, существует возможность их аннулирования – объявления недостоверными и очистка всей кэш-памяти.
Очистка внутренней кэш-памяти при сквозной записи (обнуление бит достоверности всех строк) осуществляется внешним сигналом FLUSH# за один такт системной шины (и, конечно же, по сигналу RESET). Кроме того, имеются инструкции аннулирования INVD и WBINVD. Инструкция INVD аннулирует строки внутреннего кэша без выгрузки модифицированных строк, поэтому ее неосторожное использование при включенной политике обратной записи может привести к нарушению целостности данных в иерархической памяти. Инструкция WBINVD предварительно выгружает модифицированные строки в основную память (при сквозной записи ее действие совпадает с INVD). При обратной записи очистка кэша подразумевает и выгрузку всех модифицированных строк в основную память. Для этого, естественно, может потребоваться и значительное число тактов системной шины, необходимых для проведения всех операций записи.