Введение

Логика безопасного совместного использования компьютерных ресурсов

Алгоритм пекарни Лампорта — это компьютерный алгоритм, разработанный учёным-компьютерщиком Лесли Лампортом в рамках его длительного исследования формальной корректности параллельных систем, предназначенный для повышения безопасности при использовании общих ресурсов несколькими потоками посредством взаимного исключения. В информатике часто возникает ситуация, когда несколько потоков одновременно обращаются к одним и тем же ресурсам. Повреждение данных может произойти, если две или более нити пытаются записать в одно и то же место в памяти, или если одна нить читает данные из памяти до того, как другая завершит запись. Алгоритм пекарни Лампорта — один из множества алгоритмов взаимного исключения, разработанных для предотвращения одновременного входа конкурирующих потоков в критические участки кода, чтобы исключить риск повреждения данных.

Аналогия

Лампорт представил себе пекарню с аппаратом выдачи номеров у входа, чтобы каждому посетителю присваивался уникальный номер. Номера увеличиваются на единицу с каждым входящим посетителем. Глобальный счетчик отображает номер посетителя, которого в данный момент обслуживают. Все остальные посетители должны ждать в очереди, пока пекарь не закончит обслуживание текущего посетителя и не будет отображен следующий номер. Когда посетитель заканчивает покупки и выбрасывает свой номер, кассир увеличивает номер, позволяя обслужить следующего посетителя. Этот посетитель должен взять новый номер из аппарата, чтобы совершить следующие покупки. Согласно аналогии, "посетители" – это потоки, идентифицируемые буквой i, получаемой из глобальной переменной. В силу ограничений компьютерной архитектуры некоторые аспекты аналогии Лампорта требуют незначительной корректировки. Возможно, что несколько потоков получат один и тот же номер n при запросе; этого нельзя избежать (без предварительного решения проблемы взаимного исключения, что и является целью алгоритма). Поэтому предполагается, что идентификатор потока i также служит приоритетом. Меньшее значение i означает более высокий приоритет, и потоки с более высоким приоритетом первыми войдут в критическую секцию.

Некритическая секция

Некритическая секция — это часть кода, не требующая исключительного доступа. Она представляет собой вычисления, специфичные для конкретного потока, которые не влияют на ресурсы и выполнение других потоков. Эта часть аналогична действиям, выполняемым после совершения покупки, например, возвращению сдачи в кошелек.