Добавлен: 29.10.2018
Просмотров: 48175
Скачиваний: 190
8.2. Мультикомпьютеры
621
процедурам. При таких обстоятельствах клиентская заглушка принципиально не в со-
стоянии маршализовать параметры: она не может определить их длину.
Третья проблема заключается в том, что не всегда удается точно установить типы па-
раметров даже из формального описания или кода программы как такового. Примером
может послужить процедура printf, у которой может быть любое количество параметров
(по крайней мере один), среди которых в произвольном порядке могут быть пере-
мешаны целые и вещественные числа, символы, строки, числа с плавающей запятой
различной длины и данные других типов. Попытка вызова printf в качестве удаленной
процедуры из-за подобной необязательности языка C практически обречена на провал.
Ну а правило, гласящее о том, что RPC может использоваться лишь при условии, что
вы не программируете на C (или на C++), вряд ли стало бы популярным.
Четвертая проблема связана с использованием глобальных переменных. В обычных
условиях вызывающая и вызываемая процедуры могут вдобавок к обмену данными
через параметры обмениваться ими и с использованием глобальных переменных. Те-
перь, если вызываемая процедура перемещена на удаленную машину, код даст сбой,
поскольку глобальные переменные уже не являются общими.
Эти проблемы не предполагают безнадежности технологии RPC. Она нашла широкое
применение, но практический успех ее использования требует некоторых ограничи-
тельных и предупредительных мер.
8.2.5. Распределенная совместно используемая память
Хотя технология RPC имеет свои привлекательные стороны, многие программисты
по-прежнему предпочитают модель с совместно используемой памятью и хотят ис-
пользовать ее даже на мультикомпьютерах. Как ни удивительно, но есть возможность
поддерживать иллюзию совместно используемой памяти, даже если она на самом деле
отсутствует, используя технологию, которая называется распределенной совместно
используемой памятью
(Distributed Shared Memory (DSM)) (Li, 1986; Li and Hudak,
1989). Несмотря на то что тема эта далеко не нова, исследования по ней не прекраща-
ются (Cai and Strazdins, 2012; Choi and Jung, 2013; Ohnishi and Yoshida, 2011). DSM
является весьма полезной для изучения технологией, поскольку она демонстрирует
множество проблем и сложностей, возникающих в распределенных системах. Более
того, сама идея оказалась весьма эффективной. При использовании DSM каждая
страница находится в одном из блоков памяти, показанных на рис. 8.1, б. У каждой
машины есть собственная виртуальная память и собственные таблицы страниц. Когда
центральный процессор выполняет команду LOAD или STORE в отношении страницы,
которой не располагает, происходит перехват управления операционной системой.
Затем операционная система находит страницу и просит тот центральный процессор,
в чьем распоряжении она сейчас находится, прекратить отображение страницы и пере-
слать ее по схеме соединений. По прибытии страница отображается, а команда, вы-
звавшая ошибку отсутствия страницы, запускается снова. В результате операционная
система просто устраняет ошибку отсутствия страницы за счет обращения к удаленной
оперативной памяти, а не за счет обращения к локальному диску. А для пользователя
все это выглядит так, как будто у машины есть совместно используемая память.
Разница между реальной совместно используемой памятью и DSM показана на
рис. 8.21. На рис. 8.21, а показан настоящий мультипроцессор с физической совмест-
но используемой памятью, реализованной на аппаратном уровне. А на рис. 8.21, б
622
Глава 8. Многопроцессорные системы
Рис. 8.21. Различные уровни реализации совместно используемой памяти:
а — на аппаратном уровне; б — на уровне операционной системы;
в — на уровне программного обеспечения пользователя
8.2. Мультикомпьютеры
623
показана DSM, реализованная операционной системой. На рис. 8.21, в показана еще
одна форма совместно используемой памяти, реализованная на более высоких уровнях
программного обеспечения. Мы еще вернемся к третьему варианту в этой главе, но
сейчас все внимание будет сконцентрировано на DSM.
Теперь рассмотрим некоторые детали работы DSM. В системе с DSM адресное про-
странство поделено на страницы, которые распространены по всем узлам системы.
Когда центральный процессор обращается к нелокальному адресу, происходит перехват
управления и программное обеспечение DSM извлекает страницу, содержащую этот
адрес, и перезапускает команду, на которой произошла ошибка отсутствия страницы,
которая теперь успешно завершает свою работу. Эта концепция показана на рис. 8.22, а
для адресного пространства, имеющего 16 страниц и четыре узла, каждый из которых
способен хранить шесть страниц.
Рис. 8.22. а — страницы адресного пространства, распределенные по четырем машинам;
б — ситуация после обращения центрального процессора 0 к странице 10 и перемещения
в его память этой страницы; в — ситуация, когда страница 10 в режиме только для чтения
и используется ее репликация
624
Глава 8. Многопроцессорные системы
В этом примере, если центральный процессор 0 обращается к команде или данным на
страницах 0, 2, 5 или 9, все обращения осуществляются локально. Обращения к другим
страницам вызывают перехват управления. Например, ссылка на адрес со страницы 10
вызовет перехват управления программным обеспечением DSM, которое затем пере-
местит страницу 10 с узла 1 на узел 0 (рис. 8.22, б).
Репликация
Одним из усовершенствований основной системы, способной существенно повысить
производительность, является репликация страниц, предназначенных только для
чтения, содержащих, к примеру, текст программ, константы, предназначенные только
для чтения, или других структур данных, доступных в этом режиме. Например, если
страница 10 (см. рис. 8.22) содержит раздел текста программы, то ее использование
центральным процессором 0 может привести к тому, что центральному процессору 0
будет отправлена копия без признания оригинала, находящегося в памяти централь-
ного процессора 1, недействительным или испорченным (рис. 8.22, в). Таким образом,
оба центральных процессора, 0 и 1, могут обращаться к странице 10 с необходимой им
периодичностью, не вызывая перехвата управления для получения отсутствующего
содержимого памяти.
Можно реплицировать как страницы, предназначенные только для чтения, так и все
остальные страницы. Пока осуществляется только чтение этих страниц, не существует
практически никакой разницы между репликацией страниц только для чтения и ре-
пликацией страниц, предназначенных для чтения и записи. Однако если страница, под-
вергшаяся репликации, внезапно изменяется, необходимо предпринять особые меры,
предотвращающие существование нескольких не соответствующих друг другу копий.
Меры предотвращения несоответствия будут рассмотрены в следующих разделах.
Неправильное совместное использование
Системы DSM по некоторым ключевым признакам напоминают мультипроцессоры.
В обеих системах при обращении к нелокальному слову памяти из текущего местона-
хождения этого слова извлекается блок памяти, содержащий слово, и помещается на
обратившуюся машину (соответственно в оперативную память или в кэш). Для кон-
структора важен вопрос: насколько большим должен быть этот блок? В мультипроцес-
сорах размер блока кэша обычно составляет 32 или 64 байта, чтобы не занимать шину
передачей данных слишком долго. В системах DSM блок должен быть кратен размеру
страницы (потому что MMU работает со страницами), и он может состоять из 1, 2, 4
или более страниц. По сути, работа с блоками таких размеров имитирует увеличенный
размер страницы.
В увеличенных размерах страницы для системы DSM есть свои преимущества и недо-
статки. Самое большое преимущество заключается в том, что запуск передачи данных
по сети занимает довольно много времени и при этом передача 4096 байт занимает не
намного больше времени, чем передача 1024 байт. Передача данных более крупными
блоками, в которых перемещается более широкий диапазон адресного пространства,
может зачастую привести к сокращению количества передач. Это свойство особо важно,
поскольку многие программы демонстрируют локальность своих обращений, то есть
если программа обратилась к одному слову на странице, то в ближайшем будущем она,
скорее всего, обратится и к другим словам на той же самой странице.
8.2. Мультикомпьютеры
625
В то же время при более объемной передаче данных сеть будет задействована дольше,
блокируя разрешение ошибок отсутствия страниц, вызванных другими процессами.
Кроме этого, слишком большой действительный размер страницы создает новую
проблему, которая называется неправильным совместным использованием (false
sharing) (рис. 8.23). Здесь мы имеем дело со страницей, содержащей две не связанные
друг с другом совместно используемые переменные A и B. Процессор 1 интенсивно
пользуется переменной A, считывая и записывая ее значение. А процессор 2 часто об-
ращается к переменной B. В такой ситуации страница, содержащая обе переменные,
будет постоянно перемещаться вперед и назад между двумя машинами.
Рис. 8.23. Неправильное совместное использование страницы,
содержащей несвязанные переменные
Проблема заключается в том, что переменные, ничем не связанные друг с другом, слу-
чайно оказались на одной и той же странице, поэтому процесс, использующий одну
из них, получает также и вторую. Чем больше действительный размер страницы, тем
чаще будет возникать неправильное совместное использование, и наоборот, чем мень-
ше действительный размер страницы, тем реже будет возникать этот эффект. Ничего
подобного этому феномену в обычной системе виртуальной памяти не наблюдается.
Хорошо продуманные компиляторы, понимающие суть проблемы и учитывающие ее
существование при помещении переменных в адресные пространства, могут посодей-
ствовать в уменьшении количества случаев неправильного совместного использования
и в повышении производительности. Но проще, конечно, сказать, чем сделать. Более
того, если неправильное совместное использование заключается в том, что узел 1 ис-
пользует один элемент массива, а узел 2 использует другой элемент того же массива,
то вряд ли даже хорошо продуманный компилятор сможет устранить эту проблему.
Достижение последовательной непротиворечивости
Если модифицируемые страницы не реплицируются, то проблемы достижения
непротиворечивости не возникает. Существует только один экземпляр каждой
модифицируемой страницы, и он динамически перемещается в разные места по
мере необходимости. Поскольку не всегда можно заранее узнать, какие страницы
являются модифицируемыми, на многих системах DSM, когда процесс пытается
прочитать удаленную страницу, делается ее локальная копия и обе копии, локальная
и удаленная, помечаются соответствующими блоками управления памятью (MMU),