c code:
// program break mechanism
// TLPI exercise 7-1
#include <stdio.h>
#include <stdlib.h>
void program_break_test() {
printf("%10p\n", sbrk(0));
char *bl = malloc(1024 * 1024);
printf("%x\n", sbrk(0));
free(bl);
printf("%x\n", sbrk(0));
}
int main(int argc, char **argv) {
program_break_test();
return 0;
}
When compiling following code:
printf("%10p\n", sbrk(0));
I get warning tip:
format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’
Question 1: Why is that?
And after I malloc(1024 * 1024)
, it seems the program break didn't change.
Here is the output:
9b12000
9b12000
9b12000
Question 2: Does the process allocate memory on heap when start for future use? Or the compiler change the time point to allocate? Otherwise, why?
[update] Summary: brk() or mmap()
After reviewing TLPI and check man page (with help from author of TLPI), now I understand how malloc()
decide to use brk()
or mmap()
, as following:
mallopt()
could set parameters to control behavior of malloc()
, and there is a parameter named M_MMAP_THRESHOLD
, in general:
- If requested memory is less than it,
brk()
will be used; - If requested memory is larger than or equals to it,
mmap()
will be used;
The default value of the parameter is 128kb
(on my system), but in my testing program I used 1Mb, so mmap()
was chosen, when I changed requested memory to 32kb, I saw brk()
would be used.
The book mentioned that in TLPI page 147 and 1035, but I didn't read carefully of that part.
Detailed info of the parameter could be found in man page for mallopt()
.
#include <unistd.h>
? – Predominancesbrk()
which is inunistd.h
. Without a prototype, the compiler assumes that unknown functions returnint
. – Predominancesbrk()
was declared instdlib.h
, thank you! – Illuviation-Wall
, and I see the warningwarning: implicit declaration of function ‘sbrk’
, nice tip! – Illuviation