Чому б ви використовували монітор замість семафору?


11

Зараз я відвідую паралельний курс програмування в моєму університеті, і ми нещодавно заговорили про концепцію монітора. Хоча я розумію необхідність взаємного виключення, я не розумію, для чого я б використовував монітор для цього.

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

То чому б я реалізував щось таке, що робить те саме, що і семафор із семафором? Які переваги я отримую?

Відповіді:


8

Вони майже взаємозамінні, і одне можна побудувати з іншого. Це реально / бажано дещо залежно від мови (наприклад, Java має вбудовані монітори за допомогою ключового слова "синхронізувати"). Однак семафор вважається сутністю "нижчого рівня", ніж монітор, з наступних причин та відмінностей:

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

Ще одна відмінність використання семафорів полягає в тому, що кожен розпорядок доступу до спільного ресурсу повинен явно придбати aa lock перед використанням ресурсу. Це можна легко забути, кодуючи підпрограми, що стосуються багатопотокової роботи. Монітори, на відміну від семафорів, автоматично набувають необхідні замки. [1]

Дивіться також відповідь з високою оцінкою відповіді на переповнення стека Semaphore vs. Monitors - яка різниця? з чудовою / незабутньою аналогією з громадськими туалетами та підставками для велосипедів.


Я в основному роблю те саме, що я робив би з семафорами, але я забираю необхідність блокування / розблокування у програміста, надаючи йому інтерфейс, що дозволяє йому отримувати доступ (і маніпулювати) даними, забезпечуючи при цьому взаємне виключення. Вигода буде чистішим кодом і потенційно меншими помилками в коді, оскільки ви не можете забути Блокувати / Розблокувати (в результаті чого дані можуть бути пошкоджені). Це правильно чи я щось пропускаю?
Денніс Хайн

Текст, що посилається на оману, вводить в оману, кажучи, що немає необхідності в придбанні та звільнення блокування під час використання моніторів. Це може бути правдою при використанні синхронізованого ключового слова Java, але відповідно до en.wikipedia.org/wiki/Monitor_(synchronization) , зазвичай, змінні умови монітора мають виклики очікування / сигналу, які також повинні бути реалізовані в додатку. Але не потрібно обробляти mutex у застосуванні, тому можливо простіше у використанні.
самутам

5

Ми нарешті обговорили, чому б ви сьогодні використовували монітор замість семафору на лекції.

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

Ну, ми це вже знали, то чому б ти використовував монітор замість семафору?

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

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


1

Погляньте, наприклад, на "Маленьку книжку семпафорів"автор Аллен Б. Дауні. він констатує та вирішує безліч проблем синхронізації. Особливо перегляньте узагальнені рішення, і ви побачите, що семафори - це дуже низький рівень механізму, дуже потужний, але надзвичайно простий у використанні, коли прості помилки мають жахливі наслідки (ще гірше через невідповідне функціонування одночасних програм). Наприклад, легко забути примусове взаємне виключення, дія на неправильному семафорі тощо. Монітори пропонують попередньо розроблені рішення для найбільш часто використовуваних випадків і несуть із собою більшість переваг об'єктно-орієнтованого програмування (тобто ви знаєте, що єдиний спосіб зіпсувати змінні, якими керує монітор, - це його операції). Недоліком є ​​те, що вони не можуть бути легко переобладнані на об'єктивні мови,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.