Модели памяти в многопроцессорных ВС
Основная проблема при создании разделяемой памяти в многопроцессорных системах состоит в том, как извещать другие процессоры об изменениях, вызванных выполнением команд записи. Типичным является наличие в процессоре нескольких уровней кэш-памяти. Стремление к повышению производительности микропроцессоров стимулирует переход от кэша со сквозной записью к кэшу с буферизированной записью и к кэшу с обратной записью. При буферизации и обратной записи возрастает промежуток времени между изменением в локальной копии данных, размещенной в кэш-памяти и их появлением в шине памяти микропроцессора. Следовательно, доставка этих изменений в удаленные копии тех же данных из других блоков памяти, включая кэш-память других процессоров, также будет происходить с задержкой. Кроме того, при обратной записи модификации данных в кэше не появляется на шине памяти, кроме моментов смены кэш-строк.
Для модификации удаленных копий данных используются коммуникационный протокол и протокол согласованности (когерентности) состояния памяти. Первый применяется для доставки изменений, а второй призван предотвращать использование копий данных, подвергшихся модификации в другом процессоре. В простейшем случае, например, при объединении процессоров и памяти, происходит «прослушивание» шины с целью обнаружения выполнения команд записи в адреса ячеек памяти, копии которых размещены в кэшах и в основной памяти. В этом случае коммуникационный протокол и протокол когерентности неразрывно связаны.
Для сохранения когерентности данных в соответствии с интуитивной моделью строгой состоятельности памяти операция чтения из разделяемой памяти должна возвращать последнее записанное значение. Поэтому, когда одна из множества копий модифицируется, остальные должны либо быть объявлены несостоятельными, либо модифицироваться. Выполнение этих действий требует специальных аппаратных средств быстрого распространения изменений. Однако какими бы быстрыми они не были, следование модели строгой состоятельности ведет к снижению производительности. Это обусловлено обеспечением непременной синхронности обращений процессоров к памяти и введением глобального времени, позволяющего упорядочить действия, выполняемые во всех процессорах системы. Поэтому для повышения производительности необходимы модели ослабленной состоятельности памяти, допускающие появление несогласованности копий данных в ходе их параллельной обработки с последующим обеспечением когерентности копий, чтобы результат исполнения программы был таким же, что и при строгой состоятельности.
Конкретную реализацию разделяемой памяти характеризуют:
- уровень реализации (аппаратный, программный, аппаратно-программный);
- структура разделяемых данных (слово, кэш-строка, страница, сегмент, фрагмент, объект и т.д.);
- модель состоятельности памяти, определяющая допустимые последовательности доступа в память (SRSW — «один читатель/один писатель», MRSW — «много читателей/один писатель», MRMW — «много читателей/много писателей»);
- политика обеспечения когерентности данных (модификация, объявление несостоятельными);
- механизм управления распределением памяти и размещением данных (централизованный/распределенный, статический/динамический).
В данный момент используется несколько моделей состоятельности памяти.
Строгая (strict): каждая операция чтения возвращает последнее записанное значение.
Последовательная (sequential): все процессоры в системе наблюдают один и тот же порядок выполнения операций записи и чтения (процессор, выполняющий запись приостанавливается до получения подтверждений об объявлении несостоятельными всех копий модифицируемых данных или о модификации этих копий).
Процессорная (processor): наблюдаемый в двух процессорах порядок выполнения операций чтения/записи может не совпадать, но порядок выполнения записей, производимых каждым процессором, должен быть одним и тем же.
Cлабая (weak): вводящая разграничение между обычным и синхронизованным доступами в память при выполнении требования состоятельности памяти только при доступах в точках синхронизации и разрешением несогласованности данных вне этих точек.
Свободная (release): уточненная модель слабой состоятельности, требующая состоятельности памяти только между парой операций синхронизации acquire-release (acquire — открывает критический интервал и обеспечивает исключительный доступ процессора к разделяемым данным, release — закрывает критический интервал, разрешая всем процессорам доступ к разделяемым данным). При этом операции синхронизации, выполняемые в разных процессорах, должны удовлетворять модели последовательной или процессорной состоятельности памяти.
Неторопливо-свободная (lazy release): модель свободной состоятельности с отложенным до момента непосредственного обращения распространением модификаций разделяемой памяти так, что при операции acquire передаются все предшествующие результаты команд записи, которые выполнялись до наступившего момента синхронизации.
Нетерпеливо-свободная (eager release): модель свободной состоятельности с передачей изменений разделяемой памяти при реализации операции release, безотносительно к тому, когда эти изменения будут востребованы.
Интервально свободная (scope): модель свободной состоятельности с разбиением исполнения на глобальные и локальные интервалы и гарантированием состоятельности разделяемых данных для всех процессоров только в конце каждого глобального интервала, а также гарантированием состоятельности разделяемых данных для последовательных локальных интервалов внутри каждого процессора.
Последовательно-свободная (entry): вариант модели свободной состоятельности, который требует доступа к разделяемым данным, защищенного синхронизирующими переменными, значения которых должны модифицироваться согласно модели последовательной согласованности (все процессоры должны иметь одну и ту же последовательность обращений к каждой из этих переменных).