Till now what I understood is as follow:
malloc
internally uses sbrk
and brk
to allocate memory by increasing top of heap.mmap
allocate memory in form of pages.Now, let's say current top of sbrk/malloc
is 0x001000
. And I use mmap
to allocate a page of 4KB which is allocated at 0x0020000
. Later, if I used malloc
multiple times and because of that it had to increase sbrk
top. So, what if top reaches 0x002000
?
So, it will be great if someone can clarify the following.
malloc
and mmap
.Thank you.
malloc is normally not implemented this way today... malloc used sbrk(2)
in old implementations, when extending the data segment was the only way to ask the system for more virtual memory. Newer systems use mmap(2)
if available, as they allow more flexibility when the virtual space is large enough (each mmap
ed chunk is managed as a new data segment for the process requesting it). sbrk(2)
expands and shrinks the data segment, just like a stack.... so you have to be careful using sbrk(2)
in case you are going to use it intermixed with a sbrk
implementation of malloc. The way malloc operates, normally disallows you to return any memory obtained with sbrk(2)
if you intermix the calls... so you can only use it to grow the data segment safely.
sbrk(2)
also allocates memory in pages. Since paged virtual memory emerged, almost all o.s. allocation is made in page units. Newer systems have even more than one pagesize (e.g. 4Kb and 2Mb sizes), so you can get benefit of that, depending on the application.
As 64bit systems get more and more use, there's no problem in allocating address space large enough to allow for both mecanisms to live together. This is an advantage for a multiple heap malloc implementation, as memory is allocated and deallocated independently, and never in LIFO allocated order.
Malloc uses different approaches to allocate memory, but implementations normally try not to interfere with user sbrk(2)
usage. You have to be careful, that is, if you intermix malloc(3)
calls with sbrk(2)
in a sbrk(2)
malloc system. then you run the risk of sbrk(2)
ing over the malloc adjusted data segment, and breaking the malloc internal data structures. You had better not to use sbrk(2)
yourself if you are using a sbrk(2)
implementation of malloc.
Finally, to answer your question, mmap(2)
allocates memory as malloc(3)
does, so malloc is not, and has not to be, aware of the allocated memory you did for your own use with mmap(2)
.