Betriebssysteme (19) - Prozesssynchronisation I : Switch by ozelot47

View this thread on steempeak.com
· @ozelot47 ·
$6.32
Betriebssysteme (19) - Prozesssynchronisation I : Switch
Die Synchronisation von Prozessen ist ein schwieriges Teilgebiet von Betriebssystemen. Es gibt mehrere Varianten wie man mit einem **kritischen Abschnitt** umgehen kann. Jede Variante hat ihre Vor- und Nachteile. Das Thema Prozesssynchronisation werde ich aufgrund der Komplexität in drei Artikel aufteilen.

### Das Problem
Angenommen, in einem Rechnersystem finden in unregelmäßigen Abständen Ereignisse statt, über deren Häufigkeit Buch geführt werden soll. Ein Thread namens "Beobachter" zählt immer dann eine Variable Zähler hoch, wenn ein Ereignis stattgefunden hat. Ein zweiter Thread namens "Berichterstatter" druckt hin und wieder den Zählerstand auf eine Konsole aus und setzt die Variable Zähler auf Null zurück. Beide Threads existieren für immer.

```
Process Beobachter;
start
    do
        beobachte Ereignis;
        zähler = zähler + 1;
    until false
end;

Process Berichterstatter;
start
    do
        println(zähler)
        zähler = 0;
    until false
end;
```

Die Variable Zähler liegt in dem gemeinsamen Datensegment der Threads, auf den sie lesend und schreibend zugreifen können. Sie wird anfangs auf null gesetzt.

Man sollte meinen, dass zu jedem Zeitpunkt die Summe aller ausgedruckten Zählerstände zusammen mit dem aktuellen Wert von Zähler die Anzahl aller Ereignisse angibt, die bisher stattgefunden haben. Das stimmt aber nicht! Denn die beiden Threads laufen parallel ab, und dadurch kann es zum Beispiel zu folgender Ausführungsreihenfolge der Anweisungen kommen: Wenn der Berichterstatter gerade den aktuellen Zählerstand ausgedruckt hat und in diesem Moment wegen Ablauf seiner Zeitscheibe unterbrochen wird, könnte der Beobachter rechnend werden.

Angenommen, jetzt treten viele Ereignisse ein, und die Variable Zähler wird entsprechend hochgezählt. Sobaldder Berichterstatter wieder rechnend wird, setzt er als erstes den Zähler auf null, und alle soeben aufgetretenen Ereignisse sind verloren.

Dieser Fehler hängt nicht davon ab, dass wir nur über eine CPU verfügen; er kann ebenso auftreten, wenn die Threads auf verschiedenen Prozessoren mit unbekannten Geschwindigkeiten ablaufen. Hier liegen sogenannte **Wettkampfbedingungen (race conditions)** vor; welcher Thread als erster ein bestimmtes Ziel erreicht, ist nicht vorhersehbar.
Die Fehlerursache liegt vielmehr darin, dass die beiden Anweisungen

```
println(zähler)
    zähler := 0
```

im Programm des Berichterstatters einen **kritischen Abschnitt (critical section)** bilden, der keine Unterbrechung durch den Beobachter verträgt. Ein kritischer Abschnitt ist ein Abschnitt im Programm, in dem

* gemeinsame Ressource wie z. B. Variable und Datenstrukturen benutzt werden
* auf die mehrere Threads oder Prozesse lesend und schreibend zugreifen,so dass **race condition** entstehen kann

Man muss die beiden Threads irgendwie **synchronisieren**,um zu verhindern, dass beide zur gleichen Zeit in ihren kritischen Abschnitt eintreten. Also soll die Synchronisation den **exklusiven Zugriff auf den kritischen Abschnitt garantieren**.

### switch : Der Schalter
Eine Möglichkeit besteht darin, eine **Synchronisationsvariable [switch]** zu verwenden, die wie ein Schalter den Zugang zu den kritischen Abschnitten regelt. Hat sie den Wert 0, so ist der Beobachter an der Reihe, beim Wert 1 darf der Berichterstatter rechnen:

```
Process Beobachter;
start
    do
        while (switch = 1) do no-op;
        
        /* Beginn kritischer Abschnitt */
        beobachte Ereignis;
        zähler := zähler + 1;
        /* Ende kritischer Abschnitt */
        
        switch = 1;
    until false;
end;

Process Berichterstatter;
start
    do
        while (switch = 0) do no-op;
        
        /* Beginn kritischer Abschnitt */
        println(zähler)
        zähler := 0;
        /* Ende kritischer Abschnitt */
        
        switch = 0;
    until false;
end;
```

Dabei steht **no-op** für no operation; der Thread Beobachter bleibt also in der while-Schleife und tut nichts, bis die Bedingung falsch wird, das heißt, bis switch den Wert 0 erhält. Dann führt er seinen kritischen Abschnitt aus und setzt switch auf 1, damit der Berichterstatter in seinen kritischen Abschnitteintreten kann.

Allerdings hat diese switch-Variante zwei Nachteile:

* Beide Threads verbrauchen wertvolle CPU-Zeit, während sie in ihren while-Schleifen warten. Ein solches **geschäftiges Warten (busy waiting)** sollte vermieden werden

* Die beiden Threads können nur abwechselnd in ihre kritischen Abschnitte eintreten. Wenn einer von ihnen innerhalb des kritischen Abschnitts beendet werden sollte, kann der andere nie wieder den kritischen Abschnitt betreten.

Quelle
https://web.cs.wpi.edu/~cs3013/c07/lectures/Section06-Sync.pdf [letzter Zugriff: 23.11.2019, 19:31]
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , and 481 others
👎  ,
properties (23)
post_id81,997,811
authorozelot47
permlinkbetriebssysteme-19-prozesssynchronisation-i-switch
categoryde-stem
json_metadata{"tags":["de-stem","deutsch","steemstem","stem","palnet"],"links":["https:\/\/web.cs.wpi.edu\/~cs3013\/c07\/lectures\/Section06-Sync.pdf"],"app":"steemit\/0.1","format":"markdown"}
created2019-11-24 15:51:42
last_update2019-11-24 15:51:42
depth0
children4
net_rshares22,726,655,430,864
last_payout2019-12-01 15:51:42
cashout_time1969-12-31 23:59:59
total_payout_value3.197 SBD
curator_payout_value3.121 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length4,755
author_reputation15,369,745,159,352
root_title"Betriebssysteme (19) - Prozesssynchronisation I : Switch"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (547)
@curationvoter ·
<sub>Danke für deinen Beitrag. Eine tolles Wochenende wünsch ich dir</sub>
👍  
properties (23)
post_id81,997,975
authorcurationvoter
permlinkre-betriebssysteme-19-prozesssynchronisation-i-switch-20191124t155824z
categoryde-stem
json_metadata{"app":"beem\/0.20.16"}
created2019-11-24 15:58:24
last_update2019-11-24 15:58:24
depth1
children0
net_rshares11,549,999,401
last_payout2019-12-01 15:58:24
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length75
author_reputation11,162,919,111,508
root_title"Betriebssysteme (19) - Prozesssynchronisation I : Switch"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (1)
@steemstem ·
re-ozelot47-betriebssysteme-19-prozesssynchronisation-i-switch-20191125t094932964z
<div class='text-justify'> <div class='pull-left'> <center> <br /> <img width='200' src='https://res.cloudinary.com/drrz8xekm/image/upload/v1553698283/weenlqbrqvvczjy6dayw.jpg'> </center>  <br/> </div> 

This post has been voted on by the **SteemSTEM curation team** and voting trail. It is elligible for support from @curie and @minnowbooster.<br /> 

If you appreciate the work we are doing, then consider supporting our witness [@stem.witness](https://steemconnect.com/sign/account_witness_vote?approve=1&witness=stem.witness). Additional witness support to the [curie witness](https://steemconnect.com/sign/account_witness_vote?approve=1&witness=curie) would be appreciated as well.<br /> 

For additional information please join us on the [SteemSTEM discord]( https://discord.gg/BPARaqn) and to get to know the rest of the community!<br />

Please consider using the <a href='https://www.steemstem.io'>steemstem.io</a> app and/or including @steemstem in the list of beneficiaries of this post. This could yield a stronger support from SteemSTEM.
👍  
properties (23)
post_id82,017,342
authorsteemstem
permlinkre-ozelot47-betriebssysteme-19-prozesssynchronisation-i-switch-20191125t094932964z
categoryde-stem
json_metadata{"app":"steemstem-bot"}
created2019-11-25 09:49:36
last_update2019-11-25 09:49:36
depth1
children0
net_rshares5,722,230,856
last_payout2019-12-02 09:49:36
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length1,050
author_reputation229,673,617,633,863
root_title"Betriebssysteme (19) - Prozesssynchronisation I : Switch"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (1)
@stem.curate ·
Hello,

Your post has been manually curated by a @stem.curate curator.

<center>![FA8866FD-F2C3-43B3-A5A5-E0324BA4BB47.jpeg](https://cdn.steemitimages.com/DQmaqMpaEpJBAwJMN9bCHhmTzUEuymBj8V4BMsiJteZMG7L/FA8866FD-F2C3-43B3-A5A5-E0324BA4BB47.jpeg)</Center><center> *Supporting Steemians on STEMGeeks*</center>

We are dedicated to supporting great content, like yours on the [STEMGeeks](stemgeeks.net) tribe.

Please join us on [discord](https://discord.gg/73WaANa).
👍  
properties (23)
post_id82,018,829
authorstem.curate
permlinkq1iv1s
categoryde-stem
json_metadata{"tags":["de-stem","stem"],"users":["stem.curate"],"image":["https:\/\/cdn.steemitimages.com\/DQmaqMpaEpJBAwJMN9bCHhmTzUEuymBj8V4BMsiJteZMG7L\/FA8866FD-F2C3-43B3-A5A5-E0324BA4BB47.jpeg"],"links":["stemgeeks.net","https:\/\/discord.gg\/73WaANa"],"app":"stemgeeks\/0.1","canonical_url":"https:\/\/stemgeeks.net\/@stem.curate\/q1iv1s"}
created2019-11-25 11:10:39
last_update2019-11-25 11:10:39
depth1
children0
net_rshares5,839,941,566
last_payout2019-12-02 11:10:39
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length464
author_reputation593,380,586,275
root_title"Betriebssysteme (19) - Prozesssynchronisation I : Switch"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (1)
@steemitboard ·
Congratulations @ozelot47! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

<table><tr><td><img src="https://steemitimages.com/60x70/http://steemitboard.com/@ozelot47/votes.png?201911251203"></td><td>You distributed more than 1000 upvotes. Your next target is to reach 1250 upvotes.</td></tr>
</table>

<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@ozelot47) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=ozelot47)_</sub>
<sub>_If you no longer want to receive notifications, reply to this comment with the word_ `STOP`</sub>


To support your work, I also upvoted your post!


> You can upvote this notification to help all Steem users. Learn how [here](https://steemit.com/steemitboard/@steemitboard/http-i-cubeupload-com-7ciqeo-png)!
properties (22)
post_id82,020,590
authorsteemitboard
permlinksteemitboard-notify-ozelot47-20191125t124211000z
categoryde-stem
json_metadata{"image":["https:\/\/steemitboard.com\/img\/notify.png"]}
created2019-11-25 12:42:09
last_update2019-11-25 12:42:09
depth1
children0
net_rshares0
last_payout2019-12-02 12:42:09
cashout_time1969-12-31 23:59:59
total_payout_value0.000 SBD
curator_payout_value0.000 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length880
author_reputation38,705,954,145,809
root_title"Betriebssysteme (19) - Prozesssynchronisation I : Switch"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000