Взаимно изключване и синхронизация
Download
Report
Transcript Взаимно изключване и синхронизация
Съгласуване на нишки:
Взаимно изключване и
синхронизация
Съдържание
Принципи на съгласуването
(Concurrency)
Взаимно изключване: хардуерна
поддръжка
Семафори
Монитори
Подаване на съобщения
Проблем четящи/пишещи
Много процеси
В основата на проектирането на
съвременните операционни системи е
поддръжката на много процеси
Много програми, които се изпълняват
едновременно
Мултиобработка
Обработка на разпределени среди
Основната задача е съгласуването на
работата в системата
Управление на взаимодействието на всички тези
процеси
Съгласуване (Concurrency)
Concurrency се появява в:
Много приложения
Структурни приложения
Споделящи време
Разширение на модулния дизайн
Структурата на операционна система
ОС сами по себе си са реализирани като
множество от процеси и нишки
Ключови термини
Разделяне и припокриване на
процесите
Процесите могат да бъдат разделени
на части и изпълнени на един процесор.
Разделяне и припокриване на
процесите
И не само разделени на части, но и
припокрити при многопроцесорни системи
Трудности при реализацията
на Concurrency
Споделянето на глобални ресурси
Оптималното управление на заделени
ресурси
Трудно локализиране на програмни
грешки, тъй като резултатите не са
детерминирани и възпроизводими.
Пример
void echo()
{
chin = getchar();
chout = chin;
putchar(chout);
}
Пример: Multiprocessor
Process P1
.
chin = getchar();
.
chout = chin;
putchar(chout);
.
.
Process P2
.
.
chin = getchar();
chout = chin;
.
putchar(chout);
.
Прилагане на единичен
достъп
Ако приложим правилото: само един процес
да може да изпълнява дадеана функция в
дадено време:
P1 & P2 се изпълняват на отделни процесори
P1 влиза първи в echo,
P2 се опитва да влезе, но е блокиран – P2
изчаква
P1 приключва изпълнението
P2 се продължава след прекъсването и
изпълнява echo
Надпревара (Race Condition)
Race condition се появява, когато
Няколко прецеса или нишки изпълняват
четене и запис на данни
Крайният резултат зависи от реда на
изпълнение на процесите.
Изходът зависи от това кой последен
преодолява надпреварата.
Изисквания към
операционните системи
Какви изисквания към дизайна и
управлението възникват с появата на
concurrency?
ОС трявба да:
Следят различни процеси
Заделят и освобождават ресурси
Защитават данните и ресурсите от намеса
на други процеси.
Подсигурят това, че процесите и крайният
резултат са независими от скоростта на
Взаимодействия на процеси
Конкуренция между
процесите за ресурси
Три основни проблеми при контрол:
Нужда от взаимно изключване
Критични секции
Мъртва хватка (Deadlock)
Недостиг на ресурси (Starvation)
Изисквания за
взаимно изключване
Само един процес в даден момент се
разрешава в критична точка за ресурса
Процес, спиращ в некритична точка,
изпълнява прекъсването без намесата
на други процеси
Никакви “мъртви-хватки” (deadlock) или
недостиг на ресурси (starvation)
Изисквания за
взаимно изключване
Достъпът до критична точка на даден
процес не трябва да се забавя, когато
няма друг процес, който да я използава
Не се правят предположения за
относителна скорост на процеса или
броя на процесите
Процес е в критична секция само за
определено време
Съдържание
Принципи на съгласуването(Concurrency)
Взаимно изключване: Хардуерна
поддръжка
Семафори
Монитори
Предаване на съобшения
Проблем четящи/пишещи
Деактивиране на
прекъсванията
Еднопроцесорните системи само
позволяват разделянето на процеса на
части
Деактивиране на прекъсванията
Процесът се изпълнява, докато не извика услуга
на операционната система или докато не бъде
прекъснат
Деактивиране на прекъсванията гарантира
взаимно изключване
Няма да работи в мултипроцесорни архитектури
Псевдо-код
while (true) {
/*
/*
/*
/*
}
disable interrupts */;
critical section */;
enable interrupts */;
remainder */;
Специални инструкции
Инструкция Compare&Swap
Наречена още “compare and exchange
instruction”
Инструкция Exchange
Инструкция Compare&Swap
int compare_and_swap (int *word,
int testval, int newval)
{
int oldval;
oldval = *word;
if (oldval == testval) *word = newval;
return oldval;
}
Взаимно изключване (fig 5.2)
Exchange instruction
void exchange (int register, int
memory)
{
int temp;
temp = memory;
memory = register;
register = temp;
}
Exchange Instruction
(fig 5.2)
Хардуерно взаимно
изключване: Предимства
Приложимо за произволен брой
процеси на единичен процесор или
повече процесори, споделящи
основната памет
Просто и поради това лесно да се
проверява
Може да се използва за поддръжка на
множество критични секции
Хардуерно взаимно
изключване: Недостатъци
Busy-waiting състоянията консумират
процесорно време
Възможен е недостиг на ресурси, когато
даден процес напусне критична секция
и има повече от един други чакащи
процеси.
На някои процеси може да им се отказва
достъп до безкрай.
Възможни са мъртви хватки
Съдържание
Принципи на съгласуването
(Concurrency)
Взаимно изключване: Хардуерна
поддръжка
Семафори
Монитори
Предаване на съобщения
Проблем четящи/пишещи
Семафор
Семафор:
Цяла стойност, използвана за
сигнализация между процеси.
Само три операции могат да се
извършват върху семафор, всички от
които са за атомични:
инициализация
Намаляване - Decrement (semWait)
Увеличаване - Increment. (semSignal)
Пример за семафор
Пример за двоичен семафор
Strong/Weak семафори
За съхранение на процесите, чакащи
семафора, се използва опашка
В какъв ред процесите се премахват от
опашката?
Strong Семафори използват FIFO
Weak семафори не определят реда на
напускането на процеса от опашката с
чакащи процеси
Пример за механизма на
Strong семафор
Пример за механизъм
на Семафор
Взаимно изключване,
използващо семафори
Процеси, използващи
семафори
Проблемът
Производител/Потребител
Генерално решение:
Един или повече производители генерират данни
и ги поставят в буфер
Един потребител взима данните от буфера в
същото време
Само един от производителите или потребителите
могат да ползват буфер в даден момент
Проблем:
Трябва да се подсигури, че производителят не
може да добавя данни в пълен буфер и
потребителят не може да вземе данни от празен
буфер.
Producer/Consumer Animation
Функции
• Да приемем един безкраен буфер b с линеен
масив от елементи
Producer
while (true) {
/* produce item v */
b[in] = v;
in++;
}
Consumer
while (true) {
while (in <= out)
/*do nothing */;
w = b[out];
out++;
/* consume item w */
}
Буфер (Buffer)
Incorrect Solution
Possible Scenario
Correct Solution
Семафори
Bounded Buffer
Semaphores
Функции в ограничен буфер
• .
Producer
while (true) {
/* produce item v */
while ((in + 1) % n == out)
do nothing */;
b[in] = v;
in = (in + 1) % n
}
Consumer
while (true) {
while (in == out)
/*
/* do nothing */;
w = b[out];
out = (out + 1) % n;
/* consume item w */
}
Демонстрация
Анимации
Производител/Потребител
(Producer/Consumer)
Илюстрира дейността на производителпотребител буфера.
Bounded-Buffer Problem Using Semaphores
Илюстрира ограничен буфер за проблема
производител/потребител и използването на
семафори.
Съдържание
Принципи на съгласуването
(Concurrency)
Взаимно изключване: Хардуерна
поддръжка
Семафори
Монитори
Предаване на съобщения
Проблемът четящи/пишещи
Монитори
Мониторът е програма, която осигурява
сходна функционалност както
семафорите, но е по-лесна за
контролиране.
Реализирана е на редица програмни
езици, включително
Concurrent Pascal, Pascal-Plus,
Modula-2, Modula-3, и Java.
Основни характеристики
Локалните променливи са достъпни
само от монитора
Процесът влиза в монитора чрез
извикване на една от неговите
процедури
Само един процес може да се
изпълнява в монитора в дадено време
Синхронизация
Синхронизацията е постигната чрез
condition variables в рамките на
монитора
Достъпни само от монитора.
Функции на монитора:
Cwait(c): Прекратява изпълнението на
извикващият я процес при условие c
Csignal(c) Възстановява изпълнението на
процес, блокиран след cwait при същото
условие
Структура на монитор
Решение на проблема
“ограничен буфер” с монитор
Решение, използващо
монитор
Bounded
Buffer Monitor
Съдържание
Принципи на съгласуването
(Concurrency)
Взаимно изключване: Хардуерна
поддръжка
Семафори
Монитори
Предаване на съобщения
Проблем четящи/пишещи
Взаимодействие на процеси
При взаимодеиствие на процеси,
трябва да бъдат изпълнени две
основни изисквания:
синхронизация
комуникация.
Предаването на съобшения е едно
решение на второто изискване
Допълнителен бонус: Работи със
споделена памет и разпределени системи
Предаване на съобщения
Основната функция на обмена на
съобщения се осигурява във вид на
двойка примитиви:
send (destination, message)
receive (source, message)
Синхронизация
Комуникацията изисква синхронизация
Подателят трябва да изпрати преди
получателят да може да получи
съобщението
Какво се случва в процеса след като
обработи send/receive primitive?
Подателят и получателят може и да се
блокират, чакайки за съобщение (waiting for
message)
Блокиращ send,
блокиращ receive
Подателят и получателят се блокират
докато съобщението не бъде доставено
Познато като rendezvous (среща)
Дава възможност за строга
синхронизация между процеси.
Неблокиращ Send
По-естествен е за повечето програмни
задачи, които се изпълняват и
съгласуват едновременно.
Неблокиращ send, блокиращ receive
Подателят продължава изпълнението си
Получателят е блокиран докато изисканото
съобщение не бъде получено
Неблокиращ send, неблокиращ receive
Никоя от страните в комуникацията не
трябва да чака
Адресиране
Изпращащият процес се нуждае от
възможност да определи кои процес
трябва да получи съобщението
Директно адресиране
Индиректно адресиране
Директно адресиране
Send примитивата включва специфичен
идентификатор на целевия процес
Receive примитивата би трябвало да
знае предварително от кой процес
очаква съобщение
Receive примитивата би трябвало да
използва source parameter, за да върне
стойност, когато операцията по
получаване на съобщението е
изпълнена.
Индиректно адресиране
Съобщенията се пращат на споделена
структура от данни, състояща се от
опашки
Опашките се наричат mailboxes
Един процес изпраща съобщение до
mailbox, а друг процес взима
съобщението от “пощенската кутия”
(mailbox).
Индиректна комуникация
на процеси
Обобщен формат на
съобщението
Взаимно изключване,
реализирано със съобщения
Производител/Потребите
със съобщения
Съдържание
Принципи на съгласуването
(Concurrency)
Взаимно изключване: Хардуерна
поддръжка
Семафори
Монитори
Предаване на съобщения
Проблем четящи/пишещи
Проблем четящи/пишещи
Данните са споделени от много процеси
Някои процеси могат само да четат данни,
други само да записват данни
Условия, които трябва да се изпълнят:
1.
2.
3.
Множеството читатели могат да четат даден файл
наведнъж.
Само един “писател ” може да записва данни във
файла в дадено време
Ако “писател” записва във файл, нито един
“читател” не може да го прочете.
Readers имат приоритет
Writers имат приоритет
Writers имат приоритет
Обмен на съобщения
Обмен на съобщения