Значит, malloc не вызывает никаких системных вызовов? - PullRequest
6 голосов
/ 13 июня 2011

Связанный код:

  write(-1, "test", sizeof("test"));
  void * p = malloc(1024);
  void * p2 = malloc(510);
  write(-1, "hi", sizeof("hi"));

Соответствующий вывод:

write(4294967295, "test\0", 5)          = -1 EBADF (Bad file descriptor)
brk(0)                                  = 0x601000
brk(0x622000)                           = 0x622000
write(4294967295, "hi\0", 3)            = -1 EBADF (Bad file descriptor)

Я удивлен, что такая операция на низком уровне не связана с системным вызовом?

Ответы [ 3 ]

19 голосов
/ 30 июня 2011

Не каждый вызов malloc вызывает системный вызов. На моем рабочем столе linux malloc выделяет пространство в блоках по 128 КБ, а затем распределяет пространство. Так что я буду видеть системный вызов каждые 100-200 вызовов malloc. На freebsd malloc выделяет по 2 МБ блоков. На вашей машине номера скорее всего будут отличаться.

Если вы хотите видеть syscall на каждом malloc, выделите большой объем памяти (malloc (10 *1024* 1024 * 1024))

3 голосов
/ 13 июня 2011

malloc () вызывает системную функцию brk () (в Linux / Unix) - но она вызывает ее только в том случае, если локальная куча исчерпана.Т.е. большинство реализаций malloc управляют кучей памяти, полученной с помощью brk (), и если она слишком мала или слишком фрагментирована, они запрашивают больше с помощью brk ().

3 голосов
/ 13 июня 2011

Что вы думаете о БРК?malloc абсолютно вызывает системный вызов в этом примере, системный вызов просто не является "malloc".

...