Speichermanagement mit C

Florian Lohoff flo at rfc822.org
Sun Apr 28 18:23:03 CEST 2002


On Sun, Apr 28, 2002 at 05:48:27PM +0200, Andre Landwehr wrote:
> Ich schaue mir in einer anderen Konsole mit top an, was mit dem
> Speicher passiert. Anfänglich steht in der Spalte "Size" die Zahl
> 312. Dann allokiere ich Speicher, jetzt steht da 340. Soweit, so
> gut. Dann gebe ich den Speicher wieder frei, und es steht immer
> noch 340 da. Warum?

Das hat was mit speichermanagement unter unix zu tun - Der
speicherbereich fuer jeden prozess faengt bei "0" an - Dann wird ein
program geladen und der "heap" pointer wird nach oben "geschoben". Immer
um eine page (Siehe system call "brk" oder "break").

D.g. der pointer geht auf 0x1000 - Der pointer wird aber nie nach
untern geschoben - Dafuer gibt es keinen system-call. D.h. wenn du
einmal in deinen "virtuellen" addressraum in deinem Task memory
einblendest dann wird das nie wieder freigegeben - Ein prozess kann
nur wachsen - niemals kleiner werden. 

Der neu allokierte speicher vom heap wird dann von der glibc verwaltet
im malloc. D.h. wenn du speicher freigibts und ihn dann wieder
allokierst wird nicht wieder der heap pointer via brk nach oben
geschoben sondern die selbe page neu verwendet.

Das ganze ist kernel intern noch komplizierter. Weil - Wenn du brk
machst bekommst du ein mapping einer "null" page die read und write
protected ist - Erst wenn du das erste mal auf die page zugreifst
wird diese wirklich allokiert und die null page kopiert in dein 
mapping - Also eine spezielle art von "copy on write" wobei eher ein
"copy on read" :)

Normalerweise ist das so das wenn deine page nicht mehr benoetigt wird
diese irgendwann einmal ausgeswappt wird. Sieht man auch an dem
unterschied zwischen RSS und VSZ  - Die "Resident Set Size" ist dein
wirklicher "Speicher" verbrauch - Die VSZ ist deine "Virtual Set Size"
also dein virtuell gemappter speicher fuer den prozess.

Der unterschied zwischen diesen beiden werten ist das was im swap ist.

Beim X Server ist das leider irrefuehrend - Weil wenn der X Server
die Hardware im AGP oder PCI einmappt wird diese auch in der RSS
aufgefuehrt. Ein X Server wird nicht 64 oder 128 MB gross :)

Ein weiteres problem sind threads bei denen man nicht wirklich
rausfinden kann das diese das virtual memory teilen.

Flo
-- 
Florian Lohoff                  flo at rfc822.org             +49-5201-669912
Nine nineth on september the 9th              Welcome to the new billenium
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
URL: <http://lug-owl.de/pipermail/linux/attachments/20020428/1445cb05/attachment.sig>


More information about the Linux mailing list