Основы многопоточного и распределенного программирования

       

Семафоры


Глава 4 Семафоры

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

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

Синхронизация является основой параллельных программ, поэтому для разработки пра­вильных протоколов синхронизации желательно иметь специальные средства, которые мож­но использовать для блокирования приостанавливаемых процессов. Первым таким средством синхронизации, не потерявшим актуальности и сегодня, стали семафоры. Они облегчают за­щиту критических секций и могут использоваться систематически для реализации планиро­вания и сигнализации. По этой причине они включены во все известные автору библиотеки многопоточного и синхронного параллельного программирования. Кроме того, семафоры допускают различные способы реализации, как с помощью активного ожидания, описанного в предыдущей главе, так и с помощью ядра (см. главу 6).

Идея семафора в соответствии с названием взята из метода синхронизации движения поез­дов, принятого на железной дороге. Железнодорожный семафор — это "сигнальный флажок", показывающий, свободен путь впереди или занят другим поездом. По мере движения поезда семафоры устанавливаются и сбрасываются. Семафор остается установленным на время, доста­точное, чтобы при необходимости остановить другой поезд. Таким образом, железнодорожные семафоры можно рассматривать как устройства, которые сигнализируют об условиях, чтобы обеспечить взаимоисключающее прохождение поездов по критическим участкам пути. Семафо­ры в параллельных программах аналогичны — они предоставляют базовый механизм сигнали­зации и используются для реализации взаимного исключения и условной синхронизации.

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



Содержание раздела