Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Подробности [ править ]

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

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

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

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

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

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

Эффективность [ править ]

Реализованный конкретный алгоритм распределения динамической памяти может значительно повлиять на производительность. Исследование, проведенное в 1994 г. Digital Equipment Corporation, иллюстрирует накладные расходы, связанные с различными распределителями. Наименьшая средняя длина пути инструкций, необходимая для выделения одного слота памяти, составила 52 (при измерении с помощью профилировщика уровня инструкций в различных программах). [3]

Реализации [ править ]

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

Размещение блоков фиксированного размера [ править ]

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

Бадди-блоки [ править ]

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

Размещение плиты [ править ]

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

Распределение стека [ править ]

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

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

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

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

Сборка мусора [ править ]

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

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

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

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

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

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

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

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

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

В OS / 360 МВТ, подвыделении в приеме на работу в регионе или общей системы очереди Area (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 адресное пространство включает дополнительную доступную для страниц общую область, Common Storage Area (CSA), и дополнительную частную область, Системную рабочую область (SWA). Кроме того, все ключи хранилища 0-7 зарезервированы для использования привилегированным кодом.

См. Также [ править ]

  • Динамический массив
  • Сборка мусора (информатика)
  • Недостаточно памяти

Заметки [ править ]

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

Ссылки [ править ]

  1. Гибсон, Стив (15 августа 1988 г.). «Технический разговор: взгляд на спецификацию IBM / Microsoft XMS» . InfoWorld .
  2. ^ а б IBM Corporation (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 . DOI : 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 Operating System MVT Supervisor (PDF) . С. 107–137 . Проверено 3 апреля 2019 года .

Дальнейшее чтение [ править ]

  • Дональд Кнут . Фундаментальные алгоритмы , третье издание. Аддисон-Уэсли, 1997. ISBN 0-201-89683-4 . Раздел 2.5: Динамическое распределение памяти, стр. 435–456. 
  • Простые алгоритмы распределения памяти, заархивированные 5 марта 2016 г. на Wayback Machine (первоначально опубликовано в сообществе OSDEV)
  • Уилсон, PR; Джонстон, MS; Neely, M .; Болес, Д. (1995). «Динамическое распределение памяти: обзор и критический обзор». Управление памятью . Конспект лекций по информатике. 986 . С. 1–116. CiteSeerX  10.1.1.47.275 . DOI : 10.1007 / 3-540-60368-9_19 . ISBN 978-3-540-60368-9.
  • Бергер, ЭД; Zorn, BG; Мак-Кинли, KS (июнь 2001 г.). «Составление высокопроизводительных распределителей памяти». Материалы конференции ACM SIGPLAN 2001 по проектированию и реализации языков программирования (PDF) . С. 114–124. CiteSeerX  10.1.1.1.2112 . DOI : 10.1145 / 378795.378821 . ISBN 1-58113-414-2. S2CID  7501376 .
  • Бергер, ЭД; Zorn, BG; МакКинли, KS (ноябрь 2002 г.). «Пересмотр пользовательского распределения памяти». Материалы 17-й конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям (PDF) . С. 1–12. CiteSeerX  10.1.1.119.5298 . DOI : 10.1145 / 582419.582421 . ISBN 1-58113-471-1. S2CID  481812 .
  • Уилсон, Пол Р .; Johnstone, Mark S .; Нили, Майкл; Болес, Дэвид (28–29 сентября 1995 г.), Dynamic Storage Allocation: A Survey and Critical Review (PDF) , Остин, Техас: Департамент компьютерных наук Техасского университета , получено 3 июня 2017 г.

Внешние ссылки [ править ]

  • Библиотека C ++ "Generic Memory Manager"
  • Пример побитового распределителя памяти арены на C
  • TLSF: распределитель постоянного времени для систем реального времени
  • Слайды о динамическом распределении памяти
  • Внутри распределителя памяти
  • Справочник по управлению памятью
  • Справочник по управлению памятью, Распределение в руководстве для начинающих
  • Управление памятью Linux
  • Управление памятью для системных программистов
  • VMem - общая malloc / бесплатная замена. Быстрый потокобезопасный распределитель C ++
  • Динамическая память в системах IEC61508