Подтвердить что ты не робот

Является ли распределение памяти системным вызовом?

Является ли распределение памяти системным вызовом? Например, malloc и new. Является ли куча разделяемой различными процессами и управляется ОС. Как насчет частной кучи? Если распределение памяти в куче управляется ОС, насколько это дорого?

Мне также хотелось бы иметь ссылку на места, где я могу больше узнать об этой теме.

4b9b3361

Ответ 1

В общем случае malloc и new не выполняют системный вызов при каждом вызове. Однако они используют механизм более низкого уровня для выделения больших страниц памяти. В Windows нижний механизм VirtualAlloc(). Я считаю, что в POSIX-системах это несколько эквивалентно mmap(). Оба они выполняют системный вызов для выделения памяти для процесса на уровне ОС. Последующие распределения будут использовать меньшие части этих больших страниц без системного вызова.

Куча обычно является внутренним процессом и не разделяется между процессами. Если вам это нужно, большинство ОС имеют API для размещения разделяемой памяти. Портативная оболочка для этих API доступна в библиотеке Boost.Interprocess.

Если вы хотите узнать больше о распределении памяти и отношениях с ОС, вы должны взглянуть на хорошую книгу об операционных системах. Я всегда предлагаю Современные операционные системы Эндрю С. Таненбаума, так как его очень легко читать.

Ответ 2

(Предположим, что операционная система с защитой памяти. Возможно, это не так, например, во встроенных устройствах.)

Является ли распределение памяти системным вызовом?

Не обязательно каждое распределение. Процесс должен вызвать ядро, если его куча недостаточно велика для запрошенного выделения, но библиотеки C обычно запрашивают большие куски, когда они это делают, с целью уменьшения количества системных вызовов.

Является ли куча разделяемой различными процессами и управляется ОС. Как насчет частной кучи?

Куча не разделяется между процессами. Однако он делился между потоками.

Как дорогостоящие системные вызовы выделения памяти ядра полностью зависят от ОС. Поскольку это очень распространенная вещь, вы можете ожидать, что она будет эффективной при обычных условиях. В условиях низкой ОЗУ ситуация осложняется.

Ответ 3

См. управление многоуровневой памятью в Win32.

enter image description here

Распределение памяти всегда является системным вызовом, но выделение выполняется как страницы. Если на выделенных страницах есть место, диспетчер памяти будет выделять запрошенное пространство без изменения режима ядра. Лучше всего в HeapAlloc, он обеспечивает прекрасный контроль над распределением, где Virtual Alloc округляет распределение для одной страницы. Это может привести к чрезмерному использованию в памяти.

В основном куча по умолчанию и частные кучи обрабатываются одинаково, за исключением того, что размер кучи по умолчанию указан во время связывания. Размер кучи по умолчанию составляет 1 МБ и растет по мере необходимости.

Ответ 4

Функции выделения памяти и выражения языка, такие как malloc/free и new/delete, не являются системными вызовами. Malloc\free является частью библиотеки C\С++, а новый \delete является частью системы времени выполнения С++. Вызовы обоих могут привести к системным вызовам. В других языках распределение памяти реализовано аналогичным образом.

В целом управление памятью не может быть реализовано без использования ОС вообще, поскольку память является одним из основных системных ресурсов и благодаря этому управлению глобальной памятью, выполняемому ядром ОС. Но из-за того, что системные вызовы относительно дороги, люди пытаются сконструировать languges и библиотеки распределения памяти таким образом, чтобы минимизировать количество системных вызовов.

Как я знаю, куча является объектом внутрипроцесса. Это означает, что все запросы на выделение/освобождение памяти управляются enterelly самим процессом. Операционная система знает только местоположение и размер кучи, а также обслуживает два типа запросов из системы управления внутрипроцессной памятью:

add memory page at virtual address X
release memory page from virtual address X

Локальная система управления памятью запрашивает эти службы, когда она решает, что у нее недостаточно памяти в пуле памяти кучи и когда она решит, что у нее слишком много памяти в пуле памяти кучи. Несмотря на то, что распределение памяти обычно сконструировано таким образом, чтобы минимизировать количество системных вызовов, он по-прежнему остается примерно на порядок дороже, чем выделение памяти в стеке. Это связано с тем, что алгоритмы памяти alocation\deallocation of heap намного сложнее и дороже, чем те же, что и в стеке.