Является ли malloc/бесплатным syscall или библиотечной программой, предоставляемой libc?

Если malloc/free реализуется как библиотечная процедура в libc, то выполняется ли она поверх sysck syscall или syscall mmap или что-то еще?

И чтобы быть общим, выполняет ли функция, объявленная в sys/syscall.h, ВСЕ системные вызовы на целевой машине?

Ответ 1

malloc и free являются стандартными библиотечными функциями C, которые должны выполняться каждой реализацией C.

Стандарт C определяет только способ поведения этих функций и ожидаемое поведение от них. Как они должны выполняться в левой части каждой реализации.

Короче говоря, это детали реализации реализации, которую вы используете.

( "реализация" состоит из компилятора, компоновщика, библиотеки времени выполнения и, возможно, нескольких других вещей.)

Ответ 2

Очень часто malloc и free используют низкоуровневые службы выделения виртуальной памяти и выделяют несколько страниц (или даже мегабайт) одновременно, используя системные вызовы, такие как mmap и munmap (и, возможно, sbrk). Часто malloc предпочитает повторно использовать ранее free памяти, когда это уместно. Большинство реализаций malloc используют разные и разные стратегии для "больших" и "маленьких" распределений и т.д.

Обратите внимание, что виртуальное адресное пространство может быть ограничено, например, с помощью setrlimit (2). Используйте в Linux pmap (1) и proc (5), чтобы узнать больше о виртуальном адресном пространстве какого-либо процесса (например, /proc/self/maps для вашего собственного или /proc/1234/maps - также команда pmap 1234 - для процесс пид 1234).

Вы можете посмотреть исходный код GNU libc, заглянуть в исходный код других стандартных библиотек C (таких как musl-libc), прочитать о реализациях malloc, выбрать некоторые другие или реализовать свою собственную, или использовать strace, чтобы выяснить экспериментально.

Прочтите справочную страницу по syscalls (т.е. syscalls (2)) и файл <asm/unistd.h> для получения списка системных вызовов.


очень быстрый malloc

(Я считаю, что это может быть самой быстрой реализацией malloc; однако это не очень полезно; это соответствует стандартам)

Я твердо верю, что стандарт C очень неясен в отношении malloc и free. Я почти уверен, что следующие функции соответствуют букве (но не духу) стандарта:

 /* politically incorrect, but very probably standard conforming */
 void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
 void free(void*ptr) { }

Конечно, вы будете кодировать calloc и realloc соответственно.

(Кстати, каждый код, использующий malloc должен проверять его на неудачу, но некоторые - неправильно - нет; malloc может возвращать NULL в случае неудачи, и люди должны тестировать на этот случай)


GNU libc предоставляет вам хуки для ваших собственных функций malloc (и вы, возможно, даже можете использовать Boehm Garbage Collector прозрачно через них). Эти крючки могут устареть и являются нестандартными.

При использовании GNU libc посмотрите также на mallinfo (3) и malloc_stat (3) и связанные с ними функции.

Ответ 3

Вы также можете использовать альтернативную реализацию для malloc и free если вы используете другой распределитель памяти. Например, распределитель запаса памяти иногда используется для повышения производительности многопоточных приложений.