Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

1

10.11.2008, 20:32

Frage zur Speicherverwaltung

huhu,

ich habe eine kleine Frage und hoffe hier sind ein paar die sich damit vielleicht auskennen.

Es liegt folgende Situation vor:

Es kann ja vorkommen das beim Mehrprogrammbetrieb (Mehrere Prozesse befinden sich gleichzeitig im Hauptspeicher) Programme den ihnen zugewiesenen Speicher verlassen bzw einen anderen beeinflussen (Absichtlich oder im Fehlerfall)

Das dies nicht passiert hat man dann zwei neue HardwareRegister eingeführt die vor falscher Adressierung schützen sollen.

Das BasisRegister, welches den Anfang einer Speicherpartition enthält und das Grenzregister, welches die Länge der Speicherpartition beinhaltet.

Nun folgende Grafik verstehe ich nicht ganz:
http://img356.imageshack.us/my.php?image=grenzbasisregistergx5.jpg


Logisch wäre doch, dass der logischen Adresse die BasisAdresse der Partitions addiert wird und anschließend verglichen wird ob es über die Speicherpartition hinausgeht..

Aber warum wird zuerst verglichen und dann addiert? Kann mir das vielleicht jemand erklären?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.11.2008, 20:41

Re: Frage zur Speicherverwaltung

Zitat von »"Toa"«

Logisch wäre doch, dass der logischen Adresse die BasisAdresse der Partitions addiert wird und anschließend verglichen wird ob es über die Speicherpartition hinausgeht..


die logische adresse zählt von 0 weg, relativ zur basisadresse. im grenzregister steht, wie du selber schon sagtest, die länge des speichersegments (die länge und nicht das was an adresse maximal rauskommen darf). ist deine logische adresse größer als die länge des segments so steht sie drüber raus...

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

3

10.11.2008, 20:52

Wie meinst du das mit:" Die logische Adresse zählt von 0 weg, relativ zum Basisregister"

Warum wird denn der Basisregister addiert? Das mit dem Grenzregister habe ich verstanden, thx!

€: Könntest du mir das mit den logischen(virtuellen) Adressen und Physikalischen vielleicht mal erklären? Denn ich verstehe nicht ganz warum man beim Mehrprogammbetrieb, bei dem nur der Hauptspeicher benutzt wird und kein erweiterter Virtueller Auslagerungspeicher, von logischen Adressen spricht?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.11.2008, 21:00

die "physikalische" (sagen wir mal so) adresse bekommst du so:

basis + logische adresse

die logische adresse sagt wo in dem segment etwas liegt. die basis sagt wo das segment liegt. so löst du z.b. auch das relokationsproblem. für dein programm beginnt der adressraum bei 0. du kannst dich beim schreiben deines programmes drauf verlassen dass deine variable x bei adresse 0x1234 liegt, unabhängig wo genau im physikalischen speicher dein x dann zur laufzeit liegen wird. wo in den physikalischen speicher deine adressen abgebildet werden bestimmt dann das betriebssystem über das basisregister.

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

5

10.11.2008, 21:16

oki sry noch ein paar Fragen:

Das Relokationsproblem ist ja das die Adresse erst beim einlagern bestimmt wird und vorher nicht bekannt ist. Warum ist sie denn vorher nicht bekannt?
(Eventuell dumme Frage xD)

€: Vielleicht kannst du mir die Relokation noch einmal erklären. Hab schon ein wenig gegoogelt aber das verstehe ich irgendwie nicht :/

Worin besteht der Sinn von logischen Adressen? Warum verwendet man nicht direkt physikalische? Ich meine durch diese dauernden Rechenoperationen von der Addtion der logischen Adresse und der Basis wird doch rechenleistung verschwendet oder nicht?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

10.11.2008, 21:34

Zitat von »"Toa"«

Warum ist sie denn vorher nicht bekannt?


du hast ein programm, das programm hat eine variable x.
für die variable x wird das programm speicher benötigen.
um x anzusprechen musst du wissen wo im speicher x liegt (brauchst also die adresse von x).

aber wo liegt x jetzt eigentlich? schreibst du dein programm einfach so dass x immer an der adresse 0x1234 liegt? dann kann aber kein anderes programm was an stelle 0x1234 ablegen. wenn du mehrere programme laufen lassen willst is das also keine option.
frage: wie legst du dann aber beim programmieren fest wo jetzt x liegen soll, ohne angst haben zu müssen dass dir wer in die quere kommt und ohne zu wissen was für andere programme da so noch laufen werden?
antwort: gar nicht, du hast keine chance das zu wissen

lösung: du tust so als gäbe es keine anderen programme und legst x an die stelle 0x1234. das betriebssystem kümmert sich drum, deinem programm einen teil des speichers zu geben und dein x im speicher abzulegen. die logische adresse 0x1234 muss es dazu irgendwie in eine tatsächliche (physikalische) adresse umwandeln. natürlich könnte es beim laden hergehen und dein komplettes programm nach x durchsuchen und alles durch die "richtige" adresse ersetzen.
das ist aber nicht unbedingt einfach, effizient und elegant und das problem hast du nicht nur mit variablen, du hast es überall wo speicher verwendet wird (relokationsproblem). auch z.b. beim code. dein code liegt ja auch im speicher an irgendeiner adresse. wenn du in deinem programm einen sprungbefehl hast musst du dem die adresse angeben wo er hinspringen soll. wenn mehrere programme am laufen sind kannst du nicht einfach zu adresse 0x100000 springen. du hast ja keine ahnung ob da nicht ein anderes programm liegt. also, wieder durchsuchen und 0x100000 durch das richtige ersetzen? und das für jede programm anweisung, alle sprungmarken finden und die sprungbefehle die sich drauf referenzieren? bräuchtest du in deiner exe eine riesige tabelle oder was ähnliches um das zu bewerkstelligen... -> vergiss es
lösung: du tust so als gäbe es keine anderen programme und gehöre der ganze speicher dir. das betriebssystem kümmert sich dann drum dir einen speicherbereich zu geben und aus deinen logischen adressen (durch diese rumrechnerei, die glücklicherweise von der hardware erledigt wird und damit außer ein paar transistoren nix kostet) die wirklichen adresse zu machen.

fazit: relokationsproblem gelöst und programme können sich nicht mehr gegenseitig beeinflussen...

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

7

10.11.2008, 21:52

Oki alles verständlich bis auf dieses hier:

"natürlich könnte es beim laden hergehen und dein komplettes programm nach x durchsuchen und alles durch die "richtige" adresse ersetzen. "

mit richtige adresse meinst du die physikalische oder? D.h du möchtest sagen das, dass Programm nach x durchsucht wird und die logische adresse von x mit der Physikalischen ersetzt wird.

Wenn das so stimmt hab ich alles verstanden ^.^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

10.11.2008, 22:14

Zitat von »"Toa"«

D.h du möchtest sagen das, dass Programm nach x durchsucht wird und die logische adresse von x mit der Physikalischen ersetzt wird.


jop, du hasts verstanden :)

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

9

12.11.2008, 14:47

Huhu könnte ich das Problem der Relokation folgendermaßen erklären?

Man stelle sich folgende Situation vor. Ein anderer Prozess bekommt über den Scheduler CPU Zeit zugeteilt und nun möchte das Betriebssystem diesen aber an einer anderen Speicherstelle ausführen. Es kommt zum konflikt, denn wie Adressiere ich immer wieder eine andere Speicherstelle?
Es reicht nicht dem Auftrag eine feste Adresse im reelen Speicher zuzuweisen, denn wenn man das Programm nun in einem anderen Segemnt ausführen möchte geht dies mit einer fixen Adresse nicht.

Ergo -> Lage unabhänige Adressierung nötig! ..

kann man das so ungefähr beschreiben?

10

13.11.2008, 16:12

Was willst du denn mit dem Scheduler? es geht afaik darum, das du zur Programmierzeit nicht wissen kannst, wo im RAM dein Programm liegt, aber für Variablenzugriffe Speicheradressen brauchst (bei hochsprachen wie C++ werden die variablennamen vom Compiler in Speicheradressen umgewandelt), also brauchst du für dein Programm eine logische adresse die von der späteren physikalischen Adresse unabhängig ist.

Werbeanzeige