Добавил:
По своей натуре перфекционист. Поэтому люблю все аккуратно оформлять и упорядочивать, складывать по полочкам. Вот, не пропадать же добру, нажитому за четыре кропотливых семестра. Тут я выложил все мои ответы, курсовые, отчеты и некоторые ДЗ. Они могут вам помочь для получения зачета или сдачи экзамена. Если чего-то не нашли в папочках, то попытайте удачу в разделе НЕОТСОРТИРОВАННОЕ на моей страничке, там все 4 семестра разложены по папкам. ГРУППА КТ-43-15. Годы обучения 2015-2019. Коллекция будет пополняться. Что ж, удачки :З Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
112
Добавлен:
25.01.2018
Размер:
2.28 Mб
Скачать

4.Сохранение информации о прерванной программе, которую с помощью действий аппаратуры не удалось спасти на шаге 2.

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

6.Восстановление информации, относящейся к прерванному процессу (этап, обратный шагу 4).

7.Возврат в прерванную программу.

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

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

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

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

В операционной системе выделяется программный модуль, который занимается диспетчеризацией обработчиков прерываний. Этот модуль в разных ОС называется по-разному: диспетчером или супервизором прерываний.

При возникновении прерывания диспетчер прерываний вызывается первым. Он запрещает ненадолго все прерывания, а затем выясняет причину прерывания.

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

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

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

22. Процедуры обработки прерываний. Системные вызовы.

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

боту, чаще всего никак не связанную с текущим процессом.

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

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

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

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

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

Системные вызовы Системный вызов позволяет приложению обратиться к ОС с просьбой выполнить то или иное действие, оформ-

ленное как процедура (или набор процедур) кодового сегмента ОС.

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

Реализация системных вызовов должна удовлетворять следующим требованиям:

·обеспечивать переключение в привилегированный режим;

·обладать высокой скоростью вызова процедур ОС;

·обеспечивать единообразное обращение к системным вызовам для всех аппаратных платформ, на которых работают ОС;

·допускать легкое расширение набора системных вызовов;

·обеспечивать контроль со стороны ОС за корректным использованием системных вызовов

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

При любом системном вызове приложение выполняет программное прерывание с определенным и единственным номером вектора.

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

23. Архитектура компьютеров семейства Pentium. Защищенный режим. Дескрипторные таблицы.

В ноябре 2000 г. компания Intel приступила к производству 32-разрядного процессора Pentium 4 на ядре Willamette, работающего на частоте 1,5 ГГц. Знаменательность этого события в том, что с момента выхода Pentium Pro в области архитектуры процессоров Intel не происходило ничего более значительного. С выходом Pentium 4 на свет появился процессор седьмого поколения (Pentium Pro, Pentium II/III относятся к шестому поколению — Р6). Необходимо перечислить новшества архитектуры Willamette, позволяющие отнести процессор Pentium 4 к новому поколению: • асимметричное ядро с блоками, работающими на различных скоростях; • значительно улучшенная версия суперскалярного механизма исполнения инструкций; • новый кэш второго уровня, отслеживающий порядок выполнения инструкций; • переработанные блоки операций с мультимедийными данными и числами с плавающей запятой; • огромный набор новых инструкций; • новая системная шина, передающая по 4 пакета данных за такт (ар-хитектура Quad Pumped); • конвейер выполнения инструкций из 20 стадий. Наибольшее впечатление на экспертов произвела стартовая рабочая частота процессора в 1,5 ГГц. Такого результата удалось добиться за счет новой архитектуры конвейера выполнения инструкций. Pentium III имеет конвейер длиной 12 стадий (17 стадий FPU), Athlon — 10 стадий (15 стадий FPU). Pentium 4 при длине конвейера 20 стадий позволяет достичь максимальной тактовой частоты, но и получает самые большие задержки для связанных друг с другом операций (второй операции придется ожидать 20 тактов, пока не завершится первая операция).

Защищённый режим (protected mode или P-Mode). Как утверждает Intel, это "родной" (native) режим 32-разряд- ного процессора.

Взащищённый режим процессор надо переводить специальными операциями над системными регистрами и войти в этот режим процессор может только из режима реальных адресов. При работе в защищённом режиме процессор контролирует практически все действия программ и позволяет разделить операционную систему, драйвера и прикладные программы разными уровнями привилегий. Благодаря этому ОС может ограничить области памяти, выделяемой программам, запретить или разрешить ввод/вывод по любым адресам, управлять прерываниями и многое другое. При попытке программы выйти за допустимый диапазон адресов памяти, выделенной ей, либо при обращении к "запрещённым" для неё портам процессор будет генерировать исключения - специальный тип прерываний. Грамотно оперируя исключениями, операционная система может контролировать действия программ, организовать систему виртуальной памяти, мультизадачность и другие программные технологии.

Взащищённом режиме максимально доступны все ресурсы процессора. Например, R-Mode максимальный диапазон адресов памяти ограничен одним мегабайтом, а в защищённом режиме он расширен до 4 Гб для процессоров 386 и 486 и 64 Гб для Pentium-ов.

Дескрипторные таблицы — служебные структуры данных, содержащие дескрипторы сегментов.

Вархитектуре x86 есть три вида дескрипторных таблиц:

Глобальная дескрипторная таблица (англ. Global Descriptor Table, GDT); Локальная дескрипторная таблица (англ. Local Descriptor Table, LDT); Таблица векторов прерываний (англ. Interrupt Descriptor Table, IDT); Глобальная дескрипторная таблица

Глобальная дескрипторная таблица является общей для всех процессов. Её размер и расположение в физической памяти определяются регистром GDTR. Размер таблицы не может превышать 8192 дескрипторов, поскольку один дескриптор занимает 8 байт, а лимит в регистре GDTR — двухбайтный и хранит размер таблицы минус один (максимальное значение лимита — 65535), а 8192 x 8 = 65536.

Дескрипторы LDT и сегментов задач (TSS) могут находиться только здесь.

Особенностью GDT является то, что у неё запрещён доступ к первому (с нулевым смещением относительно начала таблицы) дескриптору. Обращение к нему вызывает исключение #GP, что предотвращает обращение к памяти с использованием незагруженного сегментного регистра.

Локальная дескрипторная таблица

В отличие от GDT, LDT может быть много (соответственно количеству задач (потоков), но не обязательно). Каждая задача может иметь свою. На расположение таблицы текущей задачи указывает регистр LDTR. Размер и расположение LDT в линейной памяти определяются дескриптором LDT из GDT (но это не означает, что размер LDT может быть больше 65536 байт).

Первый дескриптор LDT (№ 0) использовать можно. Таблица дескрипторов прерываний

Таблица прерываний глобальна. Размещение в физической памяти определяется регистром IDTR. При возникновении прерывания (внешнего, аппаратного, или вызванного инструкцией Int):

из IDT выбирается дескриптор шлюза, соответственно номеру прерывания; проверяются условия защиты (права доступа);

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

24. Средства аппаратной поддержки мультипрограммирования.

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

В зависимости от источника прерывания делятся на три класса:

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

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

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

Например, такой командой в процессоре Pentium является INT, в процессорах Motorola – trap. Причинами использования таких команд являются желание получить более компактный код программы; необходимость перехода из пользовательского режима в привилегированный; обращение к услугам ОС – системный вызов.

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

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

При использовании опрашиваемых прерываний процессор получает от запросившего прерывания устройства только информацию об уровне приоритета прерывания. Возможен комбинированный подход, сочетающий векторный и опрашиваемый типы прерываний. Такой подход реализован в ПК на основе процессоров Intel Pentium. Вектор прерываний в процессоре Pentium поставляет контроллер прерываний, который отображает поступающий от шины сигнала IRQ (Interrupt request) на определенный номер вектора. Вектор прерываний представляет собой число, указывающее на одну из 256 программ обработки прерываний, адреса которых хранятся в таблице обработчиков прерываний. В том случае, когда к каждой линии IRQ подключается только одно устройство, процедура прерываний работает как чисто векторная. Однако при совместном использовании одного уровня IRQ несколькими устройствами обработка прерываний реализуется по схеме опрашиваемых прерываний, т.е. в данном случае необходимо выполнить опрос всех устройств, подключенных к данному уровню

IRQ (Interrupt Request).

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

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

25. Связь между процессами. Семафоры, мониторы, сообщения.

Межпроцессное взаимодействие (англ. inter-process communication, IPC) — обмен данными между потоками одного или разных процессов. Реализуется посредством механизмов, предоставляемых ядром ОС или процессом, использующим механизмы ОС и реализующим новые возможности IPC. Может осуществляться как на одном компьютере, так и между несколькими компьютерами сети.

Из механизмов, предоставляемых ОС и используемых для IPC, можно выделить: механизмы обмена сообщениями; механизмы синхронизации; механизмы разделения памяти;

механизмы удалённых вызовов (RPC).

Для оценки производительности различных механизмов IPC используют следующие параметры:

пропускная способность (количество сообщений в единицу времени, которое ядро ОС или процесс способно обработать); задержки (время между отправкой сообщения одним потоком и его получением другим потоком).

IPC может называться терминами межпотоковое взаимодействие (англ. inter-thread communication) и межпро-

граммное взаимодействие (англ. inter-application communication).

Межпроцессное взаимодействие, наряду с механизмами адресации памяти, является основой для разграничения адресного пространства между процессами.

Семафоры, мониторы, сообщения.

Семафор представляет собой целую переменную, принимающую неотрицательные значения, доступ любого процесса к которой, за исключением момента ее инициализации, может осуществляться только через две атомарные операции: P (от датского слова proberen – проверять) и V (от verhogen – увеличивать).В момент создания семафор может быть инициализирован любым неотрицательным значением.

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

В мониторах было введено понятие условных переменных (condition variables), над которыми можно совершать две операции wait и signal, отчасти похожие на операции P и V над семафорами.

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

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

Сообщения Наиболее простой механизм синхронизации. Реализуется с использованием 2х примитивов:

send(Q, mess) — отправить сообщение mess, процессу/объекту Q. receive(Q, mess) — получить сообщение mess, от процесса/объекта Q.

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

-: медленно.

+: возможно использование для общения удаленных процессов.

26. Тупики. Условия возникновения тупиков.

Тупики и близкая к ним проблема бесконечного откладывания - важные факторы, которые должны учитывать разработчики ОС.

Тупик (deadlock) - это такая ситуация в мультипрограммной системе, когда процесс ожидает некоторого события, которое никогда не произойдет. Системная тупиковая ситуация, или “зависание” системы - это ситуация, когда один или более процессов оказываются в состоянии тупика.

При рассмотрении проблемы тупиков все ресурсы разделяются на два класса: повторно используемые (или системные) ресурсы (типа RR-reusable resource и SR-system resource) и потребляемые (или расходуемые) ре-

сурсы (типа CR-consumable resource).

Условия возникновения тупиков Условия возникновения тупиков были сформулированы Коффманом, Элфиком и Шошани в 1970 г.

Условие взаимоисключения (Mutual exclusion). Одновременно использовать ресурс может только один процесс.

Условие ожидания ресурсов (Hold and wait). Процессы удерживают ресурсы, уже выделенные им, и могут запрашивать другие ресурсы.

Условие неперераспределяемости (No preemtion). Ресурс, выделенный ранее, не может быть принудительно забран у процесса. Освобождены они могут быть только процессом, который их удерживает.

Условие кругового ожидания (Circular wait). Существует кольцевая цепь процессов, в которой каждый процесс ждет доступа к ресурсу, удерживаемому другим процессом цепи.

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

27. Основные направления борьбы с тупиками.

Методы предотвращения взаимоблокировок ориентированы главным образом на нарушение первых трех условий путем введения ряда ограничений на поведение процессов и способы распределения ресурсов. Методы обнаружения и устранения менее консервативны и сводятся к поиску и разрыву цикла ожидания ресурсов.

Ключевые направления борьбы с тупиками:

1.Игнорирование проблемы в целом

2.Предотвращение тупиков

3.Обнаружение тупиков

4.Восстановление после тупиков

5.Игнорирование проблемы тупиков

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

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

28. Основные понятия и функции ОС по управлению памятью.

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

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

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

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

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

29. Управление памятью с фиксированными разделами, с переменными и динамическими разделами.

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

Подсистема управления памятью в этом случае выполняет следующие задачи:

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

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

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

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

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

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

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

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

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

Переменные разделы

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

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

30. Свопинг. Проблема размещения больших программ.

Свопинг При небольшом объеме памяти и, следовательно, небольшом количестве разделов увеличить число парал-

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

Чтобы избавиться от фрагментации, можно попробовать размещать в оперативной памяти задачи плотно, одну за другой, выделяя ровно столько памяти, сколько задача требует. Одной из первых операционных систем, в которой был реализован такой способ распределения памяти, была OS MVT (Multiprogramming with a Variable number of Tasks — мультипрограммирование с переменным числом задач). В этой операционной системе специальный планировщик (диспетчер памяти) ведет список адресов свободной оперативной памяти. При появлении новой задачи диспетчер памяти просматривает этот список и выделяет для задачи раздел, объем которой либо равен необходимому, либо чуть больше, если память выделяется не ячейками, а некими дискретными единицами. При этом модифицируется список свободных областей памяти. При освобождении раздела диспетчер памяти пытается объединить освобождающийся раздел с одним из свободных участков, если таковой является смежным.

В какой раздел помещать процесс? Наиболее распространены три стратегии.

Стратегия первого подходящего (First fit). Процесс помещается в первый подходящий по размеру раздел. Стратегия наиболее подходящего (Best fit). Процесс помещается в тот раздел, где после его загрузки останется меньше всего свободного места.

Стратегия наименее подходящего (Worst fit). При помещении в самый большой раздел в нем остается достаточно места для возможного размещения еще одного процесса.

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

Проблема размещения больших программ Уже давно существует проблема размещения в памяти программ, размер которых превышает размер доступ-

ной памяти. Один из вариантов ее решения организация структур с перекрытием рассмотрен в предыдущей главе. При этом предполагалось активное участие программиста в процессе сегментации и загрузки программы. Было предложено переложить проблему на компьютер. Развитие архитектуры компьютеров привело к значительному усложнению организации памяти, соответственно, усложнились и расширились задачи операционной системы по управлению памятью. Одним из главных усовершенствований архитектуры стало появление виртуальной памяти (virtual memory). Она впервые была реализована в 1959 г. на компьютере Атлас, разработанном в Манчестерском университете, и стала популярной только спустя десятилетие.

При помощи виртуальной памяти обычно решают две задачи.

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

Возможность выполнения программы, находящейся в памяти лишь частично имеет ряд вполне очевидных преимуществ:

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

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

3)Объем ввода-вывода для выгрузки части программы на диск может быть меньше, чем в варианте классического свопинга, в итоге, каждая программа будет работать быстрее.

Таким образом, возможность обеспечения (при поддержке операционной системы) для программы видимости практически неограниченной (32или 64-разрядной) адресуемой пользовательской памяти при наличии основной памяти существенно меньших размеров очень важный аспект.

Введение виртуальной памяти позволяет решать другую задачу - обеспечение контроля доступа к отдельным сегментам памяти и в частности защиту пользовательских программ друг от друга и защиту ОС от пользовательских программ.

С целью защиты виртуальная память поддерживалась и на компьютерах с 16-разрядной адресацией, в которых объем основной памяти зачастую существенно превышал 64 Кбайта (размер виртуальной памяти). Например, 16-разрядный компьютер PDP-11/70 мог иметь до 2 Мбайт оперативной памяти. Операционная система этого компьютера, тем не менее, поддерживала виртуальную память, основным смыслом которой являлось обеспечение защиты и перераспределения основной памяти между пользовательскими процессами.

31. Алгоритмы «Первое подходящее», «Следующее подходящее», «Наиболее подходящее», «Наименее подходящее», «Быстро искомое подходящее».

Когда процессы и пустые пространства содержатся в списке отсортированными по адресам, то для выделения памяти создаваемому процессу могут быть использованы несколько алгоритмов. Предположим, что диспетчер памяти знает, сколько памяти нужно выделить. Простейший алгоритм называется первое подходящее. Диспетчер памяти сканирует список сегментов до тех пор, пока не найдет пустое пространство подходящего размера. Затем пустое пространство разбивается на две части: одна для процесса и одна для неиспользуемой памяти, за исключением того статистически маловероятного случая, когда процесс в точности помещается в пустое пространство. «Первое подходящее» — это быстрый алгоритм, поскольку поиск ведется с наименьшими затратами времени. Незначительной вариацией алгоритма «первое подходящее» является алгоритм следующее подходящее. Он работает так же, как и «первое подходящее», за исключением того, что отслеживает свое местоположение, как только находит подходящее пустое пространство. При следующем вызове для поиска пустого пространства он начинает поиск в списке с того места, на котором остановился в прошлый раз, а не приступает к поиску с самого начала, как при работе алгоритма «первое подходящее». Моделирование работы алгоритма «следующее подходящее», проведенное Бэйсом (Bays, 1977), показало, что его производительность несколько хуже, чем алгоритма «первое подходящее».

Другой хорошо известный и широко используемый алгоритм — наиболее подходящее. При нем поиск ведется по всему списку от начала до конца и выбирается наименьшее соответствующее пустое пространство. Вместо того чтобы разбивать большое пустое пространство, которое может пригодиться чуть позже, алгоритм «наиболее подходящее» пытается подыскать пустое пространство, близкое по размеру к необходимому, чтобы наилучшим образом соответствовать запросу и имеющимся пустым пространствам. В качестве примера алгоритмов «первое подходящее» и «наиболее подходящее» вернемся к рис. 3.6. Если необходимо пространство в 2 единичных блока, то, согласно алгоритму «первое подходящее», будет выделено пустое пространство, начинающееся с адреса 5, а согласно алгоритму «наиболее подходящее», будет выделено пустое пространство, начинающееся с адреса 18. Алгоритм «наиболее подходящее» работает медленнее, чем «первое подходящее», поскольку он должен при каждом вызове вести поиск по всему списку. Как ни странно, но его применение приводит к более расточительному использованию памяти, чем при использовании алгоритмов «первое подходящее» и «следующее подходящее», поскольку он стремится заполнить память, оставляя небольшие бесполезные пустые пространства. В среднем при использовании алгоритма «первое подходящее» образуются более протяженные пустые пространства.

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

использования. Моделирование показало, что применение алгоритма «наименее подходящее» также далеко не самая лучшая идея.

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

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

Еще один алгоритм распределения памяти называется быстро искомое подходящее. Его использование предусматривает ведение отдельных списков для некоторых наиболее востребованных искомых размеров. К примеру, у него может быть таблица из п записей, в которой первая запись является указателем на вершину списка пустых пространств размером в 4 Кбайт, вторая — указателем на список пустых пространств размером в 8 Кбайт, а третья запись — указателем на список пустых пространств размером в 12 Кбайт, и т. д. Пустые пространства размером, скажем, в 21 Кбайт, могут быть помещены либо в список пустых пространств размером в 20 Кбайт, либо в специальный список пустых пространств с нечетным размером. При использовании алгоритма «быстро искомое подходящее», поиск пустого пространства требуемого размера ведется исключительно быстро, но в нем имеется недостаток, присущий всем системам, сортирующим пустые пространства по размеру, а именно: когда процесс завершается или выгружается процедурой свопинга, слишком много времени тратится на то, чтобы определить, можно ли высвобождаемое пространство объединить с соседними. Если не проводить объединение, то память будет очень быстро разбита на большое количество небольших по размерам пустых фрагментов, в которых не смогут поместиться процессы.

32. Понятие виртуальной памяти. Архитектурные средства поддержки виртуальной па-

мяти:

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

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

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

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

33. Страничная память.

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

Достоинства:

. Допустимость максимального объема выполняющихся программ, простота их программирования.

. Значительное уменьшение временной фрагментации, максимальное использование РОП и максимальный уровень мультипрограммирования.

Недостатки:

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

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

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

2.Большой размер страницы приводит к тому, что в ОП здесь помещены команды и данные, к которым не было обращений.

3.Ввод-вывод будет эффективен при больших размерах страниц.

4.Свойство локальности распространяется, как правило, на малые участки программ. 5.При малых размерах страниц потери на внутреннюю фрагментацию уменьшаются. Вывод: необходимость небольших размеров страницы.

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

2.При постоянном объеме выделенной ОП с увеличением размера страницы растет число прерываний по отсутствию нужной страницы.

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

4.Число команд, выполненных на странице до передачи управления другой странице, как правило, невелико.

34. Сегментная память.

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

выполнение E чтение R запись W

расширение A и их различных комбинаций.

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