29   Блокирующая переменная.

Блокирующие переменные - некоторые глобальные переменные, к которым имеют доступ все потоки данного процесса. Каждому набору критических данных ставится в соответствие некоторая двоичная переменная. Поток входит в эти данные переменная=0; выходит-1. Перед входом в критическую секцию поток проверяет значение блокирующей переменной(не входит ли другой поток.): если 1, то можно работать и установится 0. При завершении работы устанавливается 1. Если 0, то критические данные заняты другим потоком.  Структурная схема работы блокирующих переменных: см. в тетрадь, стр.47. Особенность: нельзя прерывать поток между операцией проверки и установки значения блокирующей переменной. Существует неделимая команда(см. схему), если ее нет, то между этими операциями запрещается прерывание. Преимущества: гарантирован доступ к критической секции только одного потока. Недостаток: если ресурс занят?, то поток будет все время обращаться к нему - тратить свой квант времени впустую, следовательно, используются вызовы, которые не переводят поток в состояние ожидания. Если ресурс занят?, то системный вызов не выполняет циклический поток, а переводит его в процесс ожидания.

 29  Семафоры Дийкстры.

Вместо блокирующих переменных(0,1) были предложены переменные, которые принимают целые значения. Их используют для синхронизации процессов и потоков - это семафоры. Пусть есть переменная S. Ведем две операции: 1).V- увеличение значения семафора на 1, единое действие, выборка, запоминание, не прерывается. 2).P-приводит к уменьшению переменной на 1, проверка возможно ли это. Если семафор=0(не возможно), то поток ждет, пока уменьшение станет возможным. Если семафор имеет 0 и 1, то он вырождается в блокирующую переменную. Пример: пусть есть 2 потока А и В. каждый из этих потоков осуществляет некоторые операции с буфером памяти. А - пишет в буфер(писатель), В - поток читатель(считывает). N-число буферов. Пусть Е - число пустых, незанятых буферов. В начале E=N. пусть f-число занятых буферов. В начале f=0. Поток-писатель А выполняет действия с семафором Е и пишет информацию в память, пока Е не стала =0, когда Е=0, то писать больше некуда, следовательно, А переходит в ожидание, пока поток В не считает информацию с буферов(одновременно выполняя действия над семафором f).

 

Hosted by uCoz