Методы распределения памяти без использования внешней памяти § Схема с фиксированными разделами. Самым простым способом управления оперативной памятью является разделение ее на несколько разделов фиксированной величины. Это может быть выполнено вручную оператором во время старта системы или во время ее генерации. Очередная задача, поступившая на выполнение, помещается либо в общую очередь (рис. 20,а), либо в очередь к некоторому разделу (рис 20,б).  Рис 20. Схема с фиксированными разделами: (a) с общей очередью процессов, (b) с отдельными очередями процессов. Подсистема управления памятью в этом случае выполняет следующие задачи: · сравнивает размер программы, поступившей на выполнение, и свободных разделов, выбирает подходящий раздел, · осуществляет загрузку программы и настройку адресов. Эта схема была реализована в IBM OS/360 (MFT) и в DEC RSX-11. Подсистема управления памятью сравнивает размер программы, поступившей на выполнение, выбирает подходящий раздел, осуществляет загрузку программы и настройку адресов. В какой раздел помещать программу? Распространены две стратегии: · Стратегия первого подходящего (First fit). Задание помещается в первый подходящий по размеру раздел. · Стратегия наиболее подходящего (Best fit). Задание помещается в тот раздел, где ему наиболее тесно. · Стратегия наименее подходящего (Worst fit). При помещении в самый большой раздел в нем остается достаточно места для возможного размещения еще одного процесса. Моделирование показало, что с точки зрения использования памяти эти способы примерно одинаковы, но первый способ быстрее. Заметим, что перечисленные стратегии широко применяются и другими компонентами ОС, например, для размещения файлов на диске. Связывание (настройка) адресов для данной схемы возможны как на этапе компиляции, так и на этапе загрузки. Недостатки этой схемы: · число одновременно выполняемых процессов ограничено числом разделов, · предлагаемая схема сильно страдает от внешней фрагментации потери памяти, не используемой ни одним процессом. Фрагментация - это наличие большого числа несмежных участков свободной памяти очень маленького размера (фрагментов). Настолько маленького, что ни одна из вновь поступающих программ не может поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить значительную величину, намного превышающую требуемый объем памяти. Фрагментация возникает потому, что процесс не полностью занимает выделенный ему раздел или вследствие не использования некоторых разделов, которые слишком малы для выполняемых пользовательских программ. § Оверлейная структура Так как размер логического адресного пространства процесса может быть больше чем размер выделенного ему раздела (или больше чем размер самого большого раздела), иногда используется техника, называемая оверлей (overlay) или организация структуры с перекрытием (рис. 21). Основная идея ¾ держать в памяти только те инструкции программы, которые нужны в данный момент времени. Потребность в таком способе загрузки появляется, если логическое адресное пространство системы мало, например 1 мегабайт (MS-DOS) или даже всего 64 килобайта (PDP-11), а программа относительно велика.  Рис. 21. Организация структуры с перекрытием. Можно поочередно загружать в память ветви A-B, A-C-D и A-C-E программы. Коды ветвей оверлейной структуры программы находятся на диске как абсолютные образы памяти и считываются драйвером оверлеев при необходимости. Для конструирования оверлеев необходимы специальные алгоритмы перемещения и связывания. Для описания оверлейной структуры обычно используется специальный несложный язык (overlay description language). Совокупность файлов исполняемой программы дополняется файлом (обычно с расширением .odl), описывающим дерево вызовов внутри программы Например, для примера, приведенного на рисунке 21, текст этого файла может выглядеть так: A-(B,C) C-(D,E) Привязка к памяти происходит в момент очередной загрузки одной из ветвей программы. Оверлеи не требуют специальной поддержки со стороны ОС. Они могут быть полностью реализованы на пользовательском уровне с простой файловой структурой. Заметим, что здесь впервые проявляется свойство локальности, которое дает возможность хранить в памяти только ту информацию, которая необходима в каждый конкретный момент вычислений. На современных системах (32-разрядных, 64-разрядных), где виртуальное адресное пространство измеряется гигабайтами, проблемы с нехваткой памяти решаются другими способами (виртуальная память). § Схема с переменными разделами Более эффективной представляется схема с переменными (динамическими) разделами. В этом случае память машины не делится заранее на разделы. Сначала вся память свободна. Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача. Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера. Смежные свободные участки могут быть объединены в один. На рисунке 22 показано состояние памяти в различные моменты времени при использовании динамического распределения. Так в момент в памяти находится только ОС, а к моменту память разделена между 5 задачами, причем задача П4, завершаясь, покидает память. На освободившееся после задачи П4 место загружается задача П6, поступившая в момент .  Рис. 22. Распределение памяти динамическими разделами Задачами операционной системы при реализации данного метода управления памятью является: · ведение таблиц свободных и занятых областей, в которых указываются начальные адреса и размеры участков памяти, · при поступлении новой задачи - анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи в соответствии с одной из стратегий (first fit, best fit, worst fit) · загрузка задачи в выделенный ей раздел и корректировка таблиц свободных и занятых областей, · после завершения задачи корректировка таблиц свободных и занятых областей. Этому методу также присуща внешняя фрагментация вследствие наличия большого числа участков свободной памяти. Проблемы фрагментации могут быть различными. В худшем случае мы можем иметь участок свободной (потерянной) памяти между двумя процессами. Если все эти куски объединить в один блок, мы смогли бы разместить больше процессов. Выбор между first-fit и best-fit слабо влияет на величину фрагментации. В зависимости от суммарного размера памяти и среднего размера процесса эта проблема может быть большей или меньшей. Статистический анализ показывает, что при наличии n блоков пропадает n/2 блоков, то есть 1/3 памяти! Это известное 50% правило (два соседних свободных участка в отличие от двух соседних процессов могут быть объединены в один). Одно из решений проблемы внешней фрагментации - разрешить адресному пространству процесса не быть непрерывным, что разрешает выделять процессу память в любых доступных местах. Один из способов реализации такого решения - это paging , используемый во многих современных ОС (будет рассмотрен ниже). § Схема с перемещаемыми разделами Другим способом борьбы с внешней фрагментацией является сжатие (рис. 23)., то есть перемещение всех занятых (свободных) участков в сторону возрастания (убывания) адресов, так, чтобы вся свободная память образовала единую непрерывную область. В дополнение к функциям, которые выполняет ОС при распределении памяти переменными разделами, в данном случае она должна еще время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей. Этот метод иногда называют схемой с перемещаемыми разделами. В идеале фрагментация после сжатия должна отсутствовать. Сжатие может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором - реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы в физическую должно выполняться динамическим способом. В идеале фрагментация после сжатия должна отсутствовать.  Рис. 23. Распределение памяти перемещаемвми разделами Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, а алгоритм выбора оптимальной стратегии сжатия очень трудоемкий, что часто перевешивает преимущества данного метода. Виртуальная память Уже давно существует проблема размещения в памяти программ, размер которых превышает размер доступной памяти (один из вариантов ее решения –организация структур с перекрытием рассмотрен в 6.3.1) При этом предполагалось активное участие программиста в процессе сегментации и загрузки программы. Было предложено переложить проблему на компьютер. Развитие архитектуры компьютеров привело к значительному усложнению организации памяти, соответственно, усложнились и расширились задачи операционной системы по управлению памятью. Одним из главных усовершенствований архитектуры стало появление виртуальной памяти (virtual memory). Она впервые была реализована в 1959 г. на компьютере Атлас, разработанном в Манчестерском университете, и стала популярной только спустя десятилетие. Определение: виртуальным называется ресурс, который пользователю или пользовательской программе представляется обладающим свойствами, которыми он в действительности не обладает. Так, например, пользователю может быть предоставлена виртуальная оперативная память, размер которой превосходит всю имеющуюся в системе реальную оперативную память. Пользователь пишет программы так, как будто в его распоряжении имеется однородная оперативная память большого объема, но в действительности все данные, используемые программой, хранятся на одном или нескольких разнородных запоминающих устройствах, обычно на дисках, и при необходимости частями отображаются в реальную память. Определение: виртуальная память ¾ это совокупность программно-аппаратных средств, позволяющих пользователям писать программы, размер которых превосходит имеющуюся оперативную память; для этого виртуальная память решает следующие задачи: · размещает данные в запоминающих устройствах разного типа, например, часть программы в оперативной памяти, а часть на диске; · перемещает по мере необходимости данные между запоминающими устройствами разного типа, например, подгружает нужную часть программы с диска в оперативную память; · преобразует виртуальные адреса в физические. Все эти действия выполняются автоматически, без участия программиста, то есть механизм виртуальной памяти является прозрачным по отношению к пользователю. Таким образом, при помощи виртуальной памяти обычно решают двезадачи: Во-первых,виртуальная память позволяет адресовать пространство, гораздо большее, чем емкость физической памяти конкретной вычислительной машины. В соответствии с принципом локальности для реальных программ обычно нет необходимости в помещении их в физическую память целиком. Возможность выполнения программы, находящейся в памяти лишь частично имеет ряд вполне очевидных преимуществ: · Программа не ограничена величиной физической памяти. Упрощается разработка программ, поскольку можно задействовать большие виртуальные пространства, не заботясь о размере используемой памяти. · Поскольку появляется возможность частичного помещения программы (процесса) в память и гибкого перераспределения памяти между программами, можно разместить в памяти больше программ, что увеличивает загрузку процессора и пропускную способность системы. · Объем ввода-вывода для выгрузки части программы на диск может быть меньше, чем в варианте классического свопинга, в итоге, каждая программа будет работать быстрее. Во-вторых,обеспечение контроля доступа к отдельным сегментам памяти и в частности защиту пользовательских программ друг от друга и защиту ОС от пользовательских программ - обеспечение защиты. Хотя известны и чисто программные реализации виртуальной памяти, это направление получило наиболее широкое развитие после получения соответствующей аппаратной поддержки. Идея аппаратной части механизма виртуальной памяти состоит в том, что адрес памяти, вырабатываемый командой, интерпретируется аппаратурой не как реальный адрес некоторого элемента основной памяти, а как некоторая структура, где адрес является лишь одним из компонентов наряду с атрибутами, характеризующими способ обращения по данному адресу. |