
- •Операционные системы. Часть 2 Учебное пособие
- •Содержание
- •6.1.1. Общие понятия 58
- •4.Память
- •4.1.Управление оперативной памятью
- •4.1.1.Виртуальная и физическая память
- •4.1.2.Схема управления памятью
- •4.1.3.Управление памятью в однозадачной системе
- •4.1.4.Управление памятью в многозадачной системе
- •4.1.5.Подкачка процессов целиком
- •4.1.6.Страничная подкачка
- •4.1.7.Управление виртуальной памятью
- •4.2.Носители памяти для долговременного хранения данных
- •4.2.1.Накопители на жестких дисках
- •4.2.2.Оптические диски
- •4.2.3.Голографические диски
- •4.2.4.Флэш-память
- •4.2.5.Перспективные носители информации
- •Контрольные вопросы
- •5.Разработка надстроек к операционным системам
- •5.1.Общие понятия
- •5.2.Многозадачная оболочка с синхронной заменой контекста
- •5.3.Многозадачная система с принудительной заменой контекста
- •5.4.Дополнения к асинхронной надстройке
- •Контрольные вопросы
- •6.Краткий обзор операционных систем
- •6.1. Операционная система unix
- •6.1.1.Общие понятия
- •6.1.2. Структура unix
- •6.2.Операционные системы реального времени
- •6.2.1.Понятие об операционной системе qnx
- •6.2.2.Введение в ос VX Works
- •6.3.Особенности ос для универсальных многопроцессорных систем
- •6.3.1.Операционная система helios
- •6.4.Операционная система Windows 2000
- •Варианты выпуска Windows 2000
- •Контрольные вопросы
- •Литература
- •Предметный указатель
4.1.4.Управление памятью в многозадачной системе
Многозадачная система с фиксированными разделами памяти. В настоящее время однозадачные системы встречаются довольно редко. Практически все ОС для универсальных ЭВМ являются многозадачными, в которых с точки зрения пользователя несколько процессов могут выполняться параллельно. Такое выполнение требует разделения памяти между процессами. Самый простой подход – это разделить память на некоторое число независимых разделов. Одной из разновидностей такого подхода является система с фиксированными подходами памяти. Эта система разделяется на две подсистемы: подсистема с неперемещаемыми модулями и подсистема с перемещаемыми модулями.
Неперемещаемые модули. Работа в этой подсистеме отображена на . Транзитная область памяти поделена на разделы с фиксированными объёмами памяти. К каждому разделу имеется своя очередь процессов. По сути дела, ЭВМ с мощными ресурсами представляется совокупностью более простых компьютеров, оперативная память каждого из которых равна объему соответствующего разделу. Время процессора, выделяемое каждой условной ЭВМ пропорционально числу процессоров, относящимся к данному разделу памяти. Основное достоинство этой схемы – простота реализации. Однако легко видеть, что при таком подходе имеют место следующие недостатки:
к одним разделам в очереди может стоять достаточно много процессов (1-й и 4-й разделы), другие разделы в данный момент могут находиться в нерабочем состоянии (Раздел 3);
очевидно, в схему с фиксированными модулями плохо выписываются задачи с разными объёмами.
Следствием этих недостатков является то, что использование оперативной памяти в этой схеме далеко от идеала.
Впрочем, в случае режима пакетной обработки задач (т. е. отсутствует выгрузка задач на диск) этот метод работает без изъянов. В режиме разделения времени, когда выгрузка задачи на диск может оказаться необходимой, целесообразней использовать методы, использующие перемещаемые модули.
Рис. 4.3. Очереди процессов
Перемещаемые модули. В этой модели частично исправляются недостатки, характерные для неперемещаемых модулей (Рис. 4 .4). В этой схеме очередь процессов общая для всех разделов памяти, что способствует более равномерной, чем в предыдущей схеме, загрузке оперативной памяти. При каждой активизации задачи могут работать в разном окружении. Это требует для их корректного исполнения соответствующей организации системы защиты задачи от вторжения в её область памяти чужеродной программы (методы защиты будут рассмотрены ниже). Кроме того, одинаковые разделы памяти по-прежнему препятствуют продуктивной обработке задач с разными объемами.
Многозадачная система с переменными разделами памяти и перемещаемыми модулями. В дополнение к последнему подходу можно выделять под задачи области памяти, пропорциональные объёму задачи. Это усложнение схемы устраняет проблемы, связанные с неравномерностью объёмов задач, но порождает новые проблемы. Слабость этого подхода заключается в недостатке маневра при выделении каждой задаче подобающей ей памяти, так как при решении этой задачи система имеет дело с конкретным объёмом освободившейся памяти. Можно попытаться придержать выполнения задач до более благоприятной ситуации. Однако это можно рассматривать как откат к слегка модернизированной схеме на Рис. 4 .3, в которой разделы памяти имеют разные объёмы. Чтобы сделать эту схему продуктивной, потребуется перед засылкой процессов в соответствующую очередь производить что-то вроде сортировки задач по величине. Однако поддержка такой схемы потребовала бы достаточно больших ресурсов и на практике более прагматично применять другую систему, связанную с динамическим уплотнением памяти.
Рис. 4.4. Общая очередь процессов
Динамическое уплотнение памяти. В системах с динамическим уплотнением памяти после окончания работы любого процесса происходит уплотнение памяти по направлению к младшим адресам памяти и вся свободная память группируется на старших адресах, на которые осуществляется загрузка новых процессов. Такой подход, безусловно усложняя управление памятью, на логическом уровне снимает указанные выше проблемы, но приводит к некоторым временным затратам. Например, [17] при копировании на компьютере с памятью 256 Мбайт оперативной памяти 4 байт за 40 нс уплотнение всей памяти займет 2,7 с. К счастью скорость работы с памятью возрастает примерно пропорционально возрастанию объема и порядок времени уплотнения остается примерно таким же. Если для данного класса задач это задержка не является критичной (это, во всяком случае, не задачи реального времени), то эта система может с успехом применяться.
Настройка адресов и защита памяти. Каждой выгрузке задачи на диск сопутствует необходимость во время следующей загрузки в оперативную память работать в новом окружении, которое, если не принять специальных мер, может не вполне находиться под контролем системы. Это, в частности, может приводить к несанкционированному вмешательству в выполнение задачи чужеродного программного кода со всеми вытекающими из этого явления негативными последствиями (полезно отметить, что стандарт POSIX рекомендует использовать защищенный режим). Для защиты памяти разработано несколько методов, применение которых диктуется в том числе и типом применяемой виртуальной памяти (см. Рис. 4 .1).
В одном из них защите предшествует настройка адресов. Её цель – распределить в памяти несколько программ. Ко всем адресам задачи прибавляется базовый адрес того раздела, в который данная задача загружается. При этом компоновщик должен различать адреса от кодов машинных команд, которые, естественно, должны оставаться постоянными. Настройка адресов в области памяти не гарантирует защиту. Вредоносные программы всегда могут создать новую команду и перескочить на неё.
После настройки адресов каждому процессу присваивается свой код (в компьютере IBM 360 под код отводится 4 байта). Возможность выполнения процесса в данной области памяти контролируется указанным кодом: при совпадении выполнение в этой области разрешается, а в противном случае оно запрещается. Это – довольно сложный способ защиты.
Другой подход одновременно осуществляет настройку памяти и защиту. Каждому процесса выделяется два специальных регистра, которые защищаются на аппаратном уровне, чтобы значения, записанные в них, не могли быть изменены из пользовательских процессов. В одном из регистров указывается базовый адрес раздела, а в другом – длина задачи. Этих данных вполне хватает, чтобы держать ситуацию под контролем, но реализация этого метода требует при каждой операции требуется выполнять операции сложения и сравнения. Такая схема использовалась на первых в мире суперкомпьютерах.
В семействах машин IBM PC в базовом для этих компьютеров реальном режиме, начиная с процессора 286, для адресации в защищенном режиме использовались таблицы локальных дескрипторов. Суть этого способа заключался в том, что младшая часть адреса (смещение) по-прежнему находился в кодах программы, а старшая часть (базовая) адреса задавалась опосредованно. В кодах программы записывалось указание на запись в таблице локальных дескрипторов. В этой записи находился базовый адрес физической памяти. Так как указанные таблицы создавались под контролем операционной системы, путаницы, связанной сегментной структурой виртуальной памяти (см. дальше) удавалось избежать.
Подкачка с диска. При осуществлении подкачки процессов с диска интерес представляет решение двух вопросов:
какой должна быть тактика подкачки процессов?
каким образом управлять подкачкой с диска?
В первую очередь ответы на эти вопросы зависят от выбора варианта подкачки: либо в процессе выгрузки и загрузки задачи рассматриваются как неделимые единицы (swapping); либо загрузка и выгрузка осуществляется частично (постранично – paging).