Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Алгоритмы синхронизации процессов. Примитивы взаимоисключения.
1.Взаимоисключение для N процессов
Программное решение проблемы реализации примитивов взаимоисключения для п процессов первым предложил Дейкстра. Затем Кнут усовершенствовал алгоритм Дейкстры, исключив возможность бесконечного откладывания процессов, однако в варианте Кнута некоторый процесс по-прежнему мог испытывать (потенциально) длительную задержку. В связи с этим многие ученые начали искать алгоритмы, обеспечивающие более короткие задержки. Так, Эйзенберг и Макгайр предложили решение, гарантирующее, что процесс будет входить в свой критический участок не более чем за п—1 попыток. Лэмпорт разработал алгоритм, применимый, в частности, для распределенных систем обработки данных. Алгоритм Лэмпорта предусматривает «предварительное получение номерка», подобно тому как это делается в модных кондитерских, и поэтому подучил наименованиеалгоритма кондитера (Bakery Algorithm). Бринк Хансен также предлагает возможные варианты управления параллельными распределенными процессами. Аппаратная реализация взаимоисключения: команда testandset
Алгоритм Деккера — это программное решение проблемы взаимоисключения. В данном разделе мы приводим аппаратное решение данной проблемы. Главным фактором, обеспечивающим успех в этом случае, является наличие одной аппаратной команды, которая осуществляет чтение переменной, запись ее значения в область сохранения и установку нужного конкретного значения этой переменной. Подобная команда, обычно называемая testandset (проверить-и-установить), после запуска выполняет все эти действия до конца без прерывания. Неделимая команда testandset (а, b) читает значение логической переменной b, копирует его в а, а затем устанавливает для b значение «истина» — и все это в рамках одной непрерываемой операции. Пример использования команды проверки и установки для реализации взаимоисключения приведен на рис. 1. program npимeptestandset var активный: логический; procedure процессодин; var первомувходитьнельзя: логический; Begin while истина do Begin первомувходитьнельзя: = истина; while первомувходитьнельзя do testandset (первомувходитьнельзя, активный); критическийучастокодин; активный: = ложь; прочиеоператорыодин End end;
procedure процессдва; var второмувходитьнельзя: логический; Begin while истина do Begin второмувходитьнельзя: = истина; while второмувходитьнельзя do testandset (второмувходитьнельзя, активный); критическийучастокдва; активный: = ложь; прочиеоператорыдва end end; Begin активный: = ложь; Parbegin процессодин; процессдва parend end; Рис. 1. Реализация взаимоисключения при помощи команды testandsef (ПРОВЕРИТЬ И УСТАНОВИТЬ).
Переменная «активный» логического типа имеет значение «истина», когда любой из процессов находится в своем критическом участке, и значение «ложь» в противном случае. «Процессодин» принимает решение о входе в критический участок в зависимости от значения своей локальной логической переменной «первомувходитьнельзя». Он устанавливает для переменной «первомувходитьнельзя» значение «истина», а затем многократно выполняет команду проверки и установки для глобальной логической переменной «активный». Если «процессдва» находится вне критического участка, переменная «активный» будет иметь значение «ложь». Команда проверки и установки запишет это значение в «первомувходитьнельзя» и установит] значение «истина» для переменной «активный». При проверке в цикле while будет получен результат «ложь», и «процессодин» войдет в свой критический участок. Поскольку для переменной «активный» установлено значение «истина», «процессдва» в свой критический участок войти не может. Предположим теперь, что «процессдва» уже находится в своем критическом участке, когда «процессодин» хочет войти в критический участок. «Процессодин» устанавливает значение «истина» для переменной «первомувходитьнельзя», а затем многократно проверяет значение переменной «активный» по команде testandset. Поскольку «процессдва» находится в своем критическом участке, это значение остается истинным. Каждая команда проверки и установки обнаруживает, что «активный» имеет значение «истина», и устанавливает это значение для переменных «первомувходитьнельзя» и «активный». Таким образом, «процессодин» продолжает находиться в цикле активного ожидания, пока «процессдва» в конце концов не выйдет из своего критического участка и не установит значение «ложь» для переменной «активный». В этот момент команда проверки и установки, обнаружив это значение переменной «активный» (и установив для нее истинное значение, чтобы «процессдва» не мог больше войти в свой критический участок), установит значение «ложь» для переменной «первомувходитьнельзя», что позволит, чтобы «процессодин» вошел в свой критический участок.
Этот способ реализации взаимоисключения не исключает бесконечного откладывания, однако здесь вероятность такой ситуации весьма мала, особенно если в системе имеется несколько процессоров. Когда процесс, выходя из своего критического участка, устанавливает значение «ложь» переменной «активный», команда проверки и установки testandset другого процесса, вероятнее всего, сможет «перехватить» переменную «активный» (установив для нее значение «истина») до того, как первый процесс успеет пройти цикл, чтобы снова установить значение «истина» для этой переменной. Семафоры
Все описанные выше ключевые понятия, относящиеся к взаимоисключению, Дейкстра суммировал в своей концепции семафоров (Di65). Семафор — это защищенная переменная, значение которой можно опрашивать и менять только при помощи специальных операций Р и V и операции инициализации, которую мы будем называть «инициализациясемафора». Двоичные семафоры могут принимать только значения 0 и 1. Считающие семафоры (семафоры со счетчиками) могут принимать неотрицательные целые значения. Операция Р над семафором записывается как P(S) и выполняется следующим образом: если S > О то S: =S— 1 иначе (ожидать на S)
Операция V над семафором S записывается как V(S) и выполняется следующим образом; если (один или более процессов ожидают на S) то (разрешить одному из этих процессов продолжить работу) иначе S: = S + 1
Будем предполагать, что очередь процессов, ожидающихна обслуживается в соответствии с дисциплиной «первый пришедший обслуживается первым» (FIFO). Подобно операции проверки и установки testandset, операции Р и V являются неделимыми. Участки взаимоисключения по семафору S в процессах обрамляются операциями P(S) и V(S). Если одновременно несколько процессов попытаются выполнить операцию P(S), это будет разрешено только одному из них, а остальным придется ждать. Семафоры и операции над ними могут быть реализованы как программно, так и аппаратно. Как правило, они реализуются в ядре операционной системы, где осуществляется управление сменой состояния процессов. На рис. 2 приводится пример того, каким образом можно обеспечить взаимоисключение при помощи семафоров. Здесь примитив Р (активный) — эквивалент для «входвзаимоисключения», а примитив V (активный) — для «выходвзаимоисключения». program примерсемафораодин; var активный: семафор; procedure процессодин; Begin while истина do begin предшествующиеоператорыодин; Р(активный); критическийучастокодин; V(активный); прочиеоператорыодин; end end; procedure процессдва; Begin while истина do begin предшествующиеоператорыдва Р(активный); критическийучастокдва; V(активный); прочиеоператорыдва еnd end; Begin инициализациясемафора(активный,1); Parbegin процессодин; процессдва parend end; Рис. 2. Обеспечение взаимоисключения при помощи семафора и примитивов Р и V.
|
||||||
Последнее изменение этой страницы: 2021-03-10; просмотров: 140; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.216.209.112 (0.012 с.) |