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

  • docx
  • 14.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-01329.docx

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

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

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


 

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

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

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

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

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

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

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

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

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


 

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

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

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

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

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

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

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

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

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

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


 

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

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

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

Развитие методов организации вычислительного процесса в этом направлении привело к появлению метода, известного под названием

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

Таким образом, виртуальная память – это совокупность программ- но-аппаратных средств, позволяющих пользователям писать програм- мы, размер которых превосходит имеющуюся оперативную память; для этого виртуальная память решает следующие задачи:

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

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

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


 

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

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

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

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

Размер страницы обычно выбирается равным степени двойки: 512, 1024 и т.д., это позволяет упростить механизм преобразования адресов.

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

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

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


 

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

·      дольше всего не использовавшаяся страница,

·      первая попавшаяся страница,

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

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

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

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

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

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


 

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

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

Виртуальный адрес при сегментной организации памяти может быть представлен парой (g, s), где g – номер сегмента, а s – смещение в сег- менте. Физический адрес получается путем сложения начального физи- ческого адреса сегмента, найденного в таблице сегментов по номеру g, и смещения s.

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

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

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