Лекция 6 Управление памятью

advertisement
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
СТАВРОПОЛЬСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ
Экономический факультет
УТВЕРЖДАЮ
Заведующий кафедрой
______________________
«___»_____________2014 г.
ЛЕКЦИЯ №5
Управление памятью
по дисциплине«Операционные системы»
Тема №5
Управление памятью
для студентов специальности
080500.62–Бизнес-информатика
ШИФР
наименование
Рассмотрено УМК
" " ___________ 2014 года
протокол N ______________
Ставрополь - 2014 г.
Учебные и воспитательные цели:
1. Дать систематизированные научные знания о принципах управления
памятью
Время:_______________________________________________________________ 90
мин.
Учебно-материальное обеспечение:
1. Опорная лекция.
2. ГОС ВПО по направлению 080500.62 – Бизнес-информатика.
3. Рабочая программа дисциплины «Операционные системы».
4. Основная и дополнительная литература.
5. Методические указания по изучению дисциплины «Операционные системы».
6. Комплект слайдов по Теме №5
Распределение времени
I. Вступительная часть
II. Учебные вопросы:
1. Функции ОС по управлению памятью
2. Типы адресов
3. Простое непрерывное распределение и распределение с перекрытием
4. Алгоритмы распределения памяти
II. Заключительная часть
СОДЕРЖАНИЕ ЗАНЯТИЯ
1. Функции ОС по управлению памятью
Если не оговорено иное, под памятью (memory) понимается оперативная память
компьютера, в отличие от внешней памяти (storage).
Процессор может выполнять только инструкции, находящиеся в оперативной памяти.
Память распределяется как между модулями прикладных программ, так и между модулями
самой операционной системы.
Функции ОС по управлению памятью в мультипрограммной системе:
 отслеживание свободной и занятой памяти;
 выделение памяти процессам и ее освобождение при завершении процесса;
 вытеснение процессов из оперативной памяти на диск при нехватке оперативной памяти и
возвращение в оперативную память при освобождении места в ней (механизм виртуальной
памяти);
 настройка адресов программы на конкретную область физической памяти;
 динамическое выделение памяти процессам (выделение памяти по запросу приложения во
время его выполнения); выделяются свободные участки, расположенные произвольным
образом, что приводит к фрагментации памяти;
 дефрагментация освобожденной динамической памяти;
 выделение памяти для создания служебных структур ОС (дескрипторы процессов и потоков,
таблицы распределения ресурсов, буферы, синхронизирующие объекты и т.д.;
 защита памяти – выполняемый процесс не должен записывать или читать данные из памяти,
назначенной другому процессу.
2. Типы адресов
Преобразование адресов в процессе обработки программы
Для идентификации переменных и команд на разных этапах обработки программы
операционной системой используются символьные имена, преобразуемые в виртуальные адреса
и в итоге – в физические адреса (рис. 1).
Символьные
имена
Идентификаторы в программе на
алгоритмическом языке. Присваиваются
программистом.
Транслятор
Для
специализированны
х систем, когда
известно, в какой
области памяти
будет выполняться
программа
Виртуальные
адреса
Физические
адреса
Условные адреса. Вырабатываются
транслятором и считаются относительно
адреса начала программы, принимаемого за
ноль.
Адреса ячеек физической памяти, где
располагаются переменные и команды
готовой к исполнению программы.
Рис. 1. Типы адресов
Виртуальное адресное пространство: структура и отображение на физическую память
Виртуальное адресное пространство.
Виртуальные адреса для различных программ назначаются транслятором независимо.
Диапазон виртуальных адресов определяется программно-аппаратным обеспечением
компьютера, в частности, разрядностью его схем адресации. Совокупность всех возможных
адресов из этого диапазона называется виртуальным адресным пространством.
Так, 32-разрядный процессор семейства x86 дает возможность адресовать до 232 байтов,
т.е. до 4 Гбайт памяти с диапазоном виртуальных адресов от 00000000h до FFFFFFFFh.
Реальные процессы используют только часть доступного виртуального пространства (на
1-2 порядка меньше максимума).
Совпадение виртуальных адресов переменных и команд различных программ не
приводит к конфликтам, так как в случае, когда эти переменные или команды одновременно
присутствуют в памяти, операционная система отображает совпадающие виртуальные адреса на
разные физические (если эти переменные или команды не должны разделяться
соответствующими процессами) адреса.
Образ процесса – термин, обозначающий содержимое назначенного процессу
виртуального адресного пространства, т.е. коды команд и данные (исходные, промежуточные и
результаты).
Способы структуризации виртуального адресного пространства в ОС.
Структура адреса, или модель адресации определяется в совокупности компилятором,
операционной системой и аппаратным обеспечением. Компилятор должен обеспечить простоту
работы с адресом, но с минимальным разрывом между программистом и ОС. Поэтому в языке
программирования отображается та модель, которая используется в ОС. Эта модель, в свою
очередь, определяется заложенной в ОС идеей адресации с учетом необходимости реализации
этой идеи на конкретной аппаратной платформе. Таким образом, ОС «сверху» должна
обеспечить достаточно простую модель адресации для компилятора, а «снизу» уметь
преобразовать эту модель в модель, навязанную аппаратурой.
Рассмотрим две наиболее характерных модели структуризации адресного пространства –
плоскую и двухуровневую модель «сегмент-смещение». Эти модели представлены на рис. 2.
а
б
Сегмент k
q
Сегмент p
(p,q) – двухкомпонентный
адрес
……
m
Сегмент 1
Рис. 2 Типы виртуальных адресных пространств: плоское (а), сегментированное (б)
Плоская (flat)структура. Виртуальное адресное пространство представлено в виде
непрерывной линейной последовательности адресов. Линейный виртуальный адрес – число,
представляющее собой смещение относительно начала виртуального адресного пространства
(обычно это нулевое значение).
Сегментированная структура. Виртуальное адресное пространство представляется
разделенным на сегменты, а адрес любого объекта в памяти определяется номером сегмента и
смещением относительно начала этого сегмента, т.е. парой сегмент-смещение.
Более конкретно способы структуризации виртуального адресного пространства
рассмотрены в п. 4 темы в связи с механизмами виртуальной памяти.
Важно отметить следующее.
Использование и реализация универсального принципа сегментирования структуры
адресного пространства в разные периоды развития вычислительной техники были
принципиально различными и менялись по крайней мере трижды.
В ранних ОС на сегменты фиксированного размера делилась физическая память, о чем
пользователь должен был знать и что при необходимости учитывал в программе.
Необходимость структуризации адреса диктовалась архитектурой процессора и памяти. Так,
модель памяти «сегмент-смещение» была реализована в 32-разрядной архитектуре IBM-360
(объем памяти оказывался меньше потенциально адресуемого, но тем не менее была
реализована модель «сегмент-смещение») и в 16-разрядной архитектуре x-86 (по причине
сугубо аппаратного свойства: процессор использовал 20-разрядную шину адреса, располагая 16разрядными регистрами, и для формирования адреса использовалось два регистра).
Для программы адресное пространство представляется плоским.
Подходы к преобразованию виртуальных адресов в физические
Загрузка совместно с заменой виртуальных адресов физическими. Замена адресов
выполняется один раз. Программа перемещающий загрузчик, имея начальный адрес загрузки
(т.е. адрес оперативной памяти, начиная с которого будет размещена программа) и код в
относительных (виртуальных) адресах, выполняет загрузку с одновременным увеличением
виртуальных адресов на величину начального адреса загрузки.
Динамическое преобразование виртуальных адресов. Программа загружается в память в
виртуальных адресах. Начальный адрес загрузки ОС фиксирует в специальном регистре.
Преобразование виртуальных адресов в физические (также путем прибавления начального
адреса загрузки) производится во время выполнения программы при обращении к памяти.
Таким образом, некоторый виртуальный адрес пересчитывается в физический столько раз,
сколько обращений по нему производится.
Этот способ более гибок, так как позволяет перемещать программный код процесса во
время выполнения, но менее экономичен из-за многократных преобразований одних и тех же
адресов.
Понятие виртуальной памяти
Сегодня для компьютеров универсального назначения типична ситуация, когда объем
виртуального адресного пространства превышает доступный объем оперативной памяти. Это
достигается за счет отображения виртуального адресного пространства на физическую память
посредством использования механизма виртуальной памяти.
Виртуальная память – картина памяти, формируемая операционной системой для
процесса (вспомним, что одна из функций ОС – предоставление виртуальной машины;
естественно предположить, что память такой машины тоже должна быть виртуальной).
Деятельность ОС по созданию такой картины правомерно назвать виртуализацией памяти.
Например, для процессов (потоков) в Windows NT память представляется плоской
(линейной) и имеет объем 4 Гб.
Реально ОС имеет в своем распоряжении некоторый объем физической оперативной
памяти в виде установленных модулей (этот объем может варьироваться до 4 Гб) плюс объем,
который ей разрешено использовать на диске (от 2 Мб, сверху ограничивается
администратором). Эта память распределяется между всеми процессами, включая системные,
отдельными фрагментами (например, страницами, см. далее). Страницы отдельного процесса
располагаются частью в оперативной памяти, частью на диске в порядке, устанавливаемом ОС
и в общем случае отличном от их последовательности в самом процессе (его виртуальном
адресном пространстве). Эффект увеличения объема памяти достигается за счет вытеснения
неактивных страниц на диск.
Таким образом, 4Гб оперативной памяти, с которой работает процесс, – фикция,
создаваемая для него операционной системой.
Поскольку виртуальная память – механизм управления памятью, а не предоставляемое ее
пространство, корректнее говорить о памяти, предоставляемой процессу посредством этого
механизма. Ее объем складывается из доступного объема оперативной памяти и объема
разрешенной к использованию дисковой памяти. Тогда справедливо утверждение: объем
памяти, предоставляемой процессу механизмом виртуальной памяти, потенциально позволяет
адресовать все виртуальное адресное пространство данного процесса. Реально на
взаимодействие процессов накладывается целый ряд различных ограничений, в силу которых
процессы должны вести себя корректно друг по отношению к другу, и ни один процесс не
должен претендовать на всю доступную память. На сегодня «правила хорошего тона»
предписывают использовать не более 200 – 500 Мб памяти, самостоятельно организуя
программным путем обмен с диском в случае наличия более громоздких структур данных (как,
например, это делает Adobe Photoshop).
З. Простое непрерывное распределение и распределение с перекрытием
Простое непрерывное распределение — это самая простая схема, согласно которой вся
память условно может быть разделена на три области:
 область, занимаемая операционной системой;
 область, в которой размещается исполняемая задача;
 незанятая ничем (свободная) область памяти.
Изначально являясь самой первой схемой, схема простого непрерывного распределения
памяти продолжает и сегодня быть достаточно распространенной. Эта схема предполагает, что
операционная система не поддерживает мультипрограммирование, поэтому не возникает
проблемы распределения памяти между несколькими задачами. Программные модули,
необходимые для всех программ, располагаются в области самой операционной системы, а вся
оставшаяся память может быть предоставлена задаче. Эта область памяти получается
непрерывной, что облегчает работу системы программирования. Поскольку в различных
однотипных вычислительных комплексах может быть разный состав внешних устройств (и,
соответственно, они содержат различное количество драйверов), для системных нужд могут
быть отведены отличающиеся объемы оперативной памяти, и получается, что можно не
привязывать жестко виртуальные адреса программы к физическому адресному пространству.
Эта привязка осуществляется на этапе загрузки задачи в память.
Для того чтобы для задач отвести как можно больший объем памяти, операционная
система строится таким образом, чтобы постоянно в оперативной памяти располагалась только
самая нужная ее часть. Эту часть операционной системы стали называть ядром. Прежде всего, в
ядро операционной системы входят основные модули супервизора. Для однопрограммных
систем понятие супервизора вырождается в модули, получающие и выполняющие первичную
обработку запросов от обрабатывающих и прикладных программ, и в модули подсистемы
памяти. Ведь если программа по ходу своего выполнения запрашивает некоторое множество
ячеек памяти, то подсистема памяти должна их выделить (если они есть), а после освобождения
этой памяти подсистема памяти должна выполнить действия, связанные с возвратом памяти в
систему. Остальные модули операционной системы, не относящиеся к ее ядру, могут быть
обычными диск-резидентными (или транзитными), то есть загружаться в оперативную память
только по необходимости, и после своего выполнения вновь освобождать память.
Такая схема распределения влечет за собой два вида потерь вычислительных ресурсов потеря процессорного времени, потому что процессор простаивает, пока задача ожидает
завершения операций ввода-вывода, и потеря самой оперативной памяти, потому что далеко не
каждая программа использует всю память, а режим работы в этом случае однопрограммный.
Однако это очень недорогая реализация, которая позволяет отказаться от многих функций
операционной системы. В частности, такая сложная проблема, как защита памяти, здесь почти
не стоит. Единственное, что желательно защищать — это программные модули и области
памяти самой операционной системы.
Если есть необходимость создать программу, логическое адресное пространство которой
должно быть больше, чем свободная область памяти, или даже больше, чем весь возможный
объем оперативной памяти, то используется распределение с перекрытием — так называемые
оверлейные структуры (от overlay — перекрытие, расположение поверх чего-то). Этот метод
распределения предполагает, что вся программа может быть разбита на части — сегменты.
Каждая оверлейная программа имеет одну главную (main) часть и несколько сегментов
(segments), причем в памяти машины одновременно могут находиться только ее главная часть и
один или несколько не перекрывающихся сегментов.
Пока в оперативной памяти располагаются выполняющиеся сегменты, остальные
находятся во внешней памяти. После того как текущий (выполняющийся) сегмент завершит
свое выполнение, возможны два варианта: либо он сам (если данный сегмент не нужно
сохранить во внешней памяти в его текущем состоянии) обращается к операционной системе с
указанием, какой сегмент должен быть загружен в память следующим; либо он возвращает
управление главному сегменту задачи, и уже тот обращается к операционной системе с
указанием, какой сегмент сохранить (если это нужно), а какой сегмент загрузить в оперативную
память, и вновь отдает управление одному из сегментов, располагающихся в памяти.
Простейшие схемы сегментирования предполагают, что в памяти в каждый конкретный момент
времени может располагаться только один сегмент (вместе с главным модулем). Более сложные
схемы, используемые в больших вычислительных системах, позволяют располагать в памяти
несколько сегментов. В некоторых вычислительных комплексах могли существовать отдельно
сегменты кода и сегменты данных. Сегменты кода, как правило, не претерпевают изменений в
процессе своего исполнения, поэтому при загрузке нового сегмента кода на место
отработавшего последний можно не сохранять во внешней памяти, в отличие от сегментов
данных, которые сохранять необходимо.
Первоначально программисты сами должны были включать в тексты своих программ
соответствующие обращения к операционной системе (их называют системными вызовами) и
тщательно планировать, какие сегменты могут находиться в оперативной памяти
одновременно, чтобы их адресные пространства не пересекались. Однако с некоторых пор
такого рода обращения к операционной системе системы программирования стали подставлять
в код программы сами, автоматически, если в том возникает необходимость. Так, в известной и
популярной в недалеком прошлом системе программирования Turbo Pascal программист просто
указывал, что данный модуль является оверлейным. И при обращении к нему из основной
программы модуль загружался в память и получал управление. Все адреса определялись
системой программирования автоматически, обращения к DOS для загрузки оверлеев тоже
генерировались системой Turbo Pascal.
Распределение оперативной памяти в MS DOS
Как известно, MS DOS1 — это однопрограммная операционная система для
персонального компьютера типа IBM PC. В ней, конечно, можно организовать запуск
резидентных, или TSR-задач2, в результате которого в памяти будет находиться не одна
программа, но в целом система MS DOS предназначена для выполнения только одного
вычислительного процесса. Поэтому распределение памяти в ней построено по схеме простого
непрерывного распределения. Система поддерживает механизм распределения памяти с
перекрытием (оверлейные структуры).
Как известно, в IBM PC использовался 16-разрядный микропроцессор i8088, который за
счет введения сегментного способа адресации позволял указывать адрес ячейки памяти в
пространстве объемом до 1 Мбайт. В последующих персональных компьютерах (IBM PC AT,
AT386 и др.) было принято решение поддерживать совместимость с первыми, поэтому при
работе в DOS прежде всего рассматривают первый мегабайт. Вся эта память разделялась на
несколько областей, что иллюстрирует рис. 3.2. На этом рисунке показано, что памяти может
быть и больше, чем 1 Мбайт, но более подробное рассмотрение этого вопроса мы здесь
опустим, отослав желающих изучить данную тему глубже к монографии [2].
Если не вдаваться в детали, можно сказать, что в состав MS DOS входят следующие
основные компоненты.
Подсистема BIOS (Base Input-Output System — базовая подсистема ввода-вывода),
включающая в себя помимо программы POST (Power On Self Test — самотестирование при
включении компьютера) программные модули обработки прерываний, с помощью которых
можно управлять основными контроллерами на материнской плате компьютера и устройствами
ввода-вывода. Эти модули часто называют обработчиками прерываний. По своей
функциональной сути они представляют собой драйверы. BIOS располагается в постоянном
запоминающем устройстве компьютера. В конечном итоге почти все остальные модули MS
DOS обращаются к BIOS. Если и не напрямую, то через модули более высокого уровня
иерархии.
Модуль расширения BIOS — файл IO.SYS (в других DOS-системах он может называться
иначе, например _ВЮ.С0М).
Основной, или базовый, модуль обработки прерываний DOS — файл MSDOS.SYS.
Именно этот модуль в основном реализует работу с файловой системой.
Командный процессор (интерпретатор команд) — файл COMMAND.COM.
Утилиты и драйверы, расширяющие возможности системы.
Программа загрузки MS DOS — загрузочная запись (Boot Record, BR), расположенная
на дискете или на жестком диске
Вся память в соответствии с архитектурой IBM PC условно может быть разбита на
следующие три части.
В самых младших адресах памяти (первые 1024 ячейки) размещается таблица векторов
прерывания. Это связано с аппаратной реализацией процессора i8088. В последующих
процессорах (начиная с i80286) адрес таблицы прерываний определяется через содержимое
соответствующего регистра, но для обеспечения полной совместимости с первым процессором
при включении или аппаратном сбросе в этот регистр заносятся нули. При желании, однако, в
случае использования современных микропроцессоров i80x86 вектора прерываний можно
размещать и в других областях.
Рис.2. Распределение оперативной памяти в MS DOS
Вторая часть памяти отводится для программных модулей самой системы MS DOS и для
программ пользователя. Эту область памяти мы рассмотрим чуть позже, здесь только заметим,
что она называется основной, или стандартной, памятью (conventional memory).
Наконец, третья часть адресного пространства отведена для постоянных запоминающих
устройств и функционирования некоторых устройств ввода-вывода. Эта область памяти
получила название UMA (Upper Memory Area — область памяти, адрес которой выше
основной).
В младших адресах основной памяти размещается то, что можно условно назвать ядром
этой операционной системы — системные переменные, основные программные модули, блоки
данных для буферизации операций ввода-вывода. Для управления устройствами, драйверы
которых не входят в базовую подсистему ввода-вывода, загружаются так называемые
загружаемые, или устанавливаемые, драйверы. Перечень устанавливаемых драйверов
определяется специальным конфигурационным файлом CONFIG.SYS. После загрузки
расширения BIOS — файла IO.SYS — последний (загрузив модуль MSDOS.SYS) считывает
файл CONFIG.SYS и уже в соответствии с ним подгружает в память необходимые драйверы.
Кстати, в конфигурационном файле CON FIG.SYS могут иметься операторы, указывающие на
количество буферов, отводимых для ускорения операций ввода-вывода, и на количество
файлов, которые могут обрабатываться (для работы с файлами необходимо зарезервировать
место в памяти для хранения управляющих структур, с помощью которых выполняются
операции с записями файла). В случае использования микропроцессоров i80x86 и наличия в
памяти драйвера HIMEM.SYS модули IO.SYS и MSDOS.SYS могут быть размещены за
пределами первого мегабайта в области, которая получила название НМA (High Memory Area
— область памяти с большими адресами).
Память с адресами, большими чем l0FFFFh, может быть использована в DOSпрограммах при выполнении их на микропроцессорах, имеющих такую возможность
(например, микропроцессор i80286 имел 24-разрядную шину адреса, а i80386 — уже 32разрядную). Но для этого с помощью специальных драйверов необходимо переключать
процессор в другой режим работы, при котором он сможет использовать адреса выше l0FFFFh.
Широкое распространение получили две основные спецификации: XMS (Extended Memory
Specification) и EMS (Expanded Memory Specification). Последние годы система MS DOS
практически перестала применяться. Теперь ее используют в основном для запуска некоторых
утилит, с помощью которых подготавливают дисковые устройства, или для установки других
операционных систем. И поскольку основным утилитам, необходимым для обслуживания
персонального компьютера, спецификации EMS и XMS, как правило, не нужны, мы не будем
здесь их рассматривать.
Остальные программные модули MS DOS (в принципе, большинство из них является
утилитами) оформлены как обычные исполняемые файлы. Например, утилита форматирования
диска представляет собой и двоичный исполняемый файл, и команду операционной системы. В
основном такого рода утилиты являются транзитными модулями, то есть загружаются в память
только на время своей работы, хотя среди них имеются и TSR-программы. Для того чтобы
предоставить больше памяти программам пользователя, в MS DOS применено то же решение,
что и во многих других простейших операционных системах, — командный процессор
COMMAND.COM состоит из двух частей. Первая часть является резидентной и размещается в
области ядра, вторая часть транзитная и размещается в области старших адресов раздела
памяти, выделяемой для программ пользователя. И если программа пользователя перекрывает
собой область, в которой была расположена транзитная часть командного процессора, то
последний при необходимости восстанавливает в памяти свою транзитную часть, поскольку
после выполнения программы она возвращает управление резидентной части C0MMAND.COM.
Поскольку размер основной памяти относительно небольшой, то очень часто системы
программирования реализуют оверлейные структуры. Для этого в MS DOS поддерживаются
специальные вызовы.
4. Виды алгоритмов распределения памяти
Исторически выделяются два наиболее общих подхода к распределению памяти, в
рамках каждого из которых реализуется ряд алгоритмов:
1. распределение памяти без использования внешней памяти:
 фиксированными разделами;
 динамическими разделами;
 перемещаемыми разделами;
2. распределение памяти с использованием внешней памяти:
 страничное распределение;
 сегментное распределение;
 сегментно-страничное распределение.
Алгоритмы первого класса предполагают, что размер виртуального адресного
пространства каждого процесса меньше объема оперативной памяти. Эти алгоритмы
использовались в ранних мультипрограммных ОС (OS/360, ранние версии OS/2) в 60-70 годах и
в силу неактуальности здесь опущены.
Алгоритмы второго класса реализуют механизм виртуальной памяти и подлежат
рассмотрению.
1.
2.
3.
4.
5.
6.
7.
Вопросы для самопроверки:
Что такое «виртуальный адрес», «виртуальное адресное пространство»?
Имеются ли виртуальные адреса в программах, написанных для работы в среде DOS?
Функции ОС по управлению памятью в мультипрограммной среде?
Типы виртуальных адресов
Виды алгоритмов распределения памяти
Подходы к преобразованию виртуальных адресов в физические
Назначение перемещающего загрузчика
Список литературы:
1. Сетевые операционные системы/ В.Г. Олифер, Н.А. Олифер. – СПб.: Питер, 2009. - 672 с.:
ил.
2. Операционные системы: Учебник для вузов. 2-е изд. /А.В. Гордеев. – СПб.: Питер, 2006. 416 с.: ил.
Download