Forum: PC-Programmierung Locking – Datenzugriff


von gast (Gast)


Lesenswert?

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

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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

von yalu (Gast)


Lesenswert?

Ü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.

von gast (Gast)


Lesenswert?

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)

von yalu (Gast)


Lesenswert?

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.

von gast (Gast)


Lesenswert?

Hm, Vielleicht was anderes? Gibt es da nicht eine einfache Möglichkeit.

von StinkyWinky (Gast)


Lesenswert?

Nö. Mit Flags, Zählern etc. wirst Du nur die Wahrscheinlichkeit des 
Auftretens einer Kollision vermindern können.

von gast (Gast)


Lesenswert?

Okay, ich dachte nicht, dass das so ein Problem ist.

von yalu (Gast)


Lesenswert?

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.

von gast (Gast)


Lesenswert?

super danke.

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.