<?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=Algorithmus_von_Peterson</id>
	<title>Algorithmus von Peterson - 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=Algorithmus_von_Peterson"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Algorithmus_von_Peterson&amp;action=history"/>
	<updated>2026-06-04T23:42:33Z</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=Algorithmus_von_Peterson&amp;diff=341585&amp;oldid=prev</id>
		<title>imported&gt;Fzagoev: Leerzeichen vor Strichpunkt entfernt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Algorithmus_von_Peterson&amp;diff=341585&amp;oldid=prev"/>
		<updated>2023-05-05T20:15:48Z</updated>

		<summary type="html">&lt;p&gt;Leerzeichen vor Strichpunkt entfernt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Algorithmus von Peterson&amp;#039;&amp;#039;&amp;#039; (auch bekannt als die kanadischen Prozesse) ist eine Lösung des Problems des wechselseitigen Ausschlusses ([[Mutex]]) in der dezentralen Steuerung von [[Prozess (Computer)|Prozessen]] ([[Prozesssynchronisation]]). Er wurde 1981 von [[Gary L. Peterson]] formuliert&amp;lt;ref&amp;gt;G. L. Peterson: &amp;quot;Myths About the Mutual Exclusion Problem&amp;quot;, &amp;#039;&amp;#039;Information Processing Letters&amp;#039;&amp;#039; 12(3) 1981, 115–116&amp;lt;/ref&amp;gt; und gewährleistet, dass stets nur ein Prozess in einen [[Kritischer Abschnitt|kritischen Abschnitt]] gelangen kann ([[Sequentialisierung]]). In der hier beschriebenen Form kann er nur 2 Prozesse wechselseitig ausschließen.&lt;br /&gt;
&lt;br /&gt;
== Ablaufschema ==&lt;br /&gt;
In [[C (Programmiersprache)|C]]-Code kann der Algorithmus von Peterson wie folgt dargestellt werden:&amp;lt;ref&amp;gt;[[Andrew S. Tanenbaum]]: &amp;#039;&amp;#039;Moderne Betriebssysteme&amp;#039;&amp;#039;. 3., aktualisierte Auflage. Pearson Studium, ISBN 978-3-8273-7342-7&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define FALSE 0&lt;br /&gt;
#define TRUE 1&lt;br /&gt;
#define N 2 // Anzahl der Prozesse&lt;br /&gt;
&lt;br /&gt;
volatile int turn; // Gibt an, wer gerade an der Reihe ist&lt;br /&gt;
volatile int interested[N]; // Alle Werte mit 0 (FALSE) initialisieren&lt;br /&gt;
&lt;br /&gt;
void enter_region(int process)&lt;br /&gt;
{&lt;br /&gt;
  int other; // Prozessnummer des anderen Prozesses&lt;br /&gt;
  other = 1 - process; // Der andere Prozess&lt;br /&gt;
  interested[process] = TRUE; // Interesse zeigen&lt;br /&gt;
  turn = other; // Flag setzen&lt;br /&gt;
&lt;br /&gt;
  while (interested[other] == TRUE &amp;amp;&amp;amp; turn == other); // Leeranweisung (Aktives Warten)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void leave_region(int process) // Prozess, der die kritische Region verlässt&lt;br /&gt;
{&lt;br /&gt;
  interested[process] = FALSE; // Zeigt den Ausstieg aus dem kritischen Bereich an&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funktionsweise ==&lt;br /&gt;
Bevor eine kritische Region betreten wird, ruft jeder Prozess &amp;lt;code&amp;gt;enter_region(int process)&amp;lt;/code&amp;gt; mit seiner eigenen Prozessnummer, 0&amp;amp;nbsp;oder&amp;amp;nbsp;1, als Parameter auf. Der Eintritt in die kritische Region wird damit so lange verzögert, bis er sicher ist. Sobald ein Prozess die kritische Region wieder verlässt ruft er &amp;lt;code&amp;gt;leave_region(int process)&amp;lt;/code&amp;gt; mit seiner eigenen Prozessnummer als Parameter auf. Jetzt kann ein anderer Prozess die kritische Region betreten, sofern er das möchte.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1 ===&lt;br /&gt;
# Es befindet sich kein Prozess in der kritischen Region.&lt;br /&gt;
# Der Prozess mit der Prozessnummer 0 ruft &amp;lt;code&amp;gt;enter_region(int process)&amp;lt;/code&amp;gt; mit seiner Prozessnummer 0 als Parameter auf.&lt;br /&gt;
# Durch das Setzen von &amp;lt;code&amp;gt;interested[process] = TRUE&amp;lt;/code&amp;gt;, wobei &amp;lt;code&amp;gt;process = 0&amp;lt;/code&amp;gt;, zeigt dieser Prozess sein Interesse an, die kritische Region zu betreten.&lt;br /&gt;
# Mittels &amp;lt;code&amp;gt;turn = other&amp;lt;/code&amp;gt; gibt er dem anderen Prozess die Gelegenheit, bei Interesse die kritische Region zu betreten.&lt;br /&gt;
# Da der Prozess mit der Prozessnummer 1 nicht interessiert ist, die kritische Region zu betreten, kehrt die Funktion &amp;lt;code&amp;gt;enter_region(int process)&amp;lt;/code&amp;gt; ohne das Ausführen der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife sofort zurück. Damit betritt der Prozess mit der Prozessnummer 0 die kritische Region.&lt;br /&gt;
# Bekundet der Prozess mit der Prozessnummer 1 jetzt Interesse daran, die kritische Region zu betreten, muss er so lange warten, bis der Prozess mit der Prozessnummer 0 &amp;lt;code&amp;gt;leave_region(int process)&amp;lt;/code&amp;gt; mit seiner eigenen Prozessnummer als Parameter aufruft, um die kritische Region zu verlassen.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2 ===&lt;br /&gt;
# Zwei Prozesse rufen fast gleichzeitig &amp;lt;code&amp;gt;enter_region(int process)&amp;lt;/code&amp;gt; mit ihren Prozessnummern als Parameter auf. Somit werden beide Komponenten des &amp;lt;code&amp;gt;interested&amp;lt;/code&amp;gt;-Array auf TRUE gesetzt.&lt;br /&gt;
# Einer der beiden Prozesse (sagen wir, der Prozess mit der Prozessnummer 1) speichert den Wert der Variable &amp;lt;code&amp;gt;turn&amp;lt;/code&amp;gt; als letzter und setzt ihn somit auf 0 (&amp;lt;code&amp;gt;turn = other&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Der Prozess mit der Prozessnummer 0 führt somit die &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife nicht aus und retourniert sofort.&lt;br /&gt;
# Der Prozess mit der Prozessnummer 0 betritt die kritische Region.&lt;br /&gt;
# Der Prozess mit der Prozessnummer 1 muss nun warten, da sowohl &amp;lt;code&amp;gt;interested[other]&amp;lt;/code&amp;gt; auf TRUE steht, als auch &amp;lt;code&amp;gt;turn = other&amp;lt;/code&amp;gt;. Er wartet so lange, bis der Prozess mit der Prozessnummer 0 &amp;lt;code&amp;gt;leave_region(int process)&amp;lt;/code&amp;gt; aufgerufen hat, seine &amp;lt;code&amp;gt;interested&amp;lt;/code&amp;gt;-Komponente zurück auf FALSE setzt, und die kritische Region somit wieder verlassen hat.&lt;br /&gt;
&lt;br /&gt;
== Bedeutung ==&lt;br /&gt;
Der Peterson-Algorithmus ist simpler als der [[Dekker-Algorithmus]], der das Problem des wechselseitigen Ausschlusses ebenfalls löst. Dennoch erbt er den bedeutenden Nachteil der dezentralen Steuerung: Wartende Prozesse geben den [[Prozessor]] nicht ab, sondern beanspruchen ihn durch [[Aktives Warten]].&lt;br /&gt;
&lt;br /&gt;
Gebraucht wird ein Algorithmus wie der Peterson-Algorithmus eigentlich nur zur Realisierung von [[Mutex|wechselseitigem Ausschluss]] auf einem Computersystem mit zwei Prozessoren, die keine Instruktion wie [[Test-and-set]] oder [[Compare-and-swap]] haben. Heutige Prozessoren haben dies aber normalerweise. In einer Hochsprache benutzt man ausschließlich vorhandene Sprachelemente wie [[Semaphor (Informatik)|Semaphore]] oder Methoden und Anweisungsfolgen, die als &amp;quot;synchronized&amp;quot; deklariert werden. Dies hat den Vorteil, dass ein wartender [[Thread (Informatik)|Thread]] blockiert, d.&amp;amp;nbsp;h. den Prozessor für andere Aufgaben freigibt.&lt;br /&gt;
&lt;br /&gt;
Es ist möglich, den Peterson-Algorithmus zu verallgemeinern, so dass das Problem des wechselseitigen Ausschlusses von &amp;#039;&amp;#039;n&amp;#039;&amp;#039; parallelen Prozessen gelöst werden kann.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Dekker-Algorithmus]]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmus|Peterson]]&lt;br /&gt;
[[Kategorie:Betriebssystemtheorie]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Fzagoev</name></author>
	</entry>
</feed>