Адресное пространство программы - обзор

В состав базовой операционной системы включен набор служб распределения памяти между приложениями.

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

Архитектура памяти системы - введение

Схема работы средств управления памятью позволяет расширить возможности оборудования с помощью программных средств. Из-за отсутствия однозначного соответствия между адресным пространством и физической памятью адресное пространство обычно называется виртуальной памятью.

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

Пространство физических адресов в 64-разрядных системах

Аппаратное обеспечение предоставляет доступ к адресам виртуальной памяти, лежащим в непрерывном диапазоне от 0x00000000000000000000 до 0xFFFFFFFFFFFFFFFFFFFF. Общее адресное пространство, таким образом, составляет более 1000000000000 Тб. Команды обращения к памяти оперируют с 64-разрядными адресами: 36 бит указывают сегментный регистр, а 28 бит задают смещение внутри сегмента. Такая схема адресации обеспечивает доступ более чем к 64 миллионам сегментов, до 256 Мб каждый. Каждый сегментный регистр содержит 52-разрядный ИД сегмента, который вместе с 28-разрядным смещением образует адрес виртуальной памяти. Этот 80-разрядный виртуальный адрес ссылается на единое системное пространство виртуальной памяти.

Адресное пространство процесса 64-разрядное, то есть программы используют 64-разрядные указатели. При этом процессы или обработчики прерываний могут обращаться только к тем областям системной виртуальной памяти (сегментам), ИД которых хранятся в сегментном регистре.

Адресация сегментных регистров

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

32-разрядная адресация и косвенный доступ к данным позволяют реализовать в системе интерфейс, не зависящий от фактического объема системной виртуальной памяти. Некоторые сегментные регистры используются совместно всеми процессами, другие - только ограниченным набором процессов, некоторые же могут использоваться только одним процессом. Для того чтобы несколько процессов могли использовать сегментный регистр совместно, они должны загрузить один и тот же ИД сегмента.

Пространство подкачки

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

  1. Находит неактивную в данный момент область памяти.
  2. Обеспечивает, чтобы последняя копия данных или программы из этой области памяти была записана в пространство подкачки на диске.
  3. Считывает нужную программу или данные из пространства подкачки на диске и помещает их в освобожденную область памяти.

Стратегия управления памятью

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

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

  • страницы рабочей памяти
  • страницы локальных файлов
  • страницы удаленных файлов

Рабочие страницы имеют максимальный приоритет, страницы локальных файлов - промежуточный, и страницы удаленных файлов - самый низкий приоритет.

Кроме того, для выбора заменяемых страниц VMM использует технологию, называемую "часовым алгоритмом". В соответствии с этим алгоритмом для каждой страницы устанавливается бит обращения, позволяющий выбирать страницы, которые недавно использовались системой. При вызове процедура захвата страниц циклически просматривает таблицу страниц и проверяет биты обращения к каждой странице. Если обращение к странице не выполнялось и она не закреплена (и отвечает еще некоторым специальным условиям), то эта страница будет захвачена и помещена в список свободных страниц. Страницы, которым были обращения, нельзя захватить, но можно сбросить их бит обращения, в результате чего при следующем запуске процедуры захвата они будут считаться неактивными.

Выделение памяти

В версии 3 данной операционной системы выделение памяти приложениям осуществляется по принципам отложенной подкачки. Это означает, что когда память выделяется приложению некоторой процедурой (например, malloc), пространство подкачки для этой памяти не будет выделено до тех пор, пока приложение не обратится к ней.