Управление памятью — это функциональность операционной системы, которая обрабатывает или управляет основной памятью и перемещает процессы назад и вперед между основной памятью и диском во время выполнения. Управление памятью отслеживает каждую область памяти, независимо от того, выделено ли это для какого-либо процесса или свободно. Он проверяет, сколько памяти должно быть выделено процессам. Он решает, какой процесс получит память и в какое время. Он отслеживает всякий раз, когда какая-то память освобождается или выделяется, и соответственно обновляет статус.
Этот учебник научит вас основным понятиям, связанным с управлением памятью.
Адресное пространство процесса
Адресное пространство процесса — это набор логических адресов, на которые процесс ссылается в своем коде. Например, когда используется 32-битная адресация, адреса могут варьироваться от 0 до 0x7fffffff; то есть 2 ^ 31 возможных чисел, для общего теоретического размера 2 гигабайта.
Операционная система заботится о сопоставлении логических адресов с физическими адресами во время выделения памяти программе. В программе используются три типа адресов до и после выделения памяти:
SN | Адреса и описание памяти |
---|---|
1 |
Символьные адреса Адреса, используемые в исходном коде. Имена переменных, константы и метки команд являются основными элементами символьного адресного пространства. |
2 |
Относительные адреса Во время компиляции компилятор преобразует символические адреса в относительные адреса. |
3 |
Физические адреса Загрузчик генерирует эти адреса в тот момент, когда программа загружается в основную память. |
Символьные адреса
Адреса, используемые в исходном коде. Имена переменных, константы и метки команд являются основными элементами символьного адресного пространства.
Относительные адреса
Во время компиляции компилятор преобразует символические адреса в относительные адреса.
Физические адреса
Загрузчик генерирует эти адреса в тот момент, когда программа загружается в основную память.
Виртуальные и физические адреса одинаковы в схемах привязки адресов во время компиляции и во время загрузки. Виртуальные и физические адреса различаются по схеме привязки адресов во время выполнения.
Множество всех логических адресов, сгенерированных программой, называется логическим адресным пространством . Набор всех физических адресов, соответствующих этим логическим адресам, называется физическим адресным пространством.
Отображение времени выполнения с виртуального на физический адрес выполняется блоком управления памятью (MMU), который является аппаратным устройством. MMU использует следующий механизм для преобразования виртуального адреса в физический адрес.
-
Значение в базовом регистре добавляется к каждому адресу, сгенерированному пользовательским процессом, который обрабатывается как смещение во время его отправки в память. Например, если значение базового регистра равно 10000, то попытка пользователя использовать адрес 100 местоположения будет динамически перераспределена в местоположение 10100.
-
Пользовательская программа имеет дело с виртуальными адресами; он никогда не видит реальные физические адреса.
Значение в базовом регистре добавляется к каждому адресу, сгенерированному пользовательским процессом, который обрабатывается как смещение во время его отправки в память. Например, если значение базового регистра равно 10000, то попытка пользователя использовать адрес 100 местоположения будет динамически перераспределена в местоположение 10100.
Пользовательская программа имеет дело с виртуальными адресами; он никогда не видит реальные физические адреса.
Статическая и динамическая загрузка
Выбор между статической или динамической загрузкой должен быть сделан во время разработки компьютерной программы. Если вам нужно загружать свою программу статически, то во время компиляции все программы будут скомпилированы и связаны без какой-либо внешней зависимости от программы или модуля. Компоновщик объединяет объектную программу с другими необходимыми объектными модулями в абсолютную программу, которая также включает в себя логические адреса.
Если вы пишете динамически загружаемую программу, то ваш компилятор скомпилирует программу, и для всех модулей, которые вы хотите включить динамически, будут предоставлены только ссылки, а остальная часть работы будет выполнена во время выполнения.
Во время загрузки при статической загрузке абсолютная программа (и данные) загружаются в память для запуска выполнения.
Если вы используете динамическую загрузку , динамические процедуры библиотеки хранятся на диске в перемещаемой форме и загружаются в память только тогда, когда они необходимы программе.
Статическое и динамическое связывание
Как объяснено выше, когда используется статическое связывание, компоновщик объединяет все другие модули, необходимые программе, в одну исполняемую программу, чтобы избежать какой-либо зависимости во время выполнения.
Когда используется динамическое связывание, нет необходимости связывать реальный модуль или библиотеку с программой, скорее, ссылка на динамический модуль предоставляется во время компиляции и связывания. Динамические библиотеки ссылок (DLL) в Windows и общие объекты в Unix являются хорошими примерами динамических библиотек.
Перестановка
Обмен — это механизм, в котором процесс может быть временно выгружен из основной памяти (или перемещен) во вторичное хранилище (диск) и сделать эту память доступной для других процессов. Через некоторое время система переключает процесс обратно со вторичного хранилища на основную память.
Хотя на процесс подкачки обычно влияет производительность, но он помогает в параллельном запуске нескольких больших процессов, и именно поэтому своппинг также известен как метод сжатия памяти .
Общее время, необходимое для процесса подкачки, включает время, необходимое для перемещения всего процесса на вторичный диск, а затем для копирования процесса обратно в память, а также время, необходимое процессу для восстановления основной памяти.
Предположим, что пользовательский процесс имеет размер 2048 КБ, и на стандартном жестком диске, где произойдет обмен, скорость передачи данных составляет около 1 МБ в секунду. Фактический перенос процесса 1000K в или из памяти займет
2048KB / 1024KB per second = 2 seconds = 2000 milliseconds
Теперь, учитывая время на вход и выход, потребуется 4000 миллисекунд плюс другие издержки, когда процесс конкурирует за восстановление основной памяти.
Выделение памяти
Основная память обычно имеет два раздела —
-
Недостаточно памяти — Операционная система находится в этой памяти.
-
High Memory — пользовательские процессы хранятся в верхней памяти.
Недостаточно памяти — Операционная система находится в этой памяти.
High Memory — пользовательские процессы хранятся в верхней памяти.
Операционная система использует следующий механизм выделения памяти.
SN | Распределение памяти и описание |
---|---|
1 |
Распределение по одному разделу В этом типе распределения схема регистров перемещения используется для защиты пользовательских процессов друг от друга, а также от изменения кода и данных операционной системы. Регистр перемещения содержит значение наименьшего физического адреса, тогда как регистр ограничения содержит диапазон логических адресов. Каждый логический адрес должен быть меньше регистра ограничения. |
2 |
Распределение нескольких разделов При таком типе распределения основная память делится на несколько разделов фиксированного размера, где каждый раздел должен содержать только один процесс. Когда раздел свободен, процесс выбирается из входной очереди и загружается в свободный раздел. Когда процесс завершается, раздел становится доступным для другого процесса. |
Распределение по одному разделу
В этом типе распределения схема регистров перемещения используется для защиты пользовательских процессов друг от друга, а также от изменения кода и данных операционной системы. Регистр перемещения содержит значение наименьшего физического адреса, тогда как регистр ограничения содержит диапазон логических адресов. Каждый логический адрес должен быть меньше регистра ограничения.
Распределение нескольких разделов
При таком типе распределения основная память делится на несколько разделов фиксированного размера, где каждый раздел должен содержать только один процесс. Когда раздел свободен, процесс выбирается из входной очереди и загружается в свободный раздел. Когда процесс завершается, раздел становится доступным для другого процесса.
фрагментация
Поскольку процессы загружаются и удаляются из памяти, свободное пространство памяти разбивается на маленькие кусочки. Иногда бывает, что процессы не могут быть выделены блокам памяти, учитывая их небольшой размер, и блоки памяти остаются неиспользованными. Эта проблема известна как фрагментация.
Фрагментация бывает двух типов —
SN | Фрагментация и описание |
---|---|
1 |
Внешняя фрагментация Всего пространства памяти достаточно для удовлетворения запроса или для размещения в нем процесса, но он не является непрерывным, поэтому его нельзя использовать. |
2 |
Внутренняя фрагментация Блок памяти, назначенный процессу, больше. Некоторая часть памяти остается неиспользованной, так как она не может быть использована другим процессом. |
Внешняя фрагментация
Всего пространства памяти достаточно для удовлетворения запроса или для размещения в нем процесса, но он не является непрерывным, поэтому его нельзя использовать.
Внутренняя фрагментация
Блок памяти, назначенный процессу, больше. Некоторая часть памяти остается неиспользованной, так как она не может быть использована другим процессом.
На следующей диаграмме показано, как фрагментация может привести к потере памяти, а техника сжатия может использоваться для создания большей свободной памяти из фрагментированной памяти.
Внешняя фрагментация может быть уменьшена путем сжатия или перемешивания содержимого памяти, чтобы поместить всю свободную память вместе в один большой блок. Чтобы сделать уплотнение возможным, перемещение должно быть динамическим.
Внутренняя фрагментация может быть уменьшена путем эффективного назначения самого маленького раздела, но достаточно большого для процесса.
Paging
Компьютер может адресовать больше памяти, чем физически установлено в системе. Эта дополнительная память фактически называется виртуальной памятью, и это раздел жесткого диска, настроенный для эмуляции оперативной памяти компьютера. Техника подкачки играет важную роль в реализации виртуальной памяти.
Пейджинг — это метод управления памятью, при котором адресное пространство процесса разбивается на блоки одинакового размера, называемые страницами (размер равен степени 2, от 512 до 8192 байтов). Размер процесса измеряется количеством страниц.
Точно так же основная память делится на небольшие блоки фиксированного размера (физической) памяти, называемые кадрами, и размер кадра остается таким же, как и размер страницы, чтобы оптимально использовать основную память и избежать внешней фрагментации.
Перевод адреса
Адрес страницы называется логическим адресом и представлен номером страницы и смещением .
Logical Address = Page number + page offset
Адрес кадра называется физическим адресом и представлен номером кадра и смещением .
Physical Address = Frame number + page offset
Структура данных, называемая таблицей карты страниц , используется для отслеживания связи между страницей процесса и кадром в физической памяти.
Когда система выделяет фрейм для любой страницы, она преобразует этот логический адрес в физический адрес и создает запись в таблице страниц, которая будет использоваться при выполнении программы.
Когда процесс должен быть выполнен, его соответствующие страницы загружаются в любые доступные кадры памяти. Предположим, у вас есть программа объемом 8 КБ, но ваша память может вместить только 5 КБ в данный момент времени, тогда концепция пейджинга войдет в картину. Когда на компьютере заканчивается ОЗУ, операционная система (ОС) перемещает незанятые или ненужные страницы памяти во вторичную память, чтобы освободить ОЗУ для других процессов, и возвращает их, когда это необходимо программе.
Этот процесс продолжается в течение всего выполнения программы, где ОС продолжает удалять пустые страницы из основной памяти и записывать их во вторичную память и возвращать их, когда это требуется программой.
Преимущества и недостатки пейджинга
Вот список преимуществ и недостатков подкачки —
-
Пейджинг уменьшает внешнюю фрагментацию, но все еще страдает от внутренней фрагментации.
-
Пейджинг прост в реализации и считается эффективным методом управления памятью.
-
Благодаря одинаковому размеру страниц и фреймов, обмен становится очень простым.
-
Таблица страниц требует дополнительного места в памяти, поэтому может не подойти для системы с небольшим объемом ОЗУ.
Пейджинг уменьшает внешнюю фрагментацию, но все еще страдает от внутренней фрагментации.
Пейджинг прост в реализации и считается эффективным методом управления памятью.
Благодаря одинаковому размеру страниц и фреймов, обмен становится очень простым.
Таблица страниц требует дополнительного места в памяти, поэтому может не подойти для системы с небольшим объемом ОЗУ.
сегментация
Сегментация — это метод управления памятью, при котором каждое задание делится на несколько сегментов разных размеров, по одному для каждого модуля, который содержит фрагменты, выполняющие связанные функции. Каждый сегмент на самом деле отличается логическим адресным пространством программы.
Когда процесс должен быть выполнен, его соответствующая сегментация загружается в несмежную память, хотя каждый сегмент загружается в непрерывный блок доступной памяти.
Управление памятью сегментирования очень похоже на пейджинг, но здесь сегменты имеют переменную длину, где, как и на страницах подкачки, имеют фиксированный размер.
Программный сегмент содержит основную функцию программы, вспомогательные функции, структуры данных и т. Д. Операционная система поддерживает таблицу карты сегментов для каждого процесса и список свободных блоков памяти, а также номера сегментов, их размер и соответствующие области памяти в основной памяти. Для каждого сегмента в таблице хранится начальный адрес сегмента и длина сегмента. Ссылка на ячейку памяти включает в себя значение, которое идентифицирует сегмент и смещение.