malloc возвращает память или виртуальное адресное пространство - PullRequest
5 голосов
/ 20 апреля 2011

Распределяет ли malloc блок памяти в куче или он должен называться виртуальным адресным пространством?

Я придирчив, называя это виртуальным адресным пространством или это просто наследие DOS? Как насчет Linux?

EDIT:

много ответов с большими подробностями, но никто из них не отвечает на мой вопрос.

Ответы [ 15 ]

8 голосов
/ 24 апреля 2011

malloc выделяет память в куче, точка.

Ваша библиотека C обычно хранит список (или некоторую более сложную структуру данных) доступных блоков памяти, находя подходящий фрагмент, удовлетворяющий malloc (возможно, разбивая больший блок на несколько меньших) ивозвращение free памяти в список (возможно, объединение нескольких меньших блоков в больший)

только , когда список не содержит достаточно большого блока, чтобы удовлетворить ваш malloc, библиотека запросит у ОС дополнительную память, например, используя системный вызов sbrk .Адрес, возвращаемый этим системным вызовом, может быть виртуальным или реальным, в зависимости от вашего оборудования, но как программист вы не можете (и не должны) знать это.

Сказать, что malloc выделяет виртуальное адресное пространство, а не блок в куче, все равно, что сказать, что read читает с вашего жесткого диска, а не из файла: это не имеет значения с точки зрения вызывающего, а невсегда верно.

6 голосов
/ 20 апреля 2011

Существует как минимум 3 способа измерения потребления памяти:

  • виртуальное адресное пространство - объем адресного пространства вашего процесса, потребляемый выделением.это также влияет на фрагментацию и максимальное непрерывное выделение в будущем, которое вы можете сделать.
  • фиксация - это учет операционной системы максимально возможного физического хранилища, необходимого для поддержки всей доступной для записи, не файловой / поддерживаемой устройствомпамять выделена для вашего процесса.если ОС позволяет ей превысить общую физическую память + подкачка, очень плохие вещи могут произойти при первой записи избыточного объема в память.
  • физическая память - количество физических ресурсов (потенциально включая подкачку, в зависимости от вашегоинтерпретация) ваш процесс в настоящее время занимает.Это может быть меньше, чем плата за фиксацию из-за девственных нулевых страниц и нетронутых личных карт с возможностью записи файлов, или больше, чем плата за фиксацию из-за недоступных для записи или общих сопоставлений, используемых процессом (но обычно они могут быть заменены / отброшены).

malloc обычно затрагивает их всех.

Редактировать: Итак, лучший способ ответить на ваш вопрос - это сказать:

malloc выделяет виртуальную память .

А виртуальная память потребляет:

  • виртуальное адресное пространство,
  • фиксация и
  • физических ресурсов, если они были записаны.
4 голосов
/ 24 апреля 2011

malloc - это вызов библиотеки.В Linux это, в свою очередь, вызывает sbrk системный вызов.sbrk увеличит размер кучи, но фактически не выделяет физическую память.Когда процесс пытается получить доступ к этому адресу, вызывается page fault, а затем ядро ​​выделяет фактическую физическую страницу и сопоставляется с виртуальным адресом.

TL; DR: malloc возвращает виртуальный адрес и НЕ выделяет физическую память.

Проверьте этот out.

4 голосов
/ 22 апреля 2011

Распределяет ли malloc блок памяти в куче или он должен называться виртуальным адресным пространством?

краткий ответ: malloc выделяет память в куче.

недостаточно достаточно точно , чтобы сказать, что malloc выделяет память в пространстве виртуального адреса [sic], поскольку сам стек вызовов является частью этого же пространства.

2 голосов
/ 24 апреля 2011

Чтобы ответить на этот вопрос, нам нужно знать, с какой операционной системой и архитектурой мы имеем дело. В pmg упоминается Стандарт, а в статьях упоминается «хранение» или «пространство». Это самые общие и единственно допустимые термины, если только мы не сделаем несколько предположений.

Например:

malloc выделяет блок Virtual Адресное пространство в куче

Это не правильно для многих встроенных систем. Многие из них не используют виртуальную память, потому что в ней нет необходимости (нет многозадачности и т. Д.) Или по соображениям производительности. Более того, возможно, что какое-то экзотическое устройство не имеет идеи кучи - сомнение в том, что будет использоваться malloc, но справедливо, что это одна из причин, почему в стандарте упоминается «хранилище», - это зависит от реализации.

С другой стороны, пример верен для Window и Linux на наших ПК. Давайте проанализируем это, чтобы ответить на вопрос.

Прежде всего, нам нужно определить, что такое виртуальное адресное пространство.

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

  • изолировать процессы - каждый из них имеет его собственное адресное пространство
  • позволяет выделить память под 32-битную архитектура ограничена.
  • предоставляет одну краткую модель памяти

Вернемся к вопросу: «Распределяет ли malloc блок памяти в куче или он должен называться Виртуальным адресным пространством?»

Оба утверждения верны . Я бы лучше сказал VAP вместо памяти - это более явно. Существует распространенный миф о том, что malloc = оперативная память. В старые времена распределение памяти под DOS было очень простым. Всякий раз, когда мы просим памяти, это всегда была RAM, но в современных Oses она может варьироваться.

2 голосов
/ 23 апреля 2011
  • malloc() выделяет блок памяти на HEAP.

  • Должно ли оно называться виртуальным адресным пространством ? Задержи эту мысль на секунду. VAS ( виртуальное адресное пространство ) - это механизм отображения памяти, который включает в себя все пространство памяти приложения. Другими словами, VAS не ограничивается областью памяти HEAP. HEAP на самом деле просто еще одна его часть.

Каждый раз, когда запускается новое приложение, ОС создает новый процесс и выделяет новый VAS для приложения. Память, выделенная через malloc(), зарезервирована в HEAP, который, как вы знаете, является специальной областью памяти в VAS, а память, выделенная стандартными средствами, попадает в стек, который является другой областью памяти, расположенной внутри VAS применение.

1 голос
/ 14 мая 2018

Malloc всегда возвращает виртуальный адрес, причина в том, что когда вы вызываете malloc, это на самом деле функция-обертка, которая вызывает системный вызов (системный вызов - причудливое слово для инструкций уровня ядра), и этот системный вызов выделяет виртуальную память внутри вашего сегмент кучи. Но когда вы захотите получить доступ к выделенному значению (инструкция сохранения или загрузки), MMU вызовет ошибку страницы, что в основном означает, что для этой виртуальной страницы нет физической памяти, и только в это время ОС будет выделять физическую память для этой виртуальной страницы. .

1 голос
/ 23 апреля 2011

Вы могли бы ответить на этот вопрос самостоятельно, если бы потрудились на RTFM: -)

В частности, ввод man malloc на компьютере с Linux и поиск (по одному) слов «куча» и «виртуальный» позволят вам однозначно увидеть, что malloc() определяется в терминах куча памяти, а не виртуальная память.

Статья Википедии для malloc() согласуется со справочной страницей Linux. В нем говорится (акцент мой):

В C библиотечная функция malloc используется для выделения блока памяти на куча . [...] Некоторые платформы предоставляют вызовы библиотеки, которые позволяют во время выполнения динамическое выделение из стека C а не куча (например, Unix alloca(), Microsoft Windows CRTL malloca()). Эта память автоматически освобождается при вызове Функция заканчивается. Необходимость в этом уменьшено изменениями в C99 стандарт, который добавил поддержку массивы переменной длины области видимости блока имеющие размеры, определенные во время выполнения.

Если вы не понимаете значения терминологии, вам могут помочь статьи Википедии о кучной памяти и виртуальной памяти .

1 голос
/ 20 апреля 2011

Все процессы выполняются в своем собственном виртуальном адресном пространстве.Каждый доступ к памяти обеспечивается модулем управления памятью.Если память сопоставлена, данные либо загружаются, либо сохраняются с соответствующего физического адреса.Если память не сопоставлена ​​с указанным адресом, (Блок управления памятью (MMU) вызовет исключение.

Malloc управляет связкой (или, возможно, даже просто частью) отображенных страниц памяти. Эти страницы известныкак куча. Когда кто-то запрашивает количество байтов у malloc, malloc либо найдет эту память на страницах, которыми он уже управляет, либо запросит операционную систему (используя brk или mmap в linux). Это полностью прозрачно дляuser malloc.

Таким образом, эти две концепции полностью ортогональны: процессы обращаются к виртуальной памяти, которую MMU может преобразовать в физический адрес, а куча - это блок памяти, управляемый malloc.

0 голосов
/ 06 февраля 2019

malloc() выделяет виртуальную память, принадлежащую процессу.

Во время выполнения операционная система может несколько раз загружать процесс в физическую память. Операционная система отображает виртуальные адреса каждого процесса в физическую память. Процесс не знает отображение.

Виртуальное адресное пространство состоит из

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