Функции выделения памяти и языковые операторы, такие как malloc / free и new / delete, не являются системными вызовами. Malloc \ free является частью библиотеки C \ C ++, а new \ delete является частью системы времени исполнения C ++. Вызовы обоих могут иногда приводить к системным вызовам. На других языках распределение памяти реализовано аналогичным образом.
В общем, управление памятью вообще невозможно реализовать без участия ОС, поскольку память является одним из основных системных ресурсов и из-за этого глобального управления памятью, выполняемого ядром ОС. Но из-за того, что системные вызовы относительно дороги, люди пытаются спроектировать языки и библиотеки выделения памяти таким образом, чтобы минимизировать количество системных вызовов.
Как я знаю, куча - это внутрипроцессная сущность. Это означает, что все запросы выделения / освобождения памяти полностью управляются самим процессом. Операционная система знает только местоположение и размер кучи и обслуживает два типа запросов от системы управления внутрипроцессной памятью:
add memory page at virtual address X
release memory page from virtual address X
Локальная система управления памятью запрашивает эти службы, когда решает, что ей недостаточно памяти в пуле памяти кучи, и когда она решает, что у нее слишком много памяти в пуле памяти кучи.
Несмотря на то, что выделение памяти обычно выполняется таким образом, чтобы минимизировать количество системных вызовов, оно все равно остается на порядок дороже, чем выделение памяти в стеке. Это потому, что алгоритмы выделения \ освобождения памяти для кучи намного сложнее и дороже, чем для стека.