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

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

Управление памятью обычно происходит на двух отличных уровнях:

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

    Следующие методы/алгоритмы попадают в категорию управления виртуальной памятью:

    • Подкачка страниц: действие записи содержания неиспользованных страниц к диску для многократного использования страницы RAM для других целей (страница). Когда данные необходимы снова, аппаратные проблемы прерывание из-за неотображенного адреса памяти, который ядро разрешает, читая страницу назад от диска. Даже при том, что подкачка страниц совершенно очевидна для процессов пространства пользователя, она может сильно замедлить систему.

    • CoW (Копия на Записи): Хорошие реализации fork() системный вызов не скопирует все данные процесса. Вместо этого только таблицы страниц копируются, и все страницы памяти отмечены как только для чтения. Каждый раз, когда нарушение прав доступа происходит, потому что один из разветвленных процессов пытается записать в страницу памяти, ядро просто копирует содержание той страницы.

    • Файлы с отображенной памятью: Страницы памяти не должны быть поддержаны областью подкачки, май также быть поддержанными файлами. Такие файлы с отображенной памятью могут обычно разбиваться на страницы, ничего не пишущий в диск, потому что размещение в ОЗУ обычно используется в качестве средства входа, а не производится. Секции кода от исполняемых файлов и библиотек, например, обычно с отображенной памятью, который избегает дублирования данных в памяти, когда несколько процессов используют тот же исполняемый файл/библиотеки. Размещение в ОЗУ также доступно процессам пространства пользователя через mmap() системный вызов.

  2. Управление динамической памятью

    Этот второй уровень управления памятью является местным для каждого процесса и обычно реализуется стандартной библиотекой для C (malloc(), realloc(), и free()). Как второй уровень управления памятью, malloc() полагается brk() и mmap() системные вызовы для запроса страниц памяти от ядра. Большие выделения обычно непосредственно удовлетворяются mmap() звонить. Для маленьких выделений, malloc() реализации отслеживают отображенную, неиспользованную память, подразделяя неиспользованную память по мере необходимости для соответствия запросам из пользовательского кода, и запрашивая новые страницы памяти от ядра каждый раз, когда никакой подходящий блок свободной памяти не найден.

    Общие цели для средств выделения динамической памяти:

    • Потокобезопасность

    • Никакая ненужная фрагментация памяти

    • Низкий объем памяти используется в бухгалтерских целях

    • Низкие задержки выделения/освобождения

      Это включает оптимизацию поиска подходящих свободных блоков и методов для сокращения количества системных вызовов.

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

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

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

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

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

  • Подсчет ссылок: Некоторый объект отслеживает то, сколько раз ссылаются на каждый блок памяти. Подсчет ссылок может находиться в самом блоке памяти, или где-нибудь за пределами него. Важная реализация этого std::shared_ptr<> в C++.

  • Сборка "мусора": Используемый в языках сценариев высокого уровня и в Java. Память только выделена, никогда явно освобождена, освобождение является заданием сборщика "мусора", который сканирует всю используемую память для ссылок на блок памяти и автоматически освобождает блоки, на которые больше не ссылаются.

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