Управление памятью в реальном режиме

Обновлено: 06.07.2024

В этой статье содержатся основные сведения о реализации виртуальной памяти в 32-битных версиях Windows.

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

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

Процессы и пространства адресов

Всем процессам (например, исполняемым приложениям), работающим в 32-битных версиях Windows, назначены виртуальные адреса памяти (виртуальное пространство адресов), в диапазоне от 0 до 4 294 967 295 (2*32-1 = 4 ГБ), независимо от того, сколько оперативной памяти установлено на компьютере.

В конфигурации Windows по умолчанию для личного использования каждого процесса назначаются 2 гигабайта (ГБ) этого виртуального адресного пространства, а остальные 2 ГБ делятся между всеми процессами и операционной системой. Как правило, приложения (например, Блокнот, Word, Excel и Acrobat Reader) используют только часть 2 ГБ частного адресного пространства. Операционная система назначает кадры страниц оперативной памяти только тем виртуальным страницам памяти, которые используются.

Расширение физического адреса (PAE) — это функция 32-битной архитектуры Intel, которая расширяет адрес физической памяти (RAM) до 36 бит. PAE не меняет размер виртуального адресного пространства (которое остается на уровне 4 ГБ), а только объем фактической оперативной памяти, который может быть рассмотрен процессором.

Перевод между 32-битным виртуальным адресом памяти, используемым кодом, работающим в процессе, и 36-битным адресом оперативной памяти обрабатывается компьютерным оборудованием автоматически и прозрачно в соответствии с таблицами переводов, которые поддерживаются операционной системой. Любая виртуальная страница памяти (32-битный адрес) может быть связана с любой физической страницей оперативной памяти (36-битным адресом).

В следующем списке описывается количество оперативной памяти различных Windows версий и выпусков (по данным на май 2010 г.):

Версия Windows ОЗУ
Windows NT 4.0 4 ГБ
Windows 2000 Professional 4 ГБ
Windows 2000 Standard Server 4 ГБ
Windows 2000 Advanced Server 8 ГБ
Windows 2000 Datacenter Server 32 ГБ
Windows XP Professional 4 ГБ
Windows Веб-издание Server 2003 2 ГБ
Windows Сервер 2003 выпуск Standard 4 ГБ
Windows Сервер 2003 выпуск Enterprise 32 ГБ
Windows Выпуск центра обработки данных Server 2003 64 ГБ
Windows Vista 4 ГБ
Windows Server 2008 Standard 4 ГБ
Windows Server 2008 Enterprise 64 ГБ
Windows Server 2008 Datacenter 64 ГБ
Windows 7 4 ГБ

Файл подкачки

Оперативная память — это ограниченный ресурс, в то время как для большинства практических целей виртуальная память не ограничена. Может быть много процессов, и каждый процесс имеет свои собственные 2 ГБ частного виртуального адресного пространства. Если память, используемая всеми существующими процессами, превышает доступную оперативную память, операционная система перемещает страницы (4-КБ частей) одного или более виртуальных адресных пространств на жесткий диск компьютера. Это освободит раму оперативной памяти для других применений. В Windows системах указанные страницы хранятся в одном или Pagefile.sys файлах в корне раздела. В каждом разделе диска может быть один такой файл. Расположение и размер файла страницы настроены в System Properties (нажмите кнопку Advanced, щелкните Производительность и нажмите кнопку Параметры).

Пользователи часто задают вопрос о том, насколько большим должен быть этот pagefile? На этот вопрос нет единого ответа, так как он зависит от количества установленной оперативной памяти и от объема виртуальной памяти, требуемой рабочей нагрузкой. Если других сведений нет, то обычная рекомендация в 1,5 раза больше установленной оперативной памяти является хорошей отправной точкой. В серверных системах обычно необходимо иметь достаточно оперативной памяти, чтобы не было недостатка и чтобы не использовался pagefile. В этих системах это может не служить никакой полезной цели для поддержания большого pagefile. С другой стороны, если дискового пространства достаточно, сохранение большого pagefile (например, в 1,5 раза больше установленной оперативной памяти) не вызывает проблем, и это также устраняет необходимость беспокоиться о том, насколько большим он должен быть.

Производительность, ограничения архитектуры и оперативная память

На любой компьютерной системе по мере увеличения нагрузки (количество пользователей, объем работы) производительность снижается, но нелинейно. Любое увеличение нагрузки или спроса за определенной точкой приводит к значительному снижению производительности. Это означает, что некоторые ресурсы в критическом дефиците и стали узким местом.

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

  • 2 ГБ общего виртуального адресного пространства для системы (ядра)
  • 2 ГБ частного виртуального адресного пространства за один процесс (режим пользователя)
  • 660 МБ системного хранилища PTE (Windows Server 2003 и ранее)
  • 470 МБ хранилища пула страниц (Windows Server 2003 и ранее)
  • 256 МБ неоплаченного хранилища пула (Windows Server 2003 и ранее)

Это относится к Windows Server 2003 в частности, но это может также применяться к Windows XP и Windows 2000. Однако Windows Vista, Windows Server 2008 и Windows 7 не разделяют эти архитектурные ограничения. Ограничения на память пользователя и ядра (цифры 1 и 2 здесь) одинаковы, но ресурсы ядра, такие как PTEs и различные пулы памяти, динамически. Эта новая функция позволяет использовать как страницу, так и неоплаченную память. Это также позволяет PTEs и пул сеансов расти за пределы, которые были рассмотрены ранее, до точки, где все ядро исчерпано.

Часто находятся и цитируются такие утверждения, как следующие:

С помощью терминалного сервера 2 ГБ общего адресного пространства будут полностью использоваться до использования 4 ГБ оперативной памяти.

В некоторых случаях это может быть верно. Однако необходимо следить за системой, чтобы узнать, применяются ли они к вашей конкретной системе или нет. В некоторых случаях эти утверждения являются выводами из определенных сред Windows NT 4.0 или Windows 2000 и не обязательно применимы к Windows Server 2003. В Windows Server 2003 были внесены значительные изменения, чтобы снизить вероятность того, что эти архитектурные ограничения будут фактически достигнуты на практике. Например, некоторые процессы, которые находились в ядре, были перенесены в неядерные процессы, чтобы уменьшить объем памяти, используемый в общем виртуальном пространстве адресов.

Мониторинг использования оперативной памяти и виртуальной памяти

Монитор производительности является принципиальным средством для мониторинга производительности системы и определения расположения узких мест. Чтобы запустить монитор производительности, нажмите кнопку Начните, нажмите панель управления, нажмите административные средства, а затем дважды щелкните Монитор производительности. Вот сводка некоторых важных счетчиков и то, что они вам говорят:

Memory, Committed Bytes: This counter is a measure of the demand for virtual memory.

Это показывает, сколько bytes было выделено процессами и к которым операционная система совершила раму страницы ram или слот страницы в pagefile (или возможно оба). По мере того, как количество совершенных bytes будет больше, чем доступная оперативная память, будет увеличиваться и размер используемой страницы также увеличится. В какой-то момент действие paging начинает существенно влиять на производительность.

Process, Working Set, _Total: Этот счетчик является показателем виртуальной памяти в активном использовании.

В этом счетчике показано, сколько оперативной памяти требуется, чтобы виртуальная память, используемая для всех процессов, была в оперативной памяти. Это значение всегда составляет несколько 4096, то есть размер страницы, используемый в Windows. Так как спрос на виртуальную память увеличивается за пределами доступной оперативной памяти, операционная система регулирует объем виртуальной памяти процесса в рабочем наборе, чтобы оптимизировать доступное использование оперативной памяти и свести к минимуму потери данных.

Paging File, %pagefile in use: This counter is a measure of how much of the pagefile is actually being used.

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

Memory, Pages/Sec. Этот счетчик является одним из наиболее непонимаемого.

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

Memory, Pages Output/Sec. На этом счетчике показано, сколько страниц виртуальной памяти было записано на страницу, чтобы освободить кадры страниц оперативной памяти для других целей каждую секунду.

Это лучший счетчик, чтобы отслеживать, если вы подозреваете, что paging является узким местом производительности. Даже если установленный объем оперативной памяти превышает установленный объем оперативной памяти, если выход страниц/сек в основном низкий или нулевой, существенной проблемы производительности из-за недостаточной оперативной памяти не возникает.

Память, кэш-bytes, memory, Pool Nonpaged Bytes, Memory, Pool Paged Bytes, Memory, System Code Total Bytes, Memory, System Driver Total Bytes:

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

Память, доступные MBytes. Этот счетчик измеряет, сколько оперативной памяти доступно для удовлетворения потребностей виртуальной памяти (либо новых выделений, либо для восстановления страницы с страницы).

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

Реальная память делится на область идентичных адресов для резидентной ( постоянно находящейся в основной памяти) части управляющей программы системы ДОС-3 и область замещаемых страниц, участвующую в системе страничного обмена.

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

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

Реальная память разбивается на взаимно недоступные области. Защита осуществляется в процессе выполнения программы путем управления доступом к этим областям. Исследуя содержимое РК, ЦП может указать адреса, необходимые для выполнения команды.

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

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

1 .Эффективное размещение процессов в ОП.

Основная цель УП - обеспечить максимальный уровень мультипрограммирования и тем самым максимальную загрузку ЦП.

Современные ЭВМ имеют 3-х уровневую, иерархическую организацию запоминающих устройств (ЗУ) (внутренние регистры процессора, различные типы сверхоперативной и оперативной памяти, диски, ленты), отличающихся средним временем доступа и стоимостью хранения данных в расчете на один бит (рисунок 1). Пользователю хотелось бы иметь и недорогую и быструю память. Кэш-память представляет некоторое компромиссное решение этой проблемы.


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

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

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

В системах, оснащенных кэш-памятью, каждый запрос к оперативной памяти выполняется в соответствии со следующим алгоритмом:

Просматривается содержимое кэш-памяти с целью определения, не находятся ли нужные данные в кэш-памяти; кэш-память не является адресуемой, поэтому поиск нужных данных осуществляется по содержимому - значению поля "адрес в оперативной памяти", взятому из запроса.

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

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

В реальных системах вероятность попадания в кэш составляет примерно 0,9. Высокое значение вероятности нахождения данных в кэш-памяти связано с наличием у данных объективных свойств: пространственной и временной локальности.

Пространственная локальность . Если произошло обращение по некоторому адресу, то с высокой степенью вероятности в ближайшее время произойдет обращение к соседним адресам.

Временная локальность. Если произошло обращение по некоторому адресу, то следующее обращение по этому же адресу с большой вероятностью произойдет в ближайшее время.

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

Физически ОП имеет линейную организацию и представляет собой последовательность адресуемых ячеек (байт, 1 байт = 8 бит) от 0 до N, которая делится на слова, блоки, сегменты. Номер является адресом ячейки памяти. Размер ОП определяется в килобайтах (1Кб=1024б), мегабайтах (1Мб=1024Кб), гигабайтах (1Гб=1024Мб), терабайтах (1Тб=1024 Гб) и т.д.

Слово - это единица обмена ОП с ЦП, определяемое разрядностью с ЦП.

Блок - это непрерывная область памяти с общим ключом защиты. В EC ЭВМ - размер блока 2К, поэтому процессом выдается память, кратная 2К.

Сегмент - это некоторый участок памяти (для IBM PC от 16 б до 64Кб). Сегмент может содержать несколько блоков.

Для эффективного использования ОП необходимо определить стратегию управления памятью. ОС постоянно приходится решать задачу: когда, куда и за счет кого ввести в ОП процесс и данные.

Адресация ячеек памяти в реальном режиме. В реальном режиме адрес имеет размер 20 бит. Максимальный объем адресуемой памяти составляет 1 Мбайт (2 20 = 1 Мбайт). Для формирования 20-битового адреса в памяти используются два 16-битовых регистра: сегментный регистр и регистр смещения (рис. 2.2).

  • 16-битовый адрес сегмента (сегментный регистр)
  • 19 16 15 + 0

16-битовое смещение (адрес в команде)

20-битовый физический адрес в памяти

Рис. 2.2 - Преобразование логического адреса в физический адрес в реальном режиме

Сегментный регистр определяет базовый адрес сегмента. В нем содержатся старшие 16 бит базового адреса сегмента, младшие четыре бита предполагаются равными 0. В регистре смещения находится смещение внутри сегмента (относительно базового адреса сегмента). Смещение может также задаваться непосредственной константой. Смещение добавляется к базовому адресу сегмента, и, таким образом, получается 20-битовый адрес в памяти.

Более просто можно описать вычисление следующим образом — 16-битовое значение сегментного регистра сдвигается на 4 бита влево и к нему добавляется значение смещения, в результате получается 20-битовое значение. Или это же действие можно представить математической формулой:

Физический адрес = Сегментный адрес ? 10h + Смещение.

Такая схема применялась в 8086 и 8088 микропроцессорах, и такое же представление 20-битного адреса двумя 16-битными числами поддерживается в реальном режиме всех последующих микропроцессоров х86.

С использованием реального режима функционировала ОС MS DOS (Microsoft Disk Operating System) — дисковая операционная система от фирмы Microsoft.

Распределение оперативной памяти в MS DOS. Согласно сегментной модели физический адрес вычисляется по формуле, приведенной на рисунке 2.2. Таким образом, обеспечивался доступ к адресному пространству от OOOOOh до FFFFFh при помощи пары 16-битных регистров.

Обратите внимание, что при сегментном адресе, равном OFFFFh, и смещении, равном OFFFFh, данная формула дает адрес lOFFEFh, но ввиду 20-битного ограничения на шину адреса эта комбинация в физической памяти указывает на OFFEFh. Таким образом, адресное пространство как бы сворачивается в кольцо с небольшим «нахлестом». Начиная с процессора 80286, шина адреса была расширена до 24 бит, а впоследствии (в процессорах 386DX, 486 и выше) до 32 бит и даже 36 бит. В реальном режиме процессора, используемом в MS DOS, применяется та же сегментная модель памяти, и формально был доступен лишь 1 Мбайт памяти. Однако выяснилось, что процессоры 80286 в реальном режиме эмулируют 8086 с ошибкой: та самая единица в битс А20, которая отбрасывалась в процессорах 8086/88, теперь попадает на шину адреса, и в результате максимально доступный линейный адрес в реальном режиме достиг 1 OFFEFh. Дополнительные байты оперативной памяти (64 Кбайт минус 16 байт), адресуемой в реальном режиме, позволили освободить дефицитное пространство оперативной памяти для прикладных программ. В эту область от 100 000h до 1 OFFEFh, названную высокой памятью НМЛ (High Memory Area), стали помещать часть операционной системы и небольшие резидентные программы.

Распределение оперативной памяти, непосредственно адресуемой микропроцессором в реальном режиме, представлено на рисунке 2.3 [12].

Распределение памяти в MS DOS

Рис. 2.3 - Распределение памяти в MS DOS

Стандартная память — Conventional memory. При работе в среде ОС типа MS DOS стандартная память является самой дефицитной в персональном компьютере. На ее небольшой объем (типовое значение 640 Кбайт) претендуют и BIOS, и ОС, а оставшаяся часть предназначена для прикладного ПО. Стандартная память распределяется следующим образом:

  • • OOOOOh-003FFH - Interrupt Vectors — таблица векторов прерываний 1 (256 двойных слов);
  • • 00400h 004FFh — BIOS Data Area — область переменных BIOS;
  • • 00500h-00xxxh — DOS Area — область DOS;
  • • 00xxxh-9FFFFh — User RAM — память, предоставляемая пользователю.

В процессорах семейства Intel предусмотрено 256 прерываний и соответственно 256 векторов прерываний. Все вектора прерываний объединяются в таблицу, состоящую из 256 4-байтовых элементов и занимающую 1 Кбайт. В реальном режиме эта таблица находится в самом начале памяти по адресу 0000:0000 или просто по 0-му физическому адресу.

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

Управление пользовательской памятью осуществляется с использованием специализированных структур 2 : таблицы таблиц —list of list (табл. 2.3) и управляющих блоков памяти — memory control block (МСВ) (табл. 2.4).

Таблица 2.3 - Структура таблицы таблиц

Сегментный адрес первого блока управления памятью МСВ

Указатель на первый DPB (disk parameter blockout)

Указатель на список таблиц открытых файлов

Указатель на первый драйвер DOS (CLOCKS)

Таблица 2.4 - Структура блока управления памятью

Г М Г (4dH) —за этим блоком есть еще блоки. 'Z' (5аН) —данный блок является последним (свободная память)

Сегментный адрес префикса программного сегмента (PSP — program segment prefix)

Размер блока в параграфах (1 параграф = 16 байт = 1 Oh байт)

Начало блока памяти длинной: (размер блока в параграфах • 1 Oh) байт

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

2 Данные структуры являются недокументированными.

  • • блоки памяти всегда выровнены на границу параграфа («сегмент блока»);
  • • блоки М-типа: следующий блок находится по адресу (Сегментный адрес блока + Размер + 1 ):0000;
  • • блоки Z-типа: (Сегментный адрес блока + Размер + 1 ):0000 = конец памяти (аОООН = 640К).
  • • +1 при вычислении адреса следующего блока —это шапка блока, равная 16 байтам или 1 Oh (см. табл. 2.3).

В любом МСВ указан его владелец — сегментный адрес префикса программного сегмента —PSP программы владельца данного блока памяти. А в PSP есть ссылка на окружение дайной программы, в котором можно найти имя программы — путь ее запуска.

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

Верхняя память — UMA (Upper Memory Area). Верхняя память имеет области различного назначения, которые могут быть заполнены буферной памятью адаптеров, постоянной памятью или оставаться незаполненными. Первоначально эти пространства не использовали из-за сложности адресации. С появлением механизма страничной переадресации их стали по возможности заполнять «островками» оперативной памяти, названными блоками верхней памяти UMB (Upper Memory Block). Эти области доступны DOS для размещения резидентных программ 1 и драйверов через драйвер EMM386, который отображает в них доступную дополнительную память.

XMS - EMS память. Дополнительная память за пределами первого мегабайта адресного пространства IBM PC-совместимого компьютера с процессором Intel 80286 или более поздним.

XMS (Extended Memory Specification) — спецификация дополнительной памяти, предполагает использование дополнительной памяти в реальном режиме только для хранения данных. Память становится доступной благодаря использованию менеджера дополнительной памяти ХММ (extended Memory Manager) — HIMEM.SYS.

EMS (Expanded Memory Specification) — спецификация расширенной памяти, предоставляющая доступ DOS-приложениям к памяти, недоступной через адресное пространство основной памяти. Расширенная память адресуется постранично через «окно», находящееся в области памяти UMA. С конца 1980-х до середины 1990-х годов EMS активно использовалась в приложениях, однако с появлением спецификации дополнительной памяти (XMS) стала использоваться реже.

Под памятью ( memory ) в данном случае подразумевается оперативная (основная) память компьютера. В однопрограммных операционных системах основная память разделяется на две части. Одна часть для операционной системы (резидентный монитор , ядро ), а вторая – для выполняющейся в текущий момент времени программы. В многопрограммных ОС "пользовательская" часть памяти – важнейший ресурс вычислительной системы – должна быть распределена для размещения нескольких процессов, в том числе процессов ОС. Эта задача распределения выполняется операционной системой динамически специальной подсистемой управления памятью ( memory management ). Эффективное управление памятью жизненно важно для многозадачных систем. Если в памяти будет находиться небольшое число процессов, то значительную часть времени процессы будут находиться в состоянии ожидания ввода-вывода и загрузка процессора будет низкой.

В ранних ОС управление памятью сводилось просто к загрузке программы и ее данных из некоторого внешнего накопителя (перфоленты, магнитной ленты или магнитного диска) в ОЗУ . При этом память разделялась между программой и ОС. На рис. 6.3 показаны три варианта такой схемы. Первая модель раньше применялась на мэйнфреймах и мини-компьютерах. Вторая схема сейчас используется на некоторых карманных компьютерах и встроенных системах, третья модель была характерна для ранних персональных компьютеров с MS-DOS .

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

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

Функциями ОС по управлению памятью в мультипрограммных системах являются:

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

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

Для идентификации переменных и команд на разных этапах жизненного цикла программы используются символьные имена, виртуальные (математические, условные, логические – все это синонимы) и физические адреса (рис. 6.4).

Типы адресов

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

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

Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Диапазон адресов виртуального пространства у всех процессов один и тот же и определяется разрядностью адреса процессора (для Pentium адресное пространство составляет объем, равный 2 32 байт , с диапазоном адресов от 0000.000016 до FFFF.FFFF16).

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

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

6.3. Распределение памяти

Существует ряд базовых вопросов управления памятью, которые в различных ОС решаются по -разному. Например, следует ли назначать каждому процессу одну непрерывную область физической памяти или можно выделять память участками? Должны ли сегменты программы, загруженные в память , находиться на одном месте в течение всего периода выполнения процесса или их можно время от времени сдвигать? Что делать, если сегменты программы не помещаются в имеющуюся память ? Как сократить затраты ресурсов системы на управление памятью ? Имеется и ряд других не менее интересных проблем управления памятью [5, 10, 13, 17].

Ниже приводится классификация методов распределения памяти, в которой выделено два класса методов – с перемещением сегментов процессов между ОП и ВП (диском) и без перемещения, т.е. без привлечения внешней памяти (рис. 6.5). Данная классификация учитывает только основные признаки методов. Для каждого метода может быть использовано несколько различных алгоритмов его реализации.

Классификация методов распределения памяти


Рис. 6.5. Классификация методов распределения памяти

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

Варианты фиксированного распределения памяти


Рис. 6.6. Варианты фиксированного распределения памяти

При использовании разделов с одинаковым размером имеются две проблемы.

  1. Программа может быть слишком велика для размещения в разделе. В этом случае программист должен разрабатывать программу, использующую оверлеи, чтобы в любой момент времени требовался только один раздел памяти. Когда требуется модуль, отсутствующий в данный момент в ОП, пользовательская программа должна сама его загрузить в раздел памяти программы. Таким образом, в данном случае управление памятью во многом возлагается на программиста.
  2. Использование ОП крайне неэффективно. Любая программа, независимо от ее размера, занимает раздел целиком. При этом могут оставаться неиспользованные участки памяти большого размера. Этот феномен появления неиспользованной памяти называется внутренней фрагментацией (internal fragmentation).

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

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

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

Недостаток заключается в том, что отдельные очереди для разделов могут привести к неоптимальному распределению памяти системы в целом. Например, если в некоторый момент времени нет ни одного процесса размером от 7 до 12 Мбайт, то раздел размером 12 Мбайт будет пустовать, в то время как он мог бы использоваться меньшими процессами. Поэтому более предпочтительным является использование одной очереди для всех процессов. В момент, когда требуется загрузить процесс в ОП, выбирается наименьший доступный раздел, способный вместить данный процесс.

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

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

Для преодоления сложностей, связанных с фиксированным распределением, был разработан альтернативный подход, известный как динамическое распределение. В свое время этот подход был применен фирмой IBM в операционной системе для мэйнфреймов в OS/MVT ( мультипрограммирование с переменным числом задач – Multiprogramming With a Variable number of Tasks). Позже этот же подход к распределению памяти использован в ОС ЕС ЭВМ [12] .

При динамическом распределении образуется перемененное количество разделов переменной длины. При размещении процесса в основной памяти для него выделяется строго необходимое количество памяти. В качестве примера рассмотрим использование 64 Мбайт (рис. 6.7) основной памяти. Изначально вся память пуста, за исключением области, задействованной ОС. Первые три процесса загружаются в память , начиная с адреса, где заканчивается ОС, и используют столько памяти, сколько требуется данному процессу. После этого в конце ОП остается свободный участок памяти, слишком малый для размещения четвертого процесса. В некоторый момент времени все процессы в памяти оказываются неактивными, и операционная система выгружает второй процесс, после чего остается достаточно памяти для загрузки нового, четвертого процесса.

Вариант использования памяти

Поскольку процесс 4 меньше процесса 2, появляется еще свободный участок памяти. После того как в некоторый момент времени все процессы оказались неактивными, но стал готовым к работе процесс 2, свободного места в памяти для него не находится, а ОС вынуждена выгрузить процесс 1, чтобы освободить необходимое место и разместить процесс 2 в ОП. Как показывает данный пример, этот метод хорошо начинает работу, но плохо продолжает. В конечном счете, он приводит к наличию множества мелких свободных участков памяти, в которых нет возможности разместить какой-либо новый процесс. Это явление называется внешней фрагментацией ( external fragmentation ), что отражает тот факт, что сильно фрагментированной становится память , внешняя по отношению ко всем разделам.

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

Перечислим функции операционной системы по управлению памятью в этом случае.

  1. Перемещение всех занятых участков в сторону старших или младших адресов при каждом завершении процесса или для вновь создаваемого процесса в случае отсутствия раздела достаточного размера.
  2. Коррекция таблиц свободных и занятых областей.
  3. Изменение адресов команд и данных, к которым обращаются процессы при их перемещении в памяти, за счет использования относительной адресации .
  4. Аппаратная поддержка процесса динамического преобразования относительных адресов в абсолютные адреса основной памяти.
  5. Защита памяти, выделяемой процессу, от взаимного влияния других процессов.

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

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

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

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

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

Читайте также: