<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Vektoruhr</id>
	<title>Vektoruhr - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Vektoruhr"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Vektoruhr&amp;action=history"/>
	<updated>2026-06-12T15:36:26Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Vektoruhr&amp;diff=164505&amp;oldid=prev</id>
		<title>imported&gt;Maximum 2520: /* Anwendungen */ Einzelnachweis korrigiert</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Vektoruhr&amp;diff=164505&amp;oldid=prev"/>
		<updated>2025-12-30T21:55:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Anwendungen: &lt;/span&gt; Einzelnachweis korrigiert&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;Vektoruhr&amp;#039;&amp;#039;&amp;#039; ist eine [[Software]]komponente (oder ein [[Netzwerkprotokoll|Protokoll]]) zum Zuweisen von eindeutigen [[Zeitstempel]]n an [[Nachricht]]en. Sie ist also eine [[logische Uhr]], die es erlaubt, den [[Ereignis]]sen in einem [[Verteilte Systeme|Verteilten System]] aufgrund eines Zeitstempels eine [[Kausalordnung]] zuzuweisen ([[Sequentialisierung]]) und insbesondere die [[Nebenläufigkeit]] von Ereignissen zu ermitteln. Sie stellt eine Erweiterung der [[Lamport-Uhr]] dar, die auch der starken [[Uhrenbedingung]] genügt. Vektoruhren wurden von mehreren Wissenschaftlern unabhängig voneinander entwickelt, insbesondere von [[Colin J. Fidge]], [[Friedemann Mattern]] und [[Frank Bernhard Schmuck]].&lt;br /&gt;
&lt;br /&gt;
[[Datei:Vektoruhren.svg|mini|320px|Beispiel eines Systems von Vektoruhren]]&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Das Vorgehen beim Betrieb von Vektoruhren ist wie folgt: Ähnlich wie bei der Lamport-Uhr führt jeder [[Prozess (Computer)|Prozess]] einen Zähler, der bei jedem Ereignis (insbesondere beim Senden und Empfangen von Nachrichten) erhöht wird. Aber anders als bei der Lamport-Uhr besteht hier die &amp;#039;&amp;#039;Uhr&amp;#039;&amp;#039; jedes Prozesses nicht nur aus &amp;#039;&amp;#039;einem&amp;#039;&amp;#039; Zähler, sondern aus einem [[Vektor]] (bzw. einem [[Feld (Datentyp)|Array]] oder einer assoziativen Liste) von Zählern: Jeder Prozess merkt sich den Zählerstand aller anderen Prozesse, soweit der bekannt ist. Der aktuelle Stand der Uhr wird jeder gesendeten Nachricht angehängt.&lt;br /&gt;
&lt;br /&gt;
Bei jedem Ereignis wird immer nur der &amp;#039;&amp;#039;eigene&amp;#039;&amp;#039; Zähler erhöht. Wird eine Nachricht empfangen, wird aus dem aktuellen und dem empfangenen Vektor ein &amp;#039;&amp;#039;elementweises Maximum&amp;#039;&amp;#039; gebildet, um den neuen Stand der Uhr zu ermitteln.&lt;br /&gt;
&lt;br /&gt;
Als [[Pseudocode]] sieht die Routine zum Senden einer Nachricht so aus:&lt;br /&gt;
&lt;br /&gt;
 Uhr[PID]= Uhr[PID]+1;&lt;br /&gt;
 Zeitstempel= Uhr;&lt;br /&gt;
 sende(Nachricht,Zeitstempel);&lt;br /&gt;
&lt;br /&gt;
Dabei sei &amp;#039;&amp;#039;&amp;#039;PID&amp;#039;&amp;#039;&amp;#039; für jeden Prozess ein fest vorgegebener und eindeutiger [[Bezeichner]], zum Beispiel eine [[Prozess-ID]] oder eine [[IP-Adresse]] (oder auch eine Kombination aus diesen beiden). Die Felder der Uhr für die Prozesse, von denen noch keine Nachricht empfangen wurde, werden als null angenommen.&lt;br /&gt;
&lt;br /&gt;
Routine zum Empfangen einer Nachricht:&lt;br /&gt;
&lt;br /&gt;
 (Nachricht,Zeitstempel)= empfange();&lt;br /&gt;
 Uhr[PID]= Uhr[PID]+1;&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 for (Prozesse P) do begin&lt;br /&gt;
     Uhr[P]= max(Uhr[P],Zeitstempel[P]);&lt;br /&gt;
 end;&lt;br /&gt;
&lt;br /&gt;
== Partielle Ordnung ==&lt;br /&gt;
Um nun anhand der Zeitstempel entscheiden zu können, welche Nachricht (bzw. welches Ereignis) von welcher anderen &amp;#039;&amp;#039;[[Kausalität|kausal abhängig]]&amp;#039;&amp;#039; ist, wird über den Ständen der Vektoruhr eine [[Ordnungsrelation#Halbordnung|partielle Ordnungsrelation]] definiert:&lt;br /&gt;
&lt;br /&gt;
Ein Ereignis A &amp;#039;&amp;#039;ist eine Ursache&amp;#039;&amp;#039; von Ereignis B, wenn der Zähler für jeden Prozess im Zeitstempel C(A) kleiner oder gleich dem Zähler im Zeitstempel C(B) für den korrespondierenden Prozess und für mindestens einen dieser Zähler kleiner ist. Formal:&lt;br /&gt;
:&amp;lt;math&amp;gt;A, B: Ereignisse&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;C(A)= (a_1, a_2, a_3... a_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;C(B)= (b_1, b_2, b_3... b_n)&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;A \rightarrow B \Leftrightarrow ( \forall_{1\le i\le n}: a_i \le b_i ) \land ( \exists i&amp;#039;: a_{i&amp;#039;} &amp;lt; b_{i&amp;#039;} )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da für Vektoruhren die Implikation in beide Richtungen gültig ist, erfüllen sie die &amp;#039;&amp;#039;starke&amp;#039;&amp;#039; [[Logische Uhr#Uhrenbedingung und Kausalordnung|Uhrenbedingung]].&lt;br /&gt;
&lt;br /&gt;
Eine Umsetzung der obigen Ordnungsrelation in Pseudocode (A und B seien die zu vergleichenden Zeitstempel, die Frage ist, ob A eine Ursache von B war):&lt;br /&gt;
&lt;br /&gt;
 procedure ist_ursache(A,B):&lt;br /&gt;
     mindestens_ein_element_strikt_kleiner = NEIN;&lt;br /&gt;
     for (Prozesse P) do begin&lt;br /&gt;
         if ( A[P] &amp;gt; B[P] ) then return NEIN;&lt;br /&gt;
         if ( A[P] &amp;lt; B[P] ) then mindestens_ein_element_strikt_kleiner := JA;&lt;br /&gt;
     end;&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     return mindestens_ein_element_strikt_kleiner;&lt;br /&gt;
 end procedure;&lt;br /&gt;
&lt;br /&gt;
=== Nebenläufigkeit ===&lt;br /&gt;
Es ist durchaus möglich, dass weder &amp;#039;&amp;#039;&amp;#039;A → B&amp;#039;&amp;#039;&amp;#039; noch &amp;#039;&amp;#039;&amp;#039;B → A&amp;#039;&amp;#039;&amp;#039; gilt, die genannte Prozedur somit bei den Aufrufen&lt;br /&gt;
&lt;br /&gt;
 ist_ursache(A,B)&lt;br /&gt;
 ist_ursache(B,A)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;jeweils NEIN&amp;#039;&amp;#039; als Antwort zurückliefert: Die Ereignisse sind dann nebenläufig, man schreibt auch &amp;#039;&amp;#039;&amp;#039;A || B&amp;#039;&amp;#039;&amp;#039;. Es ist gerade der entscheidende Vorteil von Vektoruhren über den einfacheren Lamport-Uhren, dass es aufgrund der Zeitstempel möglich ist, zu erkennen, welche Ereignisse nebenläufig sind. Das ergibt sich aus der Gültigkeit der starken Uhrenbedingung. Zu beachten ist hierbei, dass im Gegensatz zur Ursachenrelation die Nebenläufigkeit nicht [[Transitive Relation|transitiv]] ist.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
Vektoruhren werden in verschiedenen Bereichen der verteilten Datenhaltung eingesetzt, um Datenkonsistenz ohne zentrale Zeitgeber zu gewährleisten:&lt;br /&gt;
* In hochverfügbaren [[Schlüssel-Werte-Datenbank|Key-Value-Stores]] wie Amazon Dynamo werden sie genutzt, um Versionierungskonflikte bei replizierten Daten aufzulösen.&lt;br /&gt;
* In der [[Distributed-Ledger-Technologie]] finden sie Anwendung in Sharding-Protokollen (z. B. Cerberus), um die Kausalität von Transaktionen über mehrere Partitionen hinweg sicherzustellen. Dies ermöglicht eine partielle Ordnung von Ereignissen ohne die Notwendigkeit einer globalen Blockchain-Sequenzierung.&amp;lt;ref&amp;gt;{{Literatur |Autor=Jelle Hellings, Daniel P. Hughes, Joshua Primero, Mohammad Sadoghi |Titel=Cerberus: Minimalistic Multi-shard Byzantine-resilient Transaction Processing |Sammelwerk=Proceedings of the VLDB Endowment |Band= |Nummer= |Datum=2020-08-10 |DOI=10.48550/arXiv.2008.04450 |Seiten= |Online=https://arxiv.org/pdf/2008.04450}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Colin J. Fidge&lt;br /&gt;
   |Hrsg=K. Raymond&lt;br /&gt;
   |Titel=Timestamps in message-passing systems that preserve the partial ordering&lt;br /&gt;
   |Sammelwerk=Proc. of the 11th Australian Computer Science Conference (ACSC&amp;#039;88)&lt;br /&gt;
   |Datum=1988-02&lt;br /&gt;
   |Seiten=56–66&lt;br /&gt;
   |Online=http://sky.scitech.qut.edu.au/~fidgec/Publications/fidge88a.pdf&lt;br /&gt;
   |Abruf=2025-12-28}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Reinhard Schwarz, [[Friedemann Mattern]]&lt;br /&gt;
   |Titel=Detecting Causal Relationships in Distributed Computations: In Search of the Holy Grail&lt;br /&gt;
   |Sammelwerk=Distributed Computing&lt;br /&gt;
   |Band=7&lt;br /&gt;
   |Nummer=3&lt;br /&gt;
   |Verlag=Springer&lt;br /&gt;
   |Datum=1994&lt;br /&gt;
   |Seiten=149–174&lt;br /&gt;
   |Online=https://www.vs.inf.ethz.ch/publ/papers/holygrail.pdf&lt;br /&gt;
   |Format=PDF&lt;br /&gt;
   |KBytes=278&lt;br /&gt;
   |Abruf=2025-12-28}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Theoretische Informatik]]&lt;br /&gt;
[[Kategorie:Verteiltes System]]&lt;br /&gt;
[[Kategorie:Uhren]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Maximum 2520</name></author>
	</entry>
</feed>