Предполагается, что запуск этого фрагмента кода приведет к увеличению перерыва в программе примерно на 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);
}
}
counter <= malloc_counts;
вызовет переполнение массива, когдаcounter == malloc_counts;
- person Weather Vane   schedule 14.09.2020malloc
может использовать либоsbrk
, либоmmap
для захвата памяти, и последний не изменит точку останова. Я не знаю, как текущий алгоритм решает, что использовать. Вы можете использоватьstrace
, чтобы увидеть, что делается. - person Nate Eldredge   schedule 14.09.2020counter <= malloc_counts
должно использовать оператор сравнения «меньше-тогда» вместо «меньше-или-равно». - person CiaPan   schedule 14.09.2020malloc(127 * 4096);
- person KamilCuk   schedule 14.09.2020#include
и добавлятьint main()
неинтересно. Что возвращаетmallinfo
в каждом цикле?malloc_stats
?mallopt
сM_MMAP_THRESHOLD
тоже было бы интересно. не удается воспроизвести, ссылка на godbolt Каково значениеmalloc_counts
? - person KamilCuk   schedule 14.09.2020127 * 4096
- это очень большая сумма, намного превышающая размер страницы Linux (необходимо более одной страницы), что еще больше сбивает с толку, поскольку не похоже, что отличается от мне . - person Khaled   schedule 14.09.2020M_MMAP_THRESHOLD
. - person KamilCuk   schedule 14.09.2020gcc prog.c
все еще безрезультатно. - person Khaled   schedule 14.09.2020gcc -O0 prog.c
, чтобы убедиться. Если нет, как сказано, запросите информацию о malloc и запросите M_MMAP_THRESHOLD и посмотрите, что происходит. Также проверьте сборку и убедитесь, что вызовыmalloc
действительно существуют и не оптимизированы. - person KamilCuk   schedule 14.09.2020127*4096
это слишком! к127*1024
, мой плохой. По умолчаниюM_MMAP_THRESHOLD
это128*1024
- person KamilCuk   schedule 14.09.2020