的C代码:的malloc() - 是否使用BRK()或mmap()的
// 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;
}
当编译如下代码:
printf("%10p\n", sbrk(0));
我得到警告提示:
format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’
问题1:这是为什么?
而且在我malloc(1024 * 1024)
之后,程序中断似乎没有改变。
这里是输出:
9b12000
9b12000
9b12000
问题2:该方法是否在堆中分配内存时开始以备将来使用?或者编译器改变分配的时间点?否则,为什么?
[更新]摘要:BRK()或mmap()的
审查TLPI和检查手册页(从TLPI的作者的帮助),现在我明白了如何malloc()
决定使用brk()
后或mmap()
,如下:
mallopt()
可以设置参数来控制的malloc()
行为,有一个名为M_MMAP_THRESHOLD
参数,一般来说:
- 如果请求的内存小于它,将使用
brk()
; - 如果请求的内存大于或等于它,将使用
mmap()
;
参数的默认值是128kb
(我的系统上),但在我的测试程序中,我使用1MB,所以mmap()
选择,当我改变请求的内存为32KB,只见brk()
将被使用。
该书提到TLPI第147页和第1035页,但我没有仔细阅读该部分。
该参数的详细信息可在手册页mallopt()
中找到。
'#include'? –
JS1
@ JS1是的,解决了这个问题,你可以给我一个解释,我是linux编程的新手...... –
你需要'''sbrk()'的原型''在'unistd.h'中。如果没有原型,编译器会假定未知函数返回“int”。 – JS1