Virtueller Adressraum
-
Hi,
schön, dass es ein solches Forum gibt!
Meine Frage(n) drehen sich rund um den virtuellen Adressraum eines Programms/Prozesses:
1.Ich würde gerne wissen, wie groß der virtueller Adressraum ist, der einem Prozess zugeordnet wird. Wo kann man das nachlesen (ist ja bestimmt Betriebssystem spezifisch oder?)
2.Was ist der virtuelle Adressraum (Hauptspeicher?)
3.Was passiert, wenn ein Programm/Prozess mehr Speicher benötigt, als der im zugewiesene Adressraum groß ist?
4.Was haben Heap und Stack mit dem virtuellen Adressraum zu tun und wie wird dieser auf Heap und Stack aufgeteilt?
5.Wie kann man Heap und Stack Größen für einen Prozess verändern?Vielen Dank
Freo
-
- ist abhaengig von Betriebssystem und Architektur
- Abstraktion vom physikalischen Speicher
- es stuerzt ab (fuer gewoehnlich)
- prinzipiell gar nichts
- das solltest du nicht
PS: Wenn du nichtmal weisst, was virtueller Adressraum, Heap und Stack sind, warum willst du diese Groessen denn schon veraendern? Fuer Grundlagen hilft dir Wikipedia weiter. Es ist viel umfassender als jede moegliche Antwort hier.
-
-
üblich sind 32 und 64 bit adressräume. 32 bit sind 4 GB und 64 bit sind ... ganz viel (reche es dir aus wenn du willst, 2^64 halt).
üblich ist weiterhin, dass der adressraum in einen "kernel" bereich und einen "user" bereich geteilt wird, wobei die applikation nur direkten zugriff auf den "user" bereich hat. oft ist diese teilung 1:1, d.h. bei 32 bit je 2 GB. -
schwer in wenigen worten zu erklären. lies es nach, z.b. auf wikipedia.
-
wenn ein programm mehr speicher braucht, als es theoretisch adressieren kann, dann wird es halt einfach nicht laufen können. irgendwie logisch, oder? wie das genau aussieht, also ob schöne fehlermeldung oder einfach absturz, hängt vom programm ab.
-
heap und stack "leben" natürlich "im" adressraum. wie das aufgeteilt wird hängt vom system ab. normalerweise bekommt jeder thread eines prozesses einen fixen teil vom adressraum (z.b. 1 MB), und der heap wächst dynamisch.
-
da der heap dynamisch wächst brauch man da nichts einzustellen. mag sein dass man bei einigen systemen eine maximale grösse festlegen kann, aber das wird wohl kaum sinnvoll sein. wie man die grösse der stacks verändert kommt auch auf das system drauf an. bei windows kann man einfach einen wert in der .exe datei umschreiben, der die default stack-grösse angibt. wenn das programm allerdings nicht die default stack-grösse verwendet, wird diese änderung natürlich nix bringen.
-
-
Freo schrieb:
2.Was ist der virtuelle Adressraum (Hauptspeicher?)
Adressen, die sich für einen Prozess als Speicheradressen eines zusammenhängenden RAM-Bereichs darstellen. Zugriffe auf diese Adressen werden teils in echte Speicherzugriffe übersetzt, zum anderen Teil triggern sie Aktionen, wie das Nachladen von Speicherseiten, Auslagern in die Swap-Datei, Exceptions bei Fehlzugriffen usw.
-
Freo schrieb:
1.Ich würde gerne wissen, wie groß der virtueller Adressraum ist, der einem Prozess zugeordnet wird. Wo kann man das nachlesen (ist ja bestimmt Betriebssystem spezifisch oder?)
Das hängt vom OS und unter anderem bei UNIX von den Einstellungen ab.
Freo schrieb:
2.Was ist der virtuelle Adressraum (Hauptspeicher?)
Jeder Prozeß läuft in seinem eigenen privaten Adreßraum, so daß Programme technisch nicht sich gegenseitig überschreiben können. Damit das ganze effektiv funktioniert wird der physikalische Speicher in Pages aufgeteilt und diese Pages durch die PMMU auf physikalische Pages des Systems gemappt.
Freo schrieb:
3.Was passiert, wenn ein Programm/Prozess mehr Speicher benötigt, als der im zugewiesene Adressraum groß ist?
new wirft eine Exception, alloc & Co gibt Null zurück, Stacküberschreitung führt i.d.Regel zum Programmabbruch. Illegale Zugriffe auf nicht angeforderte Adressen ohnehin.
Freo schrieb:
4.Was haben Heap und Stack mit dem virtuellen Adressraum zu tun und wie wird dieser auf Heap und Stack aufgeteilt?
Stack und Heap liegen in demselben. Der zweite Teil, OS spezifisch.
Freo schrieb:
5.Wie kann man Heap und Stack Größen für einen Prozess verändern?
new, malloc & Co. und den Stack kann man unter UNIX per "ulimit" verändern.