2016-06-15 1 views
1

Когда я пытаюсь выполнить приведенный ниже код, я не могу анализировать внутренние вызовы malloc api. Что я не понимаю - системный вызов mmap вызывается только один раз для 2 или более вызовов malloc . Если я назначаю более 4069 байт, он вызывает только один mmap внутри (трассировка идентифицируется с помощью strace -p processid).несколько вызовов malloc внутренне вызывают mmap только один раз

#include<stdio.h> 
#include<stdlib.h> 

main() 
{ 
int *p,*q; 
sleep(20); 
p=malloc(5096); 
printf("p=%p\n",p); 
q=malloc(4096); 
printf("q=%p\n",q); 
sleep(2); 
return 0; 
} 

Трассирование ВЫВОД:

[email protected]:/home/harish# strace -p 6109 
Process 6109 attached 
restart_syscall(<... resuming interrupted call ...> 
) = 0 
brk(0)         = 0xeca000 
brk(0xeec000)       = 0xeec000 
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 14), ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f10b7bc7000 
write(1, "p=0xeca010\n", 11)   = 11 
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 
nanosleep({20, 0}, 
0x7ffc34a51790)  = 0 
write(1, "q=0xecb020\n", 11)   = 11 
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 
nanosleep({2, 0}, 0x7ffc34a51790)  = 0 
exit_group(0)       = ? 
+++ exited with 0 +++ 

То, что я ищу это, если таНос используется более чем один раз он будет называть более одного ММАП, поскольку память превышает в двух таНос х за 4096

+0

Это просто способ реализации «malloc». Вы должны изучить исходный код 'malloc', чтобы понять, как он реализован. –

+0

Где я могу увидеть основной код malloc .please, дайте мне путь для прохождения через – torban

+0

Я просто искал «исходный код malloc» и вижу несколько хороших результатов. Что вы пробовали? – Useless

ответ

2

malloc() не приводит к вызову mmap(). Как правило, это приведет к brk(). Однако не каждый вызов приведет к brk(). Это сильно зависит от выделенных страниц, запросов памяти и других вещей.

+0

Но как память распределяется через mmap, исправьте меня, если я ошибаюсь. – torban

+0

@harish, Это 'mmap 'может быть связано с другим кодом типа' printf() '. – Rohan

+0

Это может быть простой вопрос, но, пожалуйста, дайте мне некоторую уверенность в понимании, например, когда будет вызван вызов brk, и когда sbrk вызывается в malloc-внутренности, неясно – torban

2

Ваш процесс внутренняя куча (доступ через таНос, бесплатно и перераспределить) управляет памятью, как он считает нужным - это включает в себя:

  • растет кучу больших или фиксированных шаги амортизировать стоимость дорогих brk/sbrk системных вызовов в течение нескольких (де) распределения
  • дела с меньшими (де) распределениями внутри этой куча области самой
  • управления (де) фрагментации выделенных записей

Также широко используются различные механизмы для больших и малых распределений, например, небольшие объекты выделяются из этой смежной области, управляемой brk/sbrk, но отдельные крупные объекты могут быть выделены непосредственно с помощью mmap.

+0

Но после комментирования printf в моем коде, я не вижу ни одного mmap в трассировке только brk отображается дважды. Так что я ожидаю, что mmap не имеет никакого отношения к malloc – torban

+0

Я сказал malloc _may_ использовать 'mmap', для некоторых распределений, в некоторые реализации. Это не обязательно. Если вы хотите понять, что происходит внутри реализации _your_, прочитайте код. – Useless