С системой S связана цель G, ради которой система функционирует. Эта цель ставится самой системой (если система – активная), или поставлена извне. Для достижения цели в системе должна решаться задача – некоторая математическая формализация цели с четко определенным набором исходных данных и требуемых результатов.
Решение задачи предполагается получать с помощью алгоритма, т.е. предписания с указанием исполнителя (исполнителей) и последовательности элементарных шагов, которые должны быть сделаны исполнителями.
Распределенная система порождает распределенную задачу, поскольку исходные данные для задачи возникают в различных точках пространства. Также в различных точках требуются те или иные результаты решения задачи. Зачастую, задачу можно разбить в совокупность подзадач, некоторые из них могут быть сосредоточенными: все исходные данные возникают в одной точке пространства, и там же требуются результаты решения подзадачи.
Распределенная задача решается распределенным алгоритмом, собирающим исходные данные из разных точек и посылающим результаты расчетов в разные точки. Дополнительным фактором распределенности алгоритма может быть наличие нескольких исполнителей, находящихся в разных точках пространства (распределенный исполнитель).
Известно, что алгоритм оперирует кроме исходных данных, еще и промежуточными данными, а в больших системах работает с базами данных. Для распределенного алгоритма закономерно встает вопрос: как будут организованы эти данные – в виде сосредоточенной или распределенной базы данных?
Один из видов распределенных алгоритмов – протоколы. Протокол характеризуется тем, что имеется как минимум две стороны, разделенные каналом связи. На каждой из сторон выполняется локальный (сосредоточенный) алгоритм Ak . Локальный алгоритм A1 выполняется до некоторого момента времени, когда для продолжения работы ему требуются данные от другого локального алгоритма A2 . Он посылает через линию связи запрос на данные локальному алгоритму A2 . Алгоритм A2 отвечает, пересылая сообщение по линии связи. После этого локальный алгоритм A1 продолжает свою работу.
Протоколы, обычно, играют техническую роль и служат для установления режимов приема/передачи данных между удаленными объектами. В вычислительном отношении локальные алгоритмы – части протокола – не являются сложными.
Особый вид распределенных алгоритмов – криптографические протоколы. Они предназначены для доказательства одной или обеими сторонами, что они именно те, за кого себя выдают, для обмена конфиденциальной информацией и других подобных целей.
Рассмотрим один из простейших криптографических протоколов – распределенных алгоритмов.
В разных точках пространства находятся два объекта, O1 и O2 , каждый из которых решает свою часть (P1 или P2) общей задачи P. Вместе с тем, кроме стремления решить общую задачу, объекты имеют и свои частные задачи, Q1 и Q2 . Таким образом, объект O1 решает одновременно задачи P1 и Q1 , а объект O2 – задачи P2 и Q2 . И, если задачи P1 и P2 совместимы и взаимно дополняют друг друга, то задачи Q1 и Q2 – противоречат друг другу.
Следовательно, объекты O1 и O2 сотрудничают, но, одновременно, и конкурируют. А можно сказать и, что объекты конкурируют, но вынуждены сотрудничать. Смотря как расставить акценты, какая из задач, Pi или Qi , важнее для объекта Oi .
Описанная ситуация встречается очень часто. Университеты заинтересованы в решении задачи совершенствования подготовки специалистов и в этой задаче они сотрудничают. В то же время ежегодно вузы конкурируют из-за способных абитуриентов. Научные организации часто проводят совместные исследования на стыке их интересов (на стыке наук). Но они же конкурируют при распределении финансов. Два различных подразделения фирмы работают для достижения общих целей фирмы, но каждое из них хочет получить в рамках фирмы большее развитие, чем другое подразделение. В общем, друзья-соперники. Частичная конкуренция.
В нашей задаче объекты O1 и O2 должны прийти к общему компромиссному решению в интересах решения задачи P. Предположим, что имеется два равноценных (с точки зрения задачи P) решения. Одно из них также устраивает объект O1 , а другое – устраивает объект O2 . Тогда объекты O1 и O2 решают бросить жребий. Это можно сделать: написать каждое решение на своей бумажке, свернуть бумажки в трубочку, прокрутить в лототроне и одну из бумажек вытащить. Это и будет компромиссное решение.
Сложность состоит в том, что объекты O1 и O2 находятся на большом расстоянии друг от друга, и не могут провести процедуру с лототроном. Процедура с лототроном выполняется в одном месте, она возможна для сосредоточенной системы. Наша система – распределенная.
Процедуру с лототроном мог бы выполнить объект O1 и сообщить результат объекту O2 .Однако объект O2 не вполне доверяет объекту O1 . Даже телевизионная трансляция выполнения процедуры не является убедительным доказательством – это может быть искусно смонтированная запись.
Выход состоит в следующем. Обозначим одно из решений числом 0, другое – числом 1. Каждый из объектов независимо от другого должен назвать какое-нибудь целое число ni в пределах, например, от 0 до 99. Затем объекты обмениваются числами ni и вычисляют результат n1 + n2 (mod 2). Это и будет решение, т.е. число 0 или 1.
Абсолютно одновременно переслать друг другу числа ni объекты не могут. Кто-то пришлет свое число первым и окажется в невыигрышном положении. Например, O1 переслал свое число n1 объекту O2 , заинтересованному в том, чтобы выиграло решение «1». Тогда O2 , зная n1 , решает уравнение n1 + n2 (mod 2) = 1 относительно переменной n2 , и посылает O1 найденное значение n2 . Решение уравнения практически не требует времени: получив от O1 четное число, O2 должен ответить нечетным, и наоборот.
Эта несправедливость должна быть устранена. При этом ясно, что все равно какая-то из сторон обмена сообщениями первой пришлет свое число. Необходимо сделать так, чтобы у второй стороны не хватило времени на «подбор ответа».
Объекты O1 и O2 могут договориться, что вся процедура «бросания жребия» на расстоянии должна завершиться за несколько минут. Если, при этом, оба объекта знают, что подбор ответа требует нескольких часов работы суперЭВМ, то они могут быть спокойны за то, что решение не «подстроено» другой стороной.
Для обеспечения таких временных параметров в вычислениях должна использоваться функция f(x), значение которой y = f(x) при известном аргументе x вычислить можно относительно быстро. Но вот решить уравнение f(x) = y, т.е. отыскать неизвестное x при известном значении y, быстро нельзя. Более того, желательно, чтобы не было известно никаких математических методов для решения этого уравнения, кроме полного перебора или подобного ему по сложности.
Конечно, область определения функции f(x) должна быть при этом очень большой, чтобы сделать практически невозможным полный перебор. Область из двух элементов, 0 и 1, мала, область от 0 до 99 тоже недостаточна. Целые числа, с которыми приходится оперировать, должны иметь в десятичной записи не менее 150-200 цифр или не менее 512 бит в двоичной записи. Такие числа называют «длинными».
Пусть f(x) и h(z, v, w) – две таких трудно обращаемых функции. В функции h(z, v, w) первые два аргумента – длинные числа, а третий – битовый. Функции f и h известны объектам O1 и O2 , и они владеют алгоритмами быстрого вычисления значений этих функций при заданных значениях аргументов, но не умеют быстро обращать эти функции, т.е. решать уравнения.
Распределенный алгоритм бросания жребия состоит из следующих шагов.
1. Объект O2 выбирает случайным образом число x из большого интервала [0, q – 1]. Вычисляет y = f(x).
2. Объект O2 пересылает число y объекту O1 . Объект O1 не сможет восстановить число x.
3. Объект O1 выбирает случайным образом число z из большого интервала [0, q – 1]. Объект O1 выбирает случайный бит w. Эти действия могут выполняться одновременно с п.1.
4. Объект O1 вычисляет s = h(z, y, w). Число z здесь необходимо для «маскировки» бита w, а число y – для «проверки» объектом O2 правильности действий объекта O1 .
5. Объект O1 пересылает число s объекту O2 . Бит w отправляется объекту O2 , но он «запрятан» в числе s. Объект O2 не сможет восстановить этот бит. Объект O2 не сможет восстановить и число z.
6. Объект O2 выбирает случайный бит c.
7. Объект O2 отправляет бит c объекту O1 . Открытая пересылка.
8. Объект O1 пересылает число z и бит w объекту O2 . Открытая пересылка. Объект O1 уже может определить результат бросания жребия: c + w (mod 2).
9. Объект O2 вычисляет t = h(z, y, w). Здесь z и w только что получены от O1 , а y было вычислено в п.1.
10. Объект O2 сравнивает t и s, ранее полученное от объекта O1 .
11. Если t = s, то объект O2 вычисляет результат бросания жребия: c + w (mod 2).
Функции f и h могут быть различными. В частности, используются функции:
f(x) = gx (mod p) и h(z, v, w) = vwgz (mod p).
Здесь «секретные» значения x, w, z находятся в показателях степеней, и для того, чтобы найти их, требуется решить задачу дискретного логарифмирования, для которой эффективный алгоритм, существенно лучший полного перебора, неизвестен.
Константы p, q, g должны быть известны тому и другому объектам. Число p – длинное простое число. Число q – также длинное простое число, являющееся делителем числа p – 1. Число g < p, не равное 1, удовлетворяет условию gq = 1 (mod p).
Распределенные алгоритмы, решающие сосредоточенные задачи.
Одно из направлений в разработке распределенных алгоритмов – высокопроизводительные вычисления. Распределенная компьютерная система в этом случае используется как один мощный вычислитель, решающий одну задачу. Известным примером является задача «взлома» шифра, созданного алгоритмом шифрования DES. Дешифровка текста не представляет трудностей, если известен ключ шифрования. Если ключ не известен, то дешифровку можно попытаться выполнить путем полного перебора. Но метод полного перебора требует очень большого времени даже для самых быстрых однопроцессорных ЭВМ.
Решение задачи можно ускорить, используя многопроцессорную ЭВМ. В этом случае вычисления распараллеливаются, т.е. все процессоры одновременно, выполняя одинаковые или различные команды, участвуют в решении задачи. Как именно происходит распараллеливание – зависит от архитектуры многопроцессорной ЭВМ. При наличии в ее составе n процессоров в идеальной ситуации ускорение вычислений может достигать величины, близкой к n раз. Реально, алгоритмы не полностью распараллеливаются, часть процессоров может простаивать в отдельные периоды времени, и производительность увеличивается менее чем в n раз.
Современные многопроцессорные машины имеют десятки и сотни процессоров, отдельные – тысячи процессоров. Но такие уникальные машины очень дороги, установлены в специальных суперкомпьютерных центрах или в военных организациях и не всегда доступны рядовым пользователям.
Альтернативой является использование отдельных компьютеров, соединенных глобальными сетями связи и принадлежащих частным лицам и различным организациям. Компьютеры могут иметь относительно невысокую производительность, но использование в сети сразу нескольких десятков или сотен тысяч компьютеров для решения одной задачи создает эффект того же суперкомпьютера, но, может быть, еще более мощного.
Именно такая распределенная компьютерная система использовалась для упомянутой задачи дешифрования. Это не была «жесткая» система – компьютеры использовались на добровольной основе, в любой момент времени любой компьютер мог выйти из системы. Но точно также и новые компьютеры могли присоединяться к уже работающим.
Идея и соответствующая технология использования глобальной сети компьютеров для решения сложной задачи получила название Grid. Если Web обеспечивает доступ к глобальным информационным ресурсам, то Grid должен обеспечить доступ к глобальным вычислительным (обрабатывающим) ресурсам. Основные проекты использования Grid в настоящее время связаны с обработкой большого числа (терабайты, пентабайты) экспериментальных данных в физике элементарных частиц, наблюдений в астрономии, расшифровкой генома человека в биологии.