Менеджер памяти: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Addbot (обсуждение | вклад)
м Перемещение 19 интервики на Викиданные, d:q2308807
Нет описания правки
Строка 1:
'''Менеджер памяти''' — часть [[компьютерная программа|компьютерной программы]] (как [[прикладная программа|прикладной]], так и [[операционная система|операционной системы]]), обрабатывающая запросы на выделение и освобождение [[оперативная память|оперативной памяти]] или (для некоторых [[архитектура ЭВМ|архитектур]] [[ЭВМ]]) запросы на включение заданной области памяти в [[адресное пространство]] [[процессор]]а.
 
Основное назначение менеджера памяти в первом смысле — реализация [[динамически распределяемая память|динамической памяти]] ю . Например, в [[язык программирования|языке]] [[язык C|C]] динамическое выделение памяти производится через функцию <code>[[malloc]]</code>.
 
== Иерархия менеджеров памяти ==
Строка 7:
Менеджеры памяти часто образуют иерархию: нижестоящие менеджеры задействуют какие-либо закономерности выделения-освобождения памяти и этим снижают нагрузку на вышестоящие. Например:
* '''Системный'''. Сверху находится менеджер памяти, встроенный в ОС. Он вносит ту или иную [[страничная организация памяти|страницу]] в адресное пространство процесса — а значит, работает с дискретностью в 4 килобайта и очень медленный.
* '''Принадлежащий процессу.''' Менеджер памяти, встроенный в [[Библиотека времени выполнения|стандартную библиотеку языка программирования]], берёт у ОС блоки памяти «оптом» и раздаёт их сообразно с нуждами программиста. При этом он знает, что память отдаётся только одному процессупроцесс y у — а значит, синхронизация потоков производится не [[мютекс]]ами, а [[фьютекс]]ами. И переключение в [[режим ядра]] происходит в двух случаях: либо когда «оперативного запаса» памяти не хватает и нужно обратиться к ОС, либо когда один из потоков «натыкается» на занятый фьютекс.
* '''Специализированные'''. Некоторые динамические структуры данных, например, [[std::vector]], также берут память у стандартной библиотеки с запасом (например, блоками по 16 элементов). Таким образом, элементы добавляются по одному, но обращение к вышестоящему менеджеру происходит один раз за 16 элементов. [[Объектный пул]] выделяет память под объекты конкретного типа и удобен, если они выделяются-освобождаются в больших количествах, и т. д.