Простое непрерывное распределение и распределение с перекрытием (оверлейные структуры)


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

¨ область, занимаемая операционной системой;

¨ область, в которой размещается исполняемая задача;

¨ незанятая ничем (свободная) область памяти.

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

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

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

Мы не будем рассматривать все различные варианты простого непрерывного рас­пределения памяти, которых было очень и очень много, а ограничимся схемой распределения памяти для MS-DOS (см. раздел «Распределение оперативной памяти в MS-DOS», глава 2).

Если есть необходимость создать программу, логическое (и виртуальное) адрес­ное пространство которой должно быть больше, чем свободная область памяти, или даже больше, чем весь возможный объём оперативной памяти, то исполь­зуется распределение с перекрытием (так называемые оверлейные структуры1). Этот метод распределения предполагает, что вся программа может быть разбита на части – сегменты. Каждая оверлейная программа имеет одну главную часть (main) и несколько сегментов (segment), причем в памяти машины одновремен­но могут находиться только её главная часть и один или несколько не перекры­вающихся сегментов.

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

Первоначально программисты сами должны были включать в тексты своих про­грамм соответствующие обращения к ОС (их называют вызовами) и тщательно планировать, какие сегменты могут находиться в оперативной памяти одновре­менно, чтобы их адресные пространства не пересекались. Однако с некоторых пор эти вызовы система программирования стала подставлять в код программы сама, автоматически, если в том возникает необходимость. Так, в известной и популярной системе программирования Turbo Pascal, начиная с третьей версии, программист просто указывал, что данный модуль является оверлейным. И при обращении к нему из основной программы модуль загружался в память и ему передавалось управление. Все адреса определялись системой программирования автоматически, обращения к DOS для загрузки оверлеев тоже генерировались системой Turbo Pascal.



Дата добавления: 2022-02-05; просмотров: 401;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.