Введение

Алгоритм Дайкстры — Шольтена (названный в честь Эдсгера В. Дайкстры и Карела С. Шольтена) — это алгоритм для обнаружения завершения в распределенной системе. Алгоритм был предложен Дайкстрой и Шольтеном в 1980 году. Сначала рассмотрим случай простого графа процессов, который представляет собой дерево. Распределенные вычисления, имеющие древовидную структуру, не являются редкостью. Такой граф процессов может возникнуть, когда вычисление представляет собой строгое разделение и объединение. Узел начинает вычисление и разделяет задачу на две (или более, обычно кратное 2) примерно равные части и распределяет эти части другим процессорам. Этот процесс продолжается рекурсивно, пока задачи не станут достаточно малыми для решения на одном процессоре.

Алгоритм DijkstraScholten для дерева

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

Алгоритм Дийкстра-Шолтена для направленных ациклических графов

Алгоритм для дерева может быть расширен на ациклические ориентированные графы. Мы добавляем к каждому ребру дополнительный целочисленный атрибут – Дефицит. На входящем ребре Дефицит будет обозначать разницу между количеством полученных сообщений и количеством отправленных в ответ сигналов. Когда узел хочет завершить работу, он ждет, пока не получит сигналы от исходящих ребер, уменьшающие их дефицит до нуля. Затем он отправляет достаточно сигналов, чтобы обеспечить нулевой дефицит на каждом входящем ребре. Поскольку граф ацикличен, некоторые узлы не будут иметь исходящих ребер, и эти узлы завершат работу первыми после отправки достаточного количества сигналов на их входящие ребра. После этого узлы на более высоких уровнях будут завершать работу уровень за уровнем.