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

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

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

EDIT:

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

Ответы [ 15 ]

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

malloc() специально выделяет из кучи.

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

Чтобы иметь виртуальное адресное пространство, требуется MMU для сопоставления физических и виртуальных адресов, не все цели имеют MMU, поэтому динамическая память и виртуальная память никоим образом не являются синонимами или взаимозаменяемыми понятиями;они являются полностью независимыми понятиями.

Что касается «виртуального адресного пространства», являющегося «наследием DOS», то вы не можете быть дальше от истины, 16-битная архитектура x86 не поддерживает MMU или виртуальную памятьсовсем.Интересно, откуда у вас эта идея?

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

Malloc выделяется в куче, которая является частью виртуального адресного пространства.

Вы не привередливы, называя это виртуальным адресным пространством, вы просто слишком универсальны.Это можно сравнить с высказыванием: «Тебя тошнит в ванной».Строго говоря, это правда, но «Вы рвете в горшке», точнее, потому что первое утверждение подразумевает, что вы можете рвать и в раковине или в ванне.* куча и виртуальная память поддерживаются большинством операционных систем, включая Dos и Linux.

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

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

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

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

Перейдите по этой ссылке на Распределение памяти .

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

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

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