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).