Відповіді:
Щоб переконатися, що ми знаходимось на одній сторінці, спочатку розглянемо ці три визначення:
Визначення. Test-and-set - це інструкція для читання-зміни-запису в якомусь двійковому регістрі (скажімо лише, що 0 і 1 - можливі значення), де потік отримує старе значення і пише 1.
Визначення. Консенсус досягається між потоками, якщо всі n потоків визначають однакове значення (вимога узгодженості), а всі потоки визначають значення, яке було фактично запропоновано одним із потоків (вимога дійсності).
Визначення. Протокол консенсусу - це не очікування, якщо кожен виклик методу закінчується у визначеній кількості кроків.
Тепер дотримуйтесь двох ескізів.
Заява 1. Кількість консенсусу тесту та встановлення становить не менше 2. Доказ. Припустимо, у нас є дві нитки 0 і 1, які потребують досягнення консенсусу. Ми могли б зробити це, дозволивши кожному потоку слідувати протоколу консенсусу нижче:
Ви можете переконатися в тому, що консенсус та безперебійне задоволення задоволені.
(Для наступного доказу я вкладу деякі докази та визначення, тому що я думаю, що це полегшить наслідування.)
Заява 2. Консенсусна кількість тестування та встановлення становить не більше 2. Доказ. За протиріччя. Припустимо, у нас є три потоки , B і C, які бажають визначити значення a , b і c відповідно, і що у нас є дійсний протокол консенсусу без очікування, який реалізується за допомогою тесту і встановлення (і атомний читає і записує ).
Ми можемо уявити процес консенсусу як спрямоване дерево, де:
Визначення. Нехай держава буде багатовалентною, якщо результат консенсусу ще не визначений. Іншими словами, не всі можливі переплетення решти кроків призводять до однакового результату. Нехай стан буде однолістних , коли результат процесу консенсусу буде визначено.
Корінь багатовалентний. Доказ. Якщо тільки один потік активний, а інші потоки лежать спокійно назавжди, тоді X закінчиться в кінцевій кількості кроків (гарантується припущенням про вільність очікування), і він вирішить x (оскільки він має лише доступ до цього значення та його рішення задовольнить вимогу обґрунтованості консенсусу). Отже, для нашої ситуації, a , b і c - всі можливі результати. ◻
Визначення. Нехай критичним станом є стан, який є багатовалентним, з додатковою властивістю, яку хід визначатиме a , а хід B визначає b .
Існує критичний стан. Доказ. Зверху ми знаємо, що ми починаємо у багатовалентному стані. Нехай взагалі не рухається. Поки або А, або В не змусять дерево в одновалентному стані, нехай він рухається. Вільність очікування гарантує, що дерево є кінцевим, тому в певний момент необхідно зіткнутися з критичним станом. ◻
Тепер розглянемо сценарій, коли ми перебуваємо в критичному стані. Є щонайменше дві можливості:
1) робить свій хід (тим самим визначаючи а ) і зупиняється. Потім B робить свій рух і зупиняється. Далі C працює, поки не закінчиться, врешті-решт вирішивши a .
2) робить свій хід (тим самим визначаючи b ) і зупиняється. Далі C працює, поки не закінчиться, врешті-решт, вирішивши b . А не робить ходу.
Оскільки атомні читання та записи мають консенсус № 1, кроки і B повинні були бути тестовими та встановленими інструкціями в одному реєстрі (якщо регістри різні, то C не зможе визначити порядок, у якому A і B Рухи Б відбулися). З точки зору C , тоді сценарії 1 і 2 не відрізняються, тому ми повинні мати, що C вирішує і a, і b . Це неможливо. ◻
Те, що інструкція про тестування та встановлення має консенсус № 2, випливає з п. 1 і 2.
У статті у вікіпедії є посилання, яке відповідає на ваше запитання, але, можливо, ви не хочете читати цей папір на 26 сторінках. Я дам спрощену версію (цілком технічного) доказу, показуючи, що тест-встановлення не може вирішити бінарний консенсус для 3-х процесів. Такий аргумент широко використовується при доведенні консенсусних чисел.
Припустимо, у нас є алгоритм консенсусу з використанням регістрів TAS для 3 процесів.
У будь-який момент часу кожен процес буде готовий до виконання ходу (інструкції). Яка з трьох інструкцій буде виконана, не є детермінованою.
Припустимо, що ми перебуваємо у двовалентному стані (стан, коли рішення як 0, так і 1 все ще можливо), і який би процес рухався далі, наступний стан буде однозначним. Такого стану необхідно врешті-решт досягти через стан очікування.
Припустимо (wlg), що якщо процес 1 рухається, стан буде 0-валентним, і якщо процес 2 рухається, стан буде 1-валентним. Обидва ходи повинні бути операцією TAS (або, принаймні, деяким записом) в одному реєстрі, оскільки якби вони були операціями TAS на різних регістрах, ми не могли б визначити, чи перемістився процес 1 перший або процес 2 перемістився першим.
Розглянемо ці дві можливі страти:
З точки зору процесу 3, ці стани не відрізняються, оскільки він просто бачить значення, записане процесом 2. Однак у першому випадку він повинен дати 0 як вихід, а у другому 1 як вихід. Ясна річ, це суперечність.
Процеси 1 і 2 можуть вирішувати між собою, хто перемістився першим (оскільки вони бачать, яке значення було в реєстрі до їх запису), але третій глядацький процес не може.
Інший спосіб довести, що тест-набір не може бути використаний для вирішення консенсусу 3-х процесорів, це показати, що тест-набір може бути реалізований за допомогою консенсусу 2-х процесорів. Тоді, припускаючи, що тест-набір може вирішити консенсус 3-процесорів, призводить до суперечності: Припустимо, що тест-набір може вирішити консенсус 3-х процесорів; то заміною тестування та встановлення його реалізацією за допомогою консенсусу з 2 процесорами отримується реалізація консенсусу 3 процесорів з використанням консенсусу 2 процесорів, що неможливо. Таким чином, тестування та встановлення не можуть вирішити консенсус 3-х процесорів.
Щоб реалізувати тестовий і набір для n-процесорів, що використовують консенсус 2-процесорів, дозвольте процесорам визначити переможця тесту і встановити, використовуючи турнір, в якому кожен матч реалізується за допомогою консенсусу 2-процесорів (у матчі процесори запропонувати їх ідентифікатор, і результат консенсусу підкаже, хто виграє).
У практичному сенсі може бути достатньо менш суворого визначення консенсусу (тут я його називаю світловим консенсусом):
Визначення . Світло-консенсус досягається між n потоками iff (a) кожен потік або вирішує одне і те ж значення, або значення для нього невідоме, (b) принаймні один потік знає значення і (c) це значення було фактично запропоновано одним із нитки.
Отже, цей консенсус у його легшому розумінні дозволяє, що якась нитка не знає консенсусу, значення, яке вирішується.
Висновок : У цьому легшому сенсі тест-набір має нескінченне число консенсусу світла.
Претензія : Цей легший сенс є практичним. Наприклад, для вибору потоку для вступу в критичний розділ не потрібно створювати консенсус у суворому розумінні. Тобто, кожен потік повинен знати, вибраний він чи ні, проте якщо він не вибраний, він не повинен знати, який був обраний. Іншими словами, для взаємного виключення суворого консенсусу не потрібно, світла достатньо.