Взаимодействие в распределенных системах

Физическое время

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

Каждый из компьютеров в распределенной системе имеет свои собственные часы, точнее говоря, системный таймер, который используется его локальными процессами для получения текущего времени. Поэтому два процесса, выполняющиеся на различных компьютерах, могут ассоциировать соответствующую отметку времени с каждым событием. Однако даже если эти процессы будут считывать показания своих часов в одно и то же время, возвращаемые значения, скорее всего, будут отличаться. Дело в том, что ни одни часы не являются идеальными: кварцевые генераторы, составляющие основу часов для современных компьютеров, не могут иметь абсолютно одинаковую частоту, что ведет к постепенной потере синхронизации и возвращении таймерами различных значений при обращении к ним. Эта разница в показаниях часов называется рассинхронизацией часов (англ, clock skew), а скорость отклонения часов от точных показаний универсального скоординированного времени UTC (Coordinated Universal Time) с течением времени - скоростью дрейфа (англ, clock drift rate) - см. рис. 1.4.

Соотношение времени по часам компьютеров и времени Ч1ТС

Рис. 1.4. Соотношение времени по часам компьютеров и времени Ч1ТС;

3 - рассинхронизация часов, А - скорость дрейфа.

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

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

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

Пример определения суммы денег на счетах банка

Рис. 1.5. Пример определения суммы денег на счетах банка.

Чтобы определить полную сумму банк должен иметь сведения о количестве денег в каждом из филиалов. Предположим, что требуется подсчитать денежные средства в 9:00 - время, известное всем процессам. В случае, показанном на рис. 1.5а, сумма окажется равной $10. Однако возможна также ситуация, представленная на рис. 1.56, в которой на момент определения полной суммы денежные средства филиала А находятся в состоянии передачи в филиал В, т.е. деньги уже отправлены филиалом А, но еще не получены филиалом В. В этом случае будет получен неправильный результат, равный $0. Эту проблему можно решить, изучая все сообщения, находящиеся в состоянии передачи в момент подсчета денег. Например, можно потребовать от филиала А хранить записи обо всех отправленных переводах и их получателях, а от филиала В - хранить записи о всех полученных переводах и их отправителях. Тогда в "состояние" филиала нужно включить не только информацию о количестве денег на его счете, но и указанные записи обо всех отправленных и полученных денежных переводах. Проверяя такие "состояния" процессов, система обнаружит перевод, покинувший филиал А, но еще не полученный филиалом В, и соответствующие средства можно будет добавить в общую сумму. Важно отметить, что денежные средства, уже полученные филиалом В, отдельно учитывать не нужно, т.к. они будут отражены в счете этого филиала.

К сожалению, подход, представленный выше, не гарантирует вычисление верного результата. В примере, приведенном на рис. 1.5в, часы в разных филиалах идут с некоторым относительным сдвигом, т.е. имеет место небольшая рассинхронизация часов. Проверка состояния счета филиала А в момент времени 9:00 дает результат, равный $10. Впоследствии, в 9:01 по часам филиала А, эти деньги переводятся в филиал В, часы которого на момент их получения показывают 8:59. Поэтому при подсчете общей суммы по состоянию на 9:00 эти денежные средства будут учитываться дважды.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ ОРИГИНАЛ   След >