Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 22
Текст из файла (страница 22)
При этом возможны ситуации, когда из-засильной фрагментации памяти диспетчер задач не сможет образовать новый раздел, хотя суммарный объем свободных областей будет больше, чем необходимо Iдля задачи. В этой ситуации можно организовать так называемое уплотнение памяти. Для уплотнения памяти все вычисления приостанавливаются, и диспетчерпамяти корректирует свои списки, перемещая разделы в начало памяти (или, наоборот, в область старших адресов).
При определении физических адресов задачибудут участвовать новые значения базовых регистров, с помощью которых и осуществляется преобразование виртуальных адресов в физические. Недостаткомэтого решения является потеря времени на уплотнение и, что самое главное, невозможность при этом выполнять сами вычислительные процессы.Данный способ распределения памяти, тем не менее, применялся достаточно длительное время в нескольких операционных системах, поскольку в нем для задачвыделяется непрерывное адресное пространство, а это упрощает создание системпрограммирования и их работу.
Применяется этот способ и ныне при созданиисистем на базе контроллеров с упрощенной (по отношению к мощным современным процессорам) архитектурой. Например, при разработке операционной системы для современных цифровых АТС, которая использует 16-разрядные микропроцессоры Intel.Сегментная, страничнаяи сегментно-страничная организация памятиМетоды распределения памяти, при которых задаче уже может не предоставляться сплошная (непрерывная) область памяти, называют разрывными.
Идея выделять память задаче не одной сплошной областью, а фрагментами позволяет уменьшить фрагментацию памяти, однако этот подход требует для своей реализациибольше ресурсов, он намного сложнее. Если задать адрес начала текущего фрагмента программы и величину смещения относительно этого начального адреса, томожно указать необходимую нам переменную или команду. Таким образом, виртуальный адрес можно представить состоящим из двух полей. Первое поле будетуказывать на ту часть программы, к которой обращается процессор, для определения местоположения этой части в памяти, а второе поле виртуального адреса позволит найти нужную нам ячейку относительно найденного адреса. Программистможет либо самостоятельно разбивать программу на фрагменты, либо можно автоматизировать эту задачу, возложив ее на систему программирования...
, 1 i in „•. 1 ,..гш.т 1 ...~-« MiiriHHirriiii •"•'•"-' —Сегментная, страничная и сегментно-страничная организация памяти87Сегментный способ организациивиртуальной памятиПервым среди разрывных методов распределения памяти был сегментный. Дляэтого метода программу необходимо разбивать на части и уже каждой такой частивыделять физическую память. Естественным способом разбиения программы начасти является разбиение ее на логические элементы — так называемые сегменты.В принципе, каждый программный модуль (или их совокупность, если мы тогопожелаем) может быть воспринят как отдельный сегмент, и вся программа тогдабудет представлять собой множество сегментов.
Каждый сегмент размещается в памяти как до определенной степени самостоятельная единица. Логически обращение к элементам программы в этом случае будет состоять из имени сегмента и смещения относительно начала этого сегмента. Физически имя (или порядковыйномер) сегмента будет соответствовать некоторому адресу, с которого этот сегментначинается при его размещении в памяти, и смещение должно прибавляться к этому базовому адресу.Преобразование имени сегмента в его порядковый номер осуществит система программирования. Для каждого сегмента система программирования указывает егообъем. Он должен быть известен операционной системе, чтобы она могла выделять ему необходимый объем памяти. Операционная система будет размещать сегменты в памяти и для каждого сегмента она должна вести учет о местонахожденииэтого сегмента.
Вся информация о текущем размещении сегментов задачи в памяти обычно сводится в таблицу сегментов, чаще такую таблицу называют таблицейдескрипторов сегментов задачи. Каждая задача имеет свою таблицу сегментов.Достаточно часто эти таблицы называют таблицами дескрипторов сегментов, поскольку по своей сути элемент таблицы описывает расположение сегмента.Таким образом, виртуальный адрес для этого способа будет состоять из двух полей — номера сегмента и смещения относительно начала сегмента. Соответствующая иллюстрация приведена на рис.
3.4 для случая обращения к ячейке, виртуальный адрес которой равен сегменту с номером 11 со смещением от начала этогосегмента, равным 612. Как мы видим, операционная система разместила данныйсегмент в памяти, начиная с ячейки с номером 19700.Итак, каждый сегмент, размещаемый в памяти, имеет соответствующую информационную структуру, часто называемую дескриптором сегмента. Именно операционная система строит для каждого исполняемого процесса соответствующую таблицу дескрипторов сегментов, и при размещении каждого из сегментов в оперативнойили внешней памяти отмечает в дескрипторе текущее местоположение сегмента.Если сегмент задачи в данный момент находится в оперативной памяти, то об этомДелается пометка в дескрипторе. Как правило, для этого используется бит присутствия Р (от слова «present»). В этом случае в поле адреса диспетчер памятизаписывает адрес физической памяти, с которого сегмент начинается, а в поле длины сегмента (limit) указывается количество адресуемых ячеек памяти.
Это полеиспользуется не только для того, чтобы размещать сегменты без наложения другна друга, но и для того, чтобы контролировать, не обращается ли код исполняющейся задачи за пределы текущего сегмента. В случае превышения длины сегмен-88Глава 3, Управление памятью в операционных системахта вследствие ошибок программирования мы можем говорить о нарушении адресации и с помощью введения специальных аппаратных средств генерировать сигналы прерывания, которые позволят фиксировать (обнаруживать) такого родаошибки.Регистр таблицы сегментов(таблицы дескрипторовсегментов)Виртуальный адрес11612S (Segment)D (Destination)31500+ иТаблица дескрипторов текущей заде31511РАдрес началасегмента119700/TZ/Длина,сегмента1300 --.ПравадоступаR-X"•\Рис.
3.4. Сегментный способ организации виртуальной памятиЕсли бит присутствия в дескрипторе указывает, что сегмент находится не в оперативной, а во внешней памяти (например, на жестком диске), то названные поляПигментная, страничная и сегментно-страничная организация памяти89адреса и длины используются для указания адреса сегмента в координатах внешней памяти. Помимо информации о местоположении сегмента, в дескрипторе сегмента, как правило, содержатся данные о его типе (сегмент кода или сегмент данных), правах доступа к этому сегменту (можно или нельзя его модифицировать,предоставлять другой задаче), отметка об обращениях к данному сегменту (информация о том, как часто или как давно этот сегмент используется или не используется, на основании которой можно принять решение о том, чтобы предоставить место, занимаемое текущим сегментом, другому сегменту).При передаче управления следующей задаче операционная система должна занести в соответствующий регистр адрес таблицы дескрипторов сегментов этой задачи.
Сама таблица дескрипторов сегментов, в свою очередь, также представляет собой сегмент данных, который обрабатывается диспетчером памяти операционнойсистемы.При таком подходе появляется возможность размещать в оперативной памяти невсе сегменты задачи, а только задействованные в данный момент. Благодаря этому, с одной стороны, общий объем виртуального адресного пространства задачиможет превосходить объем физической памяти компьютера, на котором эта задачабудет выполняться; с другой стороны, даже если потребности в памяти не превосходят имеющуюся физическую память, можно размещать в памяти больше задач,поскольку любой задаче, как правило, все ее сегменты единовременно не нужны.А увеличение коэффициента мультипрограммирования р., как мы знаем, позволяет увеличить загрузку системы и более эффективно использовать ресурсы вычислительной системы.
Очевидно, однако, что увеличивать количество задач можнотолько до определенного предела, ибо если в памяти не будет хватать места длячасто используемых сегментов, то производительность системы резко упадет. Ведьсегмент, находящийся вне оперативной памяти, для участия в вычислениях должен быть перемещен в оперативную память. При этом если в памяти есть свободное пространство, то необходимо всего лишь найти нужный сегмент во внешнейпамяти и загрузить его в оперативную память. А если свободного места нет, придется принять решение — на место какого из присутствующих сегментов будет загружаться требуемый. Перемещение сегментов из оперативной памяти на жесткий диск и обратно часто называют свопингом сегментов.Итак, если требуемого сегмента в оперативной памяти нет, то возникает прерывание, и управление передается через диспетчер памяти программе загрузки сегмента.
Пока происходит поиск сегмента во внешней памяти и загрузка его в оперативную, диспетчер памяти определяет подходящее для сегмента место. Возможно, чтосвободного места нет, и тогда принимается решение о выгрузке какого-нибудь сегмента и выполняется его перемещение во внешнюю память. Если при этом ещеостается время, то процессор передается другой готовой к выполнению задаче.После загрузки необходимого сегмента процессор вновь передается задаче, вызвавшей прерывание из-за отсутствия сегмента. Всякий раз при считывании сегмента в оперативную память в таблице дескрипторов сегментов необходимо установить адрес начала сегмента и признак присутствия сегмента.Припоиске свободного места используется одна из вышеперечисленных дисциплин работы диспетчера памяти (применяются правила «первого подходящего»90Глава 3. Управление памятью в операционных с и сте м ахи «самого неподходящего» фрагментов).
Если свободного фрагмента памяти достаточного объема нет, но, тем не менее, сумма этих свободных фрагментов превышает требования по памяти для нового сегмента, то в принципе может быть применено «уплотнение памяти», о котором мы уже говорили в подразделе «Разделыс фиксированными границами» раздела «Распределение памяти статическимии динамическими разделами».В идеальном случае размер сегмента должен быть достаточно малым, чтобы егоможно было разместить в случайно освобождающихся фрагментах оперативнойпамяти, но достаточно большим, чтобы содержать логически законченную частьпрограммы с тем, чтобы минимизировать межсегментные обращения.Для решения проблемы замещения (определения того сегмента, который долженбыть либо перемещен во внешнюю память, либо просто замещен новым) исполь1зуются следующие дисциплины :•правило FIFO (First In First Out — первый пришедший первым и выбывает);•правило LRU (Least Recently Used — дольше других неиспользуемый);Q правило LFU (Least Frequently Used — реже других используемый);•случайный (random) выбор сегмента.Первая и последняя дисциплины являются самыми простыми в реализации, ноони не учитывают, насколько часто используется тот или иной сегмент, и, следовательно, диспетчер памяти может выгрузить или расформировать тот сегмент, к которому в самом ближайшем будущем будет обращение.
Безусловно, достовернойинформация о том, какой из сегментов потребуется в ближайшем будущем, в общем случае быть не может, но вероятность ошибки для этих дисциплин многократно выше, чем у второй и третьей, в которых учитывается информация об использовании сегментов.В алгоритме FIFO с каждым сегментом связывается очередность его размещенияв памяти. Для замещения выбирается сегмент, первым попавший в память.