На головну

Реалізація моніторів та надсилати електронні листи за допомогою семафорів

  1. III. Рішення логічних задач за допомогою міркувань
  2. Аварійні режими в енергосистемах передачі і розподілу електричної енергії.
  3. Адаптації до паразитичного способу життя. Цикли розвитку паразитів. Шляхи передачі збудників.
  4. Алгоритм знаходження екстремумів функції за допомогою другого достатньої умови екстремуму.
  5. Аналіз часу реакції системи передачі SDH при приймальних випробуваннях
  6. АНАЛІЗ ЗА ДОПОМОГОЮ ТАБЛИЦЬ
  7. АНАЛІЗ ЗА ДОПОМОГОЮ ТАБЛИЦЬ

1. Реалізація моніторів, використовуючи семафори Для цього нам потрібно вміти реалізовувати взаємовиключення при вході в монітор и умовні змінні. візьмемо семафор mutex з початковим значенням 1 для реалізації взаємовиключення при вході в монітор і по одному семафора ci для кожного умовної змінної. Крім того, для кожної умовної змінної заведемо лічильник fi для індикації наявності очікують процесів. Коли процес входить в монітор, Компілятор буде генерувати виклик функції monitor_enter, яка виконує операцію P над семафором mutex для даного монітора. При нормальному виході з монітора (Тобто при виході без виклику операції signal для умовної змінної ) Компілятор буде генерувати виклик функції monitor_exit, яка виконує операцію V над цим семафором.

Для виконання операції wait над умовної змінної компілятор буде генерувати виклик функції wait, яка виконує операцію V для семафора mutex, дозволяючи іншим процесам входити в монітор, І виконує операцію P над відповідним семафором ci, Блокуючи викликав процес. Для виконання операції signal над умовної змінної компілятор буде генерувати виклик функції signal_exit, яка виконує операцію V над асоційованим семафором ci (Якщо є процеси, які очікують відповідного події), і вихід з монітора, Минаючи функцію monitor_exit.

Semaphore mutex = 1;

void monitor_enter () {

P (mutex);

}

void monitor_exit () {

V (mutex);

}

Semaphore ci = 0;

int fi = 0;

void wait (i) {

fi= fi + 1;

V (mutex);

P (ci);

fi= fi - 1;

}

void signal_exit (i) {

if (fi) V (ci);

else V (mutex);

}

Зауважимо, що при виконанні функції signal_exit, якщо хто-небудь чекав цієї події, процес залишає монітор без збільшення значення семафора mutex, не дозволяючи тим самим всім процесам, крім розбудженого, увійти в монітор. Це збільшення зробить розбуджений процес, коли покине монітор звичайним способом або коли виконає нову операцію wait над будь-якої умовної змінної.

2. Розглянемо тепер, як реалізувати передачу повідомлень, використовуючи семафори. Виділимо в пам'яті, що досить велику область під зберігання повідомлень, там же будемо записувати, скільки порожніх і заповнених осередків знаходиться в буфері, зберігати посилання на списки процесів, які очікують читання і пам'яті. Взаємовиключення при роботі з пам'яттю, що будемо забезпечувати семафором mutex. Також заведемо по одному семафора ci на взаємодіє процес, для того щоб забезпечувати блокування процесу при спробі читання з пустого буфера або при спробі запису в переповнений буфер. Подивимося, як такий механізм буде працювати. Почнемо з процесу, який бажає отримати повідомлення.

Процес-одержувач з номером i перш за все виконує операцію P (mutex), отримуючи в монопольне володіння пам'ять, що розділяється. Після чого він перевіряє, чи є в буфері повідомлення. Якщо немає, то він заносить себе в список процесів, які очікують повідомлення, виконує V (mutex) і P (ci). Якщо повідомлення в буфері є, то він читає його, змінює лічильники буфера і перевіряє, чи є процеси в списку процесів, спраглих записи. Якщо таких процесів немає, то виконується V (mutex), і процес-одержувач виходить з критичної області. Якщо такий процес є (з номером j), то він видаляється з цього списку, виконується V для його семафора cj, І ми виходимо з критичного району. Прокинувся процес починає виконуватися в критичному районі, так як mutex у нас має значення 0 і ніхто більше не може потрапити в критичний район. При виході з критичного району саме розбуджений процес зробить виклик V (mutex).

 



Монітори | Реалізація семафорів і моніторів за допомогою черг повідомлень

Інформаційна валентність процесів і засобів зв'язку | буферизація | Надійність засобів зв'язку | Нитки виконання. Способи організації ниток. | Interleaving, race condition і взаємовиключення | Вимоги, що пред'являються до алгоритмів | заборона переривань | Алгоритм булочної (Bakery algorithm) | Команда Test-and-Set (перевірити і привласнити 1) | Рішення проблеми producer-consumer за допомогою семафорів |

© um.co.ua - учбові матеріали та реферати