Э. Таненбаум, М. ван Стеен - Распределённые системы (принципы и парадигмы) (1162619), страница 102
Текст из файла (страница 102)
Эти и другие подобные чертыпозволяют не допускать или обнаруживать множество часто встречающихсяошибок программирования, таких как неопределенные области в памяти. Особенности языка были тщательно подобраны, чтобы упростить различные варианты оптимизации.Две черты Огса, важные для распределенного программирования, — это совместно используемые объекты данных и инструкция fork. Объекты инкапсулируют внутренние структуры данных и пользовательские процедуры, называемыеоперациями {operations).
Операции предназначены для работы с этими структурами данных. Объекты пассивны, то есть не содержат потоков выполнения, которым могли бы посылаться сообщения. Напротив, процессы получают доступ квнутренним данным объектов путем вызова их операций. Объекты не наследуютсвойств других объектов, поэтому Огса считается языком на базе объектов, но необъектно-ориентированным языком.Каждая операция образует список пар (страж, блок инструкций).
Страж{guard) — это логическое выражение без каких-либо сторонних эффектов. Пустой страж означает то же самое, что и значение true. При вызове операции всеего стражи вычисляются в определенном порядке. Если все они равны значениюfalse, вызывающий процесс приостанавливается до того момента, пока один изстражей не получит значение true. Когда находится страж, вычисление которогодает результат true, вычисляется следующий за ним блок инструкций. В листинге 6.2 показан объект stack (стек) с двумя операциями, push и pop.Листинг 6 . 2 .
Упрощенный объект stack в Огса с внутренними даннымии двумя операциямиOBJECT IMPLEMENTATION stack;top: integer: # переменная, идентифицирующая вершину стекаstack: ARRAY [integer 0..N-1] OF integer; # память для стека# Эта функция ничего не возвращаетOPERATION pushCitem: i n t e g e r ) ;BEGINGUARD top < N DOs t a c k [ l o p ] : - item; # поместить элемент в стекtop := top + 1:# инкремент указателя стека0D;END;# Эта функция возвращает целоеOPERATION рорО: integer;BEGINGUARD top > О DOtop := top- 1:# приостановиться, если стек пуст# декремент указателя стека390Глава 6.
Непротиворечивость и репликацияRETURN s t a c k [ t o p ] ; # вернуть элемент с вершины стека0D:END:BEGINtop := 0:# инициализацияEND:После определения объекта stack могут быть созданы переменные этого типа:S. t : stack:В данном случае создаются два объекта стека, и в каждом из них переменнаяtop инициализируется нулем. Целая переменная к может быть помещена в стек sс помощью следующей инструкции:s$push(k):Операция изъятия из стека имеет стража, который при попытке достать переменную из пустого стека приостанавливает работу вызвавшего процедуру процесса до тех пор, пока другой процесс не поместит в стек какое-нибудь целоечисло.Для создания нового процесса на заданном пользователем процессоре в Огсапредусмотрена инструкция fork. Новый процесс запускает процедуру, имя которой указано в инструкции fork.
В новый процесс можно передавать параметры,включая объекты. Именно таким образом объекты распределяются по машинам.Например, следующая инструкция создает по одному новому процессу foobar накаждой из машин, от 1 по п:FOR 1 IN 1 .. п DO FORK foobar(s) ON 1: OD:Поскольку эти n процессов (включая родительский) выполняются параллельно, все они могут добавлять элементы в общий стек s и извлекать их оттуда,как если бы они работали на мультипроцессорной CPICTCMC С общей памятью.Поддерживать иллюзию совместно используемой памяти, хотя на самом деле еене существует, — это работа исполняющей системы.Операции над общими объектами атомарны и последовательно непротиворечивы. Система гарантирует, что если несколько процессов почти одновременносовершают операции с одним и тем же совместно используемым объектом, сетевой эффект проявится в том, что операции будут выглядеть происходящимистрого последовательно (в некотором неопределенном порядке), при этом ни одна операция не начнется до завершения предыдущей.Операции представляются для всех процессов в одном и тот же порядке.
Так,например, предположим, что мы добавим в объект stack из листинга 6.2 новуюоперацию, реек, проверяющую элемент на вершине стека. Тогда в случае, еслидва независимых процесса одновременно поместят в стек значения 3 и 4 и всепроцессы позже используют операцию реек для исследования вершины стека,система гарантирует, что каждый из процессов увидит там либо 3, либо 4. Ситуация, когда часть процессов видит 3, а остальные — 4, в мультипроцессорной системе с совместно используемой памятью невозможна. Точно так же невозможнаона и в Огса. Если поддерживается только одна копия стека, этого эффекта до-6.6. Примеры391биться легко, но если стек реплицируется на всех машинах, необходимо, как показано ниже, затратить чуть больше усилий.Огса объединяет синхронизацию и совместно используемые данные примерно так же, как при поэлементной непротиворечивости.
Первый вид синхронизации — это синхронизация взаимного исключения, позволяющая не допуститьодновременного выполнения двух процессов в одной критической области. В Огсакаждая из операций разделяемого объекта весьма напоминает критическую область, поскольку система гарантирует, что итоговый результат будет таким жесамым, что и при поочередном (по одной за раз) обработке всех критических областей. В этом отношении объект Огса похож на распределенную форму монитора, обсуждавшегося в главе 1.Другим видом синхронизации является условная синхронизация, при использовании которой процесс блокируется и ожидает выполнения некоторыхусловий.
В Огса условную синхронизацию обеспечивают стражи. В нашем примере на листинге 6.2 процесс, пытающийся извлечь элемент из пустого списка,будет приостановлен до того момента, когда стек перестанет быть пустым.Управление совместно используемыми объектами в ОгсаУправление объектами в Огса возложено на исполняющую систему. Оно поддерживается как в сетях с широковещательной (и групповой) рассылкой, так и в сетях со сквозной (от точки к точке) передачей. Исполняющая система выполняетрепликацию объектов, их пересылку, поддержание непротиворечивости и обращения к операциям.Каждый объект может быть в одном состоянии из двух — либо в виде единственной копии, либо в виде реплики. Объект в состоянии единственной копииимеется только на одной машине. Реплицированный объект представлен на всехмашинах, на которых имеются использующие его процессы.
Не требуется, чтобывсе объекты находились в одном и том же состоянии, так что некоторые объекты, задействованные процессом, могут быть реплицированы, в то время как остальные представлять собой единственные копии. Объекты в ходе выполнениямогут менять свое состояние, переходя от единственной копии к реплицированному состоянию и обратно, что придает им большую гибкость.Большое преимущество репликации объектов на всех машинах состоит в том,что операции чтения могут выполняться локально, без поглощения сетевого трафика и без задержек. Если объект не реплицирован, ему должны посылаться всеоперации, а вызывающие его процессы — блокироваться в ожидании ответа.Второе преимущество репликации состоит в том, что она повышает степень параллельности: одновременно может происходить несколько операций чтения.
Прииспользовании единственной копии одновременно может производиться толькоодна операция, что замедляет выполнение. Принципиальный недостаток репликации — затраты на поддержание непротиворечивости всех копий.Когда программа выполняет операцию над объектом, компилятор вызываетпроцедуру 1nvoke_op исполняющей системы, задающую объект, операцию, параметры и флаг, уведомляющий, будет ли объект при этом модифицироваться (этоназывается записью) или нет (это называется чтением). Действие, вызываемое392Глава 6. Непротиворечивость и репликацияисполнением процедуры 1nvoke_op, зависит от того, реплицирован ли объект,имеется ли в наличии его локальная копия, должна ли производиться запись иличтение, поддерживает ли платформа надежную, полностью упорядоченную широковещательную рассылку.
Различают четыре варианта, как показано на рис. 6.27.Единственная локальная копияй>@РРеплицированный объект,выполняется чтенией>@IЕдинственная удаленная копия0вРеплицированный объект,выполняется запись@IгРис. 6.27. Четыре варианта процесса Р, выполняющего операцию над объектом О в ОгсаНа рис. 6.27, а процесс собирается выполнить операцию над нереплицированным объектом, который расположен на одной машине с процессом. Это требуеттолько блокирования объекта, вызова операции и разблокирования объекта.Смысл блокировки в том, чтобы избежать любых удаленных обращений во время выполнения локальной операции.На рис.
6.27, б мы также имеем дело с единственной копией объекта, но имеется и кое-что еще. Исполняющая система, используя вызов RPC, просит удаленную машину выполнить нужную операцию, возможно, с небольшой задержкой, если объект в момент прихода запроса блокирован. Ни в одном из этих двухслучаев между чтением и записью разницы нет (исключая тот факт, что запись,если изменит используемые стражами переменные, может активизировать блокированные процессы).Если объект реплицирован, как показано на рис.
6.27, в и г, в нашем распоряжении всегда имеется его локальная копия, однако теперь имеет значение, какуюоперацию мы хотим осуществить — чтения или записи. Чтение можно проделатьлокально, без использования сети и без дополнительных затрат.Запись в реплицируемые объекты — более хитрое дело. Если базовая системаподдерживает надежные, полностью упорядоченные широковещательные рассылки, исполняющая система рассылает имя объекта, операцию и ее параметры,а затем блокируется до завершения широковещательной рассылки. Все машины,включая данную, вычисляют новое значение.Отметим, что примитивы широковещательной рассылки должны быть надежны, то есть нижележащие уровни должны автоматически обнаруживать и исправлять потерю сообщений. Система Amoeba, на основе которой разрабатыва-6.6.