Теорема Фишера-Линча-Патерсона (FLP) — различия между версиями
Yeputons (обсуждение | вклад) |
Yeputons (обсуждение | вклад) |
||
| Строка 9: | Строка 9: | ||
Если разрешаем недетерминизм, то есть [[алгоритм Бен-Ора]]. | Если разрешаем недетерминизм, то есть [[алгоритм Бен-Ора]]. | ||
| − | * | + | == Доказательство == |
| − | * | + | Из презентации Р. Елизарова. |
| − | * | + | |
| + | От противного: пусть есть такой алгоритм, тогда мы проанализируем варианты его исполнения, подстроим порядок доставки сообщений (без откладывания сообщений бесконечно далеко) и получим противоречие с нетривиальностью консенсуса. | ||
| + | |||
| + | === Модель === | ||
| + | {{Определение | ||
| + | |definition= | ||
| + | '''Процесс''' — это детерминированный автомат, который может выполнять три операции: | ||
| + | * <code>receive() : msg</code> — бесконечная блокировка до получения ближайшего сообщения. Так как система асинхронна, возможности "посмотреть следующее сообщение" или ''таймаутов нет''. | ||
| + | * <code>send(msg)</code> — отправка сообщения другому процессу. Гарантируется, что сообщение дойдёт получателю за конечное время, но это время может быть сколь угодно большим. | ||
| + | * <code>decided(value)</code> — процесс принял решение <code>value</code>. Решение процесс может принять только один раз, но после этого он ''может продолжить выполняться'' и помогать остальным процессам. | ||
| + | Заметим, что так как нет "времени", можно считать все переходы в процессе мгновенными. | ||
| + | }} | ||
| + | Для доказательства от противного у нас есть такой алгоритм для процессов, что все они вызывают <code>decided(value)</code> с одинаковым значением через конечное время, независимо от того, как система задерживает сообщения. | ||
| + | {{Определение | ||
| + | |definition= | ||
| + | '''Конфигурация''' — это состояния всех процессов плюс все сообщения в пути (которые отправили, но ещё не доставили). | ||
| + | }} | ||
| + | В начальной конфигурация у каждого процесса может быть сколько угодно входных данных и даже своя программа. | ||
| + | {{Определение | ||
| + | |definition= | ||
| + | '''Шаг''' из одной конфигурации в другую — это либо приём какого-то сообщения процессом (событие), либо внутренние действия процесса между соседними <code>receive()</code>. Эти действия ''однозначно'' определяются предыдущей конфигурацией и событием. | ||
| + | }} | ||
| + | {{Определение | ||
| + | |definition= | ||
| + | '''Исполнение''' — это ''бесконечная'' цепочка шагов из начальной конфигурации. Бесконечная, потому что процессы могут выполняться и после принятия решений. | ||
| + | }} | ||
| + | {{Определение | ||
| + | |definition= | ||
| + | '''Отказавший процесс''' — это процесс, который делает только конечное количество шагов в исполнении. Такой в системе может быть максимум один (это более сильное условие, чем если может много процессов отказывать). | ||
| + | }} | ||
| + | |||
| + | Также гарантируется, что в любом исполнении любое сообщение, предназначенное не отказавшему процессу, обрабатывается через конечное число шагов. | ||
| + | Другими словами, ''сообщения не теряются''. | ||
| + | |||
| + | == Ссылки == | ||
| + | * http://bailonga.es/tpmtp/lecture09.pdf | ||
| + | * https://github.com/volhovm/study-notes/blob/master/parallel_programming/parallel_programming.org | ||
Версия 16:03, 3 июня 2019
Теорема Фишера, Линча и Патерсона (FLP, 1985 год) невозможно достичь даже необоснованного консенсуса $N>2$ процессами даже на одном бите при следующих условиях:
- Алгоритм должен завершиться за конечное время.
- Один из узлов может отказать
- Система асинхронна
- Алгоритм должен быть детерминирован.
Если отказов нет, есть простой алгоритм. Если система синхронна, то есть консенсус в синхронных системах. Если разрешаем недетерминизм, то есть алгоритм Бен-Ора.
Доказательство
Из презентации Р. Елизарова.
От противного: пусть есть такой алгоритм, тогда мы проанализируем варианты его исполнения, подстроим порядок доставки сообщений (без откладывания сообщений бесконечно далеко) и получим противоречие с нетривиальностью консенсуса.
Модель
| Определение: |
Процесс — это детерминированный автомат, который может выполнять три операции:
|
Для доказательства от противного у нас есть такой алгоритм для процессов, что все они вызывают decided(value) с одинаковым значением через конечное время, независимо от того, как система задерживает сообщения.
| Определение: |
| Конфигурация — это состояния всех процессов плюс все сообщения в пути (которые отправили, но ещё не доставили). |
В начальной конфигурация у каждого процесса может быть сколько угодно входных данных и даже своя программа.
| Определение: |
Шаг из одной конфигурации в другую — это либо приём какого-то сообщения процессом (событие), либо внутренние действия процесса между соседними receive(). Эти действия однозначно определяются предыдущей конфигурацией и событием. |
| Определение: |
| Исполнение — это бесконечная цепочка шагов из начальной конфигурации. Бесконечная, потому что процессы могут выполняться и после принятия решений. |
| Определение: |
| Отказавший процесс — это процесс, который делает только конечное количество шагов в исполнении. Такой в системе может быть максимум один (это более сильное условие, чем если может много процессов отказывать). |
Также гарантируется, что в любом исполнении любое сообщение, предназначенное не отказавшему процессу, обрабатывается через конечное число шагов.
Другими словами, сообщения не теряются.