Основные компоненты операционных систем. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основные компоненты операционных систем.



Промежуточные системы

Рис. 1.1. Классификация операционных систем

ДОС (Дисковые Операционные Системы)

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

Дисковая операционная система MS DOS для IBM PC-совместимых машин является прямым наследником одного из таких резидентных мониторов.

Существование систем этого класса обусловлено их простотой и тем, что они потребляют мало ресурсов.

ОС общего назначения

К этому классу относятся системы, берущие на себя выполнение всех вышеперечисленных функций. Разделение на ОС и ДОС идет, по-видимому, от систем IBM DOS/360 и OS/360 для больших компьютеров этой фирмы. (Кстати, у IBM была еще TOS/360, Tape Operating System — Ленточная Операционная Система).

 

Системы реального времени

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

1.4.1. Классификация по способу построения ОС

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

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

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

 

 

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

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

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

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

Для управления портами связи существуют 4 операции: создать порт, уничтожить порт, читать из порта и записать в порт. Если не работает ни одна задача, то все менеджеры отключены от ядра. При решении задач к ядру подключаются через вновь созданный порт только те менеджеры, ко­торые непосредственно нужны задаче, что позволяет исключить ситуации, возникающие в монолитном ядре.

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

Существенным минусом является требование ресурсов на передачу данных между процессами.

Представители этого класса: QNX; Minix; ChorusOS развиваются медленно, но они обладают огромным потенциалом.

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

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

Архитектуры на основе экзоядер являются дальнейшим развитием и усовершенствованием микроядерных архитектур. Пока существуют толькоакадемические разработки, такие как The Pandora OS, XOK/ExOS, Nemesis, но данное направление стремительно развивается.

Объектно-ориентированная операционная система — операционная система, имеющая объектно-ориентированную архитектуру. Основные функции объектно-ориентированной ОС реализует микроядро, над кото­рым располагаются сервисные модули. С микроядром связаны объектно-ориентированные языки программирования. Ресурсы объектно-ориентированной ОС используют прикладные программы. Такая система в своем составе может иметь несколько мини-ядер (на рис. 1.2 они обозначе­ны Ml и М2), каждое из которых поддерживает свою область.

Аппаратные средства

Рис. 1.2. Объектно-ориентированная ОС

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

• в качестве данных - три очереди: очередь процессов, ожидающих
сообщения, очередь сообщений, ожидающих процессы, очередь процессов, пославших сообщения и ожидающих подтверждения;

• в качестве методов — функции работы с очередью и операции чтения и записи.

Такая организация почтового ящика позволяет организовать обмен со­общениями между процессами без потери данных. Представители данного класса: OZONE, OS/400.

1.4.2. Загрузка ОС

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

Английское название процесса загрузки — bootstrapping (от англ. «pull itself up by its own bootstraps»), - система поэтапно «поднимет себя за шнурки ботинок». Дейст­вительно, основные средства ОС в момент запуска еще недоступны, приходится постепенно подтягивать нужные силы.

Загрузка операционной системы на IBM-совместимом компьютере на­чинается с того, что BIOS считывает программу начальной загрузки (MBR) с первого сектора накопителя (первые 512 байт накопителя, MBS) в оперативную память по адресу 0000:7с00 и передает ей управление. MBR начинает со сканирования таблицы разделов в поисках раздела, где находится начальный загрузчик ОС (он помечен особым флагом). Этот флаг показывает, что данный раздел является загрузочным. Как только MBR обнаружит хотя бы один такой флаг, она считывает в память загрузочный код из первого сектора раздела, помеченного флагом, и передает ему управление или же загружается ядро ОС.

Загрузочный код содержит программу загрузчик ОС, который:

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

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

•загружает ядро операционной системы в ОЗУ;

•формирует параметры, передаваемые ядру операционной системы;

• передает управление ядру операционной системы.
Наиболее популярная схема загрузки конкретной ОС [12];

■ загрузка и инициализация ядра;

■ распознавание и конфигурирование устройств;
" создание необходимых системных процессов;

• выполнение командных файлов запуска системы;

• авторизация.

При «аварийной» (в специальном режиме) или ручной загрузке неко­торые действия могут быть пропущены.

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

Большинство современных ОС используют схему, при которой допол­нительные модули подгружаются уже после старта самого ядра. Список модулей, которые необходимо загрузить, а также параметры настройки яд­ра, собраны в специальных файлах. У DOS этот файл называется CONFIG.SYS, у MS Windows - реестром. Сложность при таком способе за­грузки состоит в том, что ядро, еще не до конца инициализировавшись, уже должно работать с файловой системой.

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

Распространенные загрузчики (по материалам www.wikipedia.ru): •NTLDR - ядра Windows NT;

•Windows Boot Manager (bootmgr.exe, winload.exe) - ядра Windows Vista; ■LILO (Linux LOader) - ядра Linux;

•GRUB (Grand Unified Bootloader) - ядра Linux и Hurd (StartUp Manager); •OS/2 BootManager - загрузчик ядра OS/2; •RedBoot — для встраиваемых систем;

■SILO (SPARC Improved bootLOader) — Linux и Solaris для машин с архитектурой SPARC.

■Loadlin - Linux из под DOS или Windows; ■Syslinux - Linux из под DOS или Windows; •BOOTP - для загрузки по сети; ■Yaboot - Linux на PowerPC; ■BootX - Mac OS X.

 

 

Построение и запуск задач

Создание исполняемых файлов

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

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

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

Форзац во время выполнения программы обеспечивает ее взаимодей­ствие с ОС. Его конкретным содержанием фактически определяется со­вместимость ОС с точки зрения переносимости исполняемых файлов. В MS DOS роль форзаца играет префиксный сегмент - PSP, объем которого занимает 512 байт.

Кодовый сегмент содержит инструкции для процессора, которыми оп­ределяется ход выполнения программы. В MS DOS адрес начала кодового сегмента, с которого начинается выполнение программы, находится в сег­ментном регистре CS.

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

Стековый сегмент служит для решения, как правило, системных задач, например, организует сохранение (с последующим восстановлением) зна­чений регистров. В MS DOS адрес начала этого сегмента хранится в сег­ментном регистре DS.

В области свободной памяти выделяется место под соответствующую динамическую переменную.

При загрузке программы сначала осуществляется связывание информации, т. е. на основе виртуальных адресов переменных вычисляются их физические адреса, затем эти адреса заменяют в программных кодах соответствующие имена переменных (разумеется, все эти адреса принадлежат области сегмента данных). Далее из кодового сегмента по очереди считываются команды, которые с помощью форзац-сегмента «допускаются» до ОС и обрабатываются. Например, оператор varl = varl + var2 обрабатывается по следующей, несколько условной, схеме:

• по соответствующим физическим адресам выбираются значения
переменных varl и var2, которые затем доставляются в центр обработки
данных (ЦП);

• значения переменных varl и var2 суммируются, и результат от­
правляется по адресу переменной varl.

В результате этого в сегменте данных значение var2 останется без из­менения, а в varl будет находиться искомая сумма.

Вернемся к форзацу. Он содержит информацию двух видов. Одна часть информации определяется только ОС (т. е. содержит стандартную информацию) и от конкретного вида исполняемого файла не зависит. Другая часть информации определяется только конкретными особенностями исполняемого файла и содержит указатели на базовые адреса сегментов, из которых состоит указанный файл. Если построить исполняемый файл без уникальной информации (для этого достаточно, чтобы он состоял из одного сегмента), то при запуске программы можно стандартную часть форзаца подключать автоматически. При этом хранить форзац вовсе не обязательно, что позволяет уменьшить объем исполняемого файла. В MS DOS форзац называется префиксным сегментом (PSP) и экономия памяти в этом случае составляет 512 байт. Для программ, которые остаются в ОП резидентными и, по сути дела, позволяют расширить возможности ОС, — это очень важный фактор.

Контрольные вопросы:

1. Сопоставьте требования к функциям современной операционной системы с функциями какой-либо конкретной системы. Какие еще функции она выполняет?

2 Укажите возможные проблемы безопасности ОС

3. Какие (какой) из способов построения ОС считаются (-ется) наиболее перспек­тивными и почему?

4. В чем разница между процессом и потоком?

5 Как происходит вызов подпрограммы? Чем он отличается от вызова макроса?

6. Какие существуют способы одновременной установки двух различных ОС на ЭВМ.

7. Как скопировать файл с дискеты на жесткий диск в ОС (семейства Windows или
Unix) только с использованием режима командной строки?

8. Какие Вы можете назвать проекты по повышению надежности ОС?
9 Как оценить безопасность ОС?

10. Какую структуру имеет исполняемый файл?

11. Что означает термин «простая операционная система»?

1 2 Как происходит создание выполняемой программы?

13.Сравните приведенные иерархические модели простых ОС.

 

 

Операционных систем

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

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

1. Главная программа, которая вызывает требуемые сервисные процедуры;

2. Набор сервисных процедур, реализующих системные вызовы;

3. Набор утилит, обслуживающих сервисные процедуры.

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

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

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

 

 

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

 

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

Для идентификации команд и переменных используются символьные имена (метки), виртуальные адреса и физические адреса.

Символьные имена присваивает пользователь при написании программы на алгоритмическом языке или ассемблере.

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

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

 

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

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

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

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

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

1) выбирает свободный раздел, размер которого достаточен для размещения поступившего на выполнение процесса;

2) осуществляет загрузку процесса и настройку адресов.

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

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

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

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

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

3) загрузка процесса в выделенный раздел и корректировка таблиц свободных и занятых областей;

4) после завершения процесса – корректировка таблиц свободных и занятых областей.

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

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

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

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



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 567; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.151.231 (0.08 с.)