new Account() schrieb:
Inwiefern ist allokieren nicht nutzen?
Voraussetzung: Ein OS wie Windows oder Linux auf einer Plattform mit virtuellem Speicher und MMU.
Pseudo-C ... mit p=malloc(1024*1024) hast du ein MB (jaja, eigentlich MiB=Mebibyte) virtuellen Speicher im Adressraum des Prozesses allokiert. Dem MB ist noch kein physischer Speicher zugeordnet. Es ist noch völlig unklar, wo genau die Daten landen würden, wenn man auf den Bereich was schreiben würde. Darüber macht sich das OS noch keinen Gedanken. Wozu auch? Der Bereich ist ja ungenutzt. Die Chancen sind groß, dass sowieso nicht alles verwendet wird. Wie das OS das MB bis dahin in seiner Rechnung "Wieviel RAM ist noch frei" behandelt, ist sehr unterschiedlich. Ganz grob, wirklich stark vereinfacht, kann man sagen: Windows zieht das MB schon ab, Linux nicht.
Benutzen heißt, dass du was vom mit p adressierten Bereich beschreibst, also Daten ablegst, die wieder lesbar sein sollen. Du sagts z.B. memset(p, 'X', 1024*512) um die erste Hälfte des MB zu beschreiben. Beim Schreibversuch fällt der MMU auf, dass es noch keine Zuordnung ("memory mapping") für die virtuelle Adressen auf physischen Speicher gibt und wirft page faults. Erst jetzt sucht der Kernel nach freiem, physischen Speicher, den er zum Abspeichern nutzen könnte. Hat er was gefunden, steht das Mappping (oder mehrere) virtuelle Adresse --> physische Adresse und die 512kB werden endlich ins RAM geschrieben. Dann hat unser Prozess 1 MB allokiert, aber nur 512kB davon genutzt. Für den Rest wird weiterhin kein physischer Speicher belegt.
new Account() schrieb:
Sobald ich speicher in einem Programme allokiert habe, kann ich ohne weiteres den reservierten Speicher nutzen.
Das ist die rosarote Wunschwelt. Klar will man das. Dummerweise brauch man viel mehr Ressourcen, um das sicherzustellen. Genau darüber stolpert der Threaderöffner mit seiner Swap-Verweigerung unter Win7.
Programme neigen dazu, viel mehr virtuellen Speicher anzufordern als sie nutzen. Die OSe in der Praxis haben somit die Wahl zwischen:
A) schon früh ohne Not Speichermangel melden. Programme bekommen nix mehr, obwohl noch massenhaft physischer Speicher frei ist, aber bereits ungenutzter, virtueller Speicher in Größe des verfügbaren physischen Speichers ausgegeben wurde.
B) sich erstmal problemfrei durchwurschteln, indem optimistisch den Programmen mehr virtueller Speicher zur Verfügung gestellt wird als physischer Speicher da ist. Damit fällt das OS allerdings evtl. 'auf die Fresse', wenn der physische Speicher
wirklich nicht reicht - aber eben erst dann.
Windows geht traditionell den Weg A, konnte den dank "Virtualisierungskram überall" aber nicht durchhalten (ab Win Server 2008 R2?). Linux geht traditionell den Weg B, läßt sich aber umkonfigurieren, insb. auch auf Weg A mit feingranularer Einstellung, wieviel virtueller Speicher maximal rausgeben wird.