memory limits....
Stephen Adler
adler at stephenadler.com
Thu May 19 11:18:18 EDT 2005
Thanks Jerry,
The kernel does allocate more than 2 gigs of memory since I currently
have 4 gigs of physical memory in my server, and the kernel reports
that it "sees" 4 gigs of physical memory. I'm wondering if there is
a difference between memory allocation in user space and memory
allocation in kernel space. If I remember right, the CPU runs in
two different modes, a user mode, and a supervisor mode or something
like that, and the difference is how the CPU addresses memory.
(These are notions I have buried deep in my memory... and could
be false.) So perhaps the user space memory limit is different from
the kernel space memory limit?
Cheers. Steve.
On Thu, 2005-05-19 at 11:09, Jerry Feldman wrote:
> On Thursday 19 May 2005 10:28 am, Stephen Adler wrote:
> > Thanks for the reply. I'm using malloc, under gcc 3.2, red hat,
> > enterprise linux 3, kernel 2.4. After allocating about 2.4 Gigs,
> > subsequent malloc's return NULL. I check for NULL returns from
> > my malloc's and exit my code if this condition is met. The OS
> > seems to be happy, nothing grinds to a halt. My applications
> > allocates all the needed memory at startup, so if not enough
> > is allocated, it informs the user and exits.
> Classicly, the way malloc works requires some explanation:
> First your program is given a virtual memory map. This includes where the
> program text (eg code) is mapped. This is usually readonly, the program
> stack, the program's initialized data, and unititalized data. Then you get
> what is called a heap. In classic Unix and Linux, the heap grows upward
> using the brk(2) or sbrk(2) system calls. These grow the heap contiguously.
> At some point they may his a barrier. This could be the top of your virtual
> address space, or it could be that some other operation, such as mmap(2) or
> the loader has mapped something else up there. Malloc(3) periodically grabs
> a chunk of memory from the heap, normally in multiples of page sizes. More
> modern mallocs may take a different approach by using mmap(2) to allocate
> its chunks. The advantage of using mmap(2) is that it can allocate
> non-contiguous chunks. Malloc(3) is simply a set of library functions and
> has nothing to do with the compiler, BUT the compiler is responsible for
> setting up the initial virtual mapping in your program, and the loader is
> responsible for the dynamically loading of your program, and mapping in
> shared libraries, et. al. Also, remember that a 32 bit signed integer is
> limited to about 2GB. I think that you may be running into a 32-bit
> instrinsic limit. This could be imposed by malloc(3) or by the kernel where
> you have a 2GB limit on heap size.
More information about the Discuss
mailing list