Механизми за синхронизация

Механизмите за синхронизация налагат синхронни правила. Правилата за синхронизация се изпълняват с помощта на механизми за синхронизация. Механизмите за синхронизация се различават по:

1) извършени действия

2) според степента на близост до машинните команди

Инструменти, които са машинно ориентирани по природа и изискват от потребителя да съставя специални текстове всеки път за програмиране на решението на проблема със синхронизацията, се наричат ​​инструменти от ниско ниво.

Инструментите от високо ниво са вид софтуерна система, достъпна за потребителя чрез специфичен интерфейс и предназначена да реши конкретен проблем със синхронизацията. Освен това функциите за решаване на конкретен проблем обикновено са скрити от потребителя.

Към тези с ниско ниво се отнася TS (test & set) - осъществява проверка и настройка на състоянието на споделена променлива в рамките на една операция на машината, което изключва възможността за намеса от други процеси. Такива опции се използват рядко или като основни инструменти на ОС.

За съзнателен избор на конкретен механизъм е необходимо да се фиксират изискванията за синхронизация. По правило механизмите се сравняват:

1) лекота на използване - определя се от простотата на синтаксиса и семантиката на механизма за синхронизация.

2) гъвкавост - определя способността на механизма да се използва за реализиране на известни типове връзки между процесите в ясна и недвусмислена форма.

3) тестируемост и разбираемост – определя възможността за използване на формални методи за анализ

4) ефективност - предполага лекота на изпълнение въз основа на средствата, които са налични като част от конкретна машина, т.е. приемливи механизми. Синхронизацията не трябваводят до прекомерни забавяния

5) надеждност - определя вероятността за правилна работа на механизма както при условията на определената спецификация, така и при извънредни условия.

Тези свойства са до голяма степен взаимно противоречиви, така че е необходимо да се вземе информирано решение във всеки отделен случай.

Механизми за синхронизация. Използване на механизма за прекъсване

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

Инструкцията Interrupt Disable забранява на процесора да реагира на сигнал за прекъсване. Този сигнал или се игнорира, или се поставя на опашка за по-късна обработка.

Такова решение не е ефективно, защото всичко се свежда до решение с една задача.

Този недостатък е лишен от двустепенна схема.

Механизми за синхронизация. Двустепенна схема

Критичен ресурс е свързан със специална променлива, която характеризира неговото състояние (зает или свободен). Съответно се предполага, че преди стартиране на първоначалния процес трябва да се провери състоянието на променливата. Ако ресурсът е свободен, маркирайте ресурса като зает и след употреба го освободете.

В тази формулировка променливата на състоянието също е критичен ресурс и при работа с нея също е необходимо да се осигури режим на взаимно изключване. Съответно, преди да влезете в основната критична област, е необходимо да въведете критичната област спрямо променливата на състоянието.

В този случай може ефективно да се използва механизмът за блокиране на прекъсванията. Работата на спомагателната променлива може да се извърши в режим на блокиране на прекъсване. Тъй като променливата на състоянието е общаозначава, че не зависи от вида на ресурса, тогава работата с него може да се реализира като функция на ОС.

Използването на спомагателни променливи донякъде усложнява логиката на внедряване, тъй като връзката между променливата на състоянието и защитения ресурс съществува само във въображението на разработчика.

При прилагането на двуетапна схема е необходимо да се реши какво да се прави с процеси, които при навлизане в спомагателна критична зона откриват, че основният ресурс е зает. На практика се реализират два режима: активно и пасивно изчакване. В случай на активно изчакване процесът открива заетост и процесът трябва да излезе от посочения критичен регион и да опита отново след известно време. В случай на пасивно изчакване, процесът влиза в опашка, от която ОС ще избере, когато ресурсът бъде освободен. Пример: заключване на файл.

Механизми за синхронизация. Семафорите на Дейкстра

Семафорът принадлежи към средствата за синхронизация от ниско ниво, работи по двустепенна схема в режим на пасивно изчакване.

Семафоре целочислена променлива, върху която се извършват два типа операции: отваряне и затваряне. Операцията за отваряне увеличава стойността на семафора с 1, операцията за затваряне я намалява с 1. Ако стойността на семафора е по-голяма от 0, тогава той се счита за отворен, а ако е равен на 0, тогава затворен.

Ако даден процес извърши операция за затваряне на отворен семафор, процесът продължава работата си, в противен случай процесът се поставя в режим на заспиване. Ако процес отвори семафора и има чакащ процес в опашката за изчакване, той преминава от състояние на готовност.

Примитивите са неделими операции. Когато се опитвате да изпълните примитив на семафор от различни процеси, само едно действие, извършено от нишката, ще успее и не е известно кое.

Механизми за синхронизация. Решаване на проблема с повторното активиране

При внедряването на семафори е необходимо да се реши проблемът с повторното активиране - да се определят правилата за поведение на процес, който е избран от чакащата опашка и влиза в състояние на готовност в резултат на отваряне на семафора.

Има 2 варианта:

- процесът трябва да изпълни отново операцията за затваряне (като се има предвид, че опитът е неуспешен)

- при преминаване към опашката за готовност процесът се маркира като успешно завършен, т.е. изпълнението му ще започне със следващата команда.

Възможни са безизходни ситуации.

1) Нека процес 2 завърши успешно операцията за затваряне, стойност на семафора = 0, след което процес 1 се опитва да извърши операцията за затваряне (неуспешно), т.е. процес 1 спира при семафора. Стойност семафор = -1. При излизане от крит. регион, процес 2 отваря семафора, стойност на семафора = 0. Процес 1 отива на готовата опашка. Ако изпълни отново операцията за затваряне, стойността на семафора е = -1 и първият процес ще спре. Съответно опит на 2-ри процес да влезе в крит. районът също ще бъде блокиран.

2) Нека процес 2 отвори семафора, т.е. семафорна стойност =0. Ако процесът 2 се опита да затвори семафора отново, той ще спре и стойността на семафора ще стане -1. Първият процес, при преминаване към активно състояние, влиза в крит. регион и при излизане задава стойността на семафора = 0. "Освободеният" 2-ри процес също получава отново критика. регион, отваря семафор, стойност на семафор =1.

Механизми за синхронизация. Семафорни модификации

Множество - характеристика на този механизъм е възможността да обработва няколко семафора в рамките на един примитив наведнъж. Операцията P затваря семафорите и се счита за завършена, ако и двата семафора са били отворени.

Броене - в тази модификация при всяко изпълнение на примитива е разрешено да се променя броячът на семафора със стойност, по-голяма от единица. Първоначалната стойност е зададена равна на броя четци. Всеки читател затваря семафора с 1, а пишещият го отваря максимално.

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

Тестови семафори - за тази модификация е въведена сложната логика на примитива V. Като параметри освен семафора е посочена стойността R, с която трябва да се промени стойността и стойността Q, с която се сравнява новата стойност на брояча на семафора. Ако получената разлика > 0 - процесът продължава, в противен случай спира.