Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 1-8 / ОС_04.doc
Скачиваний:
111
Добавлен:
04.04.2013
Размер:
179.2 Кб
Скачать

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 – обмен, сделка). При свопинге вся задача, не занимающая процессор в данное время, выгружается на магнитный диск (перемещается во внешнюю память), а на ее место загружается либо более привилегированная, либо просто готовая к выпол­нению другая задача, находившаяся на диске в приостановленном состоянии.

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

  • выделять раздел ровно такого объема, который нужен под текущую задачу;

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

Соседние файлы в папке Лекции 1-8