Семафор проти моніторів - у чому різниця?


233

Які основні відмінності між монітором та семафором ?


8
Ви можете розглядати монітор як бінарний семафор.
Максим Єгорушкін


1
Будь ласка, перегляньте цю сторінку albahari.com/threading/part2.aspx . Я читав цю статтю, найкращу, яку я коли-небудь читав на Threading
Shantanu Gupta

5
Я не думаю, що ти маєш рацію, Максиме. Семафор - це структура нижчого рівня, якщо я не помиляюся, тоді як Монітор - це повномасштабний об’єкт. Я пам’ятаю, що ми коротко переглядали монітори в моєму класі операційних систем у коледжі, але я не пам’ятаю, як Монітор відрізнявся від Mutex, окрім того, що він був об’єктно-орієнтованим. Я пам’ятаю, одну проблему можна було б використовувати за допомогою моніторів, але ми не могли використовувати цей самий метод у класі, через обмеження мови С.
user919860

1
Семафор і Монітор - це дуже відмінні, але при цьому еквівалентні по потужності в тому сенсі, що ви можете реалізовувати один від іншого. Ви можете прочитати оригінальний документ Хоара, який доводить їх еквівалентність звідси
Thanh DK

Відповіді:


529

Монітор являє собою об'єкт , призначений для бути доступно з декількох потоків. Функції або методи об'єкта монітора примушують взаємне виключення, тому лише один потік може виконувати будь-яку дію на об'єкт в даний момент часу. Якщо в даний момент один потік виконує функцію-член об'єкта, то будь-який інший потік, який намагається викликати функцію-члена цього об'єкта, доведеться почекати, поки перший не закінчиться.

Семафор є об'єктом нижчого рівня. Ви можете цілком використовувати семафор для впровадження монітора. Семафор по суті є лише лічильником. Коли лічильник позитивний, якщо нитка намагається придбати семафор, то це дозволено, і лічильник зменшився. Коли нитка виконана, вона випускає семафор і збільшує лічильник.

Якщо лічильник вже дорівнює нулю, коли нитка намагається придбати семафор, то йому доведеться почекати, поки інша нитка звільнить семафор. Якщо кілька потоків чекають, коли нитка випускає семафор, то одна з них отримує її. Нитка, яка випускає семафор, не повинна бути тією самою ниткою, яка її придбала.

Монітор - це як громадський туалет. Одночасно може входити одна людина. Вони замикають двері, щоб не допустити, щоб хто-небудь інший зайшов, зробив свої речі, а потім розблокував їх, коли вони виходили.

Семафор - це як місце прокату велосипедів. У них є певна кількість велосипедів. Якщо ви спробуєте взяти напрокат велосипед, і у них є один безкоштовний, ви можете взяти його, інакше потрібно почекати. Коли хтось повертає свій велосипед, то хтось інший може взяти його. Якщо у вас є велосипед, ви можете подарувати його комусь іншому, щоб повернутися --- місце прокату велосипеда не байдуже, хто його поверне, якщо вони повернуть свій велосипед.


162
+1 Відмінна аналогія з громадськими санвузлами та місцем прокату велосипедів. Я ніколи не забуду різницю між двома зараз.
Друпад Панчал

4
Здається, ваша відповідь суперечить stackoverflow.com/a/7336799/632951 .. тому хто правий?
Pacerier

6
@Pacerier: Я :-) Єдина суперечність - річ високого / низького рівня. Ви можете побудувати монітор із семафорів, це просто не дуже охайно, саме тому, що монітор - це структура вищого рівня, ніж семафор. Семафор - це лише стійка з очікуванням. Пропоную прочитати "Маленьку книгу семафорів
Ентоні Вільямс

3
@AnthonyWilliams: Мабуть, я сумніваюся у думці, що ви можете створювати монітори лише з семафорів. Інший спосіб також можливий, і через це ми не можемо сказати, що монітор є сутністю вищого рівня, ніж семафори.
Kavish Dwivedi

5
Так, ви можете побудувати семафор з монітора. Ви завжди можете створювати об'єкти низького рівня з об'єктів високого рівня. Матеріал високого / низького рівня стосується можливостей та обсягу експлуатації, а не про те, який може бути використаний для побудови іншого.
Ентоні Вільямс

11

Наступне пояснення фактично пояснює, як очікування () і сигнал () монітора відрізняються від P і V семафору.

Очікування () і сигнал ( + ) операції на стан змінних в моніторі аналогічні P і V операції з підрахунку семафорів .

Оператор очікування може блокувати виконання процесу, тоді як оператор сигналу може призвести до розблокування іншого процесу. Однак є деякі відмінностіміж ними. Коли процес виконує операцію P, він не обов'язково блокує цей процес, оскільки підрахунок семафору може бути більшим за нуль. На противагу цьому, коли виконується оператор очікування, він завжди блокує процес. Коли завдання виконує операцію V на семафорі, вона або розблокує завдання, що чекає на цьому семафорі, або збільшує лічильник семафору, якщо немає завдання розблокувати. З іншого боку, якщо процес виконує оператор сигналу, коли немає іншого процесу для розблокування, це не впливає на змінну умови. Ще одна відмінність семафорів від моніторів полягає в тому, що користувачі, пробуджені операцією V, можуть відновити виконання невідкладно. Навпаки, користувачів, пробуджених сигналом, перезапускають лише тоді, коли монітор розблокований. В додаток,

Посилання: тут для подальшого читання. Сподіваюся, це допомагає.


6

Відповідь однієї лінії:

Монітор: керує одночасно лише одним потоком на моніторі. (потрібно придбати замок для виконання єдиного потоку)

Семафор: замок, який захищає спільний ресурс. (потрібно придбати замок для доступу до ресурсу)


5

Семафор дозволяє безлічі потоків (до заданого числа) отримувати доступ до спільного об'єкта. Монітори дозволяють взаємовиключний доступ до спільного об'єкта.

Монітор

Семафор


10
Але, чим би монітор відрізнявся від MutEx? Блокування взаємного виключення робить те саме, що і семафор, але дозволяє лише одному потоку одночасно отримати доступ до Критичного регіону.
user919860

2
Так, в чому різниця між mnitor та mutex?
Pacerier

2
Варто зазначити, що Семафори не контролюють доступ до спільного об’єкта, а скоріше спільний ресурс (який буде містити кілька об'єктів).
xbonez

@xbonez: Якщо ми подивимось java.util.ArrayList: це об'єкт чи контейнер з декількох об'єктів? Добре, що це одночасно. Тож чи підходить семафор для контролю доступу до нього? Я б сказав: ні.
dma_k

У самій прийнятій відповіді зазначається, що Монітор здійснює взаємне виключення. Будь ласка, дивіться "Функції або методи об'єкта монітора будуть застосовувати взаємне виключення, тому лише один потік може виконувати будь-яку дію на об'єкт в даний момент часу"
achoora

2

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

Навпаки, з монітором може трапитися більше цих поганих речей. Монітор втомився безпосередньо до даних (він інкапсулює дані), і, оскільки операції монітора є атомними діями, неможливо написати код, який може отримати доступ до даних без виклику протоколу введення. Протокол виходу викликається автоматично, коли робота монітора завершена.

Монітор має вбудований механізм синхронізації стану у вигляді змінної стану, перш ніж продовжувати. Якщо умова не виконується, процес повинен чекати, поки не буде повідомлено про зміну умови. Коли процес чекає синхронізації умов, реалізація монітора бере на себе питання про взаємне виключення та дозволяє іншому процесу отримати доступ до монітора.

Взяте з навчального матеріалу Відкритого університету M362, блок 3 "Взаємодіючий процес".


Крім того, що, хоча семафори досить широко доступні на мові і представлені в підручниках як свого родом змінного з обмеженими атомними операторами, семафором є окремим випадком монітора - тому що це свій роду змінного з обмеженими атомними операторами, тому що це монітор. Вищенаведені аргументи про те, що семафори "нижчого рівня" є сумлінними.
philipxy

2

Семафор:

Використання лічильника або прапора для управління доступом до деяких спільних ресурсів у паралельній системі передбачає використання Semaphore .

Приклад:

  1. Лічильник, що дозволяє лише 50 пасажирам придбати 50 місць (загальний ресурс) будь-якого театру / автобуса / поїзда / їзди на розвазі / класу. І дозволити нового Пасажира, лише якщо хтось звільнить місце.
  2. Бінарний прапор із зазначенням вільного / зайнятого статусу будь-якої ванної кімнати.
  3. Світлофори - хороший приклад прапорів. Вони контролюють потік, регулюючи проїзд транспортних засобів по дорогах (Спільний ресурс)

Прапори розкривають лише поточний стан Ресурсу, без рахунку чи будь-якої іншої інформації про очікувані або запущені об’єкти на ресурсі.

Монітор:

Monitor синхронізує доступ до об'єкта, зв'язуючись з потоками , зацікавлених в об'єкті, попросивши їх доступ набуває або почекати якийсь - то умова , щоб стати правдою.

Приклад:

  1. Батько може виконувати функції монітора для своєї дочки, дозволяючи їй побачитись лише з одним хлопцем за один раз.
  2. Шкільний вчитель, що використовує естафету, щоб дозволити говорити лише одній дитині в класі.
  3. Нарешті, технічний, транзакції (через потоки) на об'єкті акаунта синхронізовані для підтримки цілісності.

Я думаю, що світлофор на дорожньому хресті - це також двійковий прапор: або автомобілі на одній дорозі, або на ортогональній дорозі можуть їздити (взаємовиключні), тому приклад (3) такий же, як (2). Також я думаю, що ці приклади є кутовим випадком для семафорів (тривіальний випадок), який можна реалізувати за допомогою монітора. У вікіпедії є більш типові приклади .
dma_k
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.