Udo: Betriebssystemfragen

Beitrag lesen

Der Progammzähler enthält die Speicheradresse (RAM oder ROM) des nächsten Befehls (oder auch Daten), was ausgeführt wird. Richtig?

Fast, er enthält die Adresse des nächsten Befehls. Punkt. Er zeigt nicht auf Daten, dafür gibt es andere Register.

Und dieser (Stinknormale Befehl wie addiere, subrahiere usw.) Befehl steht im Arbeitsspeicher ne?

Ja, auch. Du hast grundsätzlich recht, solltest das aber nicht auf den Arbeitsspeicher beschränkt sehen.
Diesen Befehl hat sich der Prozessor anhand einer Adresse über den Datenbus gezogen; er gibt eine Adresse auf die Adressleitungen und daraufhin erscheint das Datum (der Befehl) an den Datenleitungen und kann ins Befehlsregister geschoben werden. An den Bus sind viele Dinge angeschlossen, natürlich zu aller Erst der Arbeitsspeicher (RAM), aber auch ROM, Erweiterungskarten und andere Dinge können angeschlossen und dementsprechend Befehlsquellen sein.

Aha ok. Anhand des Programmzählers wird der nächste Befehl (wie oben beschrieben) vom Speicherbereich oder Zelle in den Befehlsregister kopiert.

Richtig.

Der Befehlsregister hat nun ein Befehl und muss sich nun die Daten auch dazu irgendwie heranziehen?

Das Befehlsregister ist, wie der Name eigentlich schon sagt, nur eine Speicherzelle im Prozessor. Die Daten, die ein Befehl benötigt, werden vom Leitwerk zur Verfügung gestellt, anhand dessen, was im Befehlsregister steht.

Beachte, dass du hier schon mit einem halben Bein im Elektrischen stehst, du hast mit Transistoren und elektrischen Verbindungen zu tun, Spannungen (Bits) werden ein- oder ausgeschaltet und dadurch ändern wieder andere Schalter ihren Zustand.

Der Stapelspeicher ist ein besonderer Speicherbereich, in dem Rücksprungadressen und lokale Funktionsvariaben abgelegt werden. Wenn du in einem Programm eine Funktion aufrufst, wird die nächste Befehlsadresse auf dem Stapelspeicher abgelegt und dann die Funktionsadresse geladen. Um aus der Funktion wieder heraus ins Hauptprogramm zu springen, wird die Adresse vom Stapelspeicher zurückgeholt:

Das Beispiel war nicht so dolle, ich versuch's nochmal: Angenommen, du hast folgende Befehle im Arbeitsspeicher an den Adressen 1 bis 5 stehen:

1 gosub 4
2 ping
3 end
4 print "hallo"
5 return

Der Programmablauf wäre wie folgt (der Stapelzeiger zeigt eingans auf einen Speicherbereich ab Adresse 100):

PC=1  SP=100  Befehl=gosub 4
PC=4  SP=101  Befehl=print "hallo"
PC=5  SP=101  Befehl=return
PC=2  SP=100  Befehl=ping
PC=3  SP=100  Befehl=end

PC = Programmzähler (program counter), SP = Stapelzeiger (stack pointer)

Der gosub-Befehl kopiert zuerst die eigentlich nächste Befehlsadresse auf den Stapel, erhöht den Stapelzeiger um 1 und setzt dann die Befehlsadresse der Unterfunktion in den Programmzähler.
Der return-Befehl arbeitet umgekehrt: Er vermindert den Stapelzeiger um 1, kopiert die an diese Stelle von gosub gespeicherte Rücksprungadresse in den Programmzähler.

Du kannst auf diese Weise beliebig viele Unterfunktionen ineinander verschachteln, ohne explizit zu wissen, wie der Weg zurück ins Hauptprogramm geht, denn die Rücksprungadressen sind fein säuberlich im Stapelspeicher aufgestapelt.

Du kannst dir die Funktion des Stapelspeichers auch wie einen Notizzettel vorstellen, auf dem du dir nacheinander die Straßen notierst, die du bei einer Stadtwanderung passierst.

Anna-Straße
   Berthold-Platz
   Cäsar-Weg
-> Droste-Gasse

Für den Weg zurück brauchst du keine Straßenkarte, sondern gehst mit deinem Stapelzeiger (deinem Finger: -> ) einfach in umgekehrter Reihenfolge die aufgeschriebenen Kreuzungen zurück.

Wie es ausschaut, sind das dann zwei verschiedene Speicherbereich, was den Stapelzeiger und Programmzähler irgendwie betrifft.

Richtig. Der Stapelzeiger ist ein Register, dass auf den Stapelspeicher zeigt, welcher ein Bereich des Arbeitsspeichers ist, auf dem das Programm Daten fast wortwörtlich stapeln kann. Zu diesen Daten kann auch die Adresse gehören, die vor einem Funktionsaufruf im Programmzähler steht und für einen Rücksprung aus der Funktion benötigt wird.

Der Programmzähler zeigt auf einen Bereich des Arbeitsspeichers, in dem sich das auszuführende Programm befindet, genauer: an die Position des aktuellen Befehls.

Befehlsadresse (auf das der Programmzähler zeigt ne oder ist das wieder was anders)

Richtig, die Befehlsadresse steht im Programmzähler.

  1. 4 notwendige Bedingungen für Deadlocks.

Der vierte Punkt "Wechselseitiger Auschluss (ressourcen sind nur exklusiv nutzbar. Die eine Ressource benutzenden Prozesse schließen sich wechselseitig aus"

Was versteht man dadrunter genau? Der Inhalt könnte ja auch in "Besitzen und Warten" fallen?

"Besitzen und Warten" hört sich für mich so an, dass ein Prozess eine weitere Sperre auf etwas anlegen möchte, das er schon zuvor gesperrt hat.

Unter Besitzen und Warten steht: Prozesse warten auf die Freigabe einer angeforderten Ressource, ohne bereits selbst belegte Ressourcen in der Zwischenzeit freizugeben.

Interpretiere ich mal so, als wenn Prozess 1 Resource A gesperrt hat und auf Resource B wartet, während Prozess 2 auf Resource A wartet und mit dem dicken Hintern auf B sitzt.

Wir haben also mehrere Resourcen und der Deadlock dreht sich sozusagen im Kreis. Das würde allerdings auf deine andere Bedingung, "Zyklische Wartebedingung" passen.

Bedingung "Wechselseitiger Ausschluss -> Die eine Ressource benutzenden Prozesse schließen sich wechselseitig aus"

Hier hätten wir dann wohl nur eine Resource: Prozess 1 und Prozess 2 haben (nicht-exklusive) Leserechte an Datei A und möchten jetzt gleichzeitig (exklusive) Schreibrechte haben – geht aber nicht, da sich beide gegenseitig mit ihren Leserechten sperren. A kann nicht schreiben, solange B auf seinen Leserechten beharrt, B kann nicht schreiben, solange A seine Leserechte hält.