Які основні відмінності між монітором та семафором ?
Які основні відмінності між монітором та семафором ?
Відповіді:
Монітор являє собою об'єкт , призначений для бути доступно з декількох потоків. Функції або методи об'єкта монітора примушують взаємне виключення, тому лише один потік може виконувати будь-яку дію на об'єкт в даний момент часу. Якщо в даний момент один потік виконує функцію-член об'єкта, то будь-який інший потік, який намагається викликати функцію-члена цього об'єкта, доведеться почекати, поки перший не закінчиться.
Семафор є об'єктом нижчого рівня. Ви можете цілком використовувати семафор для впровадження монітора. Семафор по суті є лише лічильником. Коли лічильник позитивний, якщо нитка намагається придбати семафор, то це дозволено, і лічильник зменшився. Коли нитка виконана, вона випускає семафор і збільшує лічильник.
Якщо лічильник вже дорівнює нулю, коли нитка намагається придбати семафор, то йому доведеться почекати, поки інша нитка звільнить семафор. Якщо кілька потоків чекають, коли нитка випускає семафор, то одна з них отримує її. Нитка, яка випускає семафор, не повинна бути тією самою ниткою, яка її придбала.
Монітор - це як громадський туалет. Одночасно може входити одна людина. Вони замикають двері, щоб не допустити, щоб хто-небудь інший зайшов, зробив свої речі, а потім розблокував їх, коли вони виходили.
Семафор - це як місце прокату велосипедів. У них є певна кількість велосипедів. Якщо ви спробуєте взяти напрокат велосипед, і у них є один безкоштовний, ви можете взяти його, інакше потрібно почекати. Коли хтось повертає свій велосипед, то хтось інший може взяти його. Якщо у вас є велосипед, ви можете подарувати його комусь іншому, щоб повернутися --- місце прокату велосипеда не байдуже, хто його поверне, якщо вони повернуть свій велосипед.
Наступне пояснення фактично пояснює, як очікування () і сигнал () монітора відрізняються від P і V семафору.
Очікування () і сигнал ( + ) операції на стан змінних в моніторі аналогічні P і V операції з підрахунку семафорів .
Оператор очікування може блокувати виконання процесу, тоді як оператор сигналу може призвести до розблокування іншого процесу. Однак є деякі відмінностіміж ними. Коли процес виконує операцію P, він не обов'язково блокує цей процес, оскільки підрахунок семафору може бути більшим за нуль. На противагу цьому, коли виконується оператор очікування, він завжди блокує процес. Коли завдання виконує операцію V на семафорі, вона або розблокує завдання, що чекає на цьому семафорі, або збільшує лічильник семафору, якщо немає завдання розблокувати. З іншого боку, якщо процес виконує оператор сигналу, коли немає іншого процесу для розблокування, це не впливає на змінну умови. Ще одна відмінність семафорів від моніторів полягає в тому, що користувачі, пробуджені операцією V, можуть відновити виконання невідкладно. Навпаки, користувачів, пробуджених сигналом, перезапускають лише тоді, коли монітор розблокований. В додаток,
Посилання: тут для подальшого читання. Сподіваюся, це допомагає.
Семафор дозволяє безлічі потоків (до заданого числа) отримувати доступ до спільного об'єкта. Монітори дозволяють взаємовиключний доступ до спільного об'єкта.
java.util.ArrayList
: це об'єкт чи контейнер з декількох об'єктів? Добре, що це одночасно. Тож чи підходить семафор для контролю доступу до нього? Я б сказав: ні.
Коли семафор використовується для захисту критичної області, між семафором і захищеними даними немає прямої залежності. Це є причиною того, що семафори можуть бути розповсюджені навколо коду, і чому легко забути зателефонувати зачекати або повідомити , і в цьому випадку результат, відповідно, буде порушувати взаємне виключення або постійно блокувати ресурс.
Навпаки, з монітором може трапитися більше цих поганих речей. Монітор втомився безпосередньо до даних (він інкапсулює дані), і, оскільки операції монітора є атомними діями, неможливо написати код, який може отримати доступ до даних без виклику протоколу введення. Протокол виходу викликається автоматично, коли робота монітора завершена.
Монітор має вбудований механізм синхронізації стану у вигляді змінної стану, перш ніж продовжувати. Якщо умова не виконується, процес повинен чекати, поки не буде повідомлено про зміну умови. Коли процес чекає синхронізації умов, реалізація монітора бере на себе питання про взаємне виключення та дозволяє іншому процесу отримати доступ до монітора.
Взяте з навчального матеріалу Відкритого університету M362, блок 3 "Взаємодіючий процес".
Семафор:
Використання лічильника або прапора для управління доступом до деяких спільних ресурсів у паралельній системі передбачає використання Semaphore .
Приклад:
Прапори розкривають лише поточний стан Ресурсу, без рахунку чи будь-якої іншої інформації про очікувані або запущені об’єкти на ресурсі.
Монітор:
Monitor синхронізує доступ до об'єкта, зв'язуючись з потоками , зацікавлених в об'єкті, попросивши їх доступ набуває або почекати якийсь - то умова , щоб стати правдою.
Приклад: