Hallo ich habe folgendes Problem. Ich habe mehrere Client 1 bis Client N. Dann gibt es einen Server dort sind genau 2 Variablen auf die ich lesend und schreibend von jedem Client zugreifen möchte. Problem Ich kann auf dem Server nichts locken. So jetzt dache ich mache es so; Ich gehe mal von 2 Clients aus: Habe ein zusätzliches Flag am Server angelegt, dass kann ich. Was ich nicht kann ist es so anzulegen das man nur synchronized darauf schreiben kann. So wenn jetzt z.B.: 2 Clients existieren und genau 2 gleichzeitig das BusyFlag lesen, okay Flag war nicht gesetzt beide denke okay ich kann schreiben und schreiben. => Problem. So jetzt kann ich noch zuerst lesen, dann eine rand-Zeit abwarten und dann wieder lesen. Okay dann setzte ich das BusyFlag und dann schreibe ich wieder, aber eben die rand-Zeit kann ja theoretisch genau gleich sein und dann habe ich wieder ein Problem. Hm, wie macht man das normalerweise? Danke schon mal
Auf dem Server läuft ein Programm, bei dem die Clients sich anmelden müssen um zugriff auf was auch immer zu bekommen. Wenn die fertig sind, melden sie sich wieder ab. In dem Serverprogramm wird sichergestellt, dass immer nur einer sich anmelden kann
Über welches Medium und welches Protokoll kommunizieren Clients und Server miteinander? Ist an der Datenübertragung Software beteiligt, ist die Synchronisation meistens einfach, da die Serversoftware selbst entscheiden kann, ob sie die Client-Anfragen simultan oder nacheinander bearbeitet. Geht die Kommunikation an der Software vorbei, bspw. durch direkten Speicherzugriff, wird die Sache etwas schwieriger, aber auch dafür gibt es Synchronisationsmechanismen.
Hallo Zusammen. Also ich kann an der Server Software nichts machen, eben. Also ich kann es nicht so machen, dass nur immer einer angemeldet ist. Was auch generell nicht geht würde, da es ein Maschine mit Multi-Hmi's ist – Anforderung. Viele Daten werden gleichzeitig gelesen was ja kein Problem ist aber eben das schreiben ist eines. Ich greife über RMI auf den Server zu. (java)
Du könntest ein weiteres Programm schreiben, das zwischen den Clients und dem Server liegt und die Zugriffe der Clients auf den Server koordiniert. Der Server "sieht" damit nur einen einzigen Client, nämlich dieses Programm.
Nö. Mit Flags, Zählern etc. wirst Du nur die Wahrscheinlichkeit des Auftretens einer Kollision vermindern können.
Die Synchronisation kann auch über Flags geschehen. Bei zwei Clients ist das nicht einmal kompliziert. f1, f2 und t sind drei Variablen, auf die von jedem Client zugegriffen werden kann. Der Zugriff muss atomar erfolgen, was aber kein Problem darstellt, da jede dieser Variablen nur zwei Werte annehmen kann, so dass die kleinste adressierbare Einheit als Variablengröße ausreicht. f1 und f2 müssen beide mit 0 initialisiert werden, der Startwert von t ist beliebig. Über folgende Codefragmente wird der Zugriff auf eine gemeinsame Ressource gesteuert: Client 1:
1 | f1 = 1; |
2 | t = 2; |
3 | while(f2 && t==2); |
4 | // Zugriff auf die gemeinsame Ressource
|
5 | f1 = 0; |
Client 2:
1 | f2 = 1; |
2 | t = 1; |
3 | while(f1 && t==1); |
4 | // Zugriff auf die gemeinsame Ressource
|
5 | f2 = 0; |
Der Algorithmus ist garantiert konflikt- und verklemmungsfrei. Außerdem wird jeder CLient nur solange blockiert, wie die Ressource vom anderen Client tatsächlich belegt ist. Es gibt also keine zufälligen Wartezeiten o.ä. Bei n>2 Clients könnte jeder Client dieses Verfahren (n-1)-mal zur Synchronisation mit den restlichen Clients verwenden. Man benötigte dann allerdings n*(n+1)/2 Variablen. Vielleicht findet ja einer von euch durch Überlegung oder geschickte Internetsuche eine Verallgemeinerung des Verfahrens, das mit weniger Variablen und Verarbeitungsschritten auskommt. Ändert sich die Anzahl der Clients dynamisch, kann dieses Verfahren ebenfalls angewandt werden, wenn die maximale Anzahl der Clients bekannt und nicht zu groß ist. Jeder Client synchronisiert sich einfach mit der maximalen Anzahl der restlichen Clients. Existieren einige von diesen nicht, stört das den Algorithmus nicht. Ist aber die maximale Anzahl der Clients so groß, dass man die Synchronisationsvariablen dynamisch verwalten möchte, braucht man irgendeine Form der An- und Abmeldung für die Clients. Das wird dann etwas aufwendiger, so dass man genauso gut eine Art Proxy wie aus meinem letzten Beitrag aufsetzen kann.
Wobei es gerad bei vielen Clients einfacher und effizienter sein dürfte, eine zentrale Instanz zur Ressourcenzuweisung zu haben
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.