Warum sollten Sie einen Monitor anstelle eines Semaphors verwenden?

11

Ich besuche derzeit den gleichzeitigen Programmierkurs an meiner Universität und wir haben kürzlich begonnen, über das Konzept eines Monitors zu sprechen. Obwohl ich die Notwendigkeit des gegenseitigen Ausschlusses verstehe, verstehe ich nicht, warum ich dafür einen Monitor verwenden würde.

So wie ich es verstehe, garantiert ein Monitor, dass sich zu jeder Zeit genau ein oder kein Prozess im kritischen Bereich befindet. Genau das können wir mit einem Semaphor erreichen. Darüber hinaus implementieren wir Monitore (oder zumindest eine Möglichkeit, sie zu implementieren) mit Semaphoren.

Warum sollte ich also etwas implementieren, das genau dasselbe tut wie ein Semaphor mit einem Semaphor? Welche Vorteile bekomme ich?

Dennis Hein
quelle

Antworten:

8

Sie sind nahezu austauschbar und können aus dem anderen gebaut werden. Es ist etwas sprachabhängig, was implementiert / bevorzugt wird (z. B. hat Java integrierte Monitore mit dem Schlüsselwort "synchronize"). Das Semaphor wird jedoch aus folgenden Gründen und Unterschieden als "untergeordnete" Entität als der Monitor betrachtet:

Sowohl Monitore als auch Semaphore werden für den gleichen Zweck verwendet - die Thread-Synchronisation. Monitore sind jedoch einfacher zu verwenden als Semaphoren, da sie alle Details der Schlosserfassung und -freigabe verarbeiten. Eine Anwendung, die Semaphoren verwendet, muss alle Sperren aufheben, die ein Thread beim Beenden der Anwendung erworben hat. Dies muss von der Anwendung selbst durchgeführt werden. Wenn die Anwendung dies nicht tut, kann kein anderer Thread, der die gemeinsam genutzte Ressource benötigt, fortfahren.

Ein weiterer Unterschied bei der Verwendung von Semaphoren besteht darin, dass jede Routine, die auf eine gemeinsam genutzte Ressource zugreift, vor der Verwendung der Ressource explizit eine Sperre erwerben muss. Dies kann leicht vergessen werden, wenn die Routinen für Multithreading codiert werden. Monitore erhalten im Gegensatz zu Semaphoren automatisch die erforderlichen Sperren. [1]

Siehe auch die hoch bewertete Stack Overflow-Antwort Semaphore vs. Monitors - was ist der Unterschied? mit einer großartigen / unvergesslichen Analogie zu öffentlichen Toiletten und Fahrradständern.

vzn
quelle
Ich mache im Grunde das Gleiche wie mit Semaphoren, aber ich nehme dem Programmierer das Sperren / Entsperren weg, indem ich ihm eine Schnittstelle gebe, über die er auf die Daten zugreifen (und sie bearbeiten) und gleichzeitig den gegenseitigen Ausschluss sicherstellen kann. Ein Vorteil wäre sauberer Code und möglicherweise weniger Fehler im Code, da Sie das Sperren / Entsperren nicht vergessen können (was zu möglicherweise beschädigten Daten führt). Ist das richtig oder fehlt mir etwas?
Dennis Hein
Der Text, auf den verwiesen wird, ist irreführend und besagt, dass bei Verwendung von Monitoren keine Sperrenerfassung und -freigabe erforderlich ist. Dies mag zutreffen, wenn das synchronisierte Schlüsselwort von Java verwendet wird. Laut en.wikipedia.org/wiki/Monitor_(synchronization) haben die Bedingungsvariablen des Monitors normalerweise Warte- / Signalaufrufe, die auch in der Anwendung implementiert werden sollten. Mutex muss jedoch nicht in der Anwendung verarbeitet werden, sodass die Verwendung möglicherweise einfacher ist.
Samutamm
5

In der heutigen Vorlesung haben wir schließlich besprochen, warum Sie einen Monitor anstelle eines Semaphors verwenden würden.

Im Grunde kommt es darauf an: Der Monitor und das Semaphor sind gleichermaßen ausdrucksstark, dh Sie können eine Lösung für ein Problem mit einem Monitor finden, auf dem ursprünglich ein Semaphor verwendet wurde, und umgekehrt.

Nun, das wussten wir bereits. Warum sollten Sie also einen Monitor anstelle eines Semaphors verwenden?

Persönliche Präferenz. Normalerweise würde eine Desktop-Anwendung Monitore verwenden, was weniger Möglichkeiten für Fehler lässt, aber als Kompromiss eine relativ aufgeblähte Struktur aufweist. Semaphoren hingegen werden häufig in Betriebssystemen verwendet, da sie eine leichte Struktur darstellen, aber mehr Möglichkeiten für Fehler lassen.

Ich denke, wir können daraus schließen, dass es eine Situationsentscheidung ist, ob Sie einen Monitor oder ein Semaphor benötigen / wollen. Wenn Sie ein Echtzeitsystem erstellen, möchten Sie möglicherweise ein Semaphor verwenden. Wenn Sie ein Office-Programm erstellen, können Sie auch einen Monitor verwenden.

Dennis Hein
quelle
1

Werfen Sie einen Blick auf zB "Das kleine Buch der Sempaphores"von Allen B. Downey. Es gibt viele Synchronisationsprobleme an und löst sie. Überprüfen Sie insbesondere die verpfuschten Lösungen, und Sie werden sehen, dass Semaphoren ein Mechaismus auf sehr niedriger Ebene sind, sehr mächtig, aber extrem leicht zu missbrauchen, wenn einfache Fehler schreckliche Folgen haben (was durch die inhärente nichtdeterministische Funktionsweise gleichzeitiger Programme noch verschlimmert wird). Es ist zB leicht zu vergessen, den gegenseitigen Ausschluss durchzusetzen, mit dem falschen Semaphor zu arbeiten und so weiter. Monitore bieten vorgefertigte Lösungen für die am häufigsten verwendeten Fälle und bieten die meisten Vorteile der objektorientierten Programmierung (dh Sie wissen, dass der einzige Weg, mit den vom Monitor verwalteten Variablen in Konflikt zu geraten, in dessen Betrieb besteht). Der Nachteil ist, dass sie nicht einfach in nicht objektorientierte Sprachen nachgerüstet werden können.

vonbrand
quelle