Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 21
Текст из файла (страница 21)
И поскольку основным утилитам, необходимым дляобслуживания персонального компьютера, спецификации EMS и XMS, как правило,не нужны, мы не будем здесь их рассматривать.Остальные программные модули MS DOS (в принципе, большинство из нихявляется утилитами) оформлены как обычные исполняемые файлы. Например,утилита форматирования диска представляет собой и двоичный исполняемыйфайл, и команду операционной системы. В основном такого рода утилиты являютсятранзитными модулями, то есть загружаются в память только на время своейработы, хотя среди них имеются и TSR-программы.Для того чтобы предоставить больше памяти программам пользователя, в MS DOSприменено то же решение, что и во многих других простейших операционных82Глава 3, Управление памятью в операционных системахсистемах, — командный процессор C0MMAND.COM состоит Из двух частей. Перваячасть является резидентной и размещается в области ядра, вторая часть транзитнаяи размещается в области старших адресов раздела памяти, выделяемой дляпрограмм пользователя.
И если программа пользователя перекрывает собойобласть, в которой была расположена транзитная часть командного процессора, топоследний при необходимости восстанавливает в памяти свою транзитную часть,поскольку после выполнения программы она возвращает управление резидентнойчасти C0MMAND.COM.Поскольку размер основной памяти относительно небольшой, то очень частосистемы программирования реализуют оверлейные структуры. Для этого в MS DOSподдерживаются специальные вызовы.Распределение памяти статическимии динамическими разделамиДля организации мультипрограммного и/или мультизадачного режима необходимо обеспечить одновременное расположение в оперативной памяти несколькихзадач (целиком или частями).
Память задаче может выделяться одним сплошнымучастком (в этом случае говорят о методах неразрывного распределения памяти)или несколькими порциями, которые могут быть размещены в разных областяхпамяти (тогда говорят о методах разрывного распределения).Начнем с методов неразрывного распределения памяти. Самая простая схема распределения памяти между несколькими задачами предполагает, что память, не занятая ядром операционной системы, может быть разбита на несколько непрерывных частей — разделов (partitions, regions). Разделы характеризуются именем,типом, границами (как правило, указываются начало раздела и его длина).Разбиение памяти на несколько непрерывных (неразрывных) разделов может бытьфиксированным (статическим) либо динамическим (то есть процесс выделениянового раздела памяти происходит непосредственно при появлении новой задачи).
Вначале мы кратко рассмотрим статическое распределение памяти на разделы.Разделы с фиксированными границамиРазбиение всего объема оперативной памяти на несколько разделов может осуществляться единовременно (то есть в процессе генерации варианта операционнойсистемы, который потом и эксплуатируется) или по мере необходимости оператором системы.
Однако и во втором случае при разбиении памяти на разделы вычислительная система более ни для каких целей в этот момент не используется. Пример разбиения памяти на несколько разделов приведен на рис. 3.3.В каждом разделе в каждый момент времени может располагаться по одной программе (задаче). В этом случае по отношению к каждому разделу можно применитьвсе те методы создания программ, которые используются для однопрограммныхсистем. Возможно использование оверлейных структур, что позволяет создаватьбольшие сложные программы и в то же время поддерживать коэффициент мульти-Распределение памяти статическими и динамическими разделами83программирования1 на должном уровне. Первые мультипрограммные операционныесистемы строились по этой схеме.
Использовалась эта схема и много лет спустя присоздании недорогих вычислительных систем, поскольку является несложной и обеспечивает возможность параллельного выполнения программ. Иногда в некоторомразделе размещалось по нескольку небольших программ, которые постоянно в неми находились. Такие программы назывались ОЗУ-резидентными (или просто резидентными). Та же схема используется и в современных встроенных системах; правда, для них характерно, что все программы являются резидентными, и внешняя память во время работы вычислительного оборудования не используется.Ядро операционной системы)>Раздел № О>Раздел № 1>Раздел № 2>Раздел № 3Транзитная область ОСЗадача АНеиспользуемая областьЗадача БНеиспользуемая областьЗадача ВНеиспользуемая областьРис.
3.3. Распределение памяти разделами с фиксированными границамиПод коэффициентом мультипрограммирования ( т ) понимают количество параллельно выполняемых программ. Обычно на практике для загрузки центрального процессора до уровня 90 % необходимо, чтобы коэффициент мультипрограммирования был не менее 4-5. А для того чтобы наиболееполно использовать и остальные ресурсы системы, желательно иметь m на уровне 10-15.84Глава 3, Управление памятью в операционных системахПри небольшом объеме памяти и, следовательно, небольшом количестве разделовувеличить число параллельно выполняемых приложений (особенно когда эти приложения интерактивны и во время своей работы фактически не используют процессорное время, а в основном ожидают операций ввода-вывода) можно за счетзамены их в памяти, или свопинга (swapping). При свопинге задача может бытьцеликом выгружена на магнитный диск (перемещена во внешнюю память), а на ееместо загружается либо более привилегированная, либо просто готовая к выполнению другая задача, находившаяся на диске в приостановленном состоянии.
Присвопинге из основной памяти во внешнюю (обратно) перемещается вся программа, а не ее отдельная часть.Серьезная проблема, которая возникает при организации мультипрограммногорежима работы вычислительной системы, — защита как самой операционной системы от ошибок и преднамеренного вмешательства процессов в ее работу, так и самих процессов друг от друга.В самом деле, программа может обращаться к любым ячейкам в пределах своеговиртуального адресного пространства. Если система отображения памяти не содержит ошибок, и в самой программе их тоже нет, то возникать ошибок при выполнении программы не должно.
Однако в случае ошибок адресации, что случается не так уж и редко, исполняющаяся программа может начать «обработку» чужихданных или кодов с непредсказуемыми последствиями. Одной из простейших, нодостаточно эффективных мер является введение регистров защиты памяти. В этирегистры операционная система заносит граничные значения области памяти раздела текущего исполняющегося процесса.
При нарушении адресации возникаетпрерывание, и управление передается супервизору операционной системы. Обращения задач к операционной системе за необходимыми сервисами осуществляются не напрямую, а через команды программных прерываний, что обеспечивает передачу управления только в предопределенные входные точки кода операционнойсистемы и в системном режиме работы процессора, при котором регистры защитыпамяти игнорируются. Таким образом, выполнение функции защиты требует введения специальных аппаратных механизмов, используемых операционной системой.Основным недостатком рассматриваемого способа распределения памяти являетсяналичие порой достаточно большого объема неиспользуемой памяти (см.
рис. 3.3).Неиспользуемая память может быть в каждом из разделов. Поскольку разделов несколько, то и неиспользуемых областей получается несколько, поэтому такие потеристали называть фрагментацией памяти. В отдельных разделах потери памяти могутбыть очень значительными, однако использовать фрагменты свободной памяти притаком способе распределения не представляется возможным.
Желание разработчиков сократить столь значительные потери привело их к следующим двум решениям:••выделять раздел ровно такого объема, который нужен под текущую задачу;размещать задачу не в одной непрерывной области памяти, а в нескольких областях.Второе решение было реализовано в нескольких способах организации виртуальной памяти. Мы их обсудим в следующем разделе, а сейчас кратко рассмотримпервое решение.ределение памяти статическими и динамическими разделами85разделы с подвижными границамиЧтобы избавиться от фрагментации, можно попробовать размещать в оперативной памяти задачи плотно, одну за другой, выделяя ровно столько памяти, сколько задача требует.
Одной из первых операционных систем, в которой был реализо1ван такой способ распределения памяти, была OS MVT (Multiprogramming witha Variable number of Tasks — мультипрограммирование с переменным числом задач). В этой операционной системе специальный планировщик (диспетчер памяти) ведет список адресов свободной оперативной памяти. При появлении новойзадачи диспетчер памяти просматривает этот список и выделяет для задачи раздел, объем которой либо равен необходимому, либо чуть больше, если память выделяется не ячейками, а некими дискретными единицами.
При этом модифицируется список свободных областей памяти. При освобождении раздела диспетчерпамяти пытается объединить освобождающийся раздел с одним из свободных участков, если таковой является смежным.При этом список свободных участков памяти может быть упорядочен либо по адресам, либо по объему. Выделение памяти под новый раздел может осуществляться одним из трех основных способов:апервый подходящий участок;Q самый подходящий участок;О самый неподходящий участок.В первом случае список свободных областей упорядочивается по адресам (например, по возрастанию адресов).
Диспетчер просматривает список и выделяет задачераздел в той области, которая первой подойдет по объему. В этом случае, если такой фрагмент имеется, то в среднем необходимо просмотреть половину списка.При освобождении раздела также необходимо просмотреть половину списка. Правило «первый подходящий» приводит к тому, что память для небольших задачпреимущественно будет выделяться в области младших адресов, и, следовательно,это увеличит вероятность того, что в области старших адресов будут образовываться фрагменты достаточно большого объема.Способ «самый подходящий» предполагает, что список свободных областей упорядочен по возрастанию объема фрагментов.
В этом случае при просмотре спискаДля нового раздела будет использован фрагмент свободной памяти, объем которойнаиболее точно соответствует требуемому. Требуемый раздел будет определятьсяпо-прежнему в результате просмотра в среднем половины списка. Однако оставшийся фрагмент оказывается настолько малым, что в нем уже вряд ли удастся разместить еще какой-либо раздел. При этом получается, что вновь образованныйФрагмент попадет в начало списка, и в последующем его придется каждый раз проверять на пригодность, тогда как его малый размер вряд ли окажется подходящим.Поэтому в целом такую дисциплину нельзя назвать эффективной.Как ни странно, самым эффективным способом, как правило, является последний,по которому для нового раздела выделяется «самый неподходящий» фрагмент своЭта операционная система была одной из самых распространенных в больших ЭВМ класса IBM360 (370).86Глава 3.
Управление памятью в операционных системахбодной памяти. Для этой дисциплины список свободных областей упорядочивается по убыванию объема свободного фрагмента. Очевидно, что если есть такойфрагмент памяти, то он сразу же и будет найден, и, поскольку этот фрагмент является самым большим, то, скорее всего, после выделения из него раздела памятидля задачи оставшуюся область памяти можно будет использовать в дальнейшем.Однако очевидно, что при любой дисциплине обслуживания, по которой работаетдиспетчер памяти, из-за того что задачи появляются и завершаются в произвольные моменты времени и при этом имеют разные объемы, в памяти всегда будетнаблюдаться сильная фрагментация.