Является ли выделение памяти системным вызовом? - PullRequest
48 голосов
/ 30 июня 2011

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

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

Ответы [ 4 ]

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

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

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

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

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

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

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

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

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

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

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

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

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

enter image description here

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

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

3 голосов
/ 29 августа 2013

Функции выделения памяти и языковые операторы, такие как 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

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

...