在循环中调用 malloc 后程序中断不会改变?
Program break doesnt change after calling malloc in a loop?
运行 这段代码应该会导致程序中断增加大约 malloc_counts * _SC_PAGESIZE
而不是我每次都得到固定的程序中断,所以这是为什么。 malloc 应该调用 brk
或 sbrk
,它们本身将传递给下一页的大小向上舍入(需要一些额外的工作)。那么发生了什么事?
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
int main(){
const long malloc_counts = 10;
printf("PAGE SIZE: %ld\n", sysconf(_SC_PAGESIZE));
void* allocated_pool[malloc_counts];
for(int counter=0; counter < malloc_counts; counter++)
{
printf("program brk: %p\n",sbrk(0));
allocated_pool[counter] = malloc(127*4096);
}
}
which i guess of course using optimizations
您的编译器优化了对 malloc
的调用,因为它们未被使用。因为 malloc
调用被删除,所以没有任何变化,堆也没有移动。
而且 glibc 过度分配了很多,所以这个值必须足够大才能看到它。而且默认的M_MMAP_THRESHOLD
好像是128 * 1024。所以你必须选择一个足够大的值,但低于 mmap 阈值才能看到 glibc 中的差异。
禁用你的编译器优化并分配大量内存,堆将被移动。尝试以下操作:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
printf("PAGE SIZE: %ld\n", sysconf(_SC_PAGESIZE));
#define malloc_counts 20
void *allocated_pool[malloc_counts];
for(int counter = 0; counter < malloc_counts; counter++) {
printf("program brk: %p\n", sbrk(0));
allocated_pool[counter] = malloc((size_t)127 * 1024);
*(void *volatile *)&allocated_pool[counter];
}
}
运行 这段代码应该会导致程序中断增加大约 malloc_counts * _SC_PAGESIZE
而不是我每次都得到固定的程序中断,所以这是为什么。 malloc 应该调用 brk
或 sbrk
,它们本身将传递给下一页的大小向上舍入(需要一些额外的工作)。那么发生了什么事?
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
int main(){
const long malloc_counts = 10;
printf("PAGE SIZE: %ld\n", sysconf(_SC_PAGESIZE));
void* allocated_pool[malloc_counts];
for(int counter=0; counter < malloc_counts; counter++)
{
printf("program brk: %p\n",sbrk(0));
allocated_pool[counter] = malloc(127*4096);
}
}
which i guess of course using optimizations
您的编译器优化了对 malloc
的调用,因为它们未被使用。因为 malloc
调用被删除,所以没有任何变化,堆也没有移动。
而且 glibc 过度分配了很多,所以这个值必须足够大才能看到它。而且默认的M_MMAP_THRESHOLD
好像是128 * 1024。所以你必须选择一个足够大的值,但低于 mmap 阈值才能看到 glibc 中的差异。
禁用你的编译器优化并分配大量内存,堆将被移动。尝试以下操作:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
printf("PAGE SIZE: %ld\n", sysconf(_SC_PAGESIZE));
#define malloc_counts 20
void *allocated_pool[malloc_counts];
for(int counter = 0; counter < malloc_counts; counter++) {
printf("program brk: %p\n", sbrk(0));
allocated_pool[counter] = malloc((size_t)127 * 1024);
*(void *volatile *)&allocated_pool[counter];
}
}