Семафори - Life-Prog

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

Първата голяма работа върху паралелните изчисления беше монографията на Дайкстра [DIJK65], който разглежда разработката на операционната система като изграждане на набор от последователни процеси за сътрудничество и създаване на ефективни и надеждни механизми за подпомагане на това сътрудничество. Същите тези механизми се прилагат лесно от потребителските процеси, стига процесорът и операционната система да ги направят публични. Основният принцип е, че два или повече процеса могат да си сътрудничат чрез прости сигнали, така че в определен момент процесът да може да спре, докато изчака съответния сигнал. Изискванията за сътрудничество от всякаква сложност могат да бъдат изпълнени чрез подходяща структура на сигнала. Сигнализирането използва специални променливи, наречени семафори. За да изпрати сигнал през семафори, процесът изпълнява примитивите за сигнал(и), а за да получи сигнал, той изпълнява примитивите за изчакване. В последния случай процесът се спира до предаване на съответния сигнал.2

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

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

Няма други начини да получите информация за стойността на семафор или да промените стойността му, различни от изброените.

Листинг 5.5 предоставя по-формална дефиниция на семафорните примитиви. Предполага се, че примитивите за изчакване и сигнал са атомарни, т.е. те не могат да бъдат прекъсвани и всяка от подпрограмите може да се разглежда като отделна стъпка. По-ограничена версия на семафор, известна като двоичен семафор, е показана в листинг 5.6. Един двоичен семафор може да приема само стойности 0 или 1. По принцип прилагането на двоичен семафор трябва да е по-лесна задача; може също така да се покаже, че всички проблеми, които могат да бъдат решени с помощта на обикновени семафори, могат да бъдат решени и с помощта само на двоични семафори (вижте задача 5.13).

Списък 5.5. Дефиниране на семафорни примитиви

struct semaphore int count; queueType опашка; > недействително чакане (семафор s) s.count--; if(s.count 0: Стойността на s.count определя броя процеси, които могат да изпълнят изчакване без спиране на процеса (ако приемем, че няма междинни извиквания на сигнал(и).

Назад към индекса: Операционни системи