Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kt.doc
Скачиваний:
9
Добавлен:
26.09.2019
Размер:
590.34 Кб
Скачать

32. Организация памяти

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

Непрерывная организация. В этом случае фактически вся память разделена на три области: память, занимаемая ОС, память, занимаемая программой, свободная память. ОС может находиться в нижней части памяти, начиная с нулевых адресов ОЗУ. Эта модель ранее применялась на майнфреймах и мини-компьютерах, в настоящее время малоупотребима. ОС может располагаться в верхних адресах памяти, в ПЗУ. Этот вариант используется в некоторых карманных компьютерах и встроенных системам. Третий вариант – драйверы устройств находятся вверху, в ПЗУ, а остальная часть ОС в ОЗУ. Этот вариант устанавливался на ранних моделях ПК, например, MS-DOS. В случае непрерывной организации в каждый конкретный момент времени может работать только один процесс. Как только с терминала вводится команда. ОС копирует заданную программу с диска в память, запускает ее. После окончания ждет новой команды. Новая программа в памяти грузится поверх старой.

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

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]