Введение
Алгоритм взаимного исключения для параллельного программирования
Алгоритм Питерсона (или решение Питерсона) — это алгоритм параллельного программирования, предназначенный для обеспечения взаимного исключения, который позволяет двум или более процессам совместно использовать ресурс, предназначенный для однократного использования, без возникновения конфликтов, используя только общую память для обмена данными. Он был разработан Гэри Л. Петерсоном в 1981 году. Хотя первоначальная формулировка алгоритма Питерсона работала только с двумя процессами, его можно обобщить для большего числа процессов.
Peterson's algorithm (or Peterson's solution) is a concurrent programming algorithm for mutual exclusion that allows two or more processes to share a single use resource without conflict, using only shared memory for communication. It was formulated by Gary L. Peterson in 1981. While Peterson's original formulation worked with only two processes, the algorithm can be generalized for more than two.
Взаимное исключение
P0 и P1 никогда не могут находиться в критической секции одновременно. Если P0 находится в критическом разделе, то флаг[0] истинен. Кроме того, либо флаг[1] ложен (что означает, что P1 покинул свою критическую секцию), либо переменная turn равна 0 (что означает, что P1 только что пытается войти в критическую секцию, но уступает ход), либо P1 находится в точке входа P1 gate (пытается войти в свою критическую секцию, после установки флага[1] в true, но до установки turn в 0 и ожидания в цикле). Таким образом, если оба процесса находятся в своих критических секциях, то состояние должно одновременно удовлетворять условиям флаг[0] и флаг[1], а также turn = 0 и turn = 1. Поскольку ни одно состояние не может одновременно удовлетворять turn = 0 и turn = 1, не может существовать состояния, в котором оба процесса находятся в своих критических секциях. (Это пересказ аргумента, строго обоснованного в Schneider 1997.)
Примечание
При работе на аппаратном уровне алгоритм Питерсона обычно не требуется для обеспечения атомарного доступа. Некоторые процессоры имеют специальные инструкции, такие как "test and set" или "compare and swap", которые, блокируя шину памяти, могут использоваться для обеспечения взаимного исключения в SMP-системах. Большинство современных процессоров переупорядочивают обращения к памяти для повышения эффективности выполнения (см. "Порядок памяти" для типов допустимого переупорядочивания). Такие процессоры неизменно предоставляют способ принудительного упорядочивания последовательности обращений к памяти, как правило, с помощью инструкции "барьера памяти". Реализация алгоритма Питерсона и связанных с ним алгоритмов на процессорах, переупорядочивающих обращения к памяти, обычно требует использования таких операций для корректной работы, чтобы предотвратить выполнение последовательных операций в неверном порядке. Следует отметить, что переупорядочивание обращений к памяти может происходить даже на процессорах, которые не переупорядочивают инструкции (например, процессор PowerPC в Xbox 360). Большинство таких процессоров также имеют гарантированную атомарную операцию, такую как XCHG на процессорах x86 и "load link/store conditional" на Alpha, MIPS, PowerPC и других архитектурах. Эти инструкции предназначены для обеспечения возможности построения примитивов синхронизации более эффективно, чем при использовании исключительно подходов с общей памятью.