Wo soll ich mit einer großen gleichzeitigen Programmieraufgabe beginnen? [geschlossen]


8

Meine Aufgabe ist es, ein verteiltes Semaphorsystem (Links zur Beschreibung) und eine Anwendung dafür zu implementieren . Ich werde Java-Sockets verwenden und Wasserzeichen-Arrays und Prioritätswarteschlangen verwenden (nicht sicher, wo). Daher bin ich gespannt, wie ich dieses Projekt angehen soll. Insbesondere möchte ich wissen, was ein gutes Ziel für den ersten Schritt oder ein einfaches Subsystem ist, das ich implementieren kann. Im Moment weiß ich einfach nicht, wo ich meine Aufmerksamkeit konzentrieren soll.

Die Anwendung ist ein Floating-Lizenzsystem - wie in einem Computerraum mit nur einer Kopie einer Software (möglicherweise einem CAD-Programm), mit dem jeweils nur ein PC die Software verwenden kann. Wenn ein Computer die Software verwendet, ist der Zugriff auf die Software gesperrt. Wenn diese Maschine damit fertig ist, gibt sie es auf und wer zuerst angefordert hat, sollte der nächste sein.

Hier ist der Pseudocode-Algorithmus, auf den verwiesen wird - http://i.imgur.com/q9kRm.png


1
Klingt nach einem lustigen Projekt. Ein guter "erster Schritt" wäre, die App dazu zu bringen, ihren Betriebszustand im lokalen Netzwerk zu veröffentlichen. Zweitens: Andere Apps können die Ausführung verweigern, während die erste ausgeführt wird. Drittens: Apps können sich einer Warteschlange anschließen und warten, bis sie an der Reihe sind. Zum Schluss: Teilen Sie den Apps ihren Platz in der Warteschlange mit und geben Sie ihnen möglicherweise die Möglichkeit, einen besseren Platz zu kaufen. ;-)
Sedate Alien

Antworten:


5

Beginnen Sie mit dem Subsystem "Handshake", mit dem lizenzierte Anwendungen, die auf einem bestimmten Computer ausgeführt werden, eine Sitzung auf Ihrem Lizenzserver registrieren und ein Token erhalten können, das sie für weitere Interaktionen eindeutig identifiziert.

Ich denke, es wäre vernünftig, wenn dieses Subsystem auch einige "Verhandlungen" über das weitere Kommunikationsprotokoll beinhalten würde ("Herzschlagsignale werden voraussichtlich mit einer Geschwindigkeit zwischen 5 und 10 Sekunden ausgetauscht" - solche Sachen).

Der nächste logische Schritt wäre wahrscheinlich die Einrichtung einer Art "Heartbeat" -Modul - das Modul, mit dem registrierte Computer und Server ... Hoppla, Sie haben nach dem Ziel des ersten Schritts gefragt , das nicht passt.


8

Generische Antwort

Semaphor ist eine Ressourcenzuweisungstechnik zum Verwalten von Deadlocks und Race-Bedingungen über Prioritätswarteschlangen. Metaphorisch ausgedrückt, Sie können 3 Fahrräder mieten. Angenommen, Sie mieten es nach dem Prinzip "Wer zuerst kommt, mahlt zuerst". Wenn Sie also alle Ihre 3 Fahrräder gemietet haben und eine vierte Person dies anfordert, muss sie warten, bis eines von ihnen das Fahrrad zurückgebracht hat. Es besteht die Möglichkeit, dass Sie das Fahrrad für jemanden reservieren, jemand ein bereits reserviertes Fahrrad storniert und so weiter. Ähnlich wie bei Prozessen, die einige Ressourcen erwerben möchten, werden Semaphoren verwendet.

Bei einem verteilten Semaphor können mehrere Ressourcen vorhanden sein, auf die mehrere Prozesse zugreifen können. Angenommen, ein Server hostet eine Anwendung und kann mehrere Instanzen davon hosten, und der Benutzer kann die Anwendung verwenden, wenn sie kostenlos ist. Der Server sei S1, S2, .. Sn, während die Anwendung A1, A2, ... An und die Benutzer U1, U2, ... Un sind. Wenn der erste Server also drei Instanzen der Anwendung hosten könnte, würde er als S1A1, S1A2, S1A3 bezeichnet. Nehmen Sie zum besseren Verständnis auch die Anwendungsinstanzen als Slots oder Boxen an. Ein Steckplatz gilt als leer, wenn er frei und voll ist, wenn er belegt ist. In diesem Fall wird die folgende Methode vorgeschlagen

  • Benutzer fordert die Anwendung an
  • Die Anforderung wird an eine Prioritätswarteschlange übergeben.
  • Die Warteschlange führt einen kontinuierlichen Hintergrundprozess aus, um nach freien Slots zu suchen. Sobald ein freier Slot gefunden wurde, leitet er die Anforderung an die Anwendung weiter, um die Verarbeitung zu starten
  • Sobald ein Slot die Anfrage erhält, markieren sie sich als beschäftigt und beginnen mit der Verarbeitung und markieren sich als frei, wenn sie die Verarbeitung abgeschlossen haben
  • Die Slots senden ihren Status regelmäßig an die Warteschlange, sodass die Warteschlange die Anforderungen weiterleiten kann, sobald ein Slot frei wird

Empfohlene Ressourcen

  • Dieses Modell basiert auf zentraler Nachrichtenvermittlung. Die Warteschlange, die die Anforderung verarbeitet, sollte immer verfügbar sein. Es kann auch ein Modell ohne Makler geben, das auf andere Weise implementiert werden könnte
  • Semaphor-Programmierung auf Wikipedia
  • Das kleine Buch über Semaphoren ist eine hervorragende Ressource, die frei verfügbar ist
  • Semaphor basiert auf einem Shared-Memory-Modell. Actor Model würde einen neuen Einblick geben, um dieses Problem auf andere Weise zu lösen

Spezifische Antwort auf die Frage im Kontext

Wenn ich mir den Code anschaue, bevorzuge ich die klassische Version eines Semaphors. Java hat ein eingebautes Semaphor- Paket, um dies zu tun, und Sie können einfach darauf aufbauen.

Insbesondere möchte ich wissen, was ein gutes Ziel für den ersten Schritt oder ein einfaches Subsystem ist, das ich implementieren kann.

Angenommen, nur eine Instanz der Anwendung sollte im LAN ausgeführt werden

  • Verwenden Sie das oben vorgeschlagene Paket
  • Erstellen Sie das Semaphor mit einem integrierten Warteschlangenmechanismus (ähnlich einem Stapel) und implementieren Sie es als Server
  • Wenn ein Benutzer die Anwendung startet, sucht er nach dem Semaphor, verringert die Anzahl (in diesem Fall nur 0, da nur eine einzige Instanz zulässig sein soll) und gibt dem Benutzer Zugriff auf die Anwendung
  • Wenn ein anderer Benutzer die Anwendung startet, sucht er nach dem Semaphor, da es 0 ist, stellt den Benutzer in die Warteschlange und gibt dem Benutzer eine Nachricht, dass die Anwendung beschäftigt ist
  • Wenn der erste Benutzer die Anwendung verlässt, wird das Semaphor inkrementiert, die Ressource wird verfügbar, der Benutzer wird informiert und kann nun die Anwendung starten.
  • Das Semaphor kann als eigenständiger Server (möglicherweise mit einer einfachen Webschnittstelle) implementiert werden, der mit der Anwendung gekoppelt werden kann.

Die folgenden Einschränkungen sind erwägenswert

  1. Warteschlangen können vollständig geleert oder die Priorität geändert werden
  2. Wenn Sie es mit der Anwendung als Server koppeln, muss sich nur eine Version des Servers im LAN befinden
  3. Bereiten Sie sich auf Abstürze oder unbeaufsichtigte Nachrichtenwarteschlangen vor (Benutzeranforderungszugriff, jedoch nicht verfügbar, wenn die Anwendung kostenlos ist)

Zum besseren Verständnis würde ich wahrscheinlich Folgendes vorschlagen

  • Folgen Sie diesem Link zum besseren Verständnis
  • Versuchen Sie es mit SCALA . Sie können alle vorhandenen JAVA-Bibliotheken verwenden und erhalten eine gute Parallelität
  • Schauen Sie sich ZMQ an . Dies kann die Option sein, wenn Sie den gesamten Prozess in eine separate Messaging-Anwendung abstrahieren, die mit den Ressourcen interagiert
  • Lesen Sie mehr über das AutoCAD-Lizenzierungssystem (es implementiert ein Lizenzmodell, das nur wenigen Ihrer Anforderungen entspricht).

BEARBEITEN Antwort vollständig bearbeitet, da die ursprüngliche Antwort auf einer viel breiteren Perspektive basiert


Vielen Dank für diese gründliche Antwort. Ich lese die Materialien durch, die Sie zur Verfügung gestellt haben. Hauptsächlich weiß ich nur, dass das Projekt diesen Algorithmus in Abbildung 9.3 implementiert hat.
Adel

1
@Adel Antwort aktualisiert, um der Anforderung zu entsprechen. Links auch geändert
Ubermensch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.