Squeak.ru - шаблоны программирования

как работает malloc в деталях?

Я пытаюсь найти полезную информацию о функции malloc. когда я вызываю эту функцию, она динамически выделяет память. он возвращает указатель (например, адрес) на начало выделенной памяти. вопросы:

  • как возвращенный адрес используется для чтения/записи в выделенный блок памяти (используя регистры с непрямой адресацией или как?)

  • если невозможно выделить блок памяти, возвращается NULL. что такое NULL с точки зрения оборудования?

  • чтобы выделить память в куче, нам нужно знать, какие части памяти заняты. где хранится эта информация (о занятой памяти) (если например мы используем микроконтроллер small risc)?

25.03.2015

Ответы:


1

Q3 Обычный способ управления кучами — через связанный список. В простейшем случае функция malloc сохраняет указатель на первый блок свободного пространства в куче, и каждый блок свободного пространства имеет заголовок, указывающий на следующий блок свободного пространства в куче. Таким образом, куча на самом деле самоопределяется в терминах знания того, что не занято (и, следовательно, того, что занято); это минимизирует объем дополнительной оперативной памяти, необходимой для управления кучей.

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

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

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

Q2 Указатель NULL фактически представляет собой просто ноль, который при использовании пытается получить доступ к памяти, начиная с местоположения 0 ОЗУ, которое почти всегда является зарезервированной памятью ОС. Это является причиной значительного количества прерываний нарушения памяти, вызванных отсутствием у программиста проверки ошибок для возврата NULL из функций, которые выделяют память).

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

Учитывая ваш RISC-процессор, вам нужно будет прочитать его документацию, чтобы увидеть, как он обрабатывает попытки доступа к ячейке памяти 0.

Q1 Существует много способов использования выделенной памяти в языке высокого уровня, в основном с помощью указателей, строк и массивов.

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

25.03.2015

2

Поскольку вы используете malloc, можем ли мы предположить, что вы используете C? Если это так, вы присваиваете результат переменной-указателю, затем вы можете получить доступ к памяти, ссылаясь на переменную. Вы действительно не знаете, как это реализовано в ассемблере. Это зависит от процессора, который вы используете. malloc возвращает 0 в случае сбоя. Поскольку обычно NULL определяется как 0, вы можете проверить его на NULL. Вам все равно, как malloc отслеживает свободную память. Если вам действительно нужна эта информация, вы должны посмотреть исходный код в glibc/malloc, доступный в сети.

char * c = malloc(10);   // allocate 10 bytes
if (c == NULL)
   // handle error case
else
   *c = 'a'  // write a in the first character on the block
25.03.2015
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...