Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы построения операционных систем.doc
Скачиваний:
50
Добавлен:
07.11.2018
Размер:
5.07 Mб
Скачать

3.2. Распределение с несколькими непрерывными разделами

3.2.1. Мультипрограммирование и разбиение на разделы

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

Рис. 3.2.

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

Для размещения нескольких программ память разбивают на области - разделы (partitions). Разделы определяются сво­ими границами.

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

Ниже рассматриваются некоторые способы управления разделением памяти. В примерах будет использована последовательность процессов, приведенная на рис.3.3.

Процесс

Длина, байт

1

8000

2

14000

3

7000

4

6000

5

12000

6

7000

Рис. 3.3

3.2.2. Разделы с фиксированными границами

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

Первый из них связан с разбиением памяти на разделы равных размеров (рис.3.4). Предположим, что полный объем доступной памяти равен 56000 байт, и ядро операционной системы занимает первые 8 000 байт. Память, не занятая ядром операционной системы, состоит из четырех разделов. Длина каждого раздела равна 12 000 байт. В этом случае любой процесс, размеры которого меньше или равны размеру раздела, может быть загружен в любой свободный раздел. Если все разделы - заняты, но при этом ни один из процессов не находится в состояниях «Готовый» или «Исполняемый», операционная система выгружает процесс из любого раздела во внешнюю память и загружает другой процесс.

Рис. 3.4

С подобным подходом связаны два основных недостатка:

- программа может быть больше размеров раздела; в этом случае программист может (и должен) разрабатывать программу с использованием оверлейной структуры, что значительно усложняет процесс программирования;

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

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

На рис.3.5 показано разбиение памяти на разделы фиксированного, но разного размера. Полный объем доступной памяти также равен 56 000 байт; ядро операционной системы занимает первые 8 000 байт. Память, не занятая ядром операционной системы, состоит из четырех разделов. Раздел 1 начинается с адреса 8 000 сразу за операционной системой и имеет длину 18 000 байт. Остальные разделы следуют в таком порядке: раздел 2 имеет длину 12 000 байт, раздел 3 - 10 000 байт, а раздел 4 - длину 8 000 байт.

Рис. 3.5.

В простой схеме распределения с разделами фиксированного размера каждый входящий процесс загружается в наименьший, подходящий по объему раздел. Если размер раздела превосходит размер процесса, то оставшаяся внутри раздела память не используется. Система, имея вначале пустыми все четыре раздела, сначала загрузит процесс 1 (рис.3.3) в раздел 2. Затем процесс 2 будет загружен в единственный достаточно большой для этого раздел 1. Процессы 3 и 4 загружаются в разделы 3 и 4 соответственно. После этого все разделы оказываются занятыми, поэтому больше процессов загрузить нельзя. Получившееся в итоге распределение памяти показано на рис.3.5,а. Заштрихованные области на диаграмме соответствуют неиспользованной памяти.

Однажды загруженный в раздел процесс остается там до конца своего выполнения. После того как процесс завершится, занимаемый им раздел вновь становится доступным для использования. На рис.3.5,б процесс 2 уже окончился, и в раздел 1 был загружен процесс 5. Рис.3.5,в соответствует ситуации, когда окончился процесс 1, и в раздел 2 был загружен процесс 6.

Заметим, что сами разделы и их расположение остаются фиксированными вне зависимости от размеров занимающ­их их процессов. Начальный выбор величины раздела в схеме с разделами разного размера очень важен. Число больших разделов должно быть достаточным, чтобы длинные процессы могли выполняться без слишком большой задержки. Однако если больших разделов слишком много, то при выполнении коротких процессов значительное количество памяти расходуется впустую (имеет место внутренняя фрагментация). Использование разделов фиксированного размера наиболее эффективно, когда размеры большинства процессов на­ходятся в пределах конкретных объемов, а распределение размеров процессов меняется не часто. Это позволяет эффективно использовать доступную память посредством выделения набора разделов ожидаемому множеству процессов.