Node:Confusing alloc,
Next:QDPMI VM,
Previous:How much memory,
Up:Memory
malloc
/free
don't affect virtual memory...Q: I did malloc(50*1024*1024)
, but didn't see any paging
happen, and I only have 8 MBytes of RAM on my machine. Is this virtual
memory thing for real?
Q: I malloc
'ed a large chunk of memory, but when I check
values returned by _go32_remaining_physical_memory
or
__dpmi_get_memory_information
, I don't see any change!
Q: When I free
allocated RAM,
_go32_remaining_physical_memory
reports there was no change in the
available RAM....
Q: I'm looking for a way to tell how much memory is available,
something like coreleft
in Borland C?
A: CWSDPMI (and, possibly, other DPMI hosts) only pages in memory
when it is actually accessed. If you only malloc
it, but don't
actually access it, it won't grab those pages. Try calloc
and
see the big difference.
When you call free
, DJGPP library doesn't return memory to the
system, it just adds it to its internal pool of free pages. So, from the
point of view of the DPMI server, these pages are not "free".
In addition, several widely-used DPMI servers, such as those built into
Windows, have their own quirks related to memory allocation. For
example, some of them won't let you allocate more than half the
available memory in a single chunk. As another example, on OS/2
_go32_remaining_physical_memory
reports a constant very large
value that doesn't change in the course of the program.
Note that the distinction between the physical and virtual memory is only meaningful on DOS. More sophisticated operating systems usually conceal the difference entirely, so only the sum of these two types of memory usually (but not always) gives an approximation of the total free memory.
Because of these peculiarities, there's no convenient and easy way to
return the amount of free memory available at any given moment, even in
plain DOS. Some programs only care about available physical RAM (they
don't want to page to disk, since that causes a considerable slow-down);
for these, I recommend to call the
_go32_remaining_physical_memory
library function at program
startup, and then track memory usage with sbrk(0);
.
Alternatively, disabling virtual memory altogether (by using CWSDPR0 or
by loading CWSDPMI with -s-
parameter), and checking values
returned by malloc
against NULL
, might be all you need to
know when you are about to run out of free physical memory. Programs
that need to know when they are about to run out of virtual
memory should call _go32_remaining_virtual_memory
instead. Once
again, these methods will only work reasonably well in plain DOS.