Какой тип бухгалтерского учета выполняет ОС, когда мы используем new для выделения памяти?

#c #memory-management #new-operator

#c #управление памятью #new-operator

Вопрос:

Помимо запоминания адреса указателя объекта, я думаю, ОС также необходимо записать, насколько велик размер памяти. Так что, когда мы используем delete , ОС будет знать, сколько памяти нужно освободить.

Кто-нибудь может рассказать мне более подробно об этом? Какая другая информация записывается? И где хранится эта информация? Что делает ОС после удаления памяти?

Комментарии:

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

Ответ №1:

Как уже отмечалось, new это библиотечная функция, а не функция ОС.

Общий случай примерно таков:

  • Компилятор C преобразует new ключевое слово в вызовы функций malloc() (или эквивалентные)

  • Распределитель хранит список свободных блоков памяти, он ищет там наилучшее соответствие.

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

  • Если не найден подходящий свободный блок, распределитель запрашивает у ОС некоторый фрагмент памяти. Есть несколько способов сделать это, но обычно это считается медленной операцией, поэтому она запрашивает большими шагами (по крайней мере, по одной странице за раз, обычно 4 КБ). Когда он получает новый свободный блок, он разбивается на запрошенный размер, а остальное помещается в список свободных.

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

  • У каждого процесса своя карта памяти, которая позволяет каждому «видеть» линейное пространство памяти, в то же время сохраняя каждый процесс изолированным от других. Именно ОС загружает и разгружает карту в MMU при каждом переключении процесса. Выделение новой страницы процессу в конечном счете означает добавление ее в карту памяти процесса.

Ответ №2:

кто-нибудь может рассказать мне более подробно об этом?

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

какая другая информация записывается?

Как правило, память свободного хранилища обычно называют «кучей». Это в основном потому, что он реализован в виде кучи, которая является реализацией очереди приоритетов, которая строит дерево узлов (блоки свободной памяти). Фактическая реализация и используемые алгоритмы очень сложны, потому что они должны работать очень хорошо (т. Е. Свободные блоки должны быть найдены очень быстро при запросе новой памяти, и вновь освобожденная память также должна быть объединена в кучу очень быстро), и затем, есть все проблемы с фрагментацией и так далее. Посмотрите на wiki о совместном распределении памяти для очень упрощенной версии.

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

и где хранится эта информация?

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

что делает ОС после удаления памяти?

Как правило, когда вы удаляете память, она просто добавляется в список свободных (или доступных) блоков памяти и, возможно, объединяется с соседними свободными блоками памяти, если таковые имеются. Не выполняется «заполнение памяти нулями» или любая другая фактическая операция с памятью, которая является ненужной и пустой тратой времени обработки.