Память вычислительных систем. Информатика и вычислительная техника

Основная память

Основная память - это запоминающее устройство, напрямую связанное с процессором и предназначенное для хранения выполняемых программ и данных непосредственно участвующих в операциях. Она имеет достаточное быстродействие, но ограниченный объем. Основная память делится на различные виды, основными из которых являются оперативная память (ОЗУ) и постоянное запоминающее устройство (ПЗУ) (рис.1).

ОЗУ предназначено для хранения информации (программ и данных), непосредственно участвующей в вычислительном процессе на текущем этапе функционирования.

ОЗУ служит для приема, хранения и выдачи информации. Именно в нем процессор «берет» программы и исходные данные для обработки, в нее он записывает полученные результаты. Название «оперативная» это память получила потому, что она работает очень быстро, так что процессору практически не приходится ждать при чтении данных из памяти и записи в память. Однако содержащие в ней данные сохраняются только пока компьютер включен. При выключении компьютера содержимое оперативной памяти стирается. Таким образом ОЗУ - энергозависимая память.

Рис. 1. Основные виды основной памяти

Часто для оперативной памяти используют обозначение RAM (random access memory, т.е. память с произвольным доступом). Под произвольным доступом понимают возможность непосредственного доступа к любой (произвольной) заданной ячейки памяти, причем время доступа для любой ячейки одинаково.

Основу ОЗУ составляют большие интегральные схемы, содержащие матрицы полупроводниковых запоминающих элементов (триггеров). Запоминающие элементы расположены на пересечении вертикальных и горизонтальных шин матрицы; запись и считывание информации осуществляется подачей электрических импульсов по тем каналам матрицы, которые соединены с элементами, принадлежащими выбранной ячейке памяти.

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

ОП реализуется на микросхемах DRAM (динамическая ОП), характеризующейся по сравнению с другими разновидностями памяти низкой стоимостью и высокой удельной емкостью, но большим энергопотреблением и меньшим быстродействием. Каждый информационный байт (0 и 1) в DRAM хранится в виде заряда конденсатора. Из-за наличия токов утечки заряд конденсатора необходимо с определенной периодичностью обновлять. Из-за непрерывной потребности обновления такая память и называется динамической. Регенерация содержимого памяти требует дополнительного времени, а запись информации во время регенерации в память не допускается.

Стоимость оперативной памяти в последнее время резко упала (с лета 1995 до лета 1996 г. - более чем в 4 раза), поэтому большие запросы многих программ и операционных систем к оперативной памяти с финансовой точки зрения стали менее обременительны.

Для ускорения доступа к оперативной памяти на быстродействующих компьютерах используется стабильная сверхбыстродействующая КЭШ-память, которая располагается, как бы «между» микропроцессором и оперативной памятью и хранит копии наиболее часто используемых участков оперативной памяти. При обращении микропроцессора к памяти сначала производится поиск нужных данных из КЭШ-памяти. Поскольку время доступа к КЭШ-памяти в несколько раз меньше, чем к обычной памяти, а в большинстве случаев необходимые микропроцессору данные уже хранятся в КЭШ-памяти, среднее время доступа к памяти уменьшается. КЭШ-память реализуется на микросхеме SRAM (статическая ОП).

Для компьютеров на основе Intel-386DX или 80386SX размер КЭШ-памяти в 64 Кбайт является удовлетворительным, а 128 Кбайт вполне достаточным. Компьютеры на основе Intel-80486DX, DX2, DX4 и Pentium обычно оснащаются КЭШ-памятью емкостью 256 Кбайт.

Микропроцессоры серий 486 и Pentium содержат небольшую внутреннюю КЭШ-память, поэтому для однозначности терминологии иногда в технической литературе КЭШ-память, размещаемую на системной плате, называют КЭШ-памятью второго уровня.

В микропроцессоре Pentium Pro КЭШ-память второго уровня содержится в едином корпусе с самим процессором (можно сказать она встроена в микропроцессор).

Не обязательно иметь всю память, информация в которой должна меняться. Часть наиболее важной информации лучше постоянно хранить в памяти компьютера. Эту память называют постоянной. Данные в постоянную память занесены при ее изготовлении. Как правило, эти данные не могут быть изменены, выполняемые на компьютере программы могут только их считывать. Такой вид памяти обычно называют ROM (read only mеmory, или память только для чтения), или ПЗУ (постоянное запоминающее устройство).

В IBM PC - совместимом компьютере в постоянное памяти хранятся программы для проверки оборудования, компьютера, инициирования загрузки операционной системы (ОС) и выполнения базовых функций по обслуживанию устройств компьютера. Поскольку большая часть этих программ связана с обслуживанием ввода-вывода, часто содержимое постоянной памяти называется BIOS (Basic Input - output System, или базовая система ввода -вывода).

Во многих компьютерах устанавливается BIOS на основе ФЛЕШ-памяти. Такая память может быть изменена программами, что позволяет обновлять BIOS с помощью специальных программ, без замены материнской платы или микросхемы BIOS.

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

Емкость ФЛЕШ-памяти от 32 Кбайт до 2 Мбайт, время доступа по считыванию 0,06 мкс, время записи одного байта примерно 10 мкс; ФЛЕШ-память - энергонезависимое ЗУ.

Кроме обычной оперативной памяти и постоянной памяти, в компьютере имеется небольшой участок памяти для хранения параметров конфигурации компьютера. Его часто называют CMOS-памятью, поскольку эта память обычно выполняется по технологии CMOS (complementary metal-oxide semiconductor), обладающей низким энергопотреблением. Содержимое CMOS-памяти не изменяется при выключении электропитания компьютера, поскольку для ее электропитания используется специальный аккумулятор.

Таким образом, емкость основной памяти состоит из миллионов отдельных ячеек памяти емкостью 1 байт каждая. Общая емкость основной памяти современных ПК обычно лежит в пределах от 1 до 4 Гбайт. Емкость ОЗУ на один два порядка превышает емкость ПЗУ: ПЗУ занимает на новых системных платах до 2 Мбайт), остальное объем ОЗУ.

Многопроцессорность вычислительных систем приводит к проблеме одновременного доступа к памяти со стороны нескольких процессоров. В зависимости от того, каким образом организована память многопроцессорной системы, различают:

1. Вычислительные системы с общей памятью (shared memory) – Мультипроцессоры:

i. PVP (CrayT90)

ii. SMP(Intel SHV, SunFire, Dec8400 и т.д.)

i. COMA (KSR-1, DDM)

ii. CC-NUMA (Stanford Dash, Data General и т.д.)

iii. NCC-NUMA (Crag T3E)

2. Вычислительные системы с распределенной памятью (distributed memory) – Мультикомпьютеры:

ii. MPP – слабосвязанные системы (Intel TFLOPS)

Различие между общей и распределенной памятью – это разница в структуре виртуальной памяти, то есть в том, как эта память выглядит со стороны процессоров. Другими словами, общую память от распределенной отличает то, каким образом подсистема памяти интерпретирует поступивший от микропроцессора адрес ячейки (глобальный адрес или локальный адрес).

Физически почти вся память разделена на автономные компоненты, доступ к которым может производиться независимо.

Рассмотрим модели архитектур памяти ВС, которые будут верны как для класса множественный поток данных MIMD, так и для SIMD:

UMA - ВС с общей памятью, где доступ любого процессора к памяти производится единообразно и занимает одинаковое время. Системы с однородным доступом к памяти:

Mp – общая память

Pi – процессор

Общая шина

Особенности: в каждый момент времени обмен по шине, может вести только один из процессоров. Производительность падает с увеличением количества процессоров. Чаще всего от 4 до 8 процессоров в системе, максимальная производительность = 2. Систему нельзя отнести к отказоустойчивым, так как отказ одного модуля памяти или процессора может привести к отказу всей системы.

В данном классе архитектур существуют многопроцессорные системы с памятью, состоящей из нескольких модулей. Шина заменена коммутатором, который маршрутизирует запросы процессора к одному из нескольких модулей памяти. При чём все модули памяти входят в единое адресное пространство. Достоинство – можно обрабатывать несколько запросов.

NUMA – неоднородный доступ к памяти. Здесь различают несколько классов. Используется единое адресное пространство, но каждый процессор имеет локальную память (как правило, кэш). Доступ к ЛП осуществляется гораздо быстрее, чем доступ к удаленной памяти через сеть или коммутатор.


COMA – только с кэш. Локальная память каждого процессора построена как большая кэш. Кэши всех процессоров в совокупности представляют собой глобальную память системы. Данные не привязаны статически к определенному модулю памяти и не имеют уникального адреса. Данные переносится в кэш процессора, который последним их запросил.



Главный недостаток: очень сложное управление, ОС не участвует в процессе управления (все задачи возлагаются на аппаратуру).

CC-NUMA – модель кэш-когерентного доступа к неоднородной памяти. Используется не кэш, а обычная физически распределенная память. Не требуется какого-либо программного обеспечения для сохранения множества обновленных данных. С этим справляется аппаратный уровень.

NCC-NUMA – модель предполагает использование единого адресного пространства, но не обеспечивает согласованности глобальных данных на аппаратном уровне. Управление возлагается на ПО, это считается недостатком, но модель наиболее перспективная с точки зрения повышения производительности.

Мультикомпьютеры – блоки, из которых строится система, представляют собой с процессором и памятью.

NORMA – архитектура без прямого доступа к удаленной памяти.


P – процессор

M – локальная память

K0 и K1 – контроллер ввода/вывода

Блоки – процессорные элементы. Из них собирают системы.

Каждый процессор в такой системе может обратиться к удаленной памяти только путем обмена сообщениями с процессорами, которым принадлежит адресуемая память. Все ПЭ по отношению друг к другу рассматриваются как устройства ввода-вывода.

Для посылки сообщений в другой процессорный элемент процессор формирует блок данных в своей локальной памяти и извещает свой локальный контроллер о необходимости передачи информации на внешнее устройство. По сети меж соединений это сообщение пересылается на приёмный контроллер, тот находит место в своей локальной памяти и уведомляет свой процессор о том, что оно поступило, а так же процессор-источник о получении сообщения.



Достоинства – при доступе к данным не возникает конкуренция за шину или коммутатор. Раз отсутствует общая шина, то нет ограничений на количество процессоров. В гораздо меньшей степени стоит проблема достоверности кэш. Каждый процессор в праве менять свой кэш и не согласовать свои действия с другими.

Недостатки: У каждого процессорного элемента есть система прерываний. От этого сложность обмена информацией (время на пересылку и формирование сообщения, время на формирование запросов прерываний и их обработку).

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

Из микросхем памяти (чипов) создаются модули памяти, которые устанавливаются в специальные слоты (разъемы) вычислительной системы. Сейчас наиболее распространены DIMM модули - модули памяти с двумя рядами контактов.

Разрядность адресной шины определяет адресное пространство, то есть количество ячеек памяти, которые могут адресоваться непосредственно. Если разрядность адресной шины - n, то количество всех возможных двоичных комбинаций (количество адресов) определится как N = 2n.

Рис. 1. Организация связи системы памяти с процессором

Память вычислительного устройства может выполнять три операции:

a) хранение информации;

b) запись информации;

c) чтение информации.

Характеристики памяти:

Емкость памяти определяет максимальное количество хранимой в памяти информации и измеряется в битах, байтах, килобайтах, мегабайтах, гигабайтах, терабайтах и т.д.

Удельная емкость определяется как отношение емкости памяти к физически занимаемому ею объему.

Плотность записи информации определяется как количество информации, приходящееся на единицу площади носителя информации или на единицу длины носителя информации.

Время доступа к памяти. Быстродействие памяти определяется продолжительностью выполнения операций при обращении к памяти. Время обращения при записи и время обращения при чтении складывается из времени поиска ячейки памяти по заданному адресу и собственно записи или чтения соответственно.

Классификация памяти:

Память с произвольным доступом

Для памяти с произвольным доступом (электронной памяти) время обращения не зависит от местоположения искомого участка памяти. Выбор ячейки происходит по адресу при помощи электронных схем.

Прямой циклический доступ

При обращении к дисковой памяти используется прямой циклический доступ. Носитель информации непрерывно вращается, поэтому возможность обращения к одному и тому же участку памяти является циклической.

Последовательный доступ

Последовательный доступ к данным возможен при использовании в качестве носителя магнитной ленты, где последовательный просмотр участков носителя необходим для нахождения нужных данных.

Безадресная память

К безадресным можно отнести стековые и ассоциативные запоминающие устройства. При обращении к безадресной памяти в команде обращения к памяти не задается адрес ячейки. В стековых устройствах памяти адрес ячейки памяти отслеживает специальный адресный регистр. При обращении к стеку устанавливается адрес из этого регистра. При обращении к ассоциативной памяти поиск информации ведется по признаку (тэгу) путем сравнения тегов всех ячеек памяти с ассоциативным признаком. Ассоциативный признак записывается для выполнения операции сравнения в специальный регистр признака.

Классификация памяти по функциональному назначению:

ПЗУ - постоянные запоминающие устройства или ROM (Read Only- Memory), служат для хранения постоянных данных и служебных программ.

СОЗУ - сверхоперативное запоминающее устройство, это набор регистров общего назначения - РОН, предназначенных для хранения операндов и результатов выполнения операции в процессоре.

ОЗУ - оперативное запоминающее устройство или RAM (Random Access Memory - память с произвольной выборкой), служит для хранения выполняемой программы и оперативных данных. Если к любому регистру можно обратиться для записи/чтения по его адресу, то такая регистровая структура образует СОЗУ с произвольным доступом.

Классификация по способу хранения информации:

Статическая память

В статических запоминающих устройствах БИС выполнены на бистабильных триггерных элементах памяти (имеющих два стабильных состояния - отсюда и название памяти).

Динамическая память

В динамических запоминающих устройствах используются более дешевые БИС, в которых запоминающим элементом является конденсатор. Конденсатор со временем разряжается (в этом - динамика), поэтому необходимо поддерживать значение потенциала, подзаряжая конденсатор. Этот процесс называют регенерацией.

Постоянная память

В постоянных запоминающих устройствах запоминающим элементом является пережигаемая плавкая перемычка или полупроводниковый диод, играющий роль разрушаемой перемычки. В перепрограммируемых ПЗУ для записи и хранения информации применяются ячейки, выполненные на МОП транзисторах с плавающим и изолированным затвором, информация записывается электрически, когда по каналу исток/сток протекает ток, заряды оседают на затворе и хранятся как угодно долго. Стирание информации производится путем подачи напряжения другого знака на участок исток/сток в перепрограммируемых ПЗУ с электрическим стиранием или облучением ультрафиолетовым излучением в ПЗУ с ультрафиолетовым стиранием.

Голографическая память

В голографических запоминающих устройствах информация хранится в объеме голографического кристалла в виде снимка интерференции двух волн, опорной и информационной. Этот перспективный вид запоминающих устройств имеет большую плотность записи информации и в настоящее время находится в стадии разработки.

Биологическая память

В биологических запоминающих устройствах для записи информации используется изменение состояния органических молекул, обладающих свойством хранить заряд и обмениваться электронами.

Память на магнитных носителях

Во внешних запоминающих устройствах на магнитных носителях информация хранится в виде намагниченных в определенном направлении участков ферромагнитной поверхности диска или магнитной ленты.

Оптическая память

В оптических внешних запоминающих устройствах информация записывается в виде участков, имеющих разные коэффициенты рассеяния света направленного луча лазера.

Память является одним из основных компонентов любого компьютера. Ее емкость и быстродействие в значительной степени определяют производительность всей компьютерной системы. В данном вопросе были рассмотрены наиболее важные технологии создания и детали организации памяти.

Глава 11

Организация памяти вычислительных систем

В вычислительных системах, объединяющих множество параллельно работающих процессоров или машин, задача правильной организации памяти является одной из важнейших. Различие между быстродействием процессора и памяти всегда было камнем преткновения в однопроцессорных ВМ. Многопроцессорность ВС приводит еще к одной проблеме - проблеме одновременного доступа к памяти со стороны нескольких процессоров.

В зависимости от того, каким образом организована память многопроцессорных (многомашинных) систем, различают вычислительные системы с общей памятью (shared memory) и ВС с распределенной памятью (distributed memory). В системах с общей памятью (ее часто называют также совместно используемой или разделяемой памятью) намять ВС рассматривается как общин ресурс, и каждый из процессоров имеет полный доступ ко всему адресному пространству. Системы с обшей памятью называют сильно связанными (closely coupled systems). Подобное построение вычислительных систем имеет место как в классе SIMD, так и в классе MIMD. Иногда, чтобы подчеркнуть это обстоятельство, вводят специальные подклассы, используя для их обозначения аббревиатуры SM-SIMD (Shared Memory SIMD) и SM-MIMD (Shared Memory MIMD).

В варианте с распределенной памятью каждому из процессоров придается собственная память. Процессоры объединяются в сеть и могут при необходимости обмениваться данными, хранящимися в их памяти, передавая друг другу так называемые сообщения. Такой вид ВС называют слабо связанными (loosely coupled systems). Слабо связанные системы также встречаются как в классе SIMD, так и В классе MIMD, и иной раз, чтобы подчеркнуть данную особенность, вводят подклассы DM-SIMD (Distributed Memory SIMD) и DM-MIMD (Distributed Memory MIMD).

В некоторых случаях вычислительные системы с общей памятью называют мультипроцессорами, а системы с распределенной памятью - мцльтикомпьютерами.

Различие между общей и распределенной памятью - это разницу в структуре виртуальной памяти, то есть в том, как память выглядит со стороны процессора. Физически почти каждая система памяти разделена на автономные компоненты доступ к которым может производиться независимо. Общую память от распределенной отлипает то, каким образом подсистема памяти интерпретирует поступивший от процессора адрес ячейки. Для примера положим, что процессор выполняет команду load RO, i, означающую «Загрузить регистр R0 содержимым ячейки i». В случае общей памяти i - это глобальный адрес, и для любого процессора указывает на одну и ту же ячейку. В распределенной системе памяти i - это локальный адрес Если два процессора выполняют команду load RO, i, то каждый из них обращается к i-й ячейке в своем локальной памяти, то есть к разным ячейкам, и в регистры R0 могут быть загружены неодинаковые значения.

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

Память с чередованием адресов

Физически память вычислительной системы состоит из нескольких модулей (банков), при этом существенным вопросом является то, как в этом случае распределено адресное пространство (набор всех адресов, которые может сформировать процессор). Один из способов распределения виртуальных адресов по модулям памяти состоит в разбиении адресного пространства на последовательные блоки. Если память состоит из п банков, то ячейка с адресом i при поблочном разбиении будет находиться в банке с номером i/ n. В системе памяти с чередованием адресов (interleaved memory) последовательные адреса располагаются в различных банках: ячейка с адресом i находится в банке с номером i mod п. Пусть, например, память состоит из четырех банков, по 256 байт в каждом. В схеме, ориентированной на блочную адресацию, первому банку будут выделены виртуальные адреса 0-255, второму - 256-511 и т. д. В схеме с чередованием адресов последовательные ячейки в первом банке будут иметь виртуальные адреса 0, 4, 8, .... во втором банке - 1, 5, 9 и т. д. (рис. 11.1, а).

Распределение адресного пространства по модулям дает возможность одновременной обработки запросов на доступ к памяти, если соответствующие адреса относятся к разным банкам, Процессор может в одном из циклов затребовать доступ к ячейке i а в следующем цикле - к ячейке j. Если i и j находятся в разных банках, информация будет передана в последовательных циклах. Здесь под циклом понимается цикл процессора, в то время как полный цикл памяти занимает несколько циклов процессора. Таким образом, в данном случае процессор не должен ждать, пока будет завершен полный цикл обращения к ячейке i. Рассмотренный прием позволяет повысить пропускную способность: если система памяти состоит из

https://pandia.ru/text/78/264/images/image002_61.jpg" width="62" height="15"> Интервал между элементами называют шагом по индексу или «страйдом» (stride). Одним из интересных применений этого свойства может служить Доступ к матрицам. Если шаг по индексу на единицу больше числа строк в матрице, одиночный запрос на доступ к памяти возвратит все диагональные элементы матрицы (рис. 11.1,б). Ответственность за то, чтобы все извлекаемые элементы матрицы располагались в разных банках, ложится на программиста.

Модели архитектуры памяти вычислительных систем

В рамках как совместно используемой, так и распределенной памяти реализуется несколько моделей архитектур системы памяти.

DIV_ADBLOCK84">

Рис. 11.3. Общая память: а - объединение процессоров с помощью шины; б - система с локальными кэшами; в - производительность системы как функция от числа процессоров на шине; г - многопроцессорная ВС с общей памятью, состоящей из отдельных модулей

Альтернативный способ построения многопроцессорной ВС с общей памятью на основе НМЛ показан на рис. 11.3, г. Здесь шипа заменена коммутатором, маршрутизирующим запросы процессора к одному из нескольких модулей памяти. Несмотря на то что имеется несколько модулей памяти, все они входят в единое виртуальное адресное пространство. Преимущество такого подхода в том, что коммутатор и состоянии параллельно обслуживать несколько запросов. Каждый процессор может быть соединен со своим модулем памяти и иметь доступ к нему на максимально допустимой скорости. Соперничество между процессорами может возникнуть при попытке одновременного доступа к одному и тому же модулю памяти. В этом случае доступ получает только один процессор, а прочие - блокируются.

К сожалению, архитектура UMA не очень хорошо масштабируется. Наиболее распространенные системы содержат 4-8 процессоров, значительно реже 32-64 процессора. Кроме того, подобные системы нельзя отнести к отказоустойчивым, так как отказ одного процессора или модуля памяти влечет отказ всей ВС.

Другим подходом к построению ВС с общей памятью является неоднородный доступ к памяти, обозначаемый как NUM A (Non-Uniform Memory Access), Здесь по-прежнему фигурирует единое адресное пространство, но каждый процессор имеет локальную память. Доступ процессора к собственной локальной памяти производится напрямую, что намного быстрее, чем доступ к удаленной памяти через коммутатор или сеть. Такая система может быть дополнена глобальной памятью тогда локальные запоминающие устройства играют роль быстрой кэш-памяти для глобальной памяти. Подобная схема может улучшить производительность ВС, по не в состоянии неограниченно отсрочить выравнивание прямой производительности. При наличии у каждого процессора локальной кэш-памяти (рис. 11.3,6) существует высокая вероятность (р > 0,9) того, что нужные команда или данные уже находятся в локальной памяти. Разумная вероятность попадания в локальную память существенно уменьшает число обращений процессора к глобальной памяти и, таким образом, ведет к повышению эффективности. Место излома кривой производительности (верхняя кривая на рис. 11.3, в), соответствующее точке, в которой добавление процессоров еще остается эффективным, теперь перемещается в область 20 процессоров, а тонка, где кривая становится горизонтальной, - в область 30 процессоров.

В рамках концепции NUMA реализуется несколько различных подходов, обозначаемых аббревиатурами СОМА, CC- NUMA и NCC- NUMA.

В архитектуре только с кэш-памятью (СОМА, Cache Only Memory Architecture) локальная память каждого процессора построена как большая кэш-память для быстрого доступа со стороны «своего» процессора . Кэши всех процессоров в совокупности рассматриваются как глобальная память системы. Собственно глобальная память отсутствует. Принципиальная особенность концепции СОМА выражается в динамике. Здесь данные не привязаны статически к определенному модулю памяти и не имеют уникального адреса, остающегося неизменным в течение всего времени существования переменной. В архитектуре СОМА данные переносятся в кэш-память того процессора, который последним их запросил, при этом переменная не фиксирована уникальным адресом и в каждый момент времени может размещаться в любой физической ячейке. Перенос данных из одного локального кэша в другой не требует участия в этом процессе операционной системы, но подразумевает сложную и дорогостоящую аппаратуру управления памятью. Для организации такого режима используют так называемые каталоги кэшей. Отметим также, что последняя копия элемента данных никогда из кэш-памяти не удаляется.

Поскольку в архитектуре СОМА данные перемещаются в локальную кэш-память процессора-владельца, такие ВС в плане производительности обладают существенным преимуществом над другими архитектурами NUM А. С другой стороны, если единственная переменная или две различные переменные, хранящее в одной строке одного и того же кэша, требуются двум процессорам, эта строка кэша должна перемещаться между процессорами туда и обратно при каждом доступе к данным. Такие эффекты могут зависеть от деталей распределения памяти приводить к непредсказуемым ситуациям.

Модель кэш-когерентного доступа к неоднородной памяти (CC-NUMA, Сасhe Coherent Non-Uniform Memory Architecture) принципиально отличается от модели СОМА. В системе CC-NUMA используется не кэш-память, а обычная физически распределенная память. Не происходит никакого копирования страниц или данных между ячейками памяти. Нет никакой программно реализованной передачи сообщений. Существует просто одна карта памяти, с частями, физически связанными медным кабелем, и «умные» аппаратные средства. Аппаратно реализованная кэш-когерентность означает, что не требуется какого-либо программного обеспечения для сохранения множества копий обновленных данных или их передачи. Со всем этим справляется аппаратный уровень. Доступ к локальным модулям памяти в разных узлах системы может производиться одновременно и происходит быстрее, чем к удаленным модулям памяти.

Отличие модели с кэш-некогерентным доступом к неоднородной памяти (NCC-NUMA, Non-Cache Coherent Non-Uniform Memory Architecture) от CC-NUMA очевидно из названия. Архитектура памяти предполагает единое адресное пространство, но не обеспечивает согласованности глобальных данных на аппаратном уровне. Управление использованием таких данных полностью возлагается на программное обеспечение (приложения или компиляторы). Несмотря на это обстоятельство, представляющееся недостатком архитектуры, она оказывается весьма полезной при повышении производительности вычислительных систем с архитектурой памяти типа DSM, рассматриваемой в разделе «Модели архитектур распределенной памяти».

В целом, ВС с общей памятью, построенные по схеме NUMA, называют архитектурами с виртуальной общей памятью (virtual shared memory architectures). Данный вид архитектуры, в частности CC-NUMA, в последнее время рассматривается как самостоятельный и довольно перспективный вид вычислительных систем класса MIMD, поэтому такие ВС ниже будут обсуждены более подробно.

Модели архитектур распределенной памяти

В системе с распределенной памятью каждый процессор обладает собственной памятью и способен адресоваться только к ней. Некоторые авторы называют этот тип систем многомашинными ВС или мультикомпъютерами, подчеркивая тот факт, что блоки, из которых строится система, сами по себе являются небольшими вычислительными системами с процессором и памятью. Модели архитектур с распределенной памятью принято обозначать как архитектуры без прямого доступа к удаленной памяти (NORMA, No Remote Memory Access). Такое название следует из того факта, что каждый процессор имеет доступ только к своей локальной памяти. Доступ к удаленной памяти (локальной памяти другого процессора) возможен только путем обмена сообщениями с процессором, которому принадлежит адресуемая память.

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

Основной недостаток ВС с распределенной памятью заключается в сложности обмена информацией между процессорами. Если какой-то из процессоров нуждается в данных из памяти другого процессора, он должен обменяться с этим процессором сообщениями. Это приводит к двум видам издержек:

· требуется время для того, чтобы сформировать и переслать сообщение от одно! процессора к другому;

· для обеспечения реакции на сообщения от других процессоров принимающий процессор должен получить запрос прерывания и выполнить процедуру обработки этого прерывания.

Структура системы с распределенной памятью приведена на рис. 11.4. В левой! части (рис. 11.4, а) показан один процессорный элемент (ПЭ). Он включает в себя) собственно процессор (Р), локальную память (М) и два контроллера ввода/вывод (Ко и КД В правой части (рис. 11.4, б) показана четырехпроцессорная система, иллюстрирующая, каким образом сообщения пересылаются от одного процессор к другому. По отношению к каждому ПЭ все остальные процессорные элементы можно рассматривать просто как устройства ввода/вывода. Для посылки сообщения в другой ПЭ процессор формирует блок данных в своей локальной памяти и извещает свой локальный контроллер о необходимости передачи информации на внешнее устройство. По сети межсоединений это сообщение пересылается на приемный контроллер ввода/вывода принимающего ПЭ. Последний находит место для сообщения в собственной локальной памяти и уведомляет процессор-источник о получении сообщения.

DIV_ADBLOCK89">

Интересный вариант системы с распределенной памятью представляет собой; модель распределенной совместно используемой памяти (DSM, Distribute Shared Memory), известной также и под другим названием архитектуры с неоднородным доступом к памяти и программным обеспечением когерентности (SC-NUMA, Software-Coherent Non-Uniform Memory Architecture). Идея этой модели состоит в том, что ВС, физически будучи системой с распределенной памятью, благодаря операционной системе представляется пользователю как система с общей памятью. Это означает, что операционная система предлагает пользователю единое адресное пространство, несмотря на то что фактическое обращение к памяти «чужого» компьютера ВС по-прежнему обеспечивается путем обмена сообщениями.

Мультипроцессорная когерентность кэш - памяти

Мультипроцессорная система с разделяемой памятью состоит из двух или более независимых процессоров, каждый из которых выполняет либо часть большой программы, либо независимую программу. Все процессоры обращаются к командам и данным, хранящимся в общей основной памяти. Поскольку память является обобществленным ресурсом, при обращении к ней между процессорами возникает соперничество, в результате чего средняя задержка на доступ к памяти увеличивается. Для сокращения такой задержки каждому процессору придается локальная кэш-память, которая, обслуживая локальные обращения к памяти, во многих случаях предотвращает необходимость доступа к совместно используемой основной памяти. В свою очередь, оснащение каждого процессора локальной кэш-памятью приводит к так называемой проблеме когерентности или обеспечения согласо ванности кэш-памяти. Согласно , система является когерентной, если каждая операция чтения по какому-либо адресу, выполненная любым из процессоров, возвращает значение, занесенное в ходе последней операции записи по этому адресу, вне зависимости от того, какой из процессоров производил запись последним.

В простейшей форме проблему когерентности кэш-памяти можно пояснить следующим образом (рис 11.5). Пусть два процессора Рг и Рг связаны с общей памятью посредством шины. Сначала оба процессора читают переменную х. Копии блоков, содержащих эту переменную, пересылаются из основной памяти в локальные кэши обоих процессоров (рис. 11.5, а). Далее процессор Pt выполняет операцию увеличения значения переменной х на единицу. Так как копия переменной уже находится в кэш-памяти данного процессора, произойдет кэш-попадание и значение сбудет изменено только в кэш-памяти 1. Если теперь процессор Р2 вновь выполнит операцию чтения х, то также произойдет кэш-попадание и Р2 получит хранящееся в его кэш-памяти «старое» значение х (рис. 11.5, б).

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

В решении проблемы когерентности выделяются два подхода: программный и аппаратный. В некоторых системах применяют стратегии, совмещающие оба подхода.

Программные способы решения проблемы когерентности

Программные приемы решения проблемы когерентности позволяют обойтись без дополнительного оборудования или свести его к минимуму .

Протокол Berkeley. Протокол Berkeley был применен в мультипроцес-сорной системе Berkeley, построенной на базе RISC-процессоров.

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

Другое улучшение - введение состояния совместного использования (shared). Когда процессор производит запись в одну из строк своей локальной кэш-памяти, он обычно формирует сигнал аннулирования копий изменяемого блока в других кэшах. В протоколе Berkeley сигнал аннулирования формируется только при условии, что в прочих кэшах имеются такие копии. Это позволяет существенно снизить непроизводительный трафик шины. Возможны следующие сценарии.

Прежде всего, каждый раз, когда какой-либо процессор производит запись в свою кэш-память, изменяемая строка переводится в состояние «измененная, частная» (PD, Private Dirty). Далее, если строка является совместно используемой, на шину посылается сигнал аннулирования, и во всех локальных кэшах, где есть копия данного блока данных, эти копии переводятся в состояние «недействительная» (I, Invalid). Если при записи имел место промах, процессор получает копию блока из кэша текущего хозяина запрошенного блока. Лишь после этих действий процессор производит запись в свой кэш.

При кэш-промахе чтения процессор посылает запрос владельцу блока, с тем чтобы получить наиболее свежую версию последнего, и переводит свою новую копию в состояние «только для чтения» (RO, Read Only). Если владельцем строки был другой процессор, он помечает свою копию блока как «разделяемую измененную» (SD, Shared Dirty).

Диаграмма состояний протокола Berkeley показана на рис. 11.10.

Сравнивая протоколы однократной записи и Berkeley, можно отметить следу-ющее. Оба протокола используют стратегию обратной записи, при которой изме-ненные блоки удерживаются в кэш-памяти как можно дольше. Основная память обновляется только при удалении строки из кэша. Верхняя граница общего количества транзакций записи на шине определяется той частью протокола однократной записи, где реализуется сквозная запись, так как последняя стратегия порождает на шине операцию записи при каждом изменении, инициированном процессором . Поскольку первая операция записи в протоколе однократной записи является сквозной, она производится даже если данные не являются совместно используемыми. Это влечет дополнительный трафик шины, который возрастает с увеличением емкости кэш-памяти. Доказано, что протокол однократной записи приводит к большему трафику шины по сравнению с протоколом Berkeley .







Попадание при чтении

Рис. 11.10. Протокол Berkeley

Для постоянно читаемой и обновляемой строки в протоколе однократной записи необходимы считывание этой строки в кэш, ее локальная модификация в кэше и обратная запись в память. Вся процедура требует двух операций на шине: чтения из основной памяти (ОП) и обратной записи в ОП. С другой стороны, протокол Berkeley исходит из получения прав на строку. Далее блок модифицируется в кэше. Если до удаления из кэша к строке не производилось обращение, число циклов шины будет таким же, как и в протоколе однократной записи. Однако более вероятно, что строка будет запрошена опять, тогда с позиций одиночной кэш-памяти обновление строки кэша нуждается только в одной операции чтения на шине. Таким образом, протокол Berkeley пересылает строки непосредственно между кэшами, в то время как протокол однократной записи передает блок из исходного кэша в основную память, а затем из ОП в запросившие кэши, что имеет следствием общую задержку системы памяти .

Протокол Illinois. Протокол Illinois, предложенный Марком Папамаркосом , также направлен на снижение трафика шины и, соответственно, времени ожидания процессором доступа к шине. Здесь, как и в протоколе Berkeley, главенствует идея прав владения блоком, но несколько измененная. В протоколе Illinois правом владения обладает любой кэш, где есть достоверная копия блока данных. В этом случае у одного и того же блока может быть несколько владельцев. Когда такое происходит, каждому процессору назначается определенный приоритет и источником информации становится владелец с более высоким приоритетом.

Как и в предыдущем случае, сигнал аннулирования формируется, лишь когда копии данного блока имеются и в других кэшах. Возможные сценарии для протокола Illinois представлены на рис. 11.11.

Рис. 11.11. Протокол Illinois

Каждый раз когда какой-либо процессор производит запись в свою кэш-память, изменяемая строка переводится в состояние «измененная частная» (PD, Private Dirty), Если блок данных является совместно используемым, на шину посылается сигнал аннулирования и во всех локальных кэшах, где есть копия данного блока, эти копии переводятся в состояние «недействительная» (I, Invalid). Если при записи случился промах, процессор получает копию из кэша текущего владельца запрошенного блока. Лишь после означенных действий процессор производит запись в свой кэш. Как видно, в этой части имеет место полное совпадение с протоколом Berkeley.

При кэш-промахе чтения процессор посылает запрос владельцу блока, с тем чтобы получить наиболее свежую версию последнего, и переводит свою новую копию в состояние «эксклюзивная» (Е, Exclusive) при условии, что он является единственным владельцем строки. В противном случае статус меняется на «разделяемая» (S, Shared).

Существенно, что протокол расширяем и тесно привязан как к коэффициенту кэш-промахов, так и к объему данных, которые являются общим достоянием мультипроцессорной системы.

Протокол Firefly. Протокол был предложен Такером и др. и реализован в мультипроцессорной системе Firefly Multiprocessor Workstation, разработанной в исследовательском центре Digital Equipment Corporation.

В протоколе Firefly используется запись с обновлением. Возможные состояния строки кэша совпадают с состояниями протокола Illinois (рис. 11.12). Отличие состоит в том, что стратегия обратной записи применяется только к тем строкам, которые находятся в состоянии PD или Е, в то время как применительно к строкам в состоянии S действует сквозная запись. Наблюдающие кэши при обновлении своих копий используют процедуру сквозной записи. Кроме того, наблюдающие кэши, обнаружившие у себя копию строки, возбуждают специальную «разделяемую» линию шины с тем, чтобы записывающий контроллер мог принять решение о том, в какое состояние переводить строку, в которую была произведена запись. «Разделяемая» линия при кэш-промахе чтения служит для информирования контроллера локальной кэш-памяти о месте, откуда поступила копия строки: из основной памяти или другого кэша. Таким образом, состояние S применяется только к тем данным, которые действительно используются совместно .

https://pandia.ru/text/78/264/images/image018_2.jpg" width="491 height=316" height="316">

Рис. 11.13. Протокол Dragon

Протокол MESI. Безусловно, среди известных протоколов наблюдения сам популярным является протокол MESI (Modified/Exclusive/Shared/Invalid). Протокол MESI широко распространен в коммерческих микропроцессорных системах, например на базе микропроцессоров Pentium и PowerPC. Так, его можно обнаружить во внутреннем кэше и контроллере внешнего кэша i82490 микропроцессора Pentium, в процессоре i860 и контроллере кэш-памяти МС88200 фирмы Моtorola.

Протокол был разработан для кэш-памяти с обратной записью. Одной из основных задач протокола MESI является откладывание на максимально возможный срок операции обратной записи кашированных данных в основную память BC. Это позволяет улучшить производительность системы за счет минимизации нужных пересылок информации между кэшами и основной памятью. Протокол MESI приписывает каждой кэш-строке одно из четырех состояний, которые контролируются двумя битами состояния MESI в теге данной строки. Статус кэш-строки может быть изменен как процессором, для которого эта кэш-память является локальной, так и другими процессорами мультипроцессорной «схемы. Управление состоянием кэш-строк может быть возложено и на внешние логические устройства. Одна из версий протокола предусматривает использование ранее рассмотренной схемы однократной записи.

Разделяемая (S, Shared) - строка в кэше совпадает с аналогичной строкой в основной памяти (данные достоверны) и может присутствовать в одном или нескольких из прочих кэшей.

Недействительная (I, Invalid) - кэш-строка, помеченная как недействительная, не содержит достоверных данных и становится логически недоступной.

Рис. 11.15. Последовательность смены состояний в протоколе MESI: а - процессор 1 читает х;

б - процессор 2 читает х; в - процессор 1 производит первую запись в х;

г - процессор 1 производит очередную запись в х

Порядок перехода строки кэш-памяти из одного состояния в другое зависит от: текущего статуса строки, выполняемой операции (чтение или запись), результата обращения в кэш (попадание или промах) и, наконец, от того, является ли строка совместно используемой или нет. На рис. 11.14 приведена диаграмма основных переходов без учета режима однократной записи.

Предположим, что один из процессоров делает запрос на чтение из строки, которой в текущий момент нет в его локальной кэш-памяти (промах при чтении). Запрос будет широковещательно передан по шине. Если ни в одном из кэшей не нашлось копии нужной строки, то ответной реакции от контроллеров наблюдения других процессоров не последует, строка будет считана в кэш запросившего процессора из основной памяти, а копии будет присвоен статус Е. Если в каком-либо из локальных кэшей имеется искомая копия, от соответствующего контроллера слежения поступит отклик, означающий доступ к совместно используемой строке. Все копии рассматриваемой строки во всех кэшах будут переведены в состояние S, вне зависимости от того, в каком состоянии они были до этого (И, Е или S).

Когда процессор делает запрос на запись в строку, отсутствующую в его локальной кэш-памяти (промах при записи), перед загрузкой в кэш-память строка должна быть считана из основной памяти (ОП) и модифицирована. Прежде чем процессор сможет загрузить строку, он должен убедиться, что в основной памяти действительно находится достоверная версия данных, то есть что в других кэшах отсутствует модифицированная копия данной строки. Формируемая в этом случае последовательность операций носит название чтения с намерением модифика ции (RWITM, Read With Intent To Modify). Если в одном из кэшей обнаружилась копия нужной строки, причем в состоянии М, то процессор, обладающий этой копией, прерывает RWITM-последовательность и переписывает строку в ОП, после чего меняет состояние строки в своем кэше на I. Затем RWITM-последовательность возобновляется и делается повторное обращение к основной памяти для считывания обновленной строки. Окончательным состоянием строки будет М, при котором ни в ОП, ни в других кэшах нет еще одной достоверной ее копии. Если копия строки существовала в другом кэше и не имела состояния М, то такая копия аннулируется и доступ к основной памяти производится немедленно.

Кэш-попадание при чтении не изменяет статуса читаемой строки. Если процессор выполняет доступ для записи в существующую строку, находящуюся в состоянии S, он передает на шину широковещательный запрос, с тем чтобы информировать другие кэши, обновляет строку в своем кэше и присваивает ей статус М. Все остальные копии строки переводятся в состояние I. Если процессор производит доступ по записи в строку, находящуюся в состоянии Е, единственное, что он должен сделать, - это произвести запись в строку и изменить ее состояние на М, поскольку другие копии строки в системе отсутствуют.

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

Проиллюстрируем этапы, когда процессор 2 пытается прочитать содержимое ячейки х" (рис. 11.16). Сперва наблюдается кэш-промах по чтению и процессор пытается обратиться к основной памяти. Процессор 1 следит за шиной, обнаруживает обращение к ячейке, копия которой есть в его кэш-памяти и находится в




Рис. 11.16. Переход из состояния Е в состояние S в протоколе MESI: а- процессор 2

читает х; б - процессор 1 производит обратную запись х" в основную память;

я - процессор 2 читает х" из основной памяти

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

До сих пор рассматривалась версия протокола MESI без однократной записи. С учетом однократной записи диаграмма состояний, изображенная на рис. 11.14, немного видоизменяется. Все кэш-промахи при чтении вызывают переход в состояние S. Первое попадание при записи сопровождается переходом в состояние Е (так называемый переход однократной записи). Следующее попадание при записи влечет за собой изменение статуса строки на М.

Протоколы на основе справочника

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

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

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

Для каждой строки общего пользования, копия которой может быть помещена в кэш-память, в справочнике выделяется одна запись, хранящая указатели на копии данной строки. Кроме того, в каждой записи выделен один бит модификации (D), показывающий, является ли копия «грязной» (D = 1 - dirty) или «чистой» (D = 0 - clean), то есть изменялось ли содержимое строки в кэш-памяти после того, как она была туда загружена. Этот бит указывает, имеет ли право процессор производить запись в данную строку.

В настоящее время известны три способа реализации протоколов обеспечения когерентности кэш-памяти на основе справочника: полный справочник, ограниченные справочники и сцепленные справочники.

В протоколе полного справочника единый централизованный справочник поддерживает информацию обо всех кэшах. Справочник хранится в основной памяти.


Рис. 11.17. Протокол обеспечения когерентности кэш-памяти с полным справочником

В системе из N процессоров каждая запись справочника будет содержать N однобитовых указателей. Если в соответствующей локальной кэш-памяти присутствует копия данных, бит-указатель устанавливается в 1, иначе - в 0. Схема с полным справочником показана на рис. 11.17. Здесь предполагается, что копия строки имеется в каждом кэше. Каждой строке придаются два индикатора состояния: бит достоверности (V, Valid) и бит владения (Р, Private). Если информация в строке корректна, ее V-бит устанавливается в 1. Единичное значение Р-бита указывает, что данному процессору предоставлено право на запись в соответствующую строку своей локальной кэш-памяти.

Предположим, что процессор 2 производит запись в ячейку х. В исходный момент процессор не получил еще разрешения на такую запись. Он формирует запрос к контроллеру справочника и ждет разрешения на продолжение операции. В ответ на запрос во все кэши, где есть копии строки, содержащей ячейку х, выдается сигнал аннулирования имеющихся копий. Каждый кэш, получивший этот сигнал, сбрасывает бит достоверности аннулируемой строки (V-бит) в 0 и возвращает контроллеру справочника сигнал подтверждения. После приема всех сигналов подтверждения контроллер справочника устанавливает в единицу бит модификации (D-бит) соответствующей записи справочника и посылает процессору 2 сигнал, разрешающий запись в ячейку х. С этого момента процессор 2 может продолжить запись в собственную копию ячейки х, а также в основную память, если в кэше реализована схема сквозной записи.

Основные проблемы протокола полного справочника связаны с большим количеством записей. Для каждой ячейки в справочнике системы из N процессоров требуется N+ 1 бит, то есть с увеличением числа процессоров коэффициент сложности возрастает линейно. Протокол полного справочника допускает наличие в каждом локальном кэше копий всех совместно используемых ячеек. На практике такая возможность далеко не всегда остается востребованной - в каждый конкретный момент обычно актуальны лишь одна или несколько копий. В протоколе с ограниченными справочниками копии отдельной строки вправе находиться только в ограниченном числе кэшей - одновременно может быть не более чем п копий строки, при этом число указателей в записях справочника уменьшается до п (п < N ). Чтобы однозначно идентифицировать кэш-память, хранящую копию, указатель вместо одного бита должен состоять из log2 N бит, а общая длина указателей в каждой записи справочника вместо N бит будет равна п log2 N бит. При постоянном значении п темпы роста коэффициента сложности ограниченного справочника по мере увеличения размера системы ниже, чем в случае линейной зависимости.

Когда одновременно требуется более чем п копий, контроллер принимает решение, какие из копий сохранить, а какие аннулировать, после чего производятся соответствующие изменения в указателях записей справочника.

Метод сцепленных справочников также имеет целью сжать объем справочника. В нем для хранения записей привлекается связный список, который может быть реализован как одно связный (однонаправленный) и двусвязный (двунаправленный).

Рис. 11.18. Протокол обеспечения когерентности кэш-памяти со сцепленным справочником

В односвязном списке (рис. 11.18) каждая запись справочника содержит указатель на копию строки в одном из локальных кэшей. Копии одноименных строк в разных кэшах системы образуют однонаправленную цепочку. Для этого в их тегах предусмотрено специальное поле, куда заносится указатель на кэш-память, содержащую следующую копию цепочки. В тег последней копии цепочки помещается специальный символ-ограничитель. Сцепленный справочник допускает цепочки длиной в N, то есть поддерживает N копий ячейки. При создании еще одной копии цепочку нужно разрушить, а вместо нее сформировать новую. Пусть, например, в процессоре 5 нет копии ячейки х и он обращается за ней к основной памяти. Указатель в справочнике изменяется так, чтобы указывать на кэш с номером 5, а указатель в кэше 5 - таким образом, чтобы указывать на кэш 2. Для этого контроллер основной памяти наряду с затребованными данными должен передать в кэш-память 5 также и указатель на кэш-память с номером 2. Лишь после того, как будет сформирована вся структура цепочки, процессор 5 получит разрешение на доступ к ячейке х. Если процессор производит запись в ячейку, то вниз по тракту, определяемому соответствующей цепочкой указателей, посылается сигнал аннулирования. Цепочка должна обновляться и при удалении копии из какой-либо кэш-памяти.

Двусвязный список поддерживает указатели как в прямом, так и в обратном направлениях. Это позволяет более эффективно вставлять в цепочку новые указатели или удалять из нее уже не нужные, но требует хранения большего числа указателей.

Схемы на основе справочника «страдают» от «заторов» в централизованном контроллере, а также от коммуникационных издержек в трактах между контроллерами локальных кэшей и центральным контроллером. Тем не менее они оказываются весьма эффективными в мультипроцессорных системах со сложной топологией взаимосвязей между процессорами, где невозможно реализовать протоколы наблюдения.

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

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

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

Протокол Archibald. Схема справочника Archibald - это пара замысловатых схем для иерархически организованных сетей процессоров. С детальным описанием этого протокола можно ознакомиться в .

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

Контрольные вопросы

1. Проанализируйте влияние особенностей ВС с общей памятью и ВС с распределенной памятью на разработку программного обеспечения. Почему эти ВС называют соответственно сильно связанными и слабо связанными?

2. Поясните идею с чередованием адресов памяти. Из каких соображений выбирается механизм распределения адресов? Как он связан с классом архитектуры ВС?

3. Дайте сравнительную характеристику однородного и неоднородного доступов
к памяти.

4. В чем заключаются преимущества архитектуры СОМА?

5. Проведите сравнительный анализ моделей с кэш-когерентным и кэш-некогерентным доступом к неоднородной памяти.

6. Сформулируйте достоинства и недостатки архитектуры без прямого доступа к удаленной памяти.

7. Объясните смысл распределенной и совместно используемой памяти.

8. Разработайте свой пример, иллюстрирующий проблему когерентности кэш-памяти.

9. Охарактеризуйте особенности программных способов решения проблемы когерентности, выделите их преимущества и слабые стороны.

10. Сравните методики записи в память с аннулированием и записи в память с трансляцией, акцентируя их достоинства и недостатки.

11. Дайте сравнительную характеристику методов для поддержания когерентности в мультипроцессорных системах.

12. Выполните сравнительный анализ известных вам протоколов наблюдения.

13. Какой из протоколов наблюдения наиболее популярен? Обоснуйте причины повышенного к нему интереса.

14. Дайте развернутую характеристику протоколов когерентности на основе справочника и способов их реализации. В чем суть отличий этих протоколов от протоколов наблюдения?


Со времен создания ЭВМ фон Неймана основная память в компьютерной системе организована как линейное (одномерное)адресное пространство , состоящее из последовательности слов , а позже байтов. Аналогично организована и внешняя память . Хотя такая организация и отражает особенности используемого аппаратного обеспечения, она не соответствует способу, которым обычно создаются программы. Большинство программ организованы в виде модулей, некоторые из которых неизменны (только для чтения, только для исполнения), а другие содержат данные, которые могут быть изменены.

Если операционная система и аппаратное обеспечение могут эффективно работать с пользовательскими программами и данными, представленными модулями, то это обеспечивает ряд преимуществ.


  1. Модули могут быть созданы и скомпилированы независимо друг от друга, при этом все ссылки из одного модуля в другой разрешаются системой во время работы программы.

  2. Разные модули могут получать разные степени защиты (только чтение, только исполнение) за счет весьма умеренных накладных расходов.

  3. Возможно применение механизма, обеспечивающего совместное использование модулей разными процессами (для случая сотрудничества процессов в работе над одной задачей).
Память – важнейший ресурс вычислительной системы, требующий эффективного управления. Несмотря на то, что в наши дни память среднего домашнего компьютера в тысячи раз превышает память больших ЭВМ 70-х годов, программы увеличиваются в размере быстрее, чем память . Достаточно сказать, что только операционная система занимает сотни Мбайт (например, Windows 2000 – до 30 млн строк), не говоря о прикладных программах и базах данных, которые могут занимать в вычислительных системах десятки и сотни Гбайт.

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


  • чем меньше время доступа, тем дороже бит;

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

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

  • снижается стоимость бита;

  • возрастает емкость;

  • возрастает время доступа;

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

Рис. 6.1. Иерархия памяти

Предположим, процессор имеет доступ к памяти двух уровней. На первом уровне содержится Е 1 слов, и он характеризуется временем доступа Т 1 = 1 нс. К этому уровню процессор может обращаться непосредственно. Однако если требуется получить слово , находящееся на втором уровне, то его сначала нужно передать на первый уровень. При этом передается не только требуемое слово , а блок данных , содержащий это слово . Поскольку адреса, к которым обращается процессор , имеют тенденцию собираться в группы (циклы, подпрограммы), процессор обращается к небольшому повторяющемуся набору команд. Таким образом, работа процессора с вновь полученным блоком памяти будет проходить достаточно длительное время.

Обозначим через Т 2 = 10 нс время обращения ко второму уровню памяти, а через Р – отношение числа нахождений нужного слова в быстрой памяти к числу всех обращений. Пусть в нашем примере Р = 0,95 (т.е. 95% обращений приходится на быструю память , что вполне реально), тогда среднее время доступа к памяти можно записать так:

T ср = 0,95*1нс + 0,05* (1нс+10нс)=1,55нс

Этот принцип можно применять не только к памяти с двумя уровнями. Реально так и происходит. Объем оперативной памяти существенно сказывается на характере протекания вычислительного процесса, так как он ограничивает число одновременно выполняющихся программ, т.е. уровень мультипрограммирования. Если предположить , что процесс проводит часть р своего времени в ожидании завершения операции ввода-вывода, то степень загрузки Z центрального процессора (ЦП) в идеальном случае будет выражаться зависимостью

Z = 1 - p n , где n – число процессов.

На рис. 6.2 показана зависимость Z=p(n) для различного времени ожидания завершения операции ввода-вывода (20%, 50% и 80%) и числа процессов n. Большое количество задач, необходимое для высокой загрузки процессора, требует большого объема оперативной памяти. В условиях, когда для обеспечения приемлемого уровня мультипрограммирования имеющейся памяти недостаточно, был предложен метод организации вычислительного процесса, при котором образы некоторых процессов целиком или частично временно выгружаются на диск .

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

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

В данном случае в распоряжение прикладного программиста предоставляется виртуальная оперативная память , размер которой намного превосходит реальную память системы и ограничивается только возможностями адресации используемого процесса (в ПК на базе Pentium 2 32 = 4 Гбайт). Вообще виртуальным (кажущимся) называется ресурс , обладающий свойствами (в данном случае большой объем ОП), которых в действительности у него нет.

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

Виртуализация памяти возможна на основе двух возможных подходов:


  • свопинг (swapping) – образы процессов выгружаются на диск и возвращаются в оперативную память целиком;

  • виртуальная память (virtual memory ) – между оперативной памятью и диском перемещаются части образов (сегменты, страницы, блоки и т.п.) процессов.
Недостатки свопинга:

  • избыточность перемещаемых данных и отсюда замедление работы системы и неэффективное использование памяти;

  • невозможность загрузить процесс, виртуальное пространство которого превышает имеющуюся в наличии свободную память.
Достоинство свопинга по сравнению с виртуальной памятью – меньшие затраты времени на преобразование адресов в кодах программ, поскольку оно делается один раз при загрузке с диска в память (однако это преимущество может быть незначительным, т.к. выполняется при очередной загрузке только часть кода и полностью преобразовывать код, может быть, и не надо).

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

Концепция виртуальной памяти

В ВС с виртуальной памятью адресное пространство (АП) процесса (образ процесса) во время выполнения хранится во внешней памяти ЭВМ и загружается в реальную память по частям динамически по необходимости в любое свободное место РОП. Однако программа ничего не знает об этом , написана и выполняется так, как будто полностью находится в РОП.

Виртуальная память - это моделирование оперативной памяти во внешней памяти.

Механизм отображения виртуальных и реальных адресов устанавливает между ними соответствие и называется динамическим преобразованием адресов (ДПА).

Компьютер здесь уже выступает как логическое устройство, а не физическая машина с уникальными характеристиками. ДПА поддерживается на аппаратно-микропрограммном уровне. В МП Intel, начиная с 386 процессора, выполняется поддержка виртуальной памяти.

Такая процедура выполняется для EC ЭВМ - ряд 2 и выше, для СМ ЭВМ- 1700, для IBM PC – I386 и выше.

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

Механизм ДПА предполагает ведение таблиц, показывающих какие ячейки ВП в текущий момент времени находятся в РОП и где именно. Поскольку индивидуальное отображение элементов информации (пословное или побайтовое) не имеет смысла (так как под таблицы отображения адресов потребовалось бы РОП больше чем под процессы), то отображение адресов выполняется на уровне блоков ОП.

Рисунок 1 . Динамическое преобразование адресов

Проблема: какую часть процессов держать в ОП, в некоторые моменты времени, выталкивая одни участки РОП и размещая другие.

Еще один вопрос, который необходимо решать: Каким сделать размер блока ?

Увеличение размера блока приводит к уменьшению размера таблицы отображения блоков, но увеличивает время обмена и, наоборот, уменьшение размера блока приводит к увеличению таблиц и уменьшению времени обмена с внешней памятью.

Блоки могут быть фиксированного размера (страницы) и переменного размера (сегменты). В этой связи существует четыре способа организации виртуальной памяти:

1.Динамическая страничная организация.

2.Сегментная организация.

3.Комбинированная сегментно-страничная организация.

4.Двухуровневая страничная организация.

Виртуальные адреса в страничных и сегментных системах являются двухкомпонентными и представляют собой упорядоченную пару (p,d ), где p - номер блока (страницы либо сегмента), в которой размещается элемент, а d - смещение относительно начального адреса этого блока. Преобразование виртуального адреса V=(p,d ) в адрес реальной памяти r осуществляется следующим образом. При активизации очередного процесса в специальный регистр процессора загружается адрес таблицы отображения блоков данного процесса. В соответствии с номером блока p из таблице отображения блоков , считывается строка, в которой устанавливается соответствие между номерами виртуальных и физических страниц для страниц, загруженных в оперативную память, или делается отметка о том, что виртуальная страница выгружена на диск. Кроме того, в таблице страниц содержится управляющая информация, такая как признак модификации страницы, признак невыгружаемости (выгрузка некоторых страниц может быть запрещена), признак обращения к странице (используется для подсчета числа обращений за определенный период времени) и другие данные, формируемые и используемые механизмом виртуальной памяти. К считанному физическому адресу размещения выбранного блока добавляется размер смещения d и вычисляется требуемый реальный адрес.

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

Рассмотрим, в чем состоит стратегия управления виртуальной памятью? Аналогично управлению РОП для управления ВП имеется три категории стратегий, при имеющейся цели снизить ожидание страниц и располагать в РОП только используемые блоки.

Стратегия вталкивания , определяющая, когда следует переписать страницу или сегмент из внешней памяти в ОП.

а) вталкивание по запросу - система ожидает ссылки на страницу/сегмент от выполняющегося процесса (прерывание по отсутствию страницы);

аргументы за:


  • путь выполнения программы наверняка предсказать невозможно;

  • гарантия расположения в ОП только нужных страниц;

  • накладные расходы на определение требуемых страниц минимальны;
аргументы против:

  • подкачка по одному блоку приводит к увеличению общего времени ожидания.
б) упреждающее вталкивание предполагает, что система может предвидеть необходимость использования в дальнейшем страницы/сегмента. Если вероятность обращений высока и есть свободная ОП, то соответствующие блоки переписываются в ОП.

Достоинство: сокращается время ожидания.

В настоящее время быстродействие аппаратуры увеличивается , и неоптимальные решения не приводят к уменьшению эффективности вычислительных систем.

Стратегия размещения, определяющая, куда поместить поступающую страницу/сегмент. В страничных системах - тривиально: в любой свободный блок (страница имеет фиксированный размер). В сегментных системах те же самые стратегии, что и для реальной ОП (в первую подходящую область, в наиболее подходящую, в наименее подходящую).

Стратегия выталкивания (замещения), определяющая, какую страницу/сегмент удалить из ОП для освобождения места поступающей страницы.

Здесь основная проблема "пробуксовки ", при которой вытолкнутая страница в следующий момент должна вновь размещаться в РОП.

Рассмотрим процедуры определения блоков для выталкивания из ОП.

а) выталкивание случайной страницы - в реальных системах не применяется;

б) выталкивание первой пришедшей страницы (FIFO - очередь). Для ее реализации необходимо устанавливать временные метки страниц.

Аргумент : у страницы уже были возможности использовать свой шанс.

Фактически : большая вероятность заместить активно используемые страницы, поскольку нахождение страниц длительное время может означать, что она постоянно в работе. Например, используемый редактор текстов.

в) выталкивание дольше всего неиспользованных страниц.

Для реализации необходимо реализовать обновляемые временные метки. Эвристический аргумент : - недавнее прошлое - хороший ориентир на будущее.

Недостаток - существенные издержки: постоянное обновление временных меток.

г) выталкивание реже всего используемых страниц - предполагает наличие счетчиков страниц (менее интенсивно, нежели обновляемые временные метки). Интуитивно оправдано, но тоже может быть не рационально.

д) выталкивание не использующихся в последнее время страниц - самыйраспространенный алгоритм с малыми издержками. Реализуется двумя аппаратными битами на страницу:

1.признак обращения 0 - было

1 - не было.

2.признак модификации записи 0 - неизменен.

1 - изменен.

Возможны следующие варианты комбинаций { 00,10,01,11}. Если изменений на странице не было , то страницу можно просто переписать, а не сохранять на диске.