Управление памятью - Memory management

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

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

Подробности

В некоторых операционных системах, например, DOS / 360 и преемники, OS / 360 и последователи,[2]:74 распределение памяти в адресном пространстве обрабатывается операционной системой; в, например, Unix-подобный операционных систем, размещение в адресное пространство находится на уровне приложения.

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

Распределение динамической памяти

Пример внешней фрагментации

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

Несколько проблем усложняют реализацию, например: внешняя фрагментация, который возникает, когда между выделенными блоками памяти имеется много небольших промежутков, что делает недействительным их использование для запроса выделения. Распределитель метаданные также может увеличивать размер (индивидуально) небольших выделений. Часто это удается дробление. Система управления памятью должна отслеживать невыполненные распределения, чтобы гарантировать, что они не перекрываются и что никакая память никогда не «теряется» (т. Е. Что нет "утечки памяти ").

Эффективность

Реализованный конкретный алгоритм распределения динамической памяти может значительно повлиять на производительность. Исследование, проведенное в 1994 г. Корпорация цифрового оборудования иллюстрирует накладные расходы задействованы для множества распределителей. Самый низкий средний длина пути инструкции для выделения одного слота памяти было 52 (измерено на уровне инструкций). профайлер на разнообразном ПО).[3]

Реализации

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

Выделение блоков фиксированного размера

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

Бадди блоки

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

Размещение плиты

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

Распределение стека

Много Unix-подобный системы, а также Майкрософт Виндоус реализовать функцию под названием alloca для динамического выделения памяти стека способом, аналогичным основанному на куче маллок. Компилятор обычно переводит его во встроенные инструкции, управляющие указателем стека.[5] Хотя нет необходимости вручную освобождать память, выделенную таким образом, она автоматически освобождается, когда функция, которая вызвала alloca возврат, существует риск переполнения. А поскольку alloca - это для этого случая расширение наблюдается во многих системах, но никогда в POSIX или стандарте C, его поведение в случае переполнения стека не определено.

Более безопасная версия alloca называется _malloca, который сообщает об ошибках, существует в Microsoft Windows. Это требует использования _freea.[6] гнулиб предоставляет эквивалентный интерфейс, хотя вместо того, чтобы генерировать исключение SEH при переполнении, он делегирует malloc при обнаружении превышения размера.[7] Аналогичную функцию можно эмулировать с помощью ручного учета и проверки размера, например, при использовании alloca_account в glibc.[8]

Автоматические переменные

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

Вывоз мусора

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

Системы с виртуальной памятью

Виртуальная память - это метод отделения организации памяти от физического оборудования. Приложения работают с памятью через виртуальные адреса. Каждая попытка приложения получить доступ к определенному адресу виртуальной памяти приводит к преобразованию адреса виртуальной памяти в реальный. Физический адрес. Таким образом, добавление виртуальной памяти позволяет детально контролировать системы памяти и методы доступа.

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

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

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

Управление памятью в OS / 360 и последующих версиях

IBM Система / 360 не поддерживает виртуальную память.[заметка 2] Изоляция памяти рабочие места необязательно выполняется с использованием ключи защиты, назначая хранилище для каждого задания разные ключи, 0 для супервизора или 1–15. Управление памятью в OS / 360 это руководитель функция. Хранилище запрашивается с помощью ПОЛУЧИТЬ макрос и освобожден с помощью FREEMAIN макрос, который вызывает вызов супервизора (SVC ) для выполнения операции.

В OS / 360 детали меняются в зависимости от того, генерируется за PCP, MFT или же MVT.

В OS / 360 MVT перераспределение внутри задания область, край или общий Системная очередь (SQA) основан на субпулы, области размером кратные 2 КБ - размеру области, защищенной ключом защиты. Подпулы пронумерованы от 0 до 255, плюс ненумерованный подпул, используемый для хранения загруженных программ.[2] Внутри региона подпулам назначается либо защита хранилища задания, либо ключ супервизора, ключ 0. Подпулы 0–126 получают ключ задания. Первоначально создаются только ненумерованный подпул и нулевой подпул, и все пользовательские запросы на хранение удовлетворяются из подпула 0, если другой не указан в запросе памяти. Подпулы 250–255 создаются запросами памяти супервизором от имени задания. Большинству из них назначен ключ 0, хотя некоторые получают ключ задания. MFT использует фиксированный перегородки переопределяется оператором вместо динамических областей, и PCP имеет только один раздел.

Каждый подпул отображается списком управляющих блоков, определяющих выделенные и свободные блоки памяти внутри подпула. Память выделяется путем нахождения свободной области достаточного размера или путем выделения дополнительных блоков в подпул, вплоть до размера области задания. Можно освободить всю или часть выделенной области памяти.[9]

Детали для OS / VS1 аналогичны таковым для MFT, а детали для OS / VS2 аналогичны таковым для MVT, за исключением того, что размер страницы составляет 4 КиБ. Для OS / VS1 и OS / VS2 общий Системная очередь (SQA) не загружается на страницу.

В MVS адресное пространство включает дополнительную доступную для страниц общую область, Общая кладовая (CSA), а также дополнительную частную зону, Системная рабочая область (SWA). Кроме того, все ключи хранилища 0-7 зарезервированы для использования привилегированным кодом.

Смотрите также

Примечания

  1. ^ Не путать с несвязанными куча структура данных.
  2. ^ За исключением модели 67

Рекомендации

  1. ^ Гибсон, Стив (15 августа 1988 г.). "Tech Talk: взгляд на спецификацию IBM / Microsoft XMS". InfoWorld.
  2. ^ а б Корпорация IBM (1965 г.). Операционная система IBM / 360: концепции и возможности (PDF). п. 75. Получено 3 апреля, 2019.
  3. ^ Detlefs, D .; Dosser, A .; Зорн, Б. (июнь 1994 г.). «Затраты на выделение памяти в больших программах на C и C ++» (PDF). Программное обеспечение: практика и опыт. 24 (6): 527–542. CiteSeerX  10.1.1.30.3073. Дои:10.1002 / spe.4380240602.
  4. ^ Зильбершац, Авраам; Гэлвин, Питер Б. (2004). Понятия операционной системы. Вайли. ISBN  0-471-69466-5.
  5. ^ alloca (3) – Linux Программиста Руководство - Библиотечные функции
  6. ^ "_malloca". Документация Microsoft CRT.
  7. ^ "gnulib / malloca.h". GitHub. Получено 24 ноября 2019.
  8. ^ "glibc / include / alloca.h". Зеркала Берена Минора. 23 ноября 2019.
  9. ^ Корпорация IBM (май 1973 г.). Логика программы: IBM System / 360 Операционная система MVT Supervisor (PDF). стр. 107–137. Получено 3 апреля, 2019.

дальнейшее чтение

внешняя ссылка