Управление памятью — это функциональность операционной системы, которая обрабатывает или управляет первичной памятью и перемещает процессы назад и вперед между основной памятью и диском во время выполнения. Управление памятью отслеживает каждую область памяти, независимо от того, выделено ли это для какого-либо процесса или свободно. Он проверяет, сколько памяти должно быть выделено процессам. Он решает, какой процесс получит память и в какое время. Он отслеживает всякий раз, когда какая-то память освобождается или выделяется, и соответственно обновляет статус.
Этот учебник научит вас основным понятиям, связанным с управлением памятью.
Адресное пространство процесса
Адресное пространство процесса — это набор логических адресов, на которые процесс ссылается в своем коде. Например, когда используется 32-битная адресация, адреса могут варьироваться от 0 до 0x7fffffff; то есть 2 ^ 31 возможных чисел, для общего теоретического размера 2 гигабайта.
Операционная система заботится о сопоставлении логических адресов с физическими адресами во время выделения памяти программе. В программе используются три типа адресов до и после выделения памяти:
SN
Адреса и описание памяти
1
Адреса, используемые в исходном коде. Имена переменных, константы и метки команд являются основными элементами символического адресного пространства.
Во время компиляции компилятор преобразует символические адреса в относительные адреса.
Загрузчик генерирует эти адреса в тот момент, когда программа загружается в основную память.
Виртуальные и физические адреса одинаковы в схемах привязки адресов во время компиляции и во время загрузки. Виртуальные и физические адреса различаются по схеме привязки адресов во время выполнения.
Набор всех логических адресов, генерируемых программой, называется логическим адресным пространством . Набор всех физических адресов, соответствующих этим логическим адресам, называется физическим адресным пространством.
Отображение времени выполнения с виртуального на физический адрес выполняется блоком управления памятью (MMU), который является аппаратным устройством. MMU использует следующий механизм для преобразования виртуального адреса в физический адрес.
Значение в базовом регистре добавляется к каждому адресу, сгенерированному пользовательским процессом, который обрабатывается как смещение во время его отправки в память. Например, если значение базового регистра равно 10000, то попытка пользователя использовать местоположение 100 адреса будет динамически перераспределена в местоположение 10100.
Пользовательская программа имеет дело с виртуальными адресами; он никогда не видит реальные физические адреса.
Статическая и динамическая загрузка
Выбор между статической или динамической загрузкой должен быть сделан во время разработки компьютерной программы. Если вам нужно загружать вашу программу статически, то во время компиляции все программы будут скомпилированы и связаны без какой-либо внешней программы или зависимости от модуля. Компоновщик объединяет объектную программу с другими необходимыми объектными модулями в абсолютную программу, которая также включает в себя логические адреса.
Если вы пишете динамически загружаемую программу, ваш компилятор скомпилирует программу, и для всех модулей, которые вы хотите включить динамически, будут предоставлены только ссылки, а остальная часть работы будет выполнена во время выполнения.
Во время загрузки при статической загрузке абсолютная программа (и данные) загружаются в память для запуска выполнения.
Если вы используете динамическую загрузку , динамические процедуры библиотеки хранятся на диске в перемещаемой форме и загружаются в память только тогда, когда они необходимы программе.
Статическое и динамическое связывание
Как объяснено выше, когда используется статическое связывание, компоновщик объединяет все другие модули, необходимые программе, в одну исполняемую программу, чтобы избежать какой-либо зависимости во время выполнения.
Когда используется динамическое связывание, нет необходимости связывать реальный модуль или библиотеку с программой, скорее, ссылка на динамический модуль предоставляется во время компиляции и связывания. Динамические библиотеки ссылок (DLL) в Windows и общие объекты в Unix являются хорошими примерами динамических библиотек.
Перестановка
Обмен — это механизм, в котором процесс может быть временно выгружен из основной памяти (или перемещен) во вторичное хранилище (диск) и сделать эту память доступной для других процессов. Через некоторое время система переключает процесс обратно со вторичного хранилища на основную память.
Хотя на процесс подкачки обычно влияет производительность, но он помогает в параллельном запуске нескольких больших процессов, и именно поэтому своппинг также известен как метод сжатия памяти .
Общее время, необходимое для процесса подкачки, включает время, необходимое для перемещения всего процесса на вторичный диск, а затем для копирования процесса обратно в память, а также время, необходимое процессу для восстановления основной памяти.
Предположим, что пользовательский процесс имеет размер 2048 КБ, и на стандартном жестком диске, где произойдет обмен, скорость передачи данных составляет около 1 МБ в секунду. Фактический перенос процесса 1000K в или из памяти займет
Теперь, учитывая время на вход и выход, потребуется 4000 миллисекунд плюс другие издержки, когда процесс конкурирует за восстановление основной памяти.
Выделение памяти
Основная память обычно имеет два раздела —
Недостаточно памяти — Операционная система находится в этой памяти.
High Memory — пользовательские процессы хранятся в верхней памяти.
Операционная система использует следующий механизм выделения памяти.
SN
Распределение памяти и описание
1
Распределение по одному разделу
В этом типе распределения схема регистров перемещения используется для защиты пользовательских процессов друг от друга, а также от изменения кода и данных операционной системы. Регистр перемещения содержит значение наименьшего физического адреса, тогда как регистр ограничения содержит диапазон логических адресов. Каждый логический адрес должен быть меньше регистра ограничения.
Распределение нескольких разделов
При таком типе распределения основная память делится на несколько разделов фиксированного размера, где каждый раздел должен содержать только один процесс. Когда раздел свободен, процесс выбирается из входной очереди и загружается в свободный раздел. Когда процесс завершается, раздел становится доступным для другого процесса.
фрагментация
Поскольку процессы загружаются и удаляются из памяти, свободное пространство памяти разбивается на маленькие кусочки. Иногда бывает, что процессы не могут быть выделены блокам памяти, учитывая их небольшой размер, и блоки памяти остаются неиспользованными. Эта проблема известна как фрагментация.
Фрагментация бывает двух типов —
SN
Фрагментация и описание
1
Всего пространства памяти достаточно для удовлетворения запроса или для размещения в нем процесса, но он не является непрерывным, поэтому его нельзя использовать.
Блок памяти, назначенный процессу, больше. Некоторая часть памяти остается неиспользованной, поскольку она не может быть использована другим процессом.
На следующей диаграмме показано, как фрагментация может привести к потере памяти, а техника сжатия может использоваться для создания большей свободной памяти из фрагментированной памяти.
Внешняя фрагментация может быть уменьшена путем сжатия или перемешивания содержимого памяти, чтобы поместить всю свободную память вместе в один большой блок. Чтобы сделать уплотнение возможным, перемещение должно быть динамическим.
Внутренняя фрагментация может быть уменьшена путем эффективного назначения наименьшего раздела, но достаточно большого для процесса.
Paging
Компьютер может адресовать больше памяти, чем физически установлено в системе. Эта дополнительная память фактически называется виртуальной памятью, и это раздел жесткого диска, настроенный для эмуляции оперативной памяти компьютера. Техника подкачки играет важную роль в реализации виртуальной памяти.
Пейджинг — это метод управления памятью, при котором адресное пространство процесса разбивается на блоки одинакового размера, называемые страницами (размер равен степени 2, от 512 до 8192 байтов). Размер процесса измеряется количеством страниц.
Точно так же основная память делится на небольшие блоки фиксированного размера (физической) памяти, называемые кадрами, и размер кадра остается таким же, как и размер страницы, чтобы оптимально использовать основную память и избежать внешней фрагментации.
Перевод адреса
Адрес страницы называется логическим адресом и представлен номером страницы и смещением .
Адрес кадра называется физическим адресом и представлен номером кадра и смещением .
Структура данных, называемая таблицей карты страниц , используется для отслеживания связи между страницей процесса и кадром в физической памяти.
Когда система выделяет фрейм для любой страницы, она переводит этот логический адрес в физический адрес и создает запись в таблице страниц, которая будет использоваться при выполнении программы.
Когда процесс должен быть выполнен, его соответствующие страницы загружаются в любые доступные кадры памяти. Предположим, у вас есть программа объемом 8 КБ, но ваша память может вместить только 5 КБ в данный момент времени, тогда концепция пейджинга войдет в картину. Когда на компьютере заканчивается ОЗУ, операционная система (ОС) перемещает незанятые или ненужные страницы памяти во вторичную память, чтобы освободить ОЗУ для других процессов, и возвращает их, когда это необходимо программе.
Этот процесс продолжается в течение всего выполнения программы, где ОС продолжает удалять пустые страницы из основной памяти и записывать их во вторичную память и возвращать их, когда это требуется программой.
Преимущества и недостатки пейджинга
Вот список преимуществ и недостатков подкачки —
Пейджинг уменьшает внешнюю фрагментацию, но все еще страдает от внутренней фрагментации.
Пейджинг прост в реализации и считается эффективным методом управления памятью.
Благодаря одинаковому размеру страниц и фреймов, обмен становится очень простым.
Таблица страниц требует дополнительного места в памяти, поэтому может не подходить для системы с небольшим объемом ОЗУ.
сегментация
Сегментация — это метод управления памятью, при котором каждое задание делится на несколько сегментов разных размеров, по одному для каждого модуля, который содержит фрагменты, выполняющие связанные функции. Каждый сегмент на самом деле отличается логическим адресным пространством программы.
Когда процесс должен быть выполнен, его соответствующая сегментация загружается в несмежную память, хотя каждый сегмент загружается в непрерывный блок доступной памяти.
Управление памятью сегментирования очень похоже на пейджинг, но здесь сегменты имеют переменную длину, тогда как страницы подкачки имеют фиксированный размер.
Программный сегмент содержит основную функцию программы, вспомогательные функции, структуры данных и т. Д. Операционная система поддерживает таблицу карты сегментов для каждого процесса и список свободных блоков памяти, а также номера сегментов, их размер и соответствующие области памяти в основной памяти. Для каждого сегмента в таблице хранится начальный адрес сегмента и длина сегмента. Ссылка на ячейку памяти включает в себя значение, которое идентифицирует сегмент и смещение.
Национальная библиотека им. Н. Э. Баумана Bauman National Library
Персональные инструменты
Управление памятью в операционной системе
С понятием управления паметью в ОС связаны следующие технологии:
Функции управления памятью в ОС
Типы адресов
Методы распределения памяти в ОС
Принцип кэширования данных в ОС
Содержание
Функции управления памятью в ОС
Операционная система решает следующие задачи:
Отслеживание свободной и занятой памяти.
Выделение и освобождение памяти по запросам процессов.
Обеспечение настройки адресов.
Поддержка механизма виртуальной памяти
Типы адресов
Для идентификации переменных и команд используются символьные имена (метки), виртуальные адреса и физические адреса.
Символьные имена
Символьные имена присваивает пользователь при написании программы.
Виртуальные адреса
Виртуальные адреса вырабатывает компилятор. Так как не известно, в какое место оперативной памяти будет загружена программа, то компилятор присваивает переменным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что программа будет размещена, начиная с нулевого адреса. Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Каждый процесс имеет собственное виртуальное адресное пространство.
Физические адреса
Физические адреса соответствуют номерам ячеек оперативной памяти, где в действительности расположены или будут расположены переменные и команды. Переход от виртуальных адресов к физическим может осуществляться двумя способами.
В первом случае замену виртуальных адресов на физические делает специальная системная программа — перемещающий загрузчик. Перемещающий загрузчик на основании имеющихся у него исходных данных о начальном адресе физической памяти, в которую предстоит загружать программу, и информации, предоставленной компилятором об адресно-зависимых константах программы, выполняет загрузку программы, совмещая ее с заменой виртуальных адресов физическими.
Второй способ заключается в том, что программа загружается в память в неизмененном виде в виртуальных адресах, при этом операционная система фиксирует смещение действительного расположения программного кода относительно виртуального адресного пространства. Во время выполнения программы при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический.
Второй способ является более гибким, он допускает перемещение программы во время ее выполнения, в то время как перемещающий загрузчик жестко привязывает программу к первоначально выделенному ей участку памяти. Вместе с тем использование перемещающего загрузчика уменьшает накладные расходы, так как преобразование каждого виртуального адреса происходит только один раз во время загрузки, а во втором случае — каждый раз при обращении по данному адресу.
Иногда (обычно в специализированных системах) заранее точно известно, в какой области оперативной памяти будет выполняться программа, и компилятор выдает исполняемый код сразу в физических адресах.