Контакты

К средствам управления памятью относятся. Принципы управления памятью

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Введение

1. Управление памятью

1.1 Основные задачи управления памятью

3.1 Распределение памяти фиксированными разделами

3.2 Распределение памяти динамическими разделами

3.3 Перемещаемые разделы

4.1 Страничный способ распределения виртуальной памяти

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

4.3 Сегментно-страничный способ распределения виртуальной памят

Заключение

Список литературы

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

выделение памяти для процесса пользователя при его запуске и освобождение этой памяти при завершении процесса;

обеспечение настройки запускаемой программы на выделенные адреса памяти;

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

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

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

предоставление процессам возможностей получения и освобождения дополнительных областей памяти в ходе работы;

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

изоляция памяти процессов, исключающая случайное или намеренное несанкционированное обращение одного процесса к областям памяти, занимаемым другим процессом;

предоставление процессам возможности обмена данными через общие области памяти.

2. Классификация методов распределения памяти
Рис. 1 Классификация методов распределения памяти
3. Управление реальной памятью
3.1 Распределение памяти фиксированными разделами
Простейший способ управления оперативной памятью состоит в том, что память разбивается на несколько областей фиксированной величины, называемых разделами. Такое разбиение может быть выполнено вручную оператором во время старта системы или во время ее установки. После этого границы разделов не изменяются.
Очередной новый процесс, поступивший на выполнение, помещается либо в общую очередь (рис. 1.1, а), либо в очередь к некоторому разделу (рис. 1.1, б).
Рис. 1.1. Распределение памяти фиксированными разделами:
с общей очередью (а), с отдельными очередями (б)
Подсистема управления памятью в этом случае выполняет следующие задачи:
§ Сравнивает объем памяти, требуемый для вновь поступившего процесса, с размерами свободных разделов и выбирает подходящий раздел;
§ Осуществляет загрузку программы в один из разделов и настройку адресов. Уже на этапе трансляции разработчик программы может задать раздел, в котором ее следует выполнять. Это позволяет сразу, без использования перемещающего загрузчика, получить машинный код, настроенный на конкретную область памяти.

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

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

3.2 Распределение памяти динамическими разделами

В этом случае память машины не делится заранее на разделы. Сначала вся память, отводимая для приложений, свободна. Каждому вновь поступающему на выполнение приложению на этапе создания процесса выделяется вся необходимая ему память (если достаточный объем памяти отсутствует, то приложение не принимается на выполнение и процесс для него не создается). После завершения процесса память освобождается, и на это место может быть загружен другой процесс. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. На рис. 2.1 показано состояние памяти в различные моменты времени при использовании динамического распределения. Так, в момент t0 в памяти находится только ОС, а к моменту t1 память разделена между 5 процессами, причем процесс П4, завершаясь, покидает память. На освободившееся от процесса П4 место загружается процесс П6, поступивший в момент t3.

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

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

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

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

Распределение памяти динамическими разделами лежит в основе подсистем управления памятью многих мультипрограммных операционных системах 60-70-х годов, в частности такой популярной операционной системы, как OS/360.
3.3 Перемещаемые разделы

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

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

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

4. Управление виртуальной памятью

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

4.1 Страничный способ распределения виртуальной памяти

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

Преимущества: устранение фрагментации памяти, т.е. страницы одинакового размера.
Недостатки: программа разбивается на страницы случайно, без учета логической связи, это приводит к потерям времени на межстраничные переходы.
В ОС Windows память может быть увеличена до 4 Гб, а размер страниц до 4 Кб.
4.2 Сегментный способ распределения виртуальной памяти

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

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

MS-DOS - это ОС, работающая в реальном режиме процессора i86, что предполагает использование адресного пространства размером всего лишь 1 Мб. На самом деле, в компьютерах IBM гарантируется наличие лишь 640 Кб основной памяти, старшие же адреса памяти заняты под BIOS и видеопамять, хотя среди них попадаются разрозненные куски оперативной памяти, называемые UMB (верхний блок памяти).

Адрес в реальном режиме записывается в формате [сегмент: смещение], однако здесь сегмент - это не селектор, адресующий строку таблицы сегментов, а просто номер параграфа памяти (1 параграф = 16 байт). Поэтому можно считать, что в MS-DOS используются только физические адреса.

В принципе, программы, работающие в MS-DOS, могут получить доступ к памяти за пределами 1 Мб, но для этого требуется специальный драйвер расширенной памяти.

Поскольку делить имеющуюся память между несколькими процессами не приходится, распределение получается бесхитростное.

Рис. 4 Основные области памяти ОС MS-DOS

Нижнюю часть памяти занимают модули ОС: обработчики прерываний, резидентная часть интерпретатора команд, драйверы устройств. Некоторые системные программы могут быть ради экономии загружены в верхний блок памяти (выше 640 Кб). Все, что остается в середине, может быть предоставлено процессу пользователя.

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

Часть системной памяти и вся область пользователя разбита на прилегающие друг к другу блоки, размер которых кратен параграфу. Перед началом каждого блока памяти размещается блок управления памятью (MCB, Memory Control Block), который занимает один параграф и содержит следующие данные:

· признак, определяющий, последний ли это блок памяти или за ним будут еще блоки (соответственно буква `Z" или `M");

· адрес PSP программы, владеющей этим блоком (0 означает свободный блок);

· размер блока в параграфах;

· имя программы-владельца (до 8 символов); это поле избыточно (зная PSP программы, можно найти имя ее файла), оно было добавлено, вероятно, чтобы хоть как-то занять пустующие байты параграфа MCB.

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

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

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

Почему блок среды выделяется раньше, чем блок PSP?

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

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

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

· Освобождение ранее выделенного блока.

· Изменение размера блока. Уменьшение блока возможно всегда, увеличение - только в том случае, если после данного блока расположен свободный блок достаточного размера.

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

Заключение
Проанализировав общие принципы управления памятью, видно, что в простейших системах нет свопинга или страничной организации памяти. Программа, загруженная в память, остается там до своего завершения. Некоторые ОС не позволяют находиться в памяти более чем одному процессу, в то время как другие поддерживают многозадачность.
Список литературы
1. Олифер В. Г. Сетевые операционные системы: учебник для вузов/ В.Г. Олифер, Н.А. Олифер. - СПб.: Питер, 2009. - 539 с.: ил
2. Попов И.И. Операционные системы, среды и оболочки/ И.И. Попов. - М.: Издательство "ФОРУМ: ИНФА-М", 2010. - 400 с. - (Серия "Профессиональное образование")
Размещено на Allbest.ru

Подобные документы

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

    лекция , добавлен 24.01.2014

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

    презентация , добавлен 27.12.2010

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

    курсовая работа , добавлен 01.07.2011

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

    курсовая работа , добавлен 02.12.2009

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

    презентация , добавлен 14.11.2012

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

    контрольная работа , добавлен 23.12.2016

    Распределение памяти фиксированными и динамическими, а также перемещаемыми разделами, особенности данного процесса в Windows. Функция VirtualAlloc: переданная и зарезервированная память. Выделение памяти функцией malloc, методика и анализ результатов.

    контрольная работа , добавлен 01.12.2013

    Сравнительный анализ статической и динамической памяти. Быстродействие и потребление энергии статической памятью. Объем памяти микросхем. Временные диаграммы чтения и записи памяти. Микросхемы синхронной и асинхронной памяти. Режимы модулей памяти.

    презентация , добавлен 27.08.2013

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

    курсовая работа , добавлен 31.05.2013

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

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

· отслеживание свободной и занятой памяти,

· выделение памяти процессам и освобождение памяти при завершении процессов,

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

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

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

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

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

Типы адресов

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

· Символьные имена присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.

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

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

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

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

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

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

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

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

Существуют два принципиально отличающихся подхода к преобразованию виртуальных адресов в физические.

Рис. 2.7. Типы адресов

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

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

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

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




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

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

2.1. Распределение памяти фиксированными разделами

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

Подсистема управления памятью в этом случае выполняет следующие задачи :

· сравнивая размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел,



осуществляет загрузку программы и настройку адресов.

Рис. 2.9. Распределение памяти фиксированными разделами:
а - с общей очередью; б - с отдельными очередями

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

2.2. Распределение памяти разделами переменной величины

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

На рисунке 2.10 показано состояние памяти в различные моменты времени при использовании динамического распределения. Так в момент t 0 в памяти находится только ОС, а к моменту t 1 память разделена между 5 задачами, причем задача П4, завершаясь, покидает память. На освободившееся после задачи П4 место загружается задача П6, поступившая в момент t 3 .

Задачами операционной системы при реализации данного метода управления памятью являются:

· ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти,

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

· после завершения задачи корректировка таблиц свободных и занятых областей.

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



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

Рис. 2.10. Распределение памяти динамическими разделами

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

2.3. Перемещаемые разделы



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

Рис. 2.11. Распределение памяти перемещаемыми разделами

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

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

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

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

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

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

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

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

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

Типы адресов

Алгоритмы распределения памяти

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

Распределение памяти динамическими разделами

Перемещаемые разделы

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

Страничное распределение

Сегментное распределение

Сегментно-страничное распределение

Разделяемые сегменты памяти

Кэширование данных

Иерархия запоминающих устройств

Кэш-память

Принцип действия кэш-памяти

Проблема согласования данных

Способы отображения основной памяти на кэш

Схемы выполнения запросов в системах с кэш-памятью

Выводы

Задачи и упражнения

Функции ос по управлению памятью

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

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

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

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

отслеживание свободной и занятой памяти;

выделение памяти процессам и освобождение памяти по завершении процессов;

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

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

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

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

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

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


Технология

Описание

Сильные стороны

Слабые стороны

Фиксированное распределение

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

Простота реализации, малые системные накладные расходы.

Неэффективное использование памяти из-за внутренней фрагментации, фиксированное максимальное количество активных процессов

Динамическое распределение

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

Отсутствует внутренняя фрагментация, более эффективное использование основной памяти

Неэффективное использование процессора из-за необходимости уплотнения для противодействия внешней фрагментации

Простая страничная организация

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

Отсутствует внешняя фрагментация

Наличие небольшой внутренней фрагментации

Простая сегментация

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

Отсутствует внутренняя фрагментация

Улучшенное использование памяти и сниженные накладные расходы по сравнению с динамическим распределением

Страничная организация виртуальной памяти

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

Нет внешней фрагментации; более высокая степень многозадачности; большое виртуальное адресное пространство

Сегментация виртуальной памяти

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

Нет внутренней фрагментации; более высокая степень многозадачности; большое виртуальное адресное пространство; поддержка защиты и совместного использования

Накладные расходы из-за сложности системы управления памятью

Фиксированное распределение

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

Размеры разделов

На рис. 7.2 показаны два примера фиксированного распределения. Одна возможность состоит в использовании разделов одинакового размера. В этом случае любой процесс, размер которого не превышает размер раздела, может быть загружен в любой доступный раздел. Если все разделы заняты и нет ни одного процесса в состоянии готовности или работы, операционная система может выгрузить процесс из любого раздела и загрузить другой процесс, обеспечивая тем самым процессор работой.
При использовании разделов с одинаковым размером имеются две трудности.
Программа может быть слишком велика для размещения в разделе. В этом случае программист должен разрабатывать программу, использующую оверлеи, с тем чтобы в любой момент времени ей требовался только один раздел основной памяти. Когда требуется модуль, который в настоящий момент отсутствует в основной памяти, пользовательская программа должна сама загрузить этот модуль в раздел памяти программы (независимо от того, является ли этот модуль кодом или данными).
Использование основной памяти при этом крайне неэффективно. Любая программа, независимо от ее размера, занимает раздел целиком. Так, в нашем примере программа размером менее мегабайта все равно будет занимать целиком раздел в 8 Мбайт; при этом остаются неиспользованными 7 Мбайт блока. Этот феномен появления неиспользованной памяти из-за того, что загружаемый блок по размеру меньше раздела, называется внутренней фрагментацией (internal fragmentation).
Бороться с этими трудностями (хотя и не устранить полностью) можно посредством использования разделов разных размеров (см. рис. 7.2,б). В этом случае программа размером 16 Мбайт может обойтись без оверлеев, а разделы малого размера позволяют уменьшить внутреннюю фрагментацию при загрузке программ малого размера.

Алгоритм размещения

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


Хотя этот метод представляется оптимальным с точки зрения отдельного раздела, он не оптимален с точки зрения системы в целом. Представим, что в системе, изображенной на рис. 7.2,6, в некоторый момент времени нет ни одного процесса размером от 12 до 16 Мбайт. В результате раздел размером 16 Мбайт будет пустовать, в то время как он мог бы с успехом использоваться меньшими процессами. Таким образом, более предпочтительным подходом является использование одной очереди для всех, процессов (см. рис. 7.3,б). В момент, когда требуется загрузить процесс в основную память, для этого выбирается наименьший доступный раздел, способный вместить данный процесс. Если все разделы заняты, следует принять решение об освобождении одного из них. По-видимому, следует отдать предпочтение процессу, занимающему наименьший раздел, способный вместить загружаемый процесс. Можно учесть и другие факторы, такие, как приоритет процесса или его состояние (заблокирован он или активен).
Использование разделов разного размера по сравнению с использованием разделов одинакового размера придает дополнительную гибкость данному методу. Кроме того, схемы с фиксированными разделами относительно просты, предъявляют минимальные требования к операционной системе; накладные расходы работы процессора невелики. Однако у этих схем имеются серьезные недостатки.
Количество разделов, определенное в момент генерации системы, ограничивает количество активных (не приостановленных) процессов.
Поскольку размеры разделов устанавливаются заранее, в момент генерации системы, небольшие процессы приводит к неэффективному использованию памяти. В средах, где заранее известны потребности в памяти всех задач, применение описанной схемы может быть оправдано, но в большинстве случаев эффективность этой технологии крайне низка.
Фиксированное распределение в настоящее время практически не используется. Примером успешной операционной системы с использованием данной технологии может служить ранняя операционная система IBM для мейнфреймов OS/MFT (многозадачная с фиксированным количеством задач- Multiprogramming with a Fixed number of Tasks).

Динамическое распределение

Для преодоления сложностей, связанных с фиксированным распределением, был разработан альтернативный подход, известный как динамическое распределение. Этот подход в настоящее время также вытеснен более сложными и эффективными технологиями управления памятью. В свое время динамическое распределение использовала операционная система IBM для мейнфреймов OS/MVT (многозадачная с переменным количеством задач - Multiprogramming with a Variable number of Tasks).
При динамическом распределении образуется переменное количество разделов переменной длины. При размещении процесса в основной памяти для него выделяется строго необходимое количество памяти, и не более. В качестве примера рассмотрим использование 6.4 Мбайт основной памяти (рис. 7.4). Изначально вся память пуста, за исключением области, используемой операционной системой (рис. 7.4,а). Первые три процесса загружаются в память, начиная с адреса, которым заканчивается операционная система, и используя ровно столько памяти, сколько требуется данному процессу (рис. 7.4,б-г). После этого в конце основной памяти остается "дыра", слишком малая для размещения четвертого процесса. В некоторый момент все процессы в памяти оказываются неактивными, и операционная система выгружает второй процесс (рис. 7.4,д), после которого остается достаточно памяти для загрузки нового, четвертого процесса (рис. 7.4,е). Поскольку процесс 4 меньше процесса 2, создается еще одна небольшая "дыра" в памяти. После того как в некоторый момент времени все процессы в памяти оказываются неактивными, но зато готов к работе процесс 2, свободного места в памяти для него не находится, и операционная система вынуждена выгрузить процесс 1, чтобы освободить необходимое место (рис. 7.4,ж) и разместить процесс 2 в основной памяти (рис. 7.4,з).

Как показывает данный пример, этот метод хорошо начинает работу, но плохо продолжает - в конечном счете он приводит к наличию множества мелких дыр в памяти. Со временем память становится все более и более фрагментированной, и снижается эффективность ее использования. Это явление называется внешней фрагментацией (external fragmentation), что отражает тот факт, что сильно фрагментированной становится память, внешняя по отношению ко всем разделам (в отличие от рассмотренной ранее внутренней фрагментации).
Один из методов преодоления этого явления сострит в уплотнении (compaction): время от времени операционная система перемещает процессы в памяти так, чтобы они занимали смежные области памяти; свободная память при этом собирается в один блок. Например, на рис. 7.4,з после уплотнения памяти мы получим блок свободной памяти размером 16 Мбайт, чего может оказаться вполне достаточно для загрузки нового процесса. Сложность применения уплотнения состоит в том, что при этом расходуется дополнительное время; кроме того, уплотнение требует динамического перемещения процессов в памяти, т.е. должна быть обеспечена возможность перемещения программы из одной области основной памяти в другую без потери корректности ее обращений к памяти (см. приложение к данной главе).

Алгоритм размещения

Поскольку уплотнение памяти вызывает дополнительные расходы времени процессора, разработчик операционной системы должен принять разумное решение о том, каким образом размещать процессы в памяти (образно говоря, каким образом затыкать дыры). Когда наступает момент загрузки процесса восновную память и имеется несколько блоков свободной памяти достаточного размера, операционная система должна принять решение о том, какой именно свободный блок использовать.
Можно рассматривать три основных алгоритма - наилучший подходящий, первый подходящий, следующий подходящий. Все они, само собой разумеется, ограничены выбором среди свободных блоков размера, достаточно большого для размещения процесса. Метод наилучшего подходящего выбирает блок, размер которого наиболее близок к требуемому; метод первого подходящего проверяет все свободные блоки с начала памяти и выбирает первый достаточный по размеру для размещения процесса. Метод следующего подходящего работает так же, как и метод первого подходящего, однако начинает проверку с того места, где был выделен блок в последний раз (по достижении конца памяти он продолжает работу с ее начала).
На рис. 7.5,а показан пример конфигурации памяти после ряда размещений и выгрузки процессов из памяти. Последним использованным блоком был Мок размером 22 Мбайт, в котором был создан раздел в 14 Мбайт. На рис. 7,5,6 показано различие в технологии наилучшего, первого и следующего подходящего при выполнении запроса на выделение блока размером 16 Мбайт. Метод наилучшего подходящего просматривает все свободные блоки и выбирает наиболее близкий по размеру блок в 18 Мбайт, оставляя фрагмент размером 2 Мбайт. Метод первого подходящего в данной ситуации оставляет фрагмент свободной памяти размером б Мбайт, а метод следующего подходящего - 20 Мбайт.

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

Алгоритм замещения

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

Система двойников

Как фиксированное, так и динамическое распределение памяти имеют свои недостатки. Фиксированное распределение ограничивает количество активных процессов и неэффективно использует память при несоответствии между размерами разделов и процессов. Динамическое распределение реализуется более сложно и включает накладные расходы по уплотнению памяти. Интересным компромиссом в этом плане является система двойников (, [РБТЕ77]).
В системе двойников память распределяется блоками размером 2,к < К < U ,
где
21 - минимальный размер выделяемого блока памяти;
- наибольший распределяемый блок; вообще говоря, представляет собой размер всей доступной для распределения памяти.
Вначале все доступное для распределения пространство рассматривается как единый блок размера 2u. При запросе размером s, таким, что 2 u- l< s <2и, выделяется весь блок. В противном случае блок разделяется на два эквивалентных двойника с размерами 2u-1. Если 2 U-2 < s<2 u- l, то по запросу выделяется один из двух двойников; в противном случае один из двойников вновь делится пополам. Этот процесс продолжается до тех пору пока не будет сгенерирован наименьший блок, размер которого не меньше 8. Система двойников постоянно ведет список "дыр" (доступных блоков) для каждого размера 2l. Дыра может быть удалена из списка (i+1) разделением ее пополам и внесением двух новых дыр размера 2l в список i. Когда пара двойников в списке i оказывается освобожденной, они удаляются из списка и объединяются в единый блок в списке (i+1). Ниже приведен рекурсивный алгоритм () для удовлетворения запроса размера 2i-l void get_hole(int i)
{
if (i = = (U+1))
< Ошибка >;
if (< Список 1 пуст >)
{
get_hоle(i+l);
< Разделить дыру на двойники >;
< Поместить двойники в список i >;
}
< Взять первую дыру из списка i >;
}
На рис. 7.6 приведен пример использования блока с начальным размером 1 Мбайт. Первый запрос А - на 100 Кбайт (для него требуется блок размером 128 Кбайт); Для этого начальный блок делится на два двойника по 512 Кбайт. Первый из них делится на двойники размером 256 Кбайт, и, в свою очередь, первый из получившихся при этом разделении двойников также делится пополам. Один из получившихся двойников размером 128 Кбайт выделяется запросу А. Следующий запрос В требует 256 Кбайт. Такой блок имеется в наличии и выделяется. Процесс продолжается с разделением и слиянием двойников при необходимости. Обратите внимание, что после освобождения блока Е происходит слияние двойников по 128 Кбайт в один блок размером 256 Кбайт, который, в свою очередь, тут же сливается со своим двойником.


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



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

Перемещение

Перед тем как мы рассмотрим способы, с помощью которых можно избежать недостатков распределения, следует до конца разобраться в вопросах, связанных с размещением процессов в памяти. При использовании фиксированной схемы распределения, показанной на рис. 7.3,а, можно ожидать, что процесс всегда будет назначаться одному и тому же разделу памяти. Это означает, что какой бы раздел ни был выбран для нового процесса, для размещения этого процесса после выгрузки и последующей загрузки в память всегда будет использоваться именно этот раздел. В данном случае можно использовать простейший загрузчик, описанный в приложении к данной главе: при загрузке процесса все относительные ссылки в коде замещаются абсолютными адресами памяти, определенными на основе базового адреса загруженного процесса.
Если размеры разделов равны (рис. 7.2) и существует единая очередь процессов для разделов разного размера (рис. 7.3,б), процесс по ходу работы может занимать разные разделы. При первом создании образа процесса он загружается в некоторый раздел памяти; позже, после того как он был выгружен из памяти и вновь загружен, процесс может оказаться в другом разделе (не в том, в котором он размещался в последний раз). Та же ситуация возможна и при динамическом распределении. Так, на рис. 7.4,в и 3процесс 2 занимает при размещении в памяти различные места. Кроме того, при выполнении уплотнения процессы также перемещаются в основной памяти. Таким образом, расположение команд и данных, к которым обращается процесс, не является фиксированным и изменяется всякий раз при выгрузке и загрузке (или перемещении) процесса. Для решения этой проблемы следует различать типы адресов. Логический адрес представляет собой ссылку на ячейку памяти, не зависящую от текущего расположения данных в памяти; перед тем как получить доступ к этой ячейке памяти, необходимо транслировать логический адрес в физический. Относительный адрес представляет собой частный случай логического адреса, когда адрес определяется положением относительно некоторой известной точки (обычно - начала программы). Физический адрес (известный также как абсолютный) представляет собой действительное расположение интересующей нас ячейки основной памяти.
Если программа использует относительные адреса, это означает, что все ссылки на память в загружаемом процессе даны относительно начала этой программы. Таким образом, для корректной работы программы требуется аппаратный механизм, который бы транслировал относительные адреса в физические в процессе выполнения команды, которая обращается к памяти.
На рис. 7.8 показан обычно используемый способ трансляции адреса. Когда процесс переходит в состояние выполнения, в специальный регистр процессора, иногда называемый базовым, загружается начальный адрес процесса в основной памяти. Кроме того, используется "граничный" (bounds) регистр, в котором содержится адрес последней ячейки памяти программы. Эти значения заносятся в регистры при загрузке программы в основную память. При выполнении процесса встречающиеся в командах относительные адреса обрабатываются процессором в два этапа. Сначала к относительному адресу прибавляется значение базового регистра для получения абсолютного адреса. Затем полученный абсолютный адрес сравнивается со значением в граничном регистре. Если полученный абсолютный адрес принадлежит данному процессу, команда может быть выполнена; в противном случае генерируется соответствующее данной ошибке прерывание операционной системы.
Схема, представленная на рис. 7.8, обеспечивает возможность выгрузки и загрузки программ в основную память в процессе их выполнения; кроме того, образ каждого процесса ограничен адресами, содержащимися в базовом и граничном регистрах, и защищен от нежелательного доступа со стороны других процессов.

Понравилась статья? Поделитесь ей