1

以下のコードを試してみると、malloc api の内部呼び出しを明確に分析できません。システム コール mmap が 2 つ以上の malloc 呼び出しに対して 1 回だけ呼び出されることは明らかではありません。4069 バイト以上を割り当てている場合は、それも内部で 1 つの mmap のみを呼び出しています (トレースは strace -p processid を使用して識別されます)。

#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;
}

トレース出力:

root@TEST:/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 +++

私が探しているのは、mallocが複数回使用されている場合、メモリが4096を超える2つのmallocで超過しているため、複数のmmapを呼び出すことです

4

2 に答える 2

2

プロセスの内部ヒープ (malloc、free、および realloc を介してアクセス) は、必要に応じてメモリを管理します。これには以下が含まれます。

  • ヒープを大きくまたは一定の増分で成長させて、複数の (解放) 割り当てにわたる高価なbrk/システムコールのコストを償却するsbrk
  • そのヒープ領域自体の内部でより小さな (デ) 割り当てを処理する
  • 割り当てられたレコードの断片化 (デ) の管理

大きな割り当てと小さな割り当てに異なるメカニズムを使用することも一般的です。たとえば、小さなオブジェクトはbrk/によって管理される連続した領域から割り当てられますsbrkが、個々の大きなオブジェクトは で直接割り当てられる場合がありますmmap

于 2016-06-15T09:17:59.347 に答える
2

malloc()mmap()呼び出しにはなりません。一般的には になりbrk()ます。ただし、各呼び出しが になるわけではありませんbrk()。現在割り当てられているページ、要求されたメモリなどに大きく依存します。

于 2016-06-15T08:45:44.457 に答える