
- •4.1 Понятие памяти и функции ос по управлению памятью
- •4.2 Иерархия памяти
- •4.3 Связное и несвязное распределение памяти
- •4.3.1 Связное распределение памяти в однопрограммных системах
- •4.3.2 Организация мультипрораммного режима: распределение статическими разделами
- •4.3.3 Организация мультипрораммного режима: распределение переменными разделами
- •4.4 Объединение соседних свободных участков памяти
- •4.5 Уплотнение памяти
- •4.6 Стратегии размещения информации в памяти
4.3.2 Организация мультипрораммного режима: распределение статическими разделами
Для организации мультипрограммного режима необходимо обеспечить одновременное расположение в оперативной памяти нескольких задач (целиком или их частями). Самая простая схема распределения памяти между несколькими задачами предполагает, что память, незанятая ядром ОС, может быть разбита на несколько непрерывных частей (разделов). Разделы характеризуются именем, типом, границами (как правило, указываются начало раздела и его длина).
Разбиение памяти на несколько непрерывных разделов может быть фиксированным (статическим), либо динамическим (то есть процесс выделения нового раздела памяти происходит непосредственно при появлении новой задачи).
Трансляция и загрузка в абсолютных адресах. Разбиение всего объема оперативной памяти на несколько разделов может осуществляться единовременно (т.е. в процессе генерации варианта ОС, который потом и эксплуатируется) или по мере необходимости оператором системы (в системах пакетной обработки). И в первом, и во втором случае при выполнении разбиения памяти на разделы вычислительная система более ни для каких целей в этот момент не используется. Пример разбиения памяти на несколько разделов приведен на рис. 4.5.
Рис. 4.5. Распределение памяти с разделами с фиксированными границами
В каждом разделе в каждый момент времени может располагаться по одной программе (задаче). В этом случае по отношению к каждому разделу можно применить все те методы создания программ, которые используются для однопрограммных систем. Возможно использование оверлейных структур, что позволяет создавать большие сложные программы и в то же время поддерживать коэффициент мультипрограммирования (под коэффициентом мультипрограммирования понимают количество параллельно выполняемых программ) на должном уровне. Первые мультипрограммные ОС строились по этой схеме.
Центральный процессор быстро переключался с задания на задание, создавая иллюзию одновременного их выполнения.
Трансляция заданий производилась в абсолютных адресах с расчетом на выполнение только в конкретном разделе (рис. 4.6).
Рис. 4.6 Мультипрограммирование с фиксированными разделами, с трансляцией и загрузкой в абсолютных адресах
Если задание было готово для выполнения, а его раздел в это время был занят, то заданию приходилось ждать, несмотря на то, что другие разделы были свободны (рис. 4.7).
Это приводило к неэффективному использованию ресурсов памяти, однако позволяло относительно просто реализовать операционную систему.
Рис. 4.7 Крайний случай исключительно неэффективного использования ресурсов памяти при мультипрограммировании с фиксированными разделами и трансляцией и загрузкой в абсолютных адресах. Задания, ожидающие освобождения раздела 3, малы и могли бы разместиться в других разделах. Однако их абсолютные адреса требуют, чтобы они выполнялись только в разделе 3. Остальные два раздела остаются пустыми.
Использовалась эта схема и много лет спустя при создании недорогих вычислительных систем, ибо она является несложной и обеспечивает возможность параллельного выполнения программ. Иногда в некотором разделе размещалось по несколько небольших программ, которые постоянно в нем и находились. Такие программы назывались ОЗУ-резидентными (или просто — резидентными). Они же используются и в современных встроенных системах; правда, для них характерно, что все программы являются резидентными и внешняя память во время работы вычислительного оборудования не используется.
Мультипрограммирование с фиксированными разделами: трансляция и загрузка перемещаемых модулей. Перемещающие компиляторы, ассемблеры и загрузчики применяются для трансляции и загрузки перемещаемых модулей, которые могут работать в любом свободном разделе, достаточно большом для их размещения (рис. 4.8).
Задания могут помещаться в любой свободный раздел, размер которого это допускает.
Рис. 4.8 Мультипрограммирование с фиксированными разделами, с трансляцией и загрузкой перемещаемых модулей.
Такой подход свободен от некоторых принципиальных недостатков в использовании памяти, присущих мультипрограммированию с трансляцией и загрузкой в абсолютных адресах. Трансляторы и загрузчики перемещаемых модулей гораздо сложнее, чем трансляторы и загрузчики в абсолютных адресах.
Защита в мультипрограммных системах. Серьезная проблема, которая возникает при организации мультипрограммного режима работы вычислительной системы, — это защита как самой ОС от ошибок и преднамеренного вмешательства задач в ее работу, так и самих задач друг от друга.
В самом деле, программа может обращаться к любым ячейкам в пределах своего виртуального адресного пространства. Если система отображения памяти не содержит ошибок и в самой программе их тоже нет, то возникать ошибок при выполнении программы не должно. Однако в случае ошибок адресации исполняющаяся программа может начать «обработку» чужих данных или кодов с непредсказуемыми последствиями. Одной из простейших, но достаточно сильных мер является введение граничных регистров защиты памяти.
Два регистра позволяют указывать нижнюю и верхнюю границы раздела пользователя (рис. 4.9), либо нижнюю границу (верхнюю границу) и размер раздела. Программа, которой требуется обратиться к услугам операционной системы, использует для этого команду вызова супервизора. Тем самым программа пользователя получает возможность пересекать границу операционной системы и обращаться к ее услугам.
Рис. 4.9 Защита памяти в мультипрограммных системах со связным распределением. Когда программа пользователя в разделе 2 работает, все формируемые ею адреса памяти контролируются, чтобы удостовериться, что они находятся в диапазоне между b и с.
При нарушении адресации возникает прерывание и управление также передается супервизору ОС.
Организация памяти в виде фиксированных разделов проста и эффективна, но оперативной памяти оказывается иногда недостаточно, чтобы вместить все активные процессы. При небольшом объеме памяти и, следовательно, небольшом количестве разделов увеличить количество параллельно выполняемых приложений (особенно когда эти приложения интерактивны и во время своей работы они фактически не используют процессорное время, а в основном ожидают операций ввода/вывода) можно за счет свопинга (swapping, от swap – обмен, сделка). При свопинге вся задача, не занимающая процессор в данное время, выгружается на магнитный диск (перемещается во внешнюю память), а на ее место загружается либо более привилегированная, либо просто готовая к выполнению другая задача, находившаяся на диске в приостановленном состоянии.
Основным недостатком распределения памяти с фиксированными разделами является наличие порой достаточно большого объема неиспользуемой памяти. Неиспользуемая память может быть в каждом из разделов. Поскольку разделов несколько, то и неиспользуемых областей получается несколько, поэтому такие потери стали называть фрагментацией памяти. В отдельных разделах потери памяти могут быть очень значительными, однако использовать фрагменты свободной памяти при таком способе распределения не представляется возможным. Желание разработчиков сократить столь значительные потери привело их к следующим двум решениям:
выделять раздел ровно такого объема, который нужен под текущую задачу;
размещать задачу не в одной непрерывной области памяти, а в нескольких областях.