Frage zu Prozessen
-
Über "heutige Betriebssysteme" im Allgemeinen kann ich nix sagen, bloss zu Windows: Der Stack wächst nicht "dem Heap entgegen", sondern es wird für jeden Thread gleich zu Anfang eine bestimmte Menge Adressraum reserviert. Üblicherweise sind das 1MB.
Wenn der Stack über den reservierten Bereich wächst dann machts Bumm. Im Normalfall endet das damit dass der Prozess beendet wird.
Was den Heap angeht: wenn kein Speicher oder Adressraum mehr verfügbar dann schlagen einfach Versuche Speicher oder Adressraum anzufordern fehl, d.h. die entsprechende Funktion kommt mit einem Fehlercode zurück.
Wenn das Programm dem das passiert damit umgehen kann ist alles i.O. bis auf dass es wahrscheinlich eine Meldung anzeigen wird ala "die Datei die sie laden wollen ist zu gross" oder "konnte XYZ nicht machen weil kein Speicher".
Wenn das Programm mies programmiert ist ... kann alles mögliche passieren. Im Normalfall "stürzt das Programm ab".Was das Auslagern von Seiten angeht: das ist AFAIK je nach OS unterschiedlich implementiert. Theoretisch könnte man schon bevor Seiten ausgelagert werden müssen sicherstellen dass Platz dafür vorhanden ist. Tun aber was ich weiss die meisten Betriebssysteme nicht, zumindest nicht 100%.
-
hustbaer schrieb:
...sondern es wird für jeden Thread gleich zu Anfang eine bestimmte Menge Adressraum reserviert. Üblicherweise sind das 1MB.
Der Adressraum ist immer fix. Es werden aber tatsächlich 1MB reserviert. Diese 1MB sind aber noch nicht 'committed' d.h. physikalischer Speicher wird erst benutzt (in 4K Schritten, mit allen Konsequenzen, der MM muß eventuell auslagern, etc.), wenn er auch tatsächlich benötigt wird. Das System erkennt dies an sogenannten 'Page Faults' (Zugriffe ausserhalb des eingeblendeten physikalischen RAMs).
hustbaer schrieb:
Was den Heap angeht: wenn kein Speicher oder Adressraum mehr verfügbar dann schlagen einfach Versuche Speicher oder Adressraum anzufordern fehl, d.h. die entsprechende Funktion kommt mit einem Fehlercode zurück.
Du bringst da was durcheinander, mein lieber Hustenbär. Der Adressraum ist immer festgelegt. Der Heap (unter Windows und nicht nur dort) ist ein Haufen Software, der die realtiv grossen Pages (Windoofs: 4K) in kleinere Bereiche unterteilen kann. (Zur Allokation von System Pages unter Win im User-Mode: VirtualAlloc, unter UNIX ist das sbrk()). Zudem hat man unter Win die Möglichkeit, mit mehreren solcher Heaps innerhalb eines Peozesses zu arbeiten.
hustbaer schrieb:
Was das Auslagern von Seiten angeht: das ist AFAIK je nach OS unterschiedlich implementiert. Theoretisch könnte man schon bevor Seiten ausgelagert werden müssen sicherstellen dass Platz dafür vorhanden ist. Tun aber was ich weiss die meisten Betriebssysteme nicht, zumindest nicht 100%.
Das Aus- und Einlagern von Pages ist eine sehr performancekritische Sache. Deshalb arbeiten viele Systeme in dem Bereich mit einem speziellen 'Filesystem' oder separaten Partitionen. Unter Windoze z.B. ist 'pagefile.sys' zwar im NTFS Namespace sichtbar, der Zugriff erfolgt aber gänzlich anders, als auf 'normale' Dateien. Das Vergrössern oder Verkleinern eines Pagefiles während des Betriebs ist oft mit diesen Performanceanforderungen nicht vereinbar.
-
Kann eigentlich jeder Prozess (theoretisch) den kompletten virtuellen Adressraum von 4GB nutzen?
Also wenn ich zb nen Programm starte (Prozess A), wo die Variable foo die Adresse 100 hat und ich das selbe Programm nochmal starte (Prozess B), dann kann foo im Prozess B wieder die Adresse 100 haben, oder?
-
Wurstfinger schrieb:
Kann eigentlich jeder Prozess (theoretisch) den kompletten virtuellen Adressraum von 4GB nutzen?
Also wenn ich zb nen Programm starte (Prozess A), wo die Variable foo die Adresse 100 hat und ich das selbe Programm nochmal starte (Prozess B), dann kann foo im Prozess B wieder die Adresse 100 haben, oder?Ja, weil Prozesse unter den 'Grossen Systemen' mit 'Virtuellem Speicher' arbeiten. Jeder Prozess sieht nur seinem privaten Adressraum, in dem ihm vom OS bestimmte Speicherseiten eingeblendet werden. Adressen sind realtiv zum Prozeß und haben mit Adressen in anderen Prozessen nichts, oder nur bedingt etwas zu tun.
-
Hm, ok. Aber eins versteh ich dann nicht.
Wenn ich dieses Programm ausführe:#include <iostream> int i; int main() { std::cout << &i; return 0; }bekomm ich folgende Ausgabe:
004249A
Wie kann das sein, dass die globale Variable "i" so eine hohe Adresse hat? i liegt im Datensegment und da jeder Prozess ja die vollen 4GB virt. Adr.raum zur Verfügung hat und vermutlich bei Adresse 0 beginnt, versteh ich nicht wieso i nicht eine ganz niedrige Adresse hat. Weiß das wer?
-
Weiß das absolut NIEMAND hier?

-
Wurstfinger schrieb:
Wie kann das sein, dass die globale Variable "i" so eine hohe Adresse hat? i liegt im Datensegment und da jeder Prozess ja die vollen 4GB virt. Adr.raum zur Verfügung hat und vermutlich bei Adresse 0 beginnt, versteh ich nicht wieso i nicht eine ganz niedrige Adresse hat. Weiß das wer?
Ja, der Prozess hat seinen vollen Adressraum zur Verfügung - aber davon wird der größte Teil für den Heap und den Stack verwendet (die wachsen meistens aufeinander zu). Globale und statische Variablen bekommen dann einen Platz am "Rand" des Adressraums - wo genau, entscheidet der Compiler (der Platz ist verfügbar, also kann er ihn auch nutzen).
-
Dave N. Cutler schrieb:
hustbaer schrieb:
...sondern es wird für jeden Thread gleich zu Anfang eine bestimmte Menge Adressraum reserviert. Üblicherweise sind das 1MB.
Der Adressraum ist immer fix. Es werden aber tatsächlich 1MB reserviert. Diese 1MB sind aber noch nicht 'committed' d.h. physikalischer Speicher wird erst benutzt (in 4K Schritten, mit allen Konsequenzen, der MM muß eventuell auslagern, etc.), wenn er auch tatsächlich benötigt wird. Das System erkennt dies an sogenannten 'Page Faults' (Zugriffe ausserhalb des eingeblendeten physikalischen RAMs).
hustbaer schrieb:
Was den Heap angeht: wenn kein Speicher oder Adressraum mehr verfügbar dann schlagen einfach Versuche Speicher oder Adressraum anzufordern fehl, d.h. die entsprechende Funktion kommt mit einem Fehlercode zurück.
Du bringst da was durcheinander, mein lieber Hustenbär. Der Adressraum ist immer festgelegt. Der Heap (unter Windows und nicht nur dort) ist ein Haufen Software, der die realtiv grossen Pages (Windoofs: 4K) in kleinere Bereiche unterteilen kann. (Zur Allokation von System Pages unter Win im User-Mode: VirtualAlloc, unter UNIX ist das sbrk()). Zudem hat man unter Win die Möglichkeit, mit mehreren solcher Heaps innerhalb eines Peozesses zu arbeiten.
hustbaer schrieb:
Was das Auslagern von Seiten angeht: das ist AFAIK je nach OS unterschiedlich implementiert. Theoretisch könnte man schon bevor Seiten ausgelagert werden müssen sicherstellen dass Platz dafür vorhanden ist. Tun aber was ich weiss die meisten Betriebssysteme nicht, zumindest nicht 100%.
Das Aus- und Einlagern von Pages ist eine sehr performancekritische Sache. Deshalb arbeiten viele Systeme in dem Bereich mit einem speziellen 'Filesystem' oder separaten Partitionen. Unter Windoze z.B. ist 'pagefile.sys' zwar im NTFS Namespace sichtbar, der Zugriff erfolgt aber gänzlich anders, als auf 'normale' Dateien. Das Vergrössern oder Verkleinern eines Pagefiles während des Betriebs ist oft mit diesen Performanceanforderungen nicht vereinbar.
Ich hasse es wenn mich Leute ausbessern weil sie mit meiner Ausdrucksweise nicht einverstanden sind, oder einfach nicht verstehen wie ich etwas meinte.
Du sagst Adressraum ist immer gleich viel da, den kann man nicht reservieren/anfordern?
Blödsinn.
Speicher ist nämlich während das System läuft auch immer gleich viel da, dann könnte man den also auch nicht anfordern oder wie.
Argh.
Wenn ich sage "gib mir nen Adressbereich für 1MB" dann bezeichne ich das als Adressraum anfordern.
Wenn du es anders bezeichnest (Speicher anfordern aber nicht committen - blödsinnige Ausdrucksweise denn man fordert so eben genau KEINEN Speicher sondern nur Adressen an) ... ist nicht mein Problem.Wenn dieses Posting genervt und unfreundlich klingt sorry, aber wie gesagt ich hasse es wenn mich irgendein blöder Fatzke ausbessert nur weil er vielleicht mit meiner Wortwahl nicht zufrieden war oder es einfach nicht versteht.
-
hustbaer schrieb:
Wenn dieses Posting genervt und unfreundlich klingt sorry, aber wie gesagt ich hasse es wenn mich irgendein blöder Fatzke ausbessert nur weil er vielleicht mit meiner Wortwahl nicht zufrieden war oder es einfach nicht versteht.
Macht nichts. Ich hasse es z.B., wenn irgend ein blöder Fatzke mit noch weniger Halbwissen als ich über solche Dinge schreibt.

-
VMS+1 = WNT schrieb:
hustbaer schrieb:
Wenn dieses Posting genervt und unfreundlich klingt sorry, aber wie gesagt ich hasse es wenn mich irgendein blöder Fatzke ausbessert nur weil er vielleicht mit meiner Wortwahl nicht zufrieden war oder es einfach nicht versteht.
Macht nichts. Ich hasse es z.B., wenn irgend ein blöder Fatzke mit noch weniger Halbwissen als ich über solche Dinge schreibt.

Na dann.
Du findest mich doof, ich finde dich doof, perfekte Symmetrie.p.S.: ich weiss schon wovon ich schreibe, danke

-
na, ihr seid ja schräg drauf.
hustbaer schrieb:
p.S.: ich weiss schon wovon ich schreibe, danke

jaja, das sagen sie doch alle...
