Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации лекций по ТОИ / 18-Проблема взаимного исключения.pps
Скачиваний:
46
Добавлен:
02.06.2015
Размер:
1.72 Mб
Скачать

Программные методы решения: вариант 5 – алгоритм Деккера

Процедура инициализации

procedure INIT; common boolean C1,C2 ; common integer N ; begin

C1 := false ;

C2 := false ;

N := 1 ; start(P1) ;

Устанавливается порядок входа в критическую секцию при возникновении конфликтной ситуации, когда оба процесса параллельно заявляют о попытке войти в свои критические секции

61

Первый процесс

Второй процесс

process P1;

process P2;

common boolean C1,C2 ;

common boolean C1,C2 ;

begin

begin

while true do

while true do

begin BEFORE1 ;

begin BEFORE2 ;

C1 := true ;

C2 := true ;

while C2 do

while C1 do

begin

begin

if N = 2 then

if N = 1 then

begin

begin

C1 := false ;

C2 := false ;

while N=2 do ;

while N=1 do ;

C1 := true ;

C2 := true ;

end

end

end ;

end ;

CS1 ;

CS2 ;

C1 := false; N := 2;

C2 := false; N:=1;

AFTER1 ;

AFTER2 ;

 

end

end P1 .

end P2 .

Недостатки программных методов

1.Занятое ожидание – неэффективное использование времени процессора.

2.Сложная реализация для большего числа процессов (рассмотрите пример алгоритма Деккера для 3 и более процессов).

Основные причины ошибок:

1.Невозможность обеспечить неделимость операций проверки и модификации значений переменных.

Это приводит к нарушению требований к критической секции: не реализуется взаимное исключение или возникает тупик.

Менее серьёзные ошибки – задержки и опережающие блокировки.

62

Современные методы решения проблемы взаимного исключения

1.Блокирующие функции, операции блокирования.

2.Семафоры различных типов.

3.Транзакции.

63

Современные методы решения проблемы взаимного исключения

1.Блокирующие функции, операции блокирования.

2.Семафоры различных типов.

3.Транзакции.

64

На время выполнения операций выполняется блокирование баз

данных, отдельных таблиц, записей, файлов, блоков в файлах, … с помощью специальных команд блокирования или процедур (например, открытие файла в режиме монополизации и т.п.).

Блокирующие функции могут использоваться и для выполнения арифметических операций (inc, dec) на основе аппаратной поддержки.

Блокирующие функции

В программном интерфейсе (API) операционных систем Microsoft Windows предусмотрено несколько функций, которые просты в использовании и могут оказаться полезными для синхронизации доступа к разделяемым (общим) переменным, когда для работы с ними требуется взаимное исключение.

Функции выполняют увеличение и уменьшение на единицу значения переменной типа LONG, адрес которой передаётся им в качестве единственного параметра:

LONG InterlockedIncrement(LPLONG lpAddend); LONG InterlockedDecrement(LPLONG lpAddend);

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

65 уверенным, что изменение переменной будет выполнено правильно.

Блокирующие функции

Значение, возвращаемое функциями

InterlockedIncrement и InterlockedDecrement,

равно нулю, если в результате изменений значение переменной стало равно нулю; если в результате увеличения или уменьшения значение переменной стало больше или меньше нуля, то эти функции возвращают, соответственно, значение, большее или меньшее нуля.

Полученное значение можно использовать только для сравнения, так как абсолютная величина возвращённого значения может быть не равна новому значению изменяемой переменной.

66

Блокирующие функции

Операция присваивания глобальной переменной нового значения, если она выполняется несколькими задачами одновременно, таит в себе ту же опасность.

Чтобы избежать такой опасности, в API Microsoft Windows предусмотрена функция InterlockedExchange:

LONG InterlockedExchange(

LPLONG lpTarget, // адрес изменяемой переменной

LONG lNewValue ); // новое значение для переменной

Эта функция записывает значение lNewValue по адресу lpTarget. При этом гарантируется, что операция не будет прервана другой задачей, выполняющейся в рамках того же процесса. Функция InterlockedExchange

67 возвращает старое значение изменяемой переменной.

Аппаратная поддержка выполнения блокирующих функций

Форматы команд процессоров Intel (и совместимых с ними) предусматривают возможность использования различных префиксов, в частности перед командой может быть записан префикс блокирования шины на время выполнения операции:

lock Inc A ; увеличение значения A на 1 в режиме блокирования шины lock Dec A ; уменьшение значения A на 1 в режиме блокирования шины

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

С системе команд процессоров Intel есть также команды обмена значений, заданных в качестве операндов, сравнения и обмена, проверки и установки…

68

Блокирование файлов при создании или открытии

Создание и открытие файла через API производится одной функцией CreateFile:

HANDLE CreateFile (LPCTSTR ipFileName, DWORD dwDesiredAccess. DWORD dwShareMode. LPSECURITY_ATTRIBUTES ipSecurityAttributes,

DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes. HANDLE hTemplateFile)

Параметр dwShareMode задаёт режим разделения файлов между разными процессами, данный параметр может принимать следующие значения:

 

0 – монополизация доступа к файлу;

 

FILE_SHARE_READ = 0000000th – другие процессы могут открыть файл, но

 

только по чтению, запись в файл монополизирована процессом, открывшим

 

файл;

 

FILESHAREWRITE = 00000002b – другие процессы могут открыть файл, но только

 

по записи, чтение из файла монополизировано процессом, открывшим файл;

 

FILE_SHARE_READ+FILE_SHARE_WRITE = 00000003b – другие процессы могут

69

открывать файл по чтению-записи.

Таким образом, доступ к файлу может быть заблокирован…

Современные методы решения проблемы взаимного исключения

1.Блокирующие функции, операции блокирования.

2.Семафоры различных типов.

3.Транзакции.

70

Семафор – это защищённая переменная, значение которой можно опрашивать и менять только при помощи специальных операций (семафорных примитивов) P и V и операции инициализации.

Семафоры могут находиться в двух состояниях: закрыт и открыт.

Двоичные (бинарные) семафоры могут

принимать только значения 0 или 1 (true или false). Считающие семафоры (семафоры со счётчиками) могут

принимать целые значения. Считающий семафор открыт, если значение счётчика больше 0.

Соседние файлы в папке Презентации лекций по ТОИ