www.mikrocontroller.net

Forum: PC-Programmierung Locking – Datenzugriff


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

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

Autor: StinkyWinky (Gast)
Datum:

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

Autor: gast (Gast)
Datum:

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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  f1 = 1;
  t = 2;
  while(f2 && t==2);
  // Zugriff auf die gemeinsame Ressource
  f1 = 0;

Client 2:
  f2 = 1;
  t = 1;
  while(f1 && t==1);
  // Zugriff auf die gemeinsame Ressource
  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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super danke.

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei es gerad bei vielen Clients einfacher und effizienter sein dürfte, 
eine zentrale Instanz zur Ressourcenzuweisung zu haben

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.