Лекции по ОС

advertisement
Конспект лекций по дисциплине
“Операционные системы”
Киев 2003
Основные функции ОС.
1. Обеспечивать загрузку пользовательских программ в оперативную память и их
исполнение.
2. Обеспечивать управление памятью. В простейшем случае это указание
единственной загружаемой программе адреса, на котором кончается память,
доступная для использования, и начинается память, занятая системой.
3. Обеспечивать работу с устройствами долговременной памяти.
4. Предоставить стандартизированный доступ к различным периферийным
устройствам.
5. Предоставить пользовательский интерфейс.
В ряде ОС этим функции исчерпываются.(MS-DOS)
Более развитые ОС предоставляют дополнительные возможности:
1. Параллельное (или псевдопараллельное) исполнение нескольких задач.
2. Организация взаимодействия задач друг с другом.
3. Организация максимального взаимодействия и разделения ресурсов.
4. Защита системных ресурсов, данных и программ пользователя.
5. Аутентификация пользователя (проверка пользователя на предмет того, что он
является тем, за кого себя выдает и имеет право выполнить ту или иную операцию)
Классификация ОС.
По тому, какие из вышеперечисленных функций выполняют ОС, их можно разделить
на следующие:
ДОС(Дисковые операционные системы)
Это системы, которые берут на себя выполнение только первых четырех функций. Как
правило, это резидентный набор программ, и не более того. ДОС загружает
пользовательскую программу в память и передает ей управление, после чего программа
делает с системой, что ей заблагорассудится. При завершении программы считается
“хорошим тоном” оставить машину в таком состоянии, что бы ДОС смогла продолжить
работу. Если программа приводит машину в какое-то другое состояние, то ДОС ничем ей
в этом помешать не может.
Характерный пример – различные загрузочные мониторы. Такие системы работают
одновременно только с одной программой.
MS DOS для IBM PC – прямой наследник такого монитора.
Существование таких систем обусловлено их простотой и тем, что для их реализации
необходимо мало ресурсов.
Еще одна причина по которой они могут использоваться даже на довольно мощных
машинах – требование программной совместимости с ранними моделями того же
семейства компьютеров.
ОС общего назначения
Сюда относятся системы, выполняющие все перечисленные функции.
Примерами таких систем являются IBMDOS и OC/360 и наши аналоги ОС ЕС.
Эти ОС рассчитаны на интерактивную работу одного или нескольких пользователей в
режиме разделения времени, при не очень жестких требованиях ко времени реакции
системы на внешние события. В таких системах большое внимание уделяется защите
самой системы, ПО и пользовательских данных от ошибочных и злонамеренных действий
программ и пользователей.
К этому классу относится известная ОС Windows 2000, а также системы семейства
UNIX.
Системы виртуальных машин.
Это ОС, которая допускает одновременную работу нескольких программ, но
создающая при этом для каждой программы иллюзию того, что машина находится в
полном ее распоряжении, как при работе под управлением ДОС.
Виртуальные машины – целое средство при разработке и тестировании кроссплатформенных приложений. Они также используются для отладки модулей ядра или
самой операционной системы.
Для таких систем характерны высокие накладные расходы и сравнительно низкая
надежность. Поэтому они редко используются для промышленного применения.
В системах виртуальных машин уделяется большое внимание эмуляции работы
аппаратуры.
Часто эти системы являются подсистемами ОС общего назначения: например
подсистема W0W в Windows NT, Windows 2000, эмулятор RT-II в VAX и т.д.
Системы реального времени.
Это системы, предназначенные для облегчения разработки так называемых
приложений реального времени – программ, которые управляют некомпьютерным
оборудованием, часто с жесткими временными ограничениями.
Способность гарантировать время реакции является отличительными признаками
системы реального времени. Важно учитывать разницу между гарантированностью и
просто высокой производительностью и низкими накладными расходами. Далеко не все
алгоритмы и технические решения, даже и обеспечивающие отличное среднее время
реакции, годятся для приложений и ОС реального времени.
Типичными представителями этого класса систем являются известные системы OS-9 и
OS-9000.
В сущности, мультимедийные алгоритмы (т.е. требующие синхронизации
изображения на экране и звука также являются системами реального времени).
Расхождение звука и изображения фиксируется человеком уже в пределах 30 мсек.
Средства кросс-разработки.
Это алгоритмы, предназначенные для разработки программ
в двухмашинной
конфигурации.
При этом редактирование, компиляция и отладка выполняются на инструментальной
машине, а затем скомпилированный код загружается в целевую машину.
Примерами таких ОС являются системы программирования микроконтроллеров Intel.
Такие системы, как правило, включают в себя:
 набор компиляторов и ассемблеров, работающих на инструментальной машине
с “нормальной” ОС;
 библиотеки, которые выполняют большую часть функций ОС при работе
программы (кроме функции загрузки);
 средства отладки.
Системы промежуточных типов.
Есть системы, отнести которые к одному из перечисленных типов затруднительно.
Наиболее известными из таких систем являются MS Windows 3.x и Windows 95. Они, как
ОС используют аппаратные средства процессора для защиты и виртуализации памяти, а
даже обеспечивают некоторое подобие многозадачности, ноне защищают себя и
программы и программы от ошибок других программ (т.е. ведут себя в этом смысле как
ДОС).
Семейства операционных систем.
Часто существует преемственность между различными ОС.
Такая преемственность обусловлена требованиями совместимости и переносимости
прикладного ПО, кроме того заимствованию отденых удачных решений.
На основе такой преемственности можно построить “генеалогические деревья” ОС.
Так, например, можно выделить несколько семейств ныне эксплуатирующихся ОС, а
также семейств, которые уже вымерли или вымирают.
Процветают:
 системы для больших компьютеров IBM OS-360, IBM-Vm, OS/2;
 семейство UNIX, в том числе ОС Linux.
Архитектура ОС.
Наиболее общим подходом к структуризации операционной системы является
разделение всех ее модулей на две группы:
1. Ядро – модули, выполняющие основные функции ОС.
2. модули, выполняющие вспомогательные функции.
Модули ядра выполняют:

управление процессами

управление памятью

управление устройствами ввода-вывода
Ядро выполняет такие функции, как переключение контекстов, загрузка/выгрузка
станиц памяти, обработку прерываний. Эти функции недоступны для приложений. Они
создают для них так называемую прикладную программную среду. Приложения
обращаются к ядру с запросами — системными вызовами — для выполнения тех или
иных действий (например, открытия и чтения файла, вывода графики, получения
системного времени и т. п.).
Функции ядра, которые могут вызываться приложениями, образуют интерфейс
прикладного программирования.
Функции, выполняемые модулями ядра – наиболее часто используемые, поэтому
скорость их выполнения определяет производительность всей системы в целом. Поэтому
большая часть модулей ядра являются резидентными, т.е. постоянно находятся в
оперативной памяти.
Вспомогательные модули ОС оформляются либо в виде приложений, либо в виде
библиотек процедур.
Поскольку часть модулей ОС выполняются как обычные приложения (т.е. в
стандартном для данной ОС формате), то часто бывает сложно провести четкую грань
между ОС и приложениями.
Решение о том, является ли какая-либо программа частью ОС или нет, принимает
производитель ОС.
Вспомогательные модули ОС подразделяются на следующие группы:

утилиты — программы, решающие отдельные задачи управления и
сопровождения компьютерной системы (например, программы сжатия дисков,
архивирования данных);

системные обрабатывающие программы — текстовые и графические
редакторы, компиляторы, компоновщики, отладчики;

программы предоставления пользователю дополнительных услуг —
специальный пользовательский интерфейс, калькулятор и т. п.

библиотеки процедур – упрощают разработку приложений (например,
библиотека математических функций, функций ввода-вывода и т. п.).
Вспомогательные модули ОС обращаются к функциям ядра посредством системных
вызовов.
Разделение операционной системы на ядро и модули-приложения обеспечивает
легкую расширяемость ОС.
Системные
обрабатываю
щие
программы
Утилиты
Ядро
ОС
Приложений
пользователя
Общая структура ОС
Библиотеки
приложений
Вспомогательные модули ОС загружаются в оперативную память только на время
выполнения своих функций, т.е. являются транзитными.
Важным свойством архитектуры, основанной на ядре, является возможность защиты
кодов и данных операционной системы за счет выполнения функций ядра в
привилегированном режиме.
Обеспечить привилегии ОС невозможно без специальных средств аппаратной
поддержки. Аппаратура компьютера должна поддерживать как минимум два режима
работы: пользовательский режим и привилегированный режим, его также называют
режимом ядра или режимом супервизора.
Приложения ставятся в подчиненное положение за счет запрета выполнения в
пользовательском режиме некоторых критичных команд, связанных с переключением
процессора с задачи на задачу, управлением устройствами ввода-вывода, доступом к
механизмам распределения и защиты памяти.
Условие разрешения выполнения критичных инструкций находятся под контролем
ядра и обеспечивается за счет набора инструкций, безусловно, запрещенных для
пользовательского режима.
Аналогично обеспечиваются привилегии ядра при доступе к памяти. Например,
выполнение инструкции доступа к памяти для приложения разрешается, если инструкция
обращается к области памяти, отведенной Ос данному приложению, и запрещается при
обращении к другим областям.
Между количеством уровней привилегий, реализуемых аппаратно, и количеством
уровней привилегий, поддерживаемых ОС, нет прямого соответствия.
Так, например, на базе четырех уровней, обеспечиваемых процессорами Intel, ОС
OS/2 строит трехуровневую систему привилегий, а Windows NT – двухуровневую.
С другой стороны, если аппаратура поддерживает хотя бы два уровня, программным
способом можно построить ОС со сколь угодно развитой системой защиты.
Рассмотренная архитектура ОС, основанная на привилегированном ядре и
приложениях пользовательского режима, стала классической. Ее используют многие
известные ОС: UNIX, VMS, OS/390, OS/2, Windows NT.
В некоторых случаях разработчики отступают от этой классики, и
привилегированный режим используется и для приложений ОС.
В этом случае обращения приложений к ядру осуществляются быстрее, но при этом
отсутствует надежная аппаратная защита памяти.
Многослойная структура ОС
Вычислительную систему, работающую под управлением ОС на основе ядра, можно
рассматривать как систему, состоящую из трех иерархически расположенных слоев:
 нижний слой – образуется аппаратурой;
 промежуточный — ядро;
 верхний слой – модули, реализующие вспомогательные функции.
– вспомогательные функции
– ядро ОС
– аппаратура
Трехслойная схема вычислительной системы
Слоистую структуру, изображенную на рисунке, удобно представлять для
иллюстрации того факта, что каждый слой может взаимодействовать только с соседним
слоем. При такой организации приложения не могут непосредственно взаимодействовать
с аппаратурой, а только через слой ядра.
Многослойный подход является универсальным и эффективным способом декомпозиции сложных систем. В соответствии с ним система состоит из иерархии слоев.
Каждый слой обслуживает вышележащий слой, выполняя для него некоторый набор
функций, которые образуют межслойный интерфейс.
к слою k+2
слой k+1
межслойный
интерфейс
слой k
к слою k-1
Концепция многослойного взаимодействия
На основе функций нижележащего слоя следующий слой строит свои функции —
более сложные и более мощные, которые, в свою очередь, становятся примитивами для
создания еще более мощных функций вышележащего слоя.
Строгие правила взаимодействия оговариваются только между слоям. Внутри слоя
связи между модулями могут быть произвольными.
Отдельный модуль может выполнить свою работу как самостоятельно, как и
обратиться к другому модулю своего слоя, либо к нижележащему слою через межслойный
интерфейс.
Достоинства такой системы организации:
 упрощается разработка системы;
 при модернизации системы легко производить изменения внутри каждого слоя,
не заботясь о других слоях.
Поскольку ядро представляет собой сложный многофункциональный комплекс, этот
подход распространяют и на структуру ядра.
Например:
 Средства аппаратной поддержки ОС. Сюда относят не все аппаратные
средства, а только те, которые прямо участвуют в организации вычислительных
процессов: средства поддержки привилегированного режима, систему
прерываний, средства переключения контекстов процессов, средства защиты
областей памяти.
 Машинно-зависимые компоненты ОС. Слой образуют программные модули,
в которых отражается специфика аппаратной платформы компьютера. В идеале
этот слой полностью экранирует вышележащие слои ядра от особенностей
аппаратуры. Это позволяет разрабатывать вышележащие слои на основе
машинно-независимых модулей для всех типов аппаратных платформ,
поддерживаемых данной ОС.
 Базовые механизмы ядра. Выполняет наиболее примитивные операции ядра,
такие как переключение контекстов процессов, диспетчеризацию прерываний,
перемещение страниц памяти на диск и обратно и т. п. Модули данного слоя не
принимают решений о распределении ресурсов — исполнительные
механизмами для модулей верхних слоев.
 Менеджеры ресурсов. Слой состоит из мощных функциональных модулей,
реализующих стратегические задачи по управлению основными ресурсами
вычислительной системы. Здесь работают менеджеры (диспетчеры) процессов,
ввода-вывода, файловой системы и оперативной памяти. Разбиение на
менеджеры может быть различным. например менеджер файловой системы
иногда объединяют с менеджером ввода-вывода, а функции управления
доступом пользователей к системе в целом и ее отдельным объектам поручают
отдельному менеджеру безопасности.
Каждый из менеджеров ведет учет свободных и используемых ресурсов
определенного типа и планирует их распределение в соответствии с запросами
приложений.
Для исполнения принятых решений менеджер обращается к нижележащему
слою. Внутри слоя менеджеров существуют тесные взаимосвязи, отражающие
тот факт, что для выполнения процессу нужен доступ одновременно к
нескольким ресурсам — например, процессору, памяти, вводу-выводу и т.п.
 Интерфейс системных вызовов. Это самый верхний слой ядра. Он
взаимодействует непосредственно с приложениями и системными утилитами,
образуя прикладной программный интерфейс ОС. Функции обслуживающие
системные вызовы, предоставляют доступ к ресурсам системы в удобной и
компактной форме, без указания деталей их физического расположения. Для
осуществления таких действий системные вызовы обычно обращаются за
помощью к функциям слоя менеджеров ресурсов и т.д.
Приведенное разбиение ядра ОС на слои – достаточно условно. Такое разбиение и
распределение функций может быть иным.
Также может быть иным способ взаимодействия слоев. Для ускорения работы ядра в
ряде случаях происходит обращение с верхнего слоя к функциям слоев нижнего уровня,
минуя промежуточные.
Выбор количества слоев ядра является ответственным и сложным делом: увеличение
числа слоев ведет к замедлению работы ядра, а уменьшение – ухудшает расширяемость и
логичность системы.
Независимо от того, какие функции выполняет ОС, она должна удовлетворять
эксплуатационным требованиям. Она, в частности, должна обладать следующими
качествами:
1.
Надежностью. В случае ошибки в программном или аппаратном оборудовании
система должна обнаружить ошибку и либо попытаться исправить положения.
Либо сообщить об этом пользователю и постараться свести к минимуму ущерб.
2.
Защитой. Пользователь не хочет, чтобы другие пользователи (если он,
например, работает в сети) ему мешали. Поэтому ОС должна защищать
пользователя от воздействия чужих ошибок и от попыток злоумышленного
вмешательства.
3.
Эффективностью. ОС – довольно сложная программа, которая использует
значительную часть ресурсов для своих собственных надобностей. Ресурсы,
которые потребляют ОС, не поступают в распоряжение пользователя.
Следовательно ОС должна быть, как можно более экономной. Кроме того, она
должна управлять ресурсами пользователей так, что бы свести к минимуму время
задержки и простоев.
4.
Предсказуемостью. Требование, которое пользователь может предъявлять к
системе, в большинстве случаев, непредсказуемы. Но пользователь предпочитает,
что бы обслуживание не очень сильно менялось в течении продолжительного
времени. В частности, ввода программы в машину пользователь должен иметь
основанные на предыдущем опыте приблизительное представление о том, когда
ему следует ожидать выдачи результатов.
5.
Удобством. Все ясно, как и то, что универсальных удобств не существует. Здесь
может идти речь об определенном классе задач.
Пару слов о выполняемых функциях:
Распределение процессора. В случае незамысловатой системы вся она
распределяется как единый ресурс. Пользователь либо распоряжается машиной, либо
ждет, когда она будет предоставлена в его распоряжение. Такую стратегию очень легко
организовать, но она не будет эффективно использовать оборудование. Для того чтобы
работать параллельно с процессором, можно сделать так, чтобы одна программа
выполняла операции ввода-вывода, пока другая занимает главный процессор. Хотя
реализация такого подхода – более сложна, налицо преимущество – каждое устройство
используется более интенсивно.
Управление памятью. Управление памятью тесно связанно с распределением
процессора. Программы могут работать только тогда, когда они находятся в оперативной
памяти, но не обязательно их держать там, если надежда получить процессор – невелика.
В этом случае окажется, что память, которую они занимают – пропадает зря.
Оперативная память – это тоже распределяемый ресурс. Поэтому система расходует
время для того чтобы расположить информацию рационально, стараясь держать полезные
программы в оперативной памяти и уничтожать “свободные промежутки” между
программами. Для этого система может использовать перемещение программ. Это
делается для того, чтобы уменьшить объем бесполезно используемой памяти.
Перемещение легче осуществить, если использовать специальные стратеги организации
памяти. Эти стратегии позволяют ОС весьма гибко регулировать обмен информацией
между оперативной и вспомогательной памятью.
Внешние устройства. Методы распределения устройств ввода-вывода и каналов связи
различны. Задача пользуется периферийным устройством столько времени, сколько ей
нужно, а затем отказывается от него. Устройство с быстрым произвольным доступом,
такие как, накопители на дисках, можно совместно использовать в нескольких задачах по
принципу “операция за операцией”, т.е. нескольким задачам разрешается использовать
устройство попеременно. Если, скажем, две задачи попытаются выполнить операцию
ввода-вывода на одном устройстве одновременно, то возникают очередь и задержка.
Подход к распределению устройств оказывает существенное влияние как на
правильность, так и на эффективность работы.
Стратегия распределения влияет и на эффективность использования устройств,
например, того же диска.
Эффективное распределение периферийных устройств трудно реализовать по двум
причинам:
Во-первых. с помощью существующих математических методов нельзя провести
необходимые исследования и отыскать оптимальные способы распределения нескольких
различных типов устройств для общего случая решения задач.
Во-вторых, эффективность стратегии распределения очень трудно измерить.
Можно оценить только общее внешнее проявление неправильного распределения.
Если же при оценке учитывать и влияние взаимодействия с оперативной памятью и
центральным процессором, то аналитические и эмпирические методы оказываются еще
менее перспективными.
Методы распределения устройств ввода-вывода, контроллеров и каналов сильно
зависит от устройств.
Программные ресурсы. Часто в операционных системах имеются системы
прикладных программ и библиотеки программ пользователей. Будучи ресурсами,
подлежащими распределению, эти библиотеки имеют много общего с аппаратными
ресурсами.
Совместное использование интерпретаторов, редакторов текстов и т.п. можно
организовать, если эти программы допускают параллельное использование.
Если у них рабочая часть полностью отделена от данных и операций записи в память
применяются только к разделу данных, то такие программы допускают параллельное
использование. Если же программа не допускает параллельного использования, то
каждый ее экземпляр может быть в данный момент только одному пользователю, так же,
как и любое аппаратное устройство.
При параллельном использовании каждому пользователю выделяется личный
экземпляр раздела данных, а с единственным экземпляром рабочей части все
пользователи могут работать в режиме разделения.
Супервизор.
Традиционный подход при проектировании ОС состоит в том, что множество
процессов, выполняющих основные функции системы, подчиняются главной программе,
которая называется супервизором. Осуществляя централизованное управление,
супервизор связывает воедино остальные части системы. Он организует совместную
работу программ, устанавливая привилегии или назначая наказание. Он обеспечивает
средства связи и синхронизации между процессами и физическими устройствами. Обычно
и сообщения, передаваемые от процесса к процессу, и запуск и окончание работы
устройств и сигнала от оборудования обрабатываются супервизором.
Супервизор, обычно, управляет разделением всех ресурсов у услуг системы междк
пользователем.
Функции супервизора. Функции супервизора можно грубо разделить на четыре
области:

контроль и управление;

организация связей;

защита и ограничения;

обслуживающие программы;
Контроль и управление. В обязанности супервизора входит установление
последовательности и контроль управления заданий в системе. Для обработки заданий
служат планирование порядка выполнения заданий, учет потребления или ресурсов и
интерпретация языка управления заданиями. Эти функции можно реализовать независимо
от супервизора или подчинить ему.
Пользователь описывает свои требования на некотором языке управления заданиями.
Супервизор интерпретирует эти требования и сообщает различным программам,
распределяющим ресурсы, какие ресурсы и задачи запрошены заданиями. Распределители
ресурсов обслуживают запросы, возможно, в порядке их приоритетов. Программа учета
запоминает количество потребленных ресурсов.
Организация связи. В супервизоре предусмотрены средства связи между различными
программами, когда две независимые программы такие, как файловая система и
программы управления памятью хотят связаться друг с другом, они должны просить
супервизор установить контакт. После установления первоначального контакта
программам разрешается передавать друг другу сообщения, принятым в данной системе
способом, скажем, с помощью “писем” и общего “почтового ящика”. Первоначальна связь
устанавливается через супервизор. Доступная только супервизору информация позволяет
ему также устанавливать контакты между системными программами и программами
пользователей.
Защита и ограничения. Для обеспечения гарантий выполнения работы супервизор
должен наложить некоторые ограничения, как на систему, так и на пользователей.
Имеется ряд программ, обрабатывающих сигналы аппаратуры, особенно отклонения от
нормальных условий. Например, во время работы программы копирования может
возникнуть несколько десятков различных особых ситуаций, например, сбой при чтении
или записи, неготовность дисководов к чтению или записи, отсутствие места на дискете
для копированного файла и т.д.
Когда поступает сигнал об ошибке (обычно это прерывание), супервизор должен
принять решение задержать, повторить или даже выбросить задание. Для всех этих
ситуаций необходимо предусмотреть соответствующие сообщения и корректирующие
действия.
Ограничения должны налагаться на время работы программы и количество
выдаваемых ею результатов.
Супервизор может также организовать систему защиты с помощью специальных
“паролей”.
Доступ к защищенным ресурсам разрешается только по соответствующему паролю.
С целью защиты супервизора в некоторых системах существуют два типа режима
работы:
 режим супервизора;
 рабочий режим.
Благодаря такой предосторожности супервизор обладает особой властью над
привилегированными частями системы и программами пользователей. Супервизор может
защищать себя, храня жизненно важную информацию в защищенной области памяти,
доступной только в режиме супервизора.
Обслуживание программы. Помимо распределения ресурсов супервизорам
выполняет некоторые из функций системы. В нем имеется набор обслуживающих
программ для аварийных сборов, для доступа к библиотекам программ, для обработки
сообщений от программ, работающих в оперативном режиме. Внутри супервизора часто
находятся область памяти, предназначенная для организации связей и таблицы системы
защиты. В ряде случаев, когда требуется выполнить сложные действия, супервизор
вызывает специальные обрабатывающие программы.
Использование супервизора – это пример построения ОС на принципе
централизованного управления.
Идеология централизации ключевых функций системы под контролем супервизора
имеет свои преимущества и недостатки. Одно из преимуществ – простая реализация
защиты. Второе преимущество – простота реализации.
С точки зрения разработки легче сосредоточить важнейшие системные функции в
подчинении супервизора, чем распределять их по всей системе. Лучше всего такой подход
оправдывает себя, когда супервизор делают сравнительно небольшим. К сожалению,
велико искушение передать супервизору очень много функций, превращая его тем самым
собственно в ОС.
У централизованного супервизора есть и существенные недостатки. Так программам
не разрешается устанавливать связи друг с другом самостоятельно.
Микроядерная архитектура
Микроядерная архитектура – альтернатива классическому способу организации в виде
многослойного ядра, работающего в привелигерованном режиме.
Здесь в привилегированном режиме остается работать только очень небольшая часть
ОС, называемая микроядром. Микроядро защищено от остальных частей ОС и
приложений.
Приложения
пользователей
Утилиты ОС
Пользовательский
режим
Серверы ОС
Микроядро
Привелигерованный
режим
Ядро ОС
В состав микроядра входят
1. Машинно-зависимые модули;
2. Модули, выполняющие основные базовые функции ядра по управлению
процессами;
3. Обработка прерываний;
4. Управлению виртуальной памятью;
5. Пересылка сообщений и управление вводом-выводом
Остальные функции ядра оформляются в виде приложений, работающих в
пользовательском режиме. В общем случае многие менеджеры ресурсов, выполняются в
виде модулей, работающих в пользовательском режиме.
Эти менеджеры, однако, имеют принципиальное отличие от традиционных
утилит и обрабатывающих программ ОС, хотя при микроядерной архитектуре все эти
программные компоненты также оформлены в виде приложений. Утилиты и
обрабатывающие программы вызываются в основном пользователями. По
определению, основным назначением такого приложения является обслуживание
запросов других приложений, поэтому менеджеры ресурсов, вынесенные в
пользовательский режим, называются серверами ОС.
Для реализации микроядерной архитектуры необходимым условием является
наличие в ОС удобного и эффективного способа вызова одного процесса из другого.
Поддержка такого механизма – одна из главных задач микроядра.
Преимущества микроядерной архитектуры
 Высокая переносимость;
 Расширяемость;
 Высокая надежность;
 Хорошие предпосылки для поддержки распределенных приложений; так, как
используются механизмы, аналогичные сетевым: взаимодействие клиентов и
серверов путем обмена сообщениями. Серверы микроядерной ОС могут
работать как на одном, так и на нескольких процессорах.
Недостатки микроядерной архитектуры
Более низкая производительность. Это сказывается на скорости работы
прикладных сред, а значит и на скорости выполнения приложений.
Вывод:
Микроядерная аппаратура является альтернативой классическому способу построения
ОС, который предусматривает выполнение своих основных функций ОС в
привилегированном режиме.
В микроядерных ОС в привилегированном режиме остается работать очень
небольшая часть ядра, которая названа микроядром. Все остальные функции ядра
оформляются в виде приложений, работающих в пользовательском режиме.
Микроядерные ОС удовлетворяют большинству требований, предъявляемых к
совершенным ОС, обладая переносимостью, расширяемостью, надежностью и
создают хорошие возможности для поддержки равпределенных приложений.
За эти достоинства приходится расплачиваться снижением производительности и
это основной недостаток микропроцессорной архитектуры.
Микроядерную концепцию используют такие ОС, как Windows NT и некоторые
версии ОС UNIX.
Дополнительная литература:
Андрей Рабаневский “Операционная система UNIX” Спб.: БХВ – СанктПетербург, 1999.
Процессы.
Процесс – основная единица работы в ОС. Рассмотрим сначала наиболее
знакомый тип работы – последовательную программу.
Большую последовательную программу , написанную на алгоритмическом языке,
можно подразделить на меньшие последовательные программы, называемые
процедурами. Если рекурсия исключена, то процедура никогда не может приводиться
в действие несколькими обращениями одновременно. Следовательно, любой работе,
которая выполняется в данный момент, однозначно соответствует действующая
процедура.
Однако, в ОС эта простая связь между выполняемыми работами и процедурами –
утрачена. Одна процедура может работать одновременно в нескольких частях
системы. Например, несколько каналов, связанных с дисками, могут разделять одну
процедуру ввода и наоборот, функция, представляющая по смыслу единую операцию,
например “ввод”, может каждый раз по ходу работы использовать одну или
несколько различных процедур.
Взаимно однозначного соответствия между процедурами и выполняемыми
работами, которое существует в языках последовательного программирования, в ОС
нет. Поэтому понятия процедуры и работы нельзя считать эквивалентными.
Эта параллельность отражается и на программном оборудовании. ОС выполняет
множество работ, которые движутся вперед почти независимо: ввод, вывод,
вычисления на центральном процессоре.
Понятие процесса – формализация идеи “независимой работы”.
Периферийные устройства и связанные с ними каналы работают параллельно с
блоком центрального процессора. В самом центральном процессоре тоже можно
широко использовать параллелизм аппаратного оборудования.
В системах
аппаратного оборудования с несколькими арифметическими процессорами и
большим числом каналов, работающих параллельно, организация работ становится
сложной задачей.
В дополнение к множеству аппаратных устройств, работающих параллельно,
может быть еще несколько заданий, которые также выполняются параллельно.
Эти параллельно выполняемые задания вообще не должны учитывать
существование друг друга. Когда какое либо задание отдает приказ “печатать”, его не
касается то, что другое в это время осуществляет запись на диск и т.д.
Чтобы получить адекватную модель такого функционирования, нудно ввести
единицу работы, которая бы отражала эти параллельность, а это и есть процесс.
Поскольку, работы выполняются независимо и представляющие их процессы
работают с различными скоростями, то должны допускаться произвольные
соотношения скоростей выполнения процессов.
Итак, процессы – независимые работы, которые выполняются параллельно и
различными скоростями.
Работам, иногда, все-таки необходимо обмениваться информацией. Поэтому они
не вполне независимы. Однако общение между процессами должно проходить только
по четким, строго определенным схемам во избежание путаницы и неопределенности.
Кроме того, делается допущение, что операции внутри процесса выполняются в
строго определенной последовательности.
Следует попытаться дать формальное определение понятию процесса, поскольку
существует очень определений этого понятия. Пусть X  x 0 , x1 , ... , xN , . ..– набор
переменных, характеризующих состояние, называемый набором переменных
состояния. Состояние описывается задание значений всех элементов, входящих в
набор переменных состояния.
Пространство состояний для данного набора переменных состояния – множество
состояний, которые может принимать этот набор переменных.
Действие – присваивание значений некоторым из переменных данного набора.
Последовательность состояний, принадлежащих пространству состояний, называется
работой.
Один из способов произвести работу состоит в последовательном применении
различных действий. Каждое действие порождает новое состояние, которое по
определению и есть работа.
Функция действия – это функция, которая отображает состояние в действии.
Функция действия может также порождать работу по заданному начальному
состоянию. Они просто описывают действие, которое надо применить к каждому
очередному состоянию, а это действие порождает новое состояние и т.д. до
бесконечности.
На содержательном уровне набор переменных – память, состояние – содержимое
памяти, функция действия – программа.
Следовательно, можно определить процесс как тройку: пространство состояний,
функцию действия в этом пространстве состояний, и особые элементы этого
пространства состояний – начальное состояние.
Пример:
Пусть задан процесс P имеющий две переменные x и y. Работу процесса Р можно
описать последовательностью состояний: 2,1, 4, 2, 6, 3, 8, 4...2i, i... .
Работу процесса можно такде описать, указав пространство состояний
i, j, гдеi, j  натуральны е числа , одно из начальных состояний 2,1 и функцию
действия, которая над всеми состояниями производит действия x, y  x  2, y  1 .
Каждое состояние процесса – это “моментальный снимок” хода работы, который
выполняет процесс. Пусть программа вместе со своими переменными находится в
оперативной памяти, можно проследить за выполнение программы, наблюдая за
связанными с ней ячейками и регистрами. Последовательность состояний описывает
ход работы программы в данной среде.
Ясно, что если у двух процессов отдельные наборы переменных состояния, то они
не могут взаимодействовать. Общение между процессами обеспечивается
разделяемыми переменными.
В ряде ОС кроме понятия процесс выделяется еще более мелкая единица, которая
называется поток.
В чем же разница?
В ОС, где существуют и процессы, и потоки процесс рассматривается, как заявка
на потребление всех видов ресурсов, кроме одного процессорного времени.
Это важнейший ресурс распределяется ОС между потоками, которые получили
свое название благодаря тому, что они представляют собой последовательности
(потоки выполнения) команд. Потоки возникли как средства распараллеливания
вычислений.
В простейшем случае процесс состоит из одного потока. В дальнейшем мы будем,
с целью упрощения, отождествлять эти понятия и пользоваться термином процесс.
Реализация процессов.
Каждый программный процесс однозначно определяется информационной
структурой, называемой дескриптором процесса. В типичной системе дескриптор
процесса состоит из:
1.
Переменной состояния, которая определяет положение процесса (готов к
работе, работающий, заблокирован).
2.
Защищенной области памяти, в которой находятся текущие значения
регистров, когда процесс прерывается, не закончив работы.
3.
Информации о ресурсах, которыми процесс владеет или имеет право
пользоваться.
Кроме этого, в дескрипторе процесса может быть отведено место для организации
общения с другими процессам.
Очень важно различать абстрактный и программный процессы.
Программный процесс – это и абстрактный процесс, а обратное не всегда верно.
Дескриптор и область памяти, из которой состоит программный процесс, должны
быть выделены из имеющихся у машин ресурсов.
Есть два подхода к образованию программных процессов.
Можно построить систему с фиксированным числом программных процессов,
которые существуют всегда. В таком случае программные процессы образуются
одновременно с системой.
Чтобы выполнить работу, необходимо только получить в свое распоряжение один
из существующих программных процессов.
Абстрактных процессов может быть больше, чем имеется программных
процессов. Поэтому абстрактному процессу, возможно, придется ожидать, когда ему
будет предоставлен программный процесс для выполнения работы.
Другой путь состоит в том, что в системе предусматривают механизм, который
образует и уничтожает программные процессы, когда поступает соответствующий
запрос.
Этот механизм, который сам программным процессом не является, дает системе
возможность манипулировать программными процессам. Он называется стержнем.
В процессе могут вызывать образования или уничтожение других процессов. Так
один процесс может потребовать, чтобы стержень образовал другой процесс.
Стержень заводит дескриптор нового процесса, выделяет для процессов память и
сообщает о завершении этой деятельности образующему процессу. Тогда
образующий процесс помещает в память нового процесса программу (т.е.
представления некоторой функции действия). В стержне предусмотрена команда
“запустить”, которая выделяет процессу процессор.
Аналогично команда “остановить” отбирает у процесса процессор, а команда
“уничтожить” отбирает дескриптор и ресурсы.
В системе с единственным процессором может существовать несколько
процессов. При этом стержень дает каждому процессу возможность пользоваться
процессором в определенные моменты времени.
Процессы могут существовать как не связанные друг с другом единицы, или могут
быть связаны особыми отношениями, образуя структуры. Если система не
предусматривает такой структурной организации, то супервизор обязан по мере
надобности образовывать процессы. При появлении задачи супервизор образует
процесс для выполнения задачи. Когда задача выполнена, процесс уничтожается. При
такой организации все процессы равны.
В более сложных системах процессы могут быть неравными. Например, они могут
составлять древовидную структуру.
В системе с древовидной структурой процесс называют отцом всех процессов,
которые он образует, и процесс называют сыном того процесса, который его
образовал. Здесь имеет место определение предков и потомков. Генеалогическое
дерево процессов в системе есть ориентированный граф, где каждый процесс
представляется вершиной, а дуга выходит из вершины A и заходит в вершину B тогда
и только тогда, когда A – отец B. Генеалогическое дерево описывает
упорядоченность процессов внутри системы в любой момент времени.
В системе с древовидной структурой могут быть очень строгие правила,
относительно передачи ресурсов и организации управления.
Например, при образовании каждый процесс может получить лишь те ресурсы,
которые “принадлежат” его отцу. Отец может иметь право контролировать действия
своих сыновей и принимать действия для исправления ненормальных ситуаций.
А
B
C
D
H
E
G
F
Дерево образования процессов
У такой структурированной системы есть преимущества:
 Распределение ресурсов находится под строгим контролем. Ресурсы
всякого процесса были когда-то собственностью каждого из его предков.
Если процесс хочет освободить некоторые из своих ресурсов, он может
отдать их только своему отцу. Никогда не бывает неясностей, какой ресурс
принадлежит какому процессу.
 Вся структура в целом такова, что у одних процессов больше власти, чем у
других, т.е. в ней предусмотрен простой механизм разделения труда.
 Благодаря наличию структуры всегда ясно, какому процессу принадлежит
управление: отец управляет сыновьями.
В бесструктурной системе все знает и делает супервизор. Хотя централизованное
управление допускает большую свободу при разбиении задач, оно усложняет ведение
учета, так как супервизору приходится следить за каждым процессом в системе.
Общение между процессами.
Если мы хотим использовать эффективно аппаратные и программные ресурсы.
Они подлежат разделению.
Рассмотрим задание пользователя, которое выполняется в системе, как единый
программный процесс. Редко бывает, когда этому процессу в течение всего времени
существования требовалось какое-нибудь аппаратное устройство для единоличного
пользования.
Допустим, он использует канал для работы с периферийным устройствам. Если
канал обслуживает требование процесса скорее, чем последний их порождает, есть
смысл организовать разделение единственного канала между несколькими
процессами.
Для снижения потерь из-за неэффективного использования программного
оборудования можно также и здесь воспользоваться разделением.
Возьмем, например, такую программу как компилятор. Если процессу требуется
оттранслировать программу, он может скопировать программу компилятора в свою
память и выполнить компиляцию. Если этим компилятором пользуются несколько
процессов, то такое размножение, с точки зрения ресурсов памяти, неоптимально.
Целесообразно разделить по времени один экземпляр компилятора.
Заметим, что у аппаратных и программных ресурсов есть общие свойства.
Посмотрим на систему управления файлами, которая в каждый момент может
обслуживать запросы только одного процесса.
Если эта система – программный ресурс, ее разделение организуется точно так,
как и разделение аппаратных ресурсов.
Физические устройства называются физическими или естественными ресурсами.
Часть программного обеспечения, которая ведет себя подобно физическому
ресурсу, называется логическим ресурсом.
Каждому из процессов, функционирующих в системе неважно, какие ресурсы он
использует – физические или логические.
Процессу безразлично, каким он пользуется ресурсом – физическим или
логическим, важно, чтобы ресурс делал то, что положено.
Синхронизация процессов.
Не смотря на то, что ресурсы можно разделять, они обычно доступны в каждый
момент только одному процессу. Ресурс, который допускает обслуживание только
одного пользователя за один раз, называется критическим ресурсом.
Если несколько процессов хотят использовать критический ресурс в режиме
разделения времени, им следует синхронизировать свои действия таким образом,
чтобы этот ресурс всегда находился в распоряжении не более, чем одного из них.
Если ресурс занят, то остальные процессы, которым он нужен, временно получают
отказ и должны ждать, пока он не освободиться.
Внутри каждого процесса можно выделить места, в которых происходит
обращение к критическим ресурсам. Эти места называются критическими
участками.
Рассмотрим два независимых процесса:
parbegin
Процесс_1: do while (true)
begin
Критический участок 1;
end;
Оставшаяся часть процесса 1;
end;
Процесс_2: do while (true)
begin
Критический участок 2;
end;
Оставшаяся часть процесса 2;
end;
Конструкция вида:
parbegin
Оператор 1;
Оператор 1;
...
Оператор 1;
parend.
Означает, что операторы 1N выполняются параллельно.
Кстати, записи, приведенные выше, называются записями на псевдокоде.
Критические участки процессов соответствуют тем группам операция, которые
обращаются к разделяемому критическому ресурсу.
Чтобы не допустить одновременного выполнения обоих критических участков, в
системе должен быть предусмотрен механизм, который бы синхронизировал эти два
процесса. Этот механизм должен обладать двумя свойствами:
1.
Если один или несколько процессов хотят обратиться к своим критическим
участкам, то один из них должен получить разрешение войти в свой
критический участок.
2.
В каждый момент времени не более, чем одному процессу разрешается
находиться в своем критическом участке.
У процессов возникает не только проблема синхронизации, но и необходимость в
обмене информацией.
Назовем словом “поставщик” процесс, который отправляет порции информации
другому процессу, который назовем “потребитель”.
Эти порции информации можно рассматривать как сообщения.
Один из методов, применяемых при реализации передачи сообщений, состоит в
том, что заводит пул свободных буферов, каждый из которых может содержать одно
сообщение.
Между процессами Поставщик и Потребитель имеется очередь заполненных
буферов, содержащих сообщение. Когда Поставщик хочет послать сообщение, он
добавляет в хвост этой очереди еще один буфер. Потребитель, что бы получить
сообщение, забирает из очереди буфер, который стоит в ее начале.
Такая организация требует, чтобы Поставщик и Потребитель кооперировались во
многих областях. Они должны следить за количеством заполненных и свободных
буферов. Поставщик может передавать сообщение только до тех пор, пока имеются
свободные буфера. Потребитель может получать сообщения только, если очередь не
пуста.
Для учета заполненных и свободных буферов нужны разделяемые переменные. Но
раз переменные используются в режиме разделения, то потребуется и критические
участки. Следовательно, изменять значение счетчика заполненных буферов следует в
режиме взаимного исключения.
Та же проблема возникает при реализации очереди сообщений. Пусть очередь
реализована в виде связного списка. Если Поставщик добавляет сообщение в очередь
как раз в тот момент, когда Потребитель забирает из нее самое последнее сообщение,
может получиться неправильная ссылка в списке.
Такие процессы как Поставщик и Потребитель, общающиеся на равных правах,
называются и сопрограммами. К сожалению, в литературе этому термину дается
очень много различных определений. Чтобы избежать путаницы мы вместо него
будем пользоваться термином “кооперирующиеся процессы”.
Если процессу Поставщик важно знать, что его сообщение получено, то
Потребитель должен подтверждать получение каждого сообщения, т.е. Поставщик и
Потребитель поменяются местами.
Если в системе имеется несколько пар “Поставщик – Потребитель”, то можно
организовать разделение свободных буферов, объединив их общий пул.
Остановимся на решении проблем синхронизации и отношений типа “Поставщик
– Потребитель”.
Синхронизация с помощью элементарных приемов нижнего
уровня.
1. Блокировка памяти.
Взаимное исключение реализуют аппаратно, сделав операции над памятью
неделимыми, т.е. если каждый из двух процессов пытается поместить какие-то
значения в одну и ту же ячейку, то спор разрешается аппаратно: одному процессу
разрешается выполнить операцию засылки немедленно, а другому приходиться
ждать, пока первый не закончит. Такое решение называется блокировкой памяти.
Вернемся к рассмотрению примера с двумя параллельными процессами.
Поскольку скорости обоих процессов – произвольны, указанные выше условия
должны выполняться каковы бы ни были скорости работы каждого процесса
относительно другого.
Казалось бы, ничего проще нет, как предложить следующее решение:
Boolean : Переключатель_1, Переключатель_2;
Begin
Переключатель_1:=False;
Переключатель_2:=False;
parbegin
Процесс_1: do while (True);
Цикл_1:
do while (Переключатель_2);
end;
Переключатель_1:=True;
/* Критический участок 1 */
Переключатель_1:=False;
/* Оставшаяся часть процесса 1*/
end;
Процесс_2: do while (True);
Цикл_2:
do while (Переключатель_1);
end;
Переключатель_2:=True;
/* Критический участок 2 */
Переключатель_2:=False;
/* Оставшаяся часть процесса 2*/
end;
parend;
End.
Однако, поскольку скорости произвольны, допустим, что Процесс 2 работает
гораздо быстрее, чем Процесс 1. Настолько быстрее, что фактически после того, как
Процесс 1 обнаруживает, что в Переключателе 2 стоит ”ложь”, но прежде чем он
успеет установить значение “истина”, в Переключателе 1, Процесс 2 пробегает свою
оставшуюся часть и перескакивает через Цикл 2 (поскольку в Переключателе 1 все
еще стоит значение “ложь”). Оба процесса в таком случае перейдут к выполнению
(одновременно) своих критических участков, т.е. в таком переключательном случае
система будет работать неправильно.
Предлагаю вам самостоятельно попытаться изменить приведенную программу
так, чтобы она удовлетворяла ограничениям, налагаемым на решение проблемы
критического участка.
Мы же приведем вариант решения, предложенного Деккером.
Алгоритм Деккера:
integer: C1,C2,Очередь;
begin
C1:=0;
C2:=0;
Очередь:=1;
parbegin
Процесс_1: begin C1:=1;
do while (C2=1);
if Очередь=2 then
begin
C1:=0;
do while (Очередь=2);
end;
C1:=1;
end;
end;
Критический участок Процесса 1;
C1:=0;
Очередь:=2;
Оставшаяся часть Процесса 1;
end;
Процесс_2: begin C2:=1;
do while (C1=1);
if Очередь=1 then
begin
C2:=0;
do while (Очередь=1);
end;
C2:=1;
end;
end;
Критический участок Процесса 2;
C2:=0;
Очередь:=1;
Оставшаяся часть Процесса 2;
end;
parend;
end.
Здесь введена дополнительная переменная – Очередь, которая указывает, чья
очередь попытаться войти, при условии, что оба процесса хотят выполнить свои
критические участки. Это решение имеет обобщение для случая произвольного числа
процессов, конкурирующих из-за критического ресурса.
2. Проверка и установка.
Эта машинная операция значительно упрощает решение проблемы критического
участка.
К операции “проверка и установка” обращаются с двумя параметрами:
“локальный” и “общий”. Операция берет значение параметра “общий” и присваивает
его переменной “локальный”, а затем устанавливает в переменной “общий” значение
равное единице.
Главное свойство этой операции – ее неделимость. Когда процесс выполняет
операцию “проверка и установка” никаких действий не может произойти между ее
началом и концом.
Переменная “общий” разделяется между процессами, которые подлежат
синхронизации по отношению к некоторому критическому ресурсу. У каждого
процесса есть своя собственная переменная “локальный”.
Если “общий” = 1, это значит, что какой-то процесс находится в своем
критическом участке. Начальное значение переменной “общий” = 0.
Приведем решение проблемы методом “проверка и установка”. В этом решени
предпологается, что в машине предусмотрена блокировка памяти, т.е. операция
“общий” := 0 неделима.
Алгоритм проверки и установки:
integer: ОБЩИЙ;
begin
ОБЩИЙ:=0;
parbegin
integer: ЛОКАЛЬНЫЙ1;
Процесс_1: begin do while (True);
ЛОКАЛЬНЫЙ1:=1;
do while (ЛОКАЛЬНЫЙ1=1)
Проверка и установка(ЛОКАЛЬНЫЙ1,ОБЩИЙ)
end;
Критический участок 1;
ОБЩИЙ:=0;
Оставшаяся часть Процесса 1;
end;
end;
integer: ЛОКАЛЬНЫЙ2;
Процесс_2: begin do while (True);
ЛОКАЛЬНЫЙ2:=1;
do while (ЛОКАЛЬНЫЙ2=1)
Проверка и установка(ЛОКАЛЬНЫЙ2,ОБЩИЙ)
end;
Критический участок 2;
ОБЩИЙ:=0;
Оставшаяся часть Процесса 2;
end;
end;
parend;
end.
Оба рассмотренных метода могут оказаться достаточно неэффективными,
поскольку всякий раз, когда один процесс выполняет свой критический участок,
любой другой процесс, который тоже хочет войти в критический участок, попадает в
цикл и должен там ожидать разрешения.
При таком ожидании в цикле, которое называется активным ожиданием,
напрасно расходуется время центрального процессора.
Одним из приемов, позволяющих избежать активного избежания является
“семафор”.
3. Семафоры.
Семафор – целая переменная, значения которой могут менять только операции P и
V. Пусть S – семафор. Когда процесс выполняет операцию P(S), S уменьшается на
единицу и
1. Если S0, то процесс продолжает работу.
2. Если S<0, то процесс останавливается и становится в очередь ожидания,
связанную с S. Он остается заблокированным до тех пор, пока операция V(S),
выполненная другим процессом, не освободит его.
Когда процесс выполняет V(S), S увеличивается на единицу и
1. Если S>0, процесс продолжает работу.
2. Если S0, то один процесс изымается из очереди ожидания и получает
разрешение продожить работу. Процесс, который обратился к операции V(S),
тоже может продолжать работу.
Кроме того, операции P и V – неделимы. В каждый момент времени только один
процесс может выполнять операцию P или V над данным семафором. Поэтому если,
S=1 и два процесса одновременно попытаются выполнить операцию P(S), то только
одному из них будет позволено продолжить работу. Другой процесс будет
заблокирован и поставлен в очередь к семафору S.
Ранее мы говорили о том, что стержень системы – это механизм, который
реализует процессы. Стержень должен выделять процессам и отбирать у них
процессоры. Операции P и V можно реализовать внутри стержня. Таким образом,
обеспечивается неделимость этой операции.
Семафор, максимальное значение которого равно единице, называется двоичным
семафором.
С помощью двоичного семафора процессы могут организовать взаимное
исключение с помощью операций P(S) и V(S).
Пример:
integer: СВОБОДНЫЙ;
begin
СВОБОДНЫЙ:=1;
parbegin
Процесс_1: begin
end;
Процесс_2: begin
end;
parend;
end.
do while (True);
Начало Процесса 1;
P(СВОБОДНЫЙ);
Критический участок 1;
V(СВОБОДНЫЙ);
Оставшаяся часть Процесса 1;
end;
do while (True);
Начало Процесса 2;
P(СВОБОДНЫЙ);
Критический участок 2;
V(СВОБОДНЫЙ);
Оставшаяся часть Процесса 2;
end;
Здесь S принимает значения 1, 0, -1. Если S=1, это значит, что ни один процесс не
находится в своем критическом участке. Если S=0 –один процесс находится в своем
критическом участке. Если S=-1 – один процесс находится в своем критическом
участке, а второй – в очереди ожидания.
Решение, использующее двоичные семафоры, применимо точно так же и в случае
большого числа процессов. Если алгоритм Деккера становится очень сложным более,
чем двух процессов, решение с семафором остается тривиальным. В этом главное
преимущество семафора.
С помощью общих семафоров легко решается проблема “Поставщик–
Потребитель”.
Переменная “наличие” – семафор, значение которого равно числу свободных
буферов в пуле.
Переменная “заполн” – семафор, значение которого равно числу заполненных
буферов, которые были отосланы потребителю.
Семафор “взаиск” (взаимное исключение) – двоичный. Он гарантирует, что в
каждый момент только один процесс сможет работать с буферными стрелками.
integer: НАЛИЧИЕ,ЗАПОЛН,ВЗАИСК;
begin
НАЛИЧИЕ:= количество свободных буферов;
ЗАПОЛН := 0;
ВЗАИСК := 1;
parbegin
ПОСТАВЩИК: begin do while (True);
Приготовить сообщение;
P(НАЛИЧИЕ);
P(ВЗАИСК);
Послать сообщение;
V(ЗАПОЛН);
V(ВЗАИСК);
end;
end;
ПОТРЕБИТЕЛЬ: begin do while (True);
P(ЗАПОЛН);
P(ВЗАИСК);
Получить сообщение;
V(НАЛИЧИЕ);
V(ВЗАИСК);
Обработать сообщение;
end;
end;
parend;
end.
С помощью общих семафоров можно организовать управление ресурсами,
например, дисков и для синхронизации процессов.
Однако, при использовании семафоров для синхронизации и управления
ресурсами возникают трудности, связанные с организацией очереди к семафору.
Если значение семафора S становится отрицательным, это значит, что очереди,
связанной с S, ожидает один или несколько процессов.
Когда выполняется очередная операция V(S), стержень должен выбрать, какой
процесс надо взять из очереди. Стержень системы может обслуживать очередь в
порядке поступления или использовать приоритетную схему обслуживания. Порядок
обслуживания очереди должен обуславливаться целями, для которых применяется
данный семафор. Вопрос определения дисциплины обслуживания при
проектировании ОС тесно связан с моделированием вычислительных процессов, для
чего могут быть эффективно использованы модели массового обслуживания.
Приоритет процесса можно определять динамически по числу дорогих ресурсов,
которыми этот процесс распоряжается.
Считается, что семафоры – достаточно эффективное средство для удовлетворения
потребностей ОС при реализации синхронизации и общения между процессами.
Тем не менее, часто семафоры оказываются неудобным средством. Например,
сложно реализовать схему передачи сообщений между несколькими процессами.
Элементарные приемы синхронизации на верхнем уровне.
1. Почтовые ящики.
Если процесс Р1 хочет общаться с процессом Р2, Р1 просит систему образовать
почтовый ящик, который свяжет эти два процесса так, чтобы они могли передавать
друг другу сообщения. Для того, чтобы послать процессу Р2 какое-то сообщение
процесс Р1 просто помещает это сообщение в почтовый ящик, откуда процесс Р2
может его в любое время взять. При применении почтового ящика процесс Р2 в конце
концов обязательно получит сообщение, когда обратиться за ним, если вообще
обратиться.
Почтовый ящик – это информационная структура, для которой задаются
правила, описывающие ее работу. Она состоит из головного элемента, в котором
находится описание данного почтового ящика, и из нескольких гнезд, в которые
помещают сообщения. Размер каждого гнезда и количество гнезд, обычно задаются
при образовании почтового ящика. Правила работы могут быть различными, в
зависимости от сложности почтового ящика.
В простейшем случае, сообщения передаются только в одном направлении.
Процесс Р1 может посылать сообщение до тех пор, пока имеются свободные гнезда.
Если все гнезда заполнены, то процесс Р1 может либо ждать, либо заняться другими
делами и попытаться послать сообщение позже.
Аналогично Р2 может получать сообщения до тех пор, пока имеются заполненные
гнезда.
Двусторонняя связь. Используется, если необходимо передавать подтверждение
о получении сообщения. При этом разрешается передача сообщений через почтовый
ящик в обоих направлениях. Если передающий процесс Р1 работает быстрее, чем
принимающий процесс Р2, Р1 может заполнить все гнезда, не оставив Р2 гнезд для
ответных сообщений. Чтобы этого не произошло, требуют, чтобы ответы
пересылались в тех же гнездах, в которых находились вызывавшие их сообщения.
Многовходовые почтовые ящики. Используют, когда нескольким процессам
необходимо общаться с одним процессом. Примером может служить система
управления файлами. Такие ящики более эффективны по сравнению с тем, если бы
для каждого отдельного процесса заводился бы свой почтовый ящик, но реализация
более сложна.
Порты. Для отсылки сообщения в почтовый ящик процесс должен знать его имя.
Иногда это не удобно. Порт – это связующее звено между процессом и почтовым
ящиком. Когда почтовый ящик соединен с определенным портом, процессу, чтобы
отослать сообщение, нужно указать только имя порта.
В одном из вариантов реализации, у каждого из процессов может быть вводной и
выводной порты. Почтовые ящики создаются и уничтожаются процессами. Когда
процесс создает почтовый ящик, его связывают с каким- либо портом с помощью
команды “связать”. Чтобы отменить связь ее заменяют связью между фиктивным
портом и почтовым ящиком соответственно. Владелец почтового ящика может его
уничтожить. Память, которую он занимал, возвращается предоставившему ее
процессу.
Монитор Хоара. Монитор – набор процедур и информационных структур,
которым процессы пользуются в режиме разделения, причем в каждый момент им
может пользоваться только один процесс.
Монитор можно представить себе как комнату, от которой есть только один ключ.
Если какой-то процесс намеревается воспользоваться этой комнатой и ключ
находится снаружи, то этот процесс может отпереть комнату, войти и
воспользоваться одной из процедур монитора.
Если ключа снаружи нет, то процессу придется ждать, пока тот, кто пользуется
комнатой в данный момент, не выйдет из нее и не отдаст ключ. Кроме того, в комнате
нельзя оставаться навсегда.
Рассмотрим, например, ресурс, который распределяет некоторая программа –
планировщик.
Каждый раз, когда процесс хочет получить в свое распоряжение какие-то части
ресурса, он должен обратиться к планировщику. Процедуру-планировщик разделяют
все процессы, и каждый процесс может в любой момент обратиться к планировщику.
Но планировщик не в состоянии обслуживать одновременно более одного процесса.
Значит, планировщик представляет собой пример монитора.
Иногда монитору необходимо задержать обратившийся процесс, если процесс
просит ресурс, который уже кем-то используется, до предоставления ресурса.
Следует подчеркнуть, что монитор – это пассивный объект, как комната. Это не
процесс. Монитор оживает только тогда, когда какой-либо процесс решает
воспользоваться его услугами. Особенностью программы-монитора состоит в том,
что в любой момент ее может выполнить только один процесс.
Использование монитора иллюстрирует Пример 1, на котором изображена
реализация операций P и V над семафором S. Выражение вида ИМЯ
УСЛОВИЯ.ЖДАТЬ и ИМЯ УСЛОВИЯ.СИГНАЛ относятся к операциям “ждать” и
”сигнал”, связанным с условием ИМЯ УСЛОВИЯ.
Пример 1.
ДВОИЧНЫЙ_СЕМАФОР : monitor;
S: integer;
begin
condition СЕМАФОР ПОЛОЖИТЕЛЬНЫЙ;
Procedure P;
begin
if S<1 then СЕМАФОР ПОЛОЖИТЕЛЬНЫЙ.ЖДАТЬ;
S:=S-1;
end;
Procedure V;
begin
S:=S+1;
if S=1 then СЕМАФОР ПОЛОЖИТЕЛЬНЫЙ.СИГНАЛ;
end;
end.
Обращение к операциям P и V записываются как ДВОИЧНЫЙ СЕМАФОР.Р и
ДВОИЧНЫЙ СЕМАФОР.V. Условие СЕМАФОР ПОЛОЖИТЕЛЬНЫЙ указывает, когда
заблокированный процесс может безопасно продолжать работу. На примере два
процесса взаимно исключаются из критического участка с помощью двоичного
семафора, реализованного в мониторе.
Begin
parbegin
P1: begin
P2: begin
do while (True);
call ДВОИЧНЫЙ СЕМАФОР.P;
Критический участок P1;
call ДВОИЧНЫЙ СЕМАФОР.V;
Оставшаяся часть P1;
end;
end;
do while (True);
call ДВОИЧНЫЙ СЕМАФОР.P;
Критический участок P2;
call ДВОИЧНЫЙ СЕМАФОР.V;
Оставшаяся часть P2;
end;
end;
parend;
end.
Семантика монитора гарантирует, что если хотя бы один процесс ожидает
выполнение условия, то никакой другой, обратившийся процесс не может вмешаться
между сигналом о выполнении этого условия и продолжением ровно одного из
ожидающих процессов.
По сравнению с семафорами мониторы имеют преимущества в том, что
 Мониторы – очень гибкий инструмент. Например, почтовый ящик можно
реализовать с его помощью
 Осуществляется локализация всех разделяемых переменных внутри тела
монитора, что позволяет избавиться от малоприятных конструкция в
синхронизируемых процессах.
Тупики.
Ситуация, когда процессы ждут друг друга неопределенно долго, называется
тупиком или дедлоком (deadlock).
Существует три основных направления политики избежания тупиков:
 предотвращение тупиков;
 автоматическое обнаружение;
 обнаружение при участии оператора.
Метод автоматического обнаружения тупиков допускает, чтобы система попала в
тупиковую ситуация, но имеет возможность это обнаружить программным путем.
Затем система отбирает ресурсы у других процессов и отдает их на то, чтобы
сдвинуть с места процессы, попавшие в тупик.
Третий подход основан на том, что тупиковые ситуации возникают слишком
редко, чтобы о них следовало беспокоиться. Когда такая ситуация все же возникает,
оператор ее обнаруживает и перезапускает систему. Иногда это обходиться слишком
дорого, в частности, дискредитирует систему в глазах пользователя.
Алгоритм предотвращения тупиковых ситуаций.
Рассмотрим систему, в которой процессы конкурируют из-за лентопротяжных
устройств если процессу предоставить все требуемые устройства, которые ему
нужны, он будет работать в течении конечного отрезка времени, после чего он
возвращает все затребованные устройства.
Рассмотрим пример:
Пусть двум процессам, выполняющимся в режиме мультипрограммирования для
выполнения работы нужно два ресурса, например, принтер и последовательный порт.
Такая ситуация может возникнуть, например, во время распечатки информации,
поступающей по модемной связи.
Представим фрагмент двух програм:
Процесс А
Процесс В
……..
A1 Занять ПОРТ
A2 Занять ДИСК
……..
……..
A3 Освободить ПОРТ
A4 Освободить ДИСК
……..
а)
Процесс А
Процесс В
……..
B1 Занять ДИСК
B2 Занять ПОРТ
……..
……..
B3 Освободить ДИСК
B4 Освободить ПОРТ
……..
Прерывание А
Блокировка А
А2
А1
В2 Блокировка В
В1
Блокировка А
Прерывание А
Процесс А
b)
Процесс В
А1
А3
А2
В1 Блокировка В
с)
Процесс А
Процесс В
Прерывание А
А4
В1 В2 В3 В4
А1 А2 А3 А4
В1 В2 В3 В4
Возникновение взаимных блокировок, при выполнении программ
В зависимости от соотношения скоростей процессов, они могут либо взаимно
блокировать друг друга (дедлок a), либо образовывать очереди к разделяемым
ресурсам, либо совершенно независимо использовать разделяемые ресурсы (С).
Программа должна удовлетворять запросы таким образом, чтобы процессы могли
закончиться, и не возникло тупиков.
Пусть система состоит из трех процессов и десяти устройств. Каждому процессу
соответствует его максимальная потребность в устройствах, количество их,
выделенное процессу в данный момент и количество, которое он еще имеет право
потребовать.
На рисунке а) изображено некоторое состояние системы:
a)
Имя процесса
Максимальная
потребность
Выделено
Остаток
A
B
C
4
6
8
2
3
2
2
3
6
Имя процесса
Максимальная
потребность
Выделено
Остаток
б)
A
4
2
2
B
6
3
3
C
8
4
4
Допустим, процесс С запросил еще два устройства и его удовлетворили, то если
один из процессов запросит то количество устройств, которое ему положено
максимально или больше 1 для завершения, будет дедлок. Поэтому удовлетворять
запрос С – опасно.
Для определения, ведет ли удовлетворение запроса к опасному состоянию,
существуют специальные алгоритмы.
Один из них носит название “Алгоритм Банкира”.
Каждому процессу поставлено в соответствие целое число i (1 i N). Процессу i
соответствуют его максимальная потребность в устройствах МАКС(i), количество
устройств, выделенных ему в данный момент ВЫДЕЛУСТР(i), полагающийся ему
остаток – ОСТАТОК(i) и признак МОЖЕТ НЕ ЗАКОНЧИТЬ(i).
Системы заводят глобальную переменную ОБЩУТР, обозначающую общее число
имеющихся в системе устройств.
В начале работы неизвестно, может ли какой либо процесс окончиться МОЖЕТ
НЕ ЗАКОНЧИТЬ(i) true для всех i.
Каждый раз, когда какой-то ОСТАТОК может быть выделен из числа остающихся
незанятыми устройств, предполагается, что соответствующий процесс работает, пока
не окончиться, а затем его устройства освобождаются.
Если состояние системы становится небезопасным, то она не удовлетворяет
соответствующий запрос.
..........
СВОБУСТР:=ОБЩУСТР;
for i:=1 step 1 until N do
begin
СВОБУСТР:=СВОБУСТР-ВЫДЕЛУСТР(i);
МОЖЕТНЕЗАКОНЧИТЬ(i):=True;
ОСТАТОК(i):=МАКС(i)-ВЫДЕЛУСТР(i);
end;
ПРИЗНАК:=Ture;
do while (ПРИЗНАК);
ПРИЗНАК:=False;
for i:=1 step 1 until N do
begin
if МОЖЕТНЕЗАКОНЧИТЬ(i) and ОСТАТОК(i) <= СВОБУСТР;
СВОБУСТР:=СВОБУСТР+ВЫДЕЛУСТР(i);
ПРИЗНАК:=True;
end; end; end; end;
if СВОБУСТР=ОБЩУСТР then Состояние системы безопасное
else Состояние системы не безопасное
..........
Распределение времени процессора.
Время процессора всегда было важнейшим из ресурсов системы, подлежащих
распределению.
Мультипрограммирование или многозадачность – способ организации
вычислительного процесса, при некотором на одном процессоре попеременно
выполняются сразу несколько программ.
Наиболее характерными критериями эффективности вычислительных систем
являются:
 Пропускная
способность
–
количество
задач,
выполняемых
вычислительной системой в единицу времени.
 Удобства работы пользователей, заключается в том, что они имеют
возможность интерактивно работать одновременно с несколькими
приложениями на одной машине.
 Реактивность системы – способность системы выдерживать заранее
заданные интервалы времени между запуском программы и получением
результата.
В зависимости от этого ОС делятся на:
 Системы пакетной обработки;
 Системы разделения времени;
 Системы реального времени.
Системы пакетной обработки. Предназначались для решения задач вычислительного
характера, не требующих быстрого получения результатов. Главной целью и критерием
эффективности систем пакетной обработки является максимальная пропускная
способность.
Для этой цели формируется пакет заданий, каждое задание содержит требования к
системным ресурсам, из этих заданий формируется мультипрограммная смесь, т.е.
множество одновременно выполняющихся задач.
Для пакетных ОС характерно совмещение операций ввода-вывода и вычислений.
Такое совмещение может достигаться разными способами :
1. Специализированный процессор ввода-вывода.
Иногда такие процессоры называют каналами. Канал имеет систему команд,
отличающуюся от системы команд центрального процессора. Эти команды специально
ориентированы для управления внешними устройствами :

установить магнитную головку;

напечатать строку и т.д.
Канальные программы могут храниться в той же оперативной памяти, что и
программы центрального процессора. В системе команд центрального процессора
предусматривается специальная инструкция, с помощью которой каналу передаются
параметры и указания на то, какую программу ввода-вывода он должен выполнить.
Канал
Центральный
процессор
Канальная программа
Ввод/вывод
Команда запуска
Канальной
программы
Вычисления
Сигнал завершения
Операции ввода/вывода
2. Внешние устройства управляются контроллерами.
Каждое (или группа) внешнее устройство имеет свой собственный контроллер,
которые отрабатывают команды, поступающие от центрального процессора. Контроллер и
ЦП работают асинхронно. Контроллер сообщает ЦП о том, что он готов принять
следующую команду сигналом прерывания или ЦП узнает об этом, периодически
опрашивая состояние контроллера.
Контроллер
Операция ввода/вывода
Сигналы готовности
устройства
Центральный
процессор
Команды ввода/вывода
Вычисления
Максимальный эффект при пакетной обработке достигается при наиболее полном
перекрытии вычислений и ввода-вывода.
В случае одной задачи ускорение зависит от её характера. При преобладании
вычислений или ввода-вывода ускорение практически отсутствует.
Системы разделения времени.
Системы разделения времени устраняют основной недостаток пакетной обработки –
изоляцию пользователей-программистов от процесса его задач. Каждому пользователю
выделяется свой терминал, с которого можно вести свой диалог с программой. В системах
этого типа каждой задаче выделяется квант процессорного времени, ни одна задача не
занимает процессор надолго. Создается иллюзия, что процессор принадлежит только
задаче (либо программисту).
Системы реального времени .
Основной критерий – способность системы выдержать заранее заданные интервалы
времени между запуском программы и получением результата. Это время называется
временем реакции системы, а соответствующее свойство системы – реактивностью.
Требования ко времени реакции определяются внешними факторами (например,
спецификой системы управления).
В системах реального времени мультипрограммная смесь представляет собой
фиксированный набор заранее разработанных программ, а выбор программы на
выполнение осуществляется по прерываниям (например, исходя из текущего состояния
объекта управления) или в состоянии с расписанием работ.
Мультипроцессорная обработка.
Мультипроцессорная обработка – способ организации вычислительного процесса в
системах с несколькими процессорами, при котором несколько задач могут одновременно
выполняться на разных процессорах системы.
В настоящее время стало обычным явлением включение нескольких процессоров в
архитектуру персонального компьютера.
Функции поддержки мультипроцессорной обработки данных имеются во многих ОС, в
том числе и такой как Windows NT.
Мультипроцессорные системы характеризуют как симметричные или как
несимметричные, в зависимости от того , к какому аспекту вычислительной системы это
относится:
 к архитектуре;
 к способу организации вычислительного процесса.
Симметричная архитектура предполагает однородность всех процессов и
единообразие включения процессоров в схему мультипроцессорной системы.
Традиционные симметричные мультипроцессорные конфигурации разделяют одну
большую память между всеми процессорами.
Масштабируемость или возможность наращивания числа процессоров в
симметричных системах ограничена вследствие того, что все они пользуются одной и той
же оперативной памятью и располагаются в одном корпусе. Это масштабирование по
вертикали.
В симметричных архитектурах все процессы пользуются одной и той же схемой
отображения памяти. Они могут быстро обмениваться данными. Обеспечивается высокая
производительность для задач, которые активно между собой взаимодействуют
(например, при работе с базами данных).
В ассиметричной архитектуре процессоры могут отличаться как своими
характеристиками, так и функциональной ролью, которая поручается им в системе.
Масштабирование в асимметричной архитектуре реализуется иначе, чем в
симметричной. Система может состоять из нескольких устройств, каждое из которых
содержит один или несколько процессоров. Это масштабирование по горизонтали.
Каждое такое устройство называется кластером, а вся система обычно называется
кластерной. Способ организации вычислительного процесса в мультипроцессорной
системе определяется ОС.
Ассиметричное мультипроцессирование является наиболее простым способом
организации. Этот способ иногда называют «ведущий - ведомый».
На «ведущем» процессоре работает ОС, который управляет всеми остальными
«ведомыми» процессорами. Он берет на себя функции распределения задач и ресурсов, а
«ведомые» работают только как обрабатывающие устройства и никаких действий по
организации работы вычислительной системы не выполняют. Такая ОС не намного
сложнее ОС однопроцессорной системы.
Ассиметричная организация вычислительного процесса может быть реализована как
для симметричной мультипроцессорной архитектуры, так и для несимметричной.
Симметричное мультипроцессирование как способ организации вычислительного
процесса может быть реализовано только в системах с симметричной
мультипроцессорной архитектурой.
Симметричное мультипроцессирование реализуется общей для всех процессоров ОС.
Все процессоры равноправно участвуют в управлении вычислительным процессом и в
выполнении прикладных задач. Например, сигнал прерывания от принтера, который
распечатывает данные процесса, выполняемого на некотором процессоре, может быть
обработан совсем другим процессором. Разные процессоры могут в какой-то момент
одновременно обслуживать как разные, так и одинаковые модули ОС. Для этого модули
ОС должны обладать свойством реентерабельности (повторной входимости). ОС
полностью децентрализована. Как только процессор завершает выполнение очередного
задания, он передает управление планировщику, который выбирает из общей системной
очереди для всех процессоров задачу, которая будет выполняться на данном процессоре
следующей.
В случае отказа одного из процессоров симметричные системы сравнительно легко
реконструируется, что является преимуществом перед ассиметричными системами.
Понятия процесса и потока
До сих пор мы рассматривали процесс как некоторую неделимую работу,
выполняемую вычислительной системой.
В ряде ОС определены два типа работы. Более крупная единица – процесс, которая
требует для своей реализации несколько более мелких работ, и эта более мелкая единица
называется потоком.
При реализации потоков появляется возможность организации параллельных
вычислений в рамках процесса.
Дело в том, что приложения, выполняемые в рамках одного процесса, могут обладать
внутренним параллелизмом, который в принципе может ускорить время выполнения
процесса.
Из этого следует, что в ОС наряду с механизмами управления процессами нужен
другой механизм распараллеливания вычислений, который учитывал бы тесные связи
между отдельными ветвями вычислений одного и того же приложения.
Для этих целей в ряде современных ОС используется механизм многопоточной
обработки. При этом вводится новая единица работы – поток выполнения, а понятие
«процесс» в некоторой степени меняет смысл.
Понятию «поток» соответствует последовательный переход процессора от одной
команды программы к другой. ОС распределяет процессорное время между потоками, а
процессу ОС назначает адресное пространство и набор ресурсов, которые совместно
используются всеми его потоками.
При управлении процессами ОС использует два основных типа информационных
структур:
 дескриптор процесса;
 контекст процесса.
Дескриптор процесса содержит такую информацию о процессе, которая необходима
ядру ОС в течение всего жизненного цикла процесса независимо от того, находится он в
активном или пассивном состоянии, находится образ процесса в оперативной памяти или
выгружен на диск. Образ – совокупность кодов команд и данных.
Дескрипторы процессов объединены в список, образующий таблицу процессов.
Память отводится динамически в области ядра. На основании информации, содержащейся
в таблице процессов, ОС осуществляет планирование и синхронизацию процессов.
В дескрипторе прямо или косвенно (через указатели) содержится информация о
состоянии процесса, о расположении образа процесса, об идентификаторе пользователя,
создавшего процесс, о родственных процессах, о событиях, появления которых ожидает
процесс и др.
Контекст процесса содержит информацию, необходимую для возобновления
выполнения процесса с прерванного места: содержимое регистров процесса, коды ошибок
выполняемых процессором системных вызовов, информация обо всех открытых данным
процессом файлах и незавершенных операциях ввода-вывода и другие данные,
характеризующие состояние вычислительной системы в момент прерывания.
Контекст, так же как и дескриптор, доступен только программам ядра, т.е. находится в
виртуальном адресном пространстве ОС.
На протяжении существования процесса выполнение его потоков может быть
многократно прервано и продолжено (далее будем считать, что всё сказанное о потоках,
будет относиться к процессам в целом, если ОС не поддерживает потоки).
Переход от выполнения одного потока к другому осуществляется в результате
планирования и диспетчеризации.
Работа по определению того, в какой момент времени необходимо прервать поток и
какому потоку предоставить возможность выполняться, называется планированием.
При планировании могут приниматься во внимание приоритет потоков, время их
ожидания в очереди, накопленное время выполнения, интенсивность обращения к вводувыводу и др. факторы.
ОС планирует выполнение потоков независимо от того, принадлежат ли они одному
или разным процессам. Так, например, после выполнения потока некоторого процесса ОС
может выбрать для выполнения другой поток того же процесса или же назначить к
выполнению поток другого процесса.
Планирование потоков включает в себя решение двух задач:
 определение момента времени для смены текущего активного потока;
 выбор для выполнения потока из очереди готовых потоков.
Существует множество различных алгоритмов планирования потоков, которые
решают упомянутые задачи.
Именно особенности реализации планирования потоков в наибольшей степени
определяют специфику ОС, в частности, является ли она системой пакетной обработки,
системой разделения времени или системой реального времени.
Планирование может быть динамическим или статическим.
При динамическом планировании решения принимаются во время работы системы
на основе анализа текущей ситуации.
ОС работает в условиях неопределенности – поток и процессы появляются в
случайные моменты времени и также непредсказуемо завершаются. Динамические
планировщики могут гибко приспосабливаться к изменяющейся ситуации. Здесь ОС для
поиска оптимальных решений должна затрачивать значительные усилия.
Планировщик называется статическим, если он принимает решения о планировании
не во время работы системы, а заранее.
Результатом работы статического планировщика является таблица, называемая
расписанием, в которой указывается, какому потоку (процессу) когда и на какое время
должен быть предоставлен процессор.
Диспетчеризация заключается в реализации найденного в результате планирования
(динамического или статического) решения, т.е. в переключении процессора с одного
потока на другой. Прежде, чем прервать выполнение потока, ОС запоминает его контекст
с тем, чтобы впоследствии использовать эту информацию для последующего
возобновления выполнения данного потока.
Контекст отражает:
 состояние аппаратуры компьютера в момент прерывания потока: значение
счетчика команд, содержимое регистров общего назначения, режим работы
процессора, флаги, маски и другие параметры;
 параметры операционной среды (ссылки на открытые файлы, данные о
незавершенных операциях ввода-вывода, коды ошибок, выполняемых
данным потоком системных вызовов и т.д.).
Диспетчеризация сводится к следующему :
 сохранение контекста текущего потока, который требуется сменить;
 загрузка контекста нового потока, выбранного в результате планирования;
 запуск нового потока на выполнение.
В мультипрограммной системе поток может находиться в одном из трех состояний:
 выполнение – выполняется процессором:
 ожидание – ждет осуществления некоторого события;
 готовность – имеет все необходимые для выполнения ресурсы, готов
выполняться, но процессор занят выполнением другого потока.
Заметим, что состояния выполнения и ожидания могут быть отнесены и к задачам,
выполняющимся в однопрограммном режиме, а состояние готовности характерно только
для режима мультипрограммирования.
Граф состояний потока в многозадачной среде можно представить как на рисунке:
Поток завершен или ошибка
ВЫПОЛНЕНИЕ
Поток выбран
на выполнение
Поток вытеснен
ГОТОВНОСТЬ
Ввод-вывод завершен
(событие произошло)
Поток ожидает завершения
ввода-вывода (или другого события)
ОЖИДАНИЕ
Только что созданный поток
«Вытеснение потока» означает прекращение его выполнения процессором, например,
вследствие исчерпания отведенного для выполнения кванта времени.
В состоянии выполнения в однопроцессорной системе может находится не более
одного потока, а в каждом из состояний ожидания и готовности – несколько потоков. Эти
потоки образуют очереди ожидающих и готовых потоков.
Вытесняющие и невытесняющие алгоритмы планирования.
Все множество алгоритмов планирования можно разделить на два класса:
вытесняющие и невытесняющие .
Невытесняющие основаны на том, что активному потоку позволено выполняться до
тех пор, пока он сам не решит отдать управление ОС.
Вытесняющие – такие, в которых решение о переключении процессора с выполнения
одного потока на другой принимается ОС.
При невытесняющем мультипрограммировании механизм планирования распределен
между ОС и прикладными программами. Прикладная программа, получив управление от
ОС, сама определяет момент завершения очередного цикла своего выполнения и только
затем передает управление ОС с помощью какого-либо системного вызова.
Поэтому разработчики приложений (программисты) для ОС с невытесняющей
многозадачностью вынуждены брать на себя часть функций планировщика и создавать
приложения так, чтобы они выполняли свои задачи небольшими частями. Это может быть
как недостатком, так и преимуществом, если, например, наперед известен набор
постоянно решаемых задач.
Почти все современные ОС, такие как UNIX, Windows NT/2000, OS-2, Windows 95/98
реализуют вытесняющие алгоритмы планирования потоков.
Алгоритмы планирования, основанные на квантовании.
В основе многих вытесняющих алгоритмов планирования лежит концепция
квантования. В соответствии с ней, каждому потоку поочередно для работы выделяется
ограниченный непрерывный отрезок времени – квант.
Смена активного потока происходит, если:
 поток завершился и покинул систему;
 произошла ошибка;
 поток перешел в состояние ожидания;
 исчерпан квант процессорного времени.
Поток, исчерпавший свой квант, переводится в состояние готовности и ожидает в
очереди. Граф состояний потока представлен на рисунке:
Поток завершен или ошибка
ВЫПОЛНЕНИЕ
Потоку
предоставлен
квант
Поток инициировал
ввод-вывод
Поток исчерпал
квант
ГОТОВНОСТЬ
Ввод-вывод завершен
ОЖИДАНИЕ
Кванты для потоков могут быть одинаковыми или различными.
Очередь может быть простая или с приоритетами. Например, если потоки не
полностью используют кванты времени из-за операций ввода-вывода, из них можно
образовать приоритетную очередь как соответствующую компенсацию за не полностью
использованные кванты.
Соответствующий граф состояний потока можно представить как:
Поток завершен или ошибка
ВЫПОЛНЕНИЕ
Требуется ввод-вывод
Квант исчерпан
Очередь готовых
потоков
Назначен квант
ОЖИДАНИЕ
Вновь
созданные
потоки
Очередь готовых
потоков
Ввод-вывод завершен
Алгоритмы планирования, основанные на приоритетах.
Приоритет – это число, характеризующее степень привилегированности потока при
использовании ресурсов. В большинстве ОС приоритет потока связан с приоритетом
процесса, в рамках которого выполняется данный поток. Значение приоритетов
включается в описатель процесса. ОС может изменять приоритеты потока в зависимости
от ситуации. В последнем случае приоритеты называются динамическими, в отличие от
неизменяемых, которые называются статическими (или фиксированными).
В ОС Windows NT определено 32 уровня приоритетов и два класса потоков – потоки
реального времени и потоки с переменными приоритетами.
Диапазон от 1 до 15 отведен для потоков с переменными приоритетами, а от 16 до 32 –
для более критичных ко времени потоков реального времени.
Смешанные алгоритмы планирования.
В ряде ОС алгоритмы планирования построены с использованием как концепции
квантования, так приоритетов. Например, в основе планирования лежит квантование, но
величина кванта и порядок выбора потоков из очереди готовых определяется
приоритетами потоков.
Так сделано в Windows NT, в ней квантование сочетается с динамическими
абсолютными приоритетами. На выполнение выбирается поток с наивысшим
приоритетом. Ему выделяется квант времени. Если во время выполнения в очереди
готовых появляется поток с более высоким приоритетом, то он вытесняет выполняемый
поток. Вытесненный поток возвращается в очередь готовых, причем он становится
впереди всех остальных потоков, имеющих такой же приоритет.
Планирование в системах реального времени.
В системах реального времени главным критерием является обеспечение временных
характеристик вычислительного процесса.
Любая система реального времени должна реагировать на сигналы управляемого
объекта в течение заданных временных ограничений. Необходимость тщательного
планирования работ облегчается тем, что в системах реального времени весь набор
выполняемых задач известен заранее.
Кроме того, в системе имеется информация о временах выполнения задач, моментах
активации, предельных допустимых сроках ожидания ответа и т.д. Эти данные могут быть
использованы планировщиком для создания статического расписания или для построения
адекватного алгоритма динамического планирования.
Если последствия невыполнения временных ограничений системой катастрофичны
(например, прокатный стан), система называется жесткой. Если невыполнение
ограничений не столь серьезно (например, система продажи авиабилетов), система
называется мягкой.
Моменты перепланировки.
Для реализации алгоритма планирования ОС должна получать управление всякий раз,
когда в системе происходит событие, требующее перераспределения процессорного
времени. К таким событиям относят следующие:
 прерывание от таймера, сигнализирующее, что время, отведенное активной
задаче, закончилось;
 активная задача выполнила системный вызов, связанный с запросом на вводвывод или на доступ к ресурсу, который в настоящий момент занят (например,
файл данных);
 активная задача выполнила системный вызов, связанный с освобождением
ресурса. Планировщик проверяет, не ожидает ли этот ресурс какая-либо задача.
Если да, то задача переводится из состояния ожидания в состояние готовности
и проверяется, имеет ли она наивысший приоритет. Если нет – возможна
перепланировка;
 внешнее аппаратное прерывание. Оно сигнализирует о переводе
соответствующей текущей задачи в очередь готовности и выполняется
планировщик;
 внутреннее прерывание сообщает об ошибке в текущей задаче. Планировщик
снимает задачу и выполняет перепланирование.
При возникновении каждого из этих событий планировщик выполняет просмотр
очередей и решает вопрос о том, какая задача будет выполняться следующей.
Мультипрограммирование на основе прерываний.
Прерывание происходит в произвольной точке потока команд программы, которую
программист не может прогнозировать.
Прерывания имеют некоторое сходство с процедурой в том, что в обоих случаях
выполняется некоторая подпрограмма, обрабатывающая специальную ситуацию, а затем
продолжается выполнение основной ветви программы.
В зависимости от источника, прерывания делятся на три больших класса:
 внешние;
 внутренние;
 программные;
Внешние прерывания возникают в результате действий пользователя или в результате
поступления сигналов от аппаратных устройств. Данный класс прерываний является
ассинхронным по отношению к потоку инструкций прерываемой программы.
Аппаратура процессора работает так, что асинхронные прерывания возникают между
выполнением двух соседних инструкций, при этом система после обработки прерывания
продолжает выполнение процесса, уже начиная со следующей инструкции.
Внутренние прерывания, происходят синхронно выполнению программы при
появлении аварийной ситуации в ходе исполнения некоторой инструкции программы.
Примерами являются деление на нуль, ошибки защиты памяти, обращения по
несуществующему адресу. Прерывания возникают внутри выполнения команды.
Программные прерывания отличаются от предыдущих двух классов тем, что они по
своей сути не являются «истинными» прерываниями. Программное прерывание возникает
при выполнении особой команды процессора, выполнение которой имитирует прерывание,
то есть переход на новую последовательность инструкций.
Прерываниям приписывается приоритет, с помощью которого они ранжируются по
степени важности и срочности. О прерываниях, имеющих одинаковое значение
приоритета, говорят, что они относятся к одному уровню приоритета прерываний.
Процедуры, вызываемые по прерываниям, обычно называют обработчиками
прерываний, или процедурами обслуживания прерываний.
Аппаратные прерывания обрабатываются драйверами соответствующих внешних
устройств, внутренние прерывания — специальными модулями ядра, а программные
прерывания — процедурами ОС, обслуживающими системные вызовы.
Кроме этих модулей в ОС может находиться так называемый диспетчер прерываний,
который координирует работу отдельных обработчиков прерываний.
Обобщенно последовательность действий аппаратных и программных средств по
обработке прерывания можно описать следующим образом:
1.При возникновении сигнала (для аппаратных прерываний) или условия (для
внутренних прерываний) прерывания происходит первичное аппаратное
распознавание типа прерывания. Если прерывания данного типа в настоящий момент
запрещены (приоритетной схемой или механизмом маскирования), то процессор
продолжает поддерживать естественный ход выполнения команд.
В противном случае в зависимости от поступившей в процессор информации
происходит автоматический вызов процедуры обработки прерывания, адрес которой
находится в специальной таблице ОС, размещаемой либо в регистрах процессора,
либо в определенном месте оперативной памяти.
2. Автоматически сохраняется некоторая часть контекста прерванного потока,
которая позволит ядру возобновить исполнение потока процесса после обработки
прерывания. В это подмножество включаются значения счетчика команд, слова
состояния машины, хранящего признаки основных режимов работы процессора
(пример слова — регистр EFLAGS в Intel Pentium), а также нескольких регистров
общего назначения, которые требуются программе обработки прерывания. Может
быть сохранен и полный контекст процесса, если ОС обслуживает данное
прерывание со сменой процесса.
3. Одновременно с загрузкой адреса процедуры обработки прерываний в счетчик
команд может автоматически выполняться загрузка нового значения слова
состояния машины, которое определяет режимы работы процессора при обработке
прерывания, в том числе работу в привилегированном режиме.
4. Временно запрещаются прерывания данного типа, чтобы не образовалась очередь
вложенных друг в друга потоков одной и той же процедуры. Детали выполнения
этой операции зависят от особенностей аппаратной платформы, например может
использоваться механизм маскирования прерываний..
5. После того как прерывание обработано ядром ОС, прерванный контекст
восстанавливается, и работа потока возобновляется с прерванного места.
Часть контекста восстанавливается аппаратно по команде возврата из прерываний
(например, адрес следующей команды и слово состояния машины), а часть —
программным способом, с помощью явных команд извлечения данных из стека. При
возврате из прерывания блокировка повторных прерываний данного типа снимается.
Программные прерывания
Программное прерывание реализует один из способов перехода на подпрограмму с
помощью специальной инструкции процессора, такой как INT в процессорах Intel
Pentium, trap в процессорах Motorola, и т.п.
При выполнении команды программного прерывания процессор отрабатывает ту же
последовательность действий, что и при возникновении внешнего или внутреннего
прерывания, но только происходит это в предсказуемой точке программы — там, где
программист поместил данную команду.
Практически все современные процессоры имеют в системе команд инструкции
программных прерываний.
Программные прерывания часто используются для выполнения ограниченного
количества вызовов функций ядра операционной системы, то есть системных вызовов.
Диспетчеризация и приоритезация прерываний в ОС
Прерывания выполняют полезную для вычислительной системы функцию —
позволяют реагировать на асинхронные по отношению к вычислительному процессу
события.
Прерывания создают дополнительные трудности для ОС в организации
вычислительного процесса.
Для упорядочения работы обработчиков прерываний в ОС применяется тот же
механизм, что и для упорядочения работы пользовательских процессов – механизм
приоритетных очередей. Все источники прерываний делятся на несколько классов,
причем каждому классу присваивается приоритет. В ОС выделяется программный
модуль, который занимается диспетчеризацией обработчиков прерываний. Этот модуль в
разных ОС называется по-разному, мы в самом начале определим его, как диспетчером
прерываний.
При возникновении прерывания диспетчер прерываний вызывается первым. Он
запрещает га некоторое время все прерывания, и выясняет причину прерывания. Затем
сравнивается приоритет источника прерывания с текущим приоритетом потока команд,
выполняемых процессором. Если приоритет нового запроса выше текущего, то
выполнение текущего потока приостанавливается и выполняется обработка прерывания. В
противном случае запрос ставится в очередь.
Процедуры обработки прерываний и текущий процесс
Важной особенностью процедур, выполняемых по запросам прерываний, является то, что
они выполняют работу, чаще всего никак не связанную с текущим процессом.
Например, драйвер диска может получить управление после того, как контроллер диска
записал в соответствующие сектора информацию, полученную от процесса А, но этот момент
времени, не совпадет с периодом очередной итерации выполнения процесса А или его потока.
В наиболее типичном случае процесс А будет находиться в состоянии ожидания
завершения операции ввода-вывода (при синхронном режиме выполнения этой операции) и
драйвер диска прервет какой-либо другой процесс.
В некоторых случаях вообще трудно однозначно определить, для какого процесса
выполняет работу тот или иной программный модуль ОС, например планировщик потоков.
Поэтому для такого рода процедур вводятся ограничения — они не имеют права использовать
ресурсы (память, открытые файлы и т.п.), с которыми работает текущий процесс.
Процедуры обработки прерываний работают с ресурсами, которые были выделены им при
инициализации соответствующего драйвера или инициализации самой операционной
системы. Эти ресурсы принадлежат ОС, а не конкретному процессу. Так память драйверам
выделяется из системной области. Поэтому обычно говорят, что процедуры обработки
прерывании работают вне контекста процесса.
Диспетчеризация прерываний является важной функцией ОС, и эта функция
реализована практически во всех мультипрограммных ОС. Как правило, в ОС реализуется
двухуровневый механизм планирования работ. Верхний уровень планирования выполняется
диспетчером прерываний, который распределяет процессорное время между потоком
поступающих запросов на прерывания различных типов — внешних, внутренних и
программных. Оставшееся процессорное время распределяется другим диспетчером —
диспетчером потоков, на основании дисциплин квантования и других, которые мы
рассматривали.
Системные вызовы
Системный вызов позволяет приложению обратиться к ОС с просьбой выполнить то или
иное действие, оформленное как процедура (или набор процедур) кодового сегмента ОС.
Для прикладного программиста ОС выглядит как некая библиотека, реализующая
полезные функции, облегчающие управление прикладной задачей или выполнение действий,
запрещенных в пользовательском режиме, например обмен данными с устройством вводавывода.
Реализация системных вызовов должна удовлетворять следующим требованиям:
 обеспечивать переключение в привилегированный режим;
 обладать высокой скоростью вызова процедур ОС;
 обеспечивать единообразное обращение к системным вызовам для всех аппаратных
платформ, на которых работают ОС;
 допускать легкое расширение набора системных вызовов;
 обеспечивать контроль со стороны ОС за корректным использованием
системных вызовов
В большинстве ОС системные вызовы обслуживаются по централизованной схеме,
основанной на существовании диспетчера системных вызовов.
При любом системном вызове приложение выполняет программное прерывание с
определенным и единственным номером вектора.
Перед выполнением программного прерывания приложение передает ОС номер
системного вызова. Способ передачи зависит от реализации. Например, номер можно
поместить в определенный регистр процессора или передать через стек. Также некоторым
способом передаются аргументы системного вызова, они могут помешаться как, в
регистры общего назначения, так и передаваться через стек или массив, оперативной
памяти.
Таблица прерываний
системы
Системный
вызов
Вектор = 80h,
RØ = 21h
ОС Linux
Адрес диспетчера
системных вызовов
Диспетчер
системных вызовов
Процедура обработки
Системного вызова 21h
Процедура обработки
Системного вызова 22h
Процедура обработки
Системного вызова 23h
Централизованная схема обработки системных вызовов.
…
Адрес процедуры 21h
Адрес процедуры 22h
Адрес процедуры 23h
…
После завершения работы системного вызова управление возвращается диспетчеру, при
этом он получает также код завершения этого вызова. Диспетчер восстанавливает
регистры процессора, помещает в определенный регистр код возврата и выполняет
инструкцию возврата из прерывания, которая восстанавливает непривилегированный
режим работы процессора.
Описанный табличный способ организации системных вызовов принят практически во
всех операционных системах. Он позволяет легко модифицировать состав системных
вызовов, просто добавив в таблицу новый адрес и расширив диапазон допустимых
номеров вызовов.
ОС может выполнять системные вызовы в синхронном или асинхронном режимах.
Синхронный системный вызов означает, что процесс, сделавший такой вызов,
приостанавливается до тех пор, пока системный вызов не выполнит всю требуемую работу.
После этого планировщик переводит процесс в состояние готовности.
Асинхронный системный вызов не приводит к переводу процесса в режим ожидания
после выполнения некоторых начальных системных действий, например запуска операции
вывода-вывода, управление возвращается прикладному процессу.
Большинство системных вызовов в ОС являются синхронными.
а) Асинхронный системный
вызов
Прикладной
процесс
Проверка события:
завершения системного вызова
Обработка системного
вызова
б) Синхронный системный
вызов
Прикладной
процесс
Ожидание
Системный
вызов
Код
системного
вызова
Обработка системного
вызова
Управление памятью. Функции ОС по управлению
памятью.
Под памятью понимается оперативная память компьютера. В отличие от памяти
жесткого диска, которую называют внешней памятью, оперативная память для
сохранения информации требует постоянное электропитание.
Особая роль памяти в том, что процессор может выполнять инструкции программы
только в том случае, если они находятся в памяти.
Память распределяется как между модулями прикладных программ, так и между
модулями самой операционной системы.
Функциями ОС по управлению памятью в мультипрограммной системе являются:
 отслеживание свободной и занятой памяти;
 выделение памяти процессам и освобождение памяти по завершении процессов;
 вытеснение кодов и данных процессов из оперативной памяти на диск, когда
размеры основной памяти не достаточны для размещения в ней всех процессов, и
возвращение их в оперативную память, когда в ней освобождается место;
 настройка адресов программы на конкретную область физической памяти.
Во время работы ОС приходится создавать новые служебные информационные
структуры, такие как описатели процессов и потоков, различные таблицы распределения
ресурсов, буферы для обмена данными и т.п. Все эти системные объекты требуют памяти.
В некоторых ОС во время установки резервируется некоторый фиксированный объем
памяти для системных нужд. В других же ОС используется более гибкий подход, при
котором память для системных целей выделяется динамически.
Защита памяти — еще одна важная задача ОС. Она состоит в том, чтобы не
позволить выполняемому процессу записывать или читать данные из памяти, назначенной
другому процессу.
Типы адресов
Для идентификации переменных и команд на разных этапах жизненного цикла
программы используются символьные имена, виртуальные адреса и физические адреса.
Символьные
имена
Идентификаторы переменных
в программе
на алгоритмическом языке
Транслятор
Виртуальные
адреса
Физические
адреса
Условные адреса,
вырабатываемые транслятором
Номера ячеек
физической памяти
 Символьные имена присваивает пользователь при написании программы.
 Виртуальные (условные) адреса, вырабатывает транслятор, переводящий
программу на машинный язык.
 Физические адреса соответствуют номерам ячеек оперативной памяти, где в
действительности расположены переменные и команды.
Совокупность виртуальных адресов называется виртуальным адресный
пространством.
Диапазон возможных адресов виртуального пространства у всех процессов является
одним и тем же. Тем не менее, каждый процесс имеет собственное виртуальное адресное
пространство — транслятор присваивает виртуальные адреса переменным и кодам
каждой программе независимо.
В разных ОС используются разные способы структуризации адресного пространства.
1. Линейная последовательности виртуальных адресов. Такая структура адресного
пространства называют также плоской (flat). При этом виртуальным адресом
является единственное число, представляющее собой смещение относительно начала
виртуального адресного пространства. Адрес такого типа называют линейным
виртуальным адресом.
2. Виртуальное адресное пространство делится на части, называемые сегментами.
Виртуальный адрес представляющий собой пару чисел (n, m), где n определяет
сегмент, a m — смещение внутри сегмента.
3. Есть более сложные способы структуризации, когда виртуальный адрес образуется
тремя или даже более числами.
Существуют два принципиально отличающихся подхода к преобразованию
виртуальных адресов в физические.
1.Замена виртуальных адресов на физические выполняется один раз для каждого
процесса во время начальной загрузки программы в память. Выполняет это
системная программа — перемещающий загрузчик — на основании имеющихся у
нее исходных данных о начальном адресе физической памяти, а также информации,
предоставленной транслятором об адресно-зависимых элементах программы,
выполняет загрузку программы, совмещая ее с заменой виртуальных адресов
физическими.
2. Программа загружается в память в неизмененном виде в виртуальных адресах. При
загрузке ОС фиксирует смещение действительного расположения программного
кода относительно виртуального адресного пространства. Во время выполнения
программы при каждом обращении к оперативной памяти выполняется
преобразование виртуального адреса в физический.
Последний способ является более гибким: в то время как перемещающий загрузчик
жестко привязывает программу к первоначально выделенному ей участку памяти,
динамическое преобразование виртуальных адресов позволяет перемещать программный
код процесса в течение всего периода его выполнения.
Как правило, объем виртуального адресного пространства превышает доступный
объем оперативной памяти. В таком случае ОС для хранения данных виртуального
адресного пространства использует дополнительную внешнюю память.
Однако соотношение объемов виртуальной и физической памяти может быть и
обратным.
Следует помнить, что механизмы виртуального адресного пространства, и
виртуальной памяти в общем случае – это не одно и тоже. Можно представить себе ОС, в
которой поддерживаются виртуальные адресные пространства для процессов, но
отсутствует механизм виртуальной памяти. Это возможно только в том случае, если
размер виртуального адресного пространства каждого процесса меньше объема
физической памяти.
Содержимое назначенного процессу виртуального адресного пространства,
представляет собой образ процесса.
Во время работы процесса постоянно выполняются переходы от прикладных кодов к
кодам ОС, которые либо явно вызываются из прикладных процессов как системные
функции, либо вызываются как реакция на внешние события. Для того чтобы упростить
передачу управления от прикладного кода к коду ОС, а также для легкого доступа
модулей ОС к прикладным данным, в большинстве ОС ее сегменты разделяют
виртуальное адресное пространство с прикладными сегментами активного процесса.
То есть виртуальное адресное пространство процесса делится на две непрерывные
части: системную и пользовательскую. В некоторых ОС (например, Windows NT) эти
части имеют одинаковый размер — по 2 Гбайт.
Часть виртуального адресного пространства каждого процесса, отводимая под
сегменты ОС, является идентичной для всех процессов. Поэтому при смене активного
процесса заменяется только вторая часть виртуального адресного пространства.
Например, в процессорах Intel Pentium существует два типа системных таблиц: одна —
для описания сегментов, общих для всех процессов, другая — для описания
индивидуальных сегментов данного процесса. При смене процесса первая таблица
остается неизменной, а вторая – заменяется новой.
Алгоритмы распределения памяти
Алгоритмы распределения памяти разделены на два класса: алгоритмы, в которых
используется перемещение сегментов процессов между оперативной памятью и диском, и
алгоритмы, в которых внешняя память не привлекается.
Методы распределения памяти
Без использования
внешней памяти
С использованием
внешней памяти
Фиксированными
разделами
Страничное
распределение
Динамическими
разделами
Сегментное
распределение
Перемещаемыми
разделами
Сегментностраничное
распределение
Классификация методов распределения памяти
Распределение памяти фиксированными разделами
Это простейший способ управления памятью. Память разбивается на несколько
областей фиксированной величины, называемых разделами.
Это разбиение может быть выполнено вручную оператором во время старта системы
или во ее установки. После этого границы разделов не изменяются.
Новый процесс, поступивший на выполнение, помещается либо в общую очередь,
либо в очередь к некоторому разделу.
ОС
а) Общая очередь
Раздел 1
Очередь задач
Раздел 2
– свободная память
б) Отдельные очереди
Очереди
к разделам
Раздел 3
ОС
Раздел 1
Раздел 2
Раздел 3
– свободная память
Распределение памяти фиксированными разделами
Система управления памяти решает следующие задачи:
 Сравнивает объем памяти, требуемый для нового процесса, с размерами свободных
разделов и выбирает подходящий раздел.
 Осуществляет загрузку программы в один из разделов и настройку адресов.
Уже на этапе трансляции разработчик программы может задать раздел, в котором ее
следует выполнять. Это позволяет сразу, без использования перемещающего загрузчика,
получить машинный код, настроенный на конкретную область памяти.
Существенный недостаток — жесткость.
Уровень мультипрограммирования заранее ограничен числом разделов. Независимо от
размера программы она будет занимать весь раздел, с другой стороны процесс,
требующий несколько разделов, не может быть выполнен.
Этот простейший метод распределения памяти сейчас находит применение только в
системах реального времени, благодаря детерминированности вычислительного процесса.
Распределение памяти динамическими разделами
Каждому новому поступающему на выполнение процессу выделяется вся необходимая
ему память, если ее не хватает, процесс не запускается.
Функции ОС, для реализации этого метода:
 Ведение таблиц свободных и занятых областей, в которых указываются начальные
адреса и размеры участков памяти.
 При создании нового процесса – анализ требований к памяти, просмотр таблицы
свободных областей и выбор раздела. Выбор раздела может осуществляться по
разным правилам: первый попавшийся раздел достаточного размера, раздел,
имеющий наименьший достаточный размер, раздел, имеющий наибольший
достаточный размер.
 Загрузка программы в выделенный ей раздел и корректировка таблиц свободных и
занятых областей.
 Корректировка таблиц свободных и занятых областей.
Этому методу присущ серьёзный недостаток – фрагментация памяти.
Фрагментация – наличие большого числа несмежных участков свободной памяти
маленького размера. Такого, что ни одна из вновь поступающих программ не может
поместиться ни в одном из участков, хотя суммарный объем фрагментов может составить
величину, превышающую требуемый объем памяти.
Примером этого метода является популярная в прошлом OS/360 и EC – ЭВМ..
Перемещаемые разделы
Борьба с фрагментацией – перемещение всех занятых участков в сторону старших или
младших адресов, так, чтобы вся свободная память образовала свободную единую
область.
В дополнение к функциям, которые выполняет ОС с динамическими разделами, она
еще время от времени копирует содержимое разделов из одного места памяти в другое,
корректируя таблицы свободных и занятых областей. Эта процедура называется
сжатием.
Сжатие выполняется либо при каждом завершении процесса, либо когда для
создаваемого процесса нет свободного раздела достаточного размера.
Так как программы перемещаются в оперативной памяти в ходе своего выполнения, то
в данном случае невозможно выполнить настройку адресов с помощью перемещающего
загрузчика. Здесь необходима реализация динамического преобразования адресов.
Хотя этот метод приводит к более эффективному использованию памяти, но требует
значительных временных затрат, что перевешивает имущества данного метода.
Метод используется в ранних версиях ОС OS/2.
ОС
ОС
П1
П1
a
П2
П2
П4
b
П4
Процедура
сжатия
a+b+c
c
Распределение памяти перемещаемыми разделами
Свопинг и виртуальная память
Объем оперативной памяти, который имеется в компьютере, существенно сказывается
на протекании вычислительного процесса. Он ограничивает число одновременно
выполняющихся программ и размеры их виртуальных адресных пространств.
Если все задачи мультипрограммной смеси являются вычислительными (мало
операций ввода-вывода), для хорошей загрузки процессора может оказаться достаточным
всего 3-5 задач.
Если вычислительная система загружена выполнением интерактивных задач, для
эффективного использования процессора может потребоваться уже несколько десятков, а
то и сотен задач.
Загрузка
процессора
100
80
20%
60
50%
40
80%
20
1
2
3
4
5
6
7
8
9
10
Уровень
Зависимость загрузки процессора от числа задач и
интенсивности ввода-вывода
Большое количество задач требует больших объемов оперативной памяти.
В условиях, когда для обеспечения приемлемого уровня мультипрограммирования
имеющейся памяти оказывается недостаточно, был предложен метод организации
вычислительного процесса, при котором образы некоторых процессов целиком или
частично временно выгружаются на диск.
В мультипрограммном режиме помимо активного процесса, имеются также
приостановленные процессы, ожидающие завершения ввода-вывода или освобождения
ресурсов, а также процессы в состоянии готовности, стоящие в очереди к процессору.
Образы таких неактивных процессов могут быть временно, до следующего цикла
активности, выгружены на диск. Несмотря на это, ОС «знает» о существовании процессов
и учитывает это при распределении процессорного времени и других ресурсов. К
моменту, когда подходит очередь выполнения выгруженного процесса, его образ
возвращается с диска в оперативную память. Если при этом оказывается, что свободного
места в оперативной памяти не хватает, то на диск выгружается другой процесс.
Такая подмена (виртуализация) оперативной памяти дисковой позволяет повысить
уровень мультипрограммирования.
Виртуальным называется ресурс, который пользователю или пользовательской
программе представляется обладающим свойствами, которыми он, в действительности,
не обладает.
Ясно, что работа виртуальной оперативной памяти происходит медленнее, чем
реальной.
Виртуализация оперативной памяти осуществляется совокупностью программных
модулей ОС и аппаратных схем процессора и включает решение следующих задач:

размещение данных в запоминающих устройствах различного типа;

выбор образов процессов или их частей для перемещения из оперативной
памяти на диск и обратно;

перемещение по мере необходимости данных между памятью и диском;

преобразование виртуальных адресов в физические.
Заметим, что с проблемой размещения в оперативной памяти программ, которые
превышают ее размеры, программисты столкнулись достаточно давно. Одним из решений
было разбиение программы на части, которые назывались оверлеями. Когда один
оверлей заканчивал свое выполнение, он вызывал другой оверлей. Все оверлеи хранились
на диске и перемещались между памятью и диском средствами ОС на основании директив
программиста, содержащихся в программе.
Несмотря на внешнее сходство, имеет принципиальное отличие от виртуальной
памяти. Оно состоит в том, что при оверлее разбиение программы на части и
планирование их загрузки в оперативную память выполняются программистом заранее во
время написания программы.
Виртуализация памяти может быть осуществлена на основе двух различных подходов:

свопинг — образы процессов выгружаются на диск и возвращаются в
оперативную память целиком;

виртуальная память — между оперативной памятью и диском
перемещаются части (сегменты, страницы) образов процессов.
Свопинг – частный случай виртуализации. Это наиболее простой способ совместного
использования оперативной памяти и диска.
Недостаток – избыточность. Когда ОС решает активизировать процесс, для его
выполнения, часто не требуется загружать в оперативную память все его сегменты
полностью. Аналогично при освобождении памяти для загрузки нового процесса очень
часто не требуется выгружать другой процесс на диск целиком. Достаточно выгрузить
только часть его образа. Перемещение избыточной информации замедляет работу
системы и неэффективно используется оперативная память.
Еще один недостаток. Системы, поддерживающие свопинг не способны загрузить
для выполнения процесс, виртуальное адресное пространство которого превышает
имеющуюся в наличии свободную память.
В современных ОС свопинг применения не находит.
Ключевой проблемой виртуальной памяти, возникающей в результате многократного
изменения местоположения в оперативной памяти образов процессов или их частей,
является преобразование виртуальных адресов в физические.
В настоящее время все множество реализаций виртуальной памяти может быть
представлено тремя классами:

Страничная
виртуальная
память.
Перемещение
данных
осуществляется страницами — частями виртуального адресного
пространства, фиксированного и сравнительно небольшого размера.

Сегментная виртуальная память –перемещение осуществляется
сегментами — частями виртуального адресного пространства произвольного
размера.

Сегментно-страничная виртуальная память. Здесь используется
двухуровневое деление: виртуальное адресное пространство делится на
сегменты, а затем сегменты делятся на страницы. Единицей перемещения
здесь является страница.
Для временного хранения сегментов и страниц на диске отводится либо специальная
область, либо специальный файл, который носит название страничный файл.
Текущий размер страничного файла является важным параметром ОС, чем он больше,
тем больше приложений может одновременно выполнять ОС. Однако, с увеличением
страничного файла увеличивается время на перекачку информации и общая полезная
производительность системы уменьшается.
Размер страничного файла в современных ОС является настраиваемым параметром.
Виртуальные
страницы
Страничное распределение
Виртуальное адресное пространство каждого процесса делится на части одинакового,
фиксированного для данной системы размера – виртуальные страницы.
В общем случае размер виртуального адресного пространства процесса не кратен
размеру страницы. Поэтому последняя страница каждого процесса дополняется
фиктивной областью.
Вся оперативная память машины также делится на части такого же размера,
называемые физическими страницами.
Размер страницы выбирается равным степени двойки: 512, 1024, 4096 байт и т. д, Это
позволяет упростить механизм преобразования адресов.
Виртуальное адресное
Пространство процесса 1
0
1
2
3
4
0
1
2
3
4
Таблица страниц
процесса 1
№стр Упр. Инф.
5
ВП
ВП
10
2
Стр. 4, п. 1
Виртуальные
страницы
Стр. 0, п. 1
Виртуальное адресное
Пространство процесса 2
0
1
2
3
4
5
0
1
2
3
4
5
Таблица страниц
процесса 2
№стр Упр. Инф.
8
ВП
ВП
ВП
ВП
11
Страничный обмен
Стр. 0, п. 2
Стр. 3, пр. 1
Стр. 5, пр. 2
Для каждого процесса ОС создает таблицу страниц — информационную структуру,
содержащую записи обо всех виртуальных страницах процесса.
Запись таблицы, называемая дескриптором страницы и включает следующую
информацию:

номер физической страницы, в которую загружена данная виртуальная
страница;

признак присутствия, устанавливается в единицу, если виртуальная
страница находится в оперативной памяти;

признак модификации страницы, который устанавливается в единицу
всякий раз, когда производится запись по адресу, относящемуся к данной
странице;

признак обращения к странице, называемый также битом доступа,
который устанавливается в единицу при каждом обращении по адресу,
относящемуся к данной странице.
Признаки присутствия, модификации и обращения в большинстве современных
процессоров устанавливаются аппаратно при операциях с памятью. Информация из
таблиц страниц используется для решения вопроса о необходимости перемещения той
или иной страницы между памятью и диском, а также для преобразования виртуального
адреса в физический.
Таблицы страниц размещаются в оперативной памяти. Адрес таблицы страниц
включается в контекст соответствующего процесса. При активизации очередного
процесса ОС загружает адрес его таблицы страниц в специальный регистр процессора.
При каждом обращении к памяти выполняется поиск номера виртуальной страницы,
содержащей требуемый адрес, затем по этому номеру определяется нужный элемент
таблицы страниц, и из него извлекается описывающая страницу информация. Далее
анализируется признак присутствия, и, если страница находится в оперативной памяти, то
выполняется преобразование виртуального адреса в физический. Если же нужная
виртуальная страница в данный момент выгружена на диск, то происходит страничное
прерывание. Выполняющийся процесс переводится в состояние ожидания, и
активизируется другой процесс из очереди процессов, находящихся в состоянии
готовности. Параллельно программа обработки страничного прерывания находит на диске
требуемую виртуальную страницу и пытается загрузить ее в оперативную память. Если в
памяти имеется свободная физическая страница, то загрузка выполняется немедленно,
если же свободных страниц нет, то на основании принятой в данной системе стратегии
замещения страниц решается вопрос о том, какую страницу следует выгрузить из
оперативной памяти.
После определения виртуальной страницы, обнуляется ее бит присутствия и
анализируется ее признак модификации. Если за время последнего пребывания в
оперативной памяти была модифицирована, ее новая версия должна быть переписана
на диск. Если нет, то никакой записи на диск не производится (она и так есть).
Физическая страница объявляется свободной.
Виртуальный адрес при страничном распределении может быть представлен в виде
пары (р, sv), где p — порядковый номер виртуальной страницы процесса (нумерация
страниц начинается с 0), a sv — смещение в пределах виртуальной страницы.
Физический адрес также может быть представлен в виде пары (n, Sf), где n — номер
физической страницы, a Sf — смещение в пределах физической страницы. Задача
подсистемы виртуальной памяти состоит в преобразовании пары (р, sv) в (n, Sf).
Рассмотрим два базисных свойства страничной организации.
Первое из них состоит в том, что объем страницы выбирается равным степени двойки
— 2k . Из этого следует, что смещение s может быть получено простым отделением k
младших разрядов в двоичной записи адреса, а оставшиеся старшие разряды адреса
представляют собой двоичную запись номера страницы.
Например:
Размер страницы 1 Кбайт (210). Двоичной адрес 101 000 111 0012. Он принадлежит
странице 102 и смещен относительно ее начала на 1 000 111 0012 байт.
Второе свойство заключается в том, что в пределах страницы непрерывная
последовательность виртуальных адресов однозначно отображается в непрерывную
последовательность физических адресов, т.е. sv = Sf.
Отсюда следует простая схема преобразования виртуальных адресов в физические.
Младшие разряды физического адреса, соответствующие смещению, получаются
переносом такого же количества младших разрядов из виртуального адреса. Старшие
разряды физического адреса, соответствующие номеру физической страницы,
определяются из таблицы страниц, в которой указывается соответствие виртуальных и
физических страниц.
Если происходит обращение к памяти по некоторому виртуальному адресу.
Аппаратными схемами процессора выполняются следующие действия:

Из специального регистра процессора извлекается адрес AT таблицы
страниц активного процесса. На основании начального адреса таблицы
страниц, номера виртуальной страницы p (старшие разряды виртуального


адреса) и длины отдельной записи в таблице страниц L (системная константа)
определяется адрес нужного дескриптора в таблице страниц: а =АТ+(рхL).
Из этого дескриптора извлекается номер соответствующей физической
страницы — n.
К номеру физической страницы присоединяется смещение s (младшие
разряды виртуального адреса).
Виртуальный адрес
k двоичных разрядов
Номер виртуальной
страницы - p
Смещение в
виртуальной
странице - S
Номера физических
страниц
Регистр процессора
Начальный адрес
таблицы страниц – АТ
AT+(pxL)
n
Номер физической
страницы - n
Физический адрес
Смещение в
физической странице
-S
k двоичных разрядов
Аппаратный механизм получения физического адреса по виртуальному, предусмотрен
для уменьшения времени преобразования адресов.
Другим важным фактором, влияющим на производительность системы, является
частота страничных прерываний. На нее, в свою очередь, влияют размер страницы и
принятые в данной системе правила выбора страниц для выгрузки и загрузки.
При выборе страницы на выгрузку смысл критерия сводится к одному: на диск
выталкивается страница, к которой дольше всего не будет обращений
Однако, точно предсказать ход вычислительного процесса невозможно, а
следовательно, и точно определить страницу, подлежащую выгрузке. Решение
принимается на основе неких эмпирических критериев.
Например, если страница не использовалась долгое время, делается вывод о том, что
она не потребуется и сейчас.
Наиболее популярным критерием является число обращений к странице за последний
период времени. ОС ведет по каждой странице программный счетчик. Когда возникает
необходимость удалить какую-либо страницу из памяти, ОС находит страницу, счетчик
обращений которой имеет наименьшее значение. Все счетчики периодически обнуляются.
Интенсивность страничного обмена может быть снижена за счет, так называемой,
упреждающей загрузки, в соответствии с которой при возникновении страничного
прерывания в память загружается не одна страница, а сразу несколько прилегающих к
ней страниц.
Концептуально предполагается, что если обращение произошло по некоторому
адресу, то велика вероятность обращения по соседним адресам.
Важнейшая задача – выбор оптимального размера страницы.
Если страница велика, то велики потери из фиктивных областей (в среднем половина
последней страницы). Выбор размера страницы – сложная оптимизационная задача. На
практике размер страницы выбирают в несколько килобайт. Например, в процессорах
Pentiumи ОС на них, поддерживают страницы размером 4096 байт (4 Кбайт).
Размер страницы также влияет на количество записей в таблицах страниц процессов.
Так в современных процессорах максимальный объем виртуального адресного
пространства процесса, не меньше 4 Гбайт (232), то при размере страницы 4 Кбайт (212) и
длине записи 4 байта для хранения таблицы страниц требуется 4 Мбайт памяти!
Выходом из возникшей ситуации является хранение в памяти только той части
таблицы страниц, которая активно используется в данный период времени, т.е. таблицу
страниц можно временно вытеснять из оперативной памяти.
Именно такой результат может быть достигнут путем усложнения структуризации
виртуального адресного пространства, при котором все множество виртуальных адресов
процесса делится на разделы, а разделы делятся на страницы.
Все страницы имеют одинаковый размер, а разделы содержат одинаковое количество
страниц.
Если размер страницы и количество страниц в разделе выбрать равными степени
двойки (2k и 2n соответственно), то принадлежность виртуального адреса к разделу и
странице, а также смещение внутри страницы определяется очень просто: младшие k
двоичных разрядов дают смещение, следующие n разрядов – номер виртуальной
страницы, а оставшиеся старшие разряды содержат номер раздела.
Для каждого раздела строится собственная таблица страниц. Количество дескрипторов
в таблице и их размер подбираются такими образом, чтобы объем таблицы оказался
равным объему страницы.
Например, в процессоре Pentium при размере страницы 4 Кбайт длина дескриптора
составляет 4 байта и количество записей в таблице страниц, помещающейся на страницу,
равно 1024. Каждая таблица страниц описывается дескриптором, структура которого
полностью совпадает со структурой дескриптора обычной страницы. Эти дескрипторы
сведены в таблицу разделов, называемую также каталогом страниц. Физический адрес
таблицы разделов активного процесса содержится в специальном регистре процессора и
поэтому всегда известен ОС. Страница, содержащая таблицу разделов, никогда не
выгружается из памяти.
Выгрузка страниц с таблицами страниц позволяет экономить память, но при этом
приводит к дополнительным затратам при получении физического адреса.
Действительно, может случиться так, что та таблица страниц, которая содержит
нужный дескриптор, в данный момент выгружена на диск, тогда процесс
преобразования адреса приостанавливается до загрузки требуемой страницы в память.
Для уменьшения вероятности отсутствия страницы в памяти используют различные
приемы, основным из которых является кэширование (будем изучать позже).
Проследим более подробно схему преобразования адресов для случая двухуровневой
структуризации виртуального адресного пространства:
1. Путем отбрасывания k+n младших разрядов в виртуальном адресе определяется
номер раздела, к которому принадлежит данный виртуальный адрес.
2. По этому номеру из таблицы разделов извлекается дескриптор соответствующей
таблицы страниц. Проверяется, находится ли данная таблица страниц в памяти.
Если нет, происходит страничное прерывание и система загружает нужную
страницу с диска.
3. Далее из этой таблицы страниц извлекается дескриптор виртуальной страницы,
номер которой содержится в средних n разрядах преобразуемого виртуального
адреса. Снова выполняется проверка наличия данной страницы в памяти и при
необходимости ее загрузка.
4. Из дескриптора определяется номер (базовый адрес) физической страницы, в
которую загружена данная виртуальная страница. К номеру физической
страницы пристыковывается смещение, взятое из k младших разрядов
виртуального адреса. В результате получается искомый физический адрес.
Заметим что страничное распределение памяти может быть реализовано в
упрощенном варианте, без выгрузки страниц на диск. В этом случае все виртуальные
страницы всех процессов постоянно находятся в оперативной памяти. Такой вариант не
имеет преимуществ работы с виртуальной памятью большого объема, но позволяет
успешно бороться с фрагментацией физической памяти. Никогда не образуется
неиспользуемые остатки. Такой режим используется в специализированных ОС, когда
требуется высокая реактивность системы.
Сегментное распределение
При страничной организации виртуальное адресное пространство процесса делится на
равные части механически, без учета смыслового значения данных.
Однако, разбиение виртуального адресного пространства па «осмысленные» части
делает принципиально возможным совместное использование фрагментов программ
разными процессами. Например, двум процессам требуется одна и та же подпрограмма,
которая к тому же обладает свойством реентерабельности. Тогда коды этой
подпрограммы могут быть оформлены в виде отдельного сегмента и включены в
виртуальные адресные пространства обоих процессов.
При отображении в физическую память сегменты, содержащие коды подпрограммы
из обоих виртуальных пространств, проецируются на одну и ту же область физической
памяти. Таким образом, оба процесса получат доступ к одной и той же копии
подпрограммы.
Виртуальное адресное пространство процесса делится на части — сегменты.
Их размер которых определяется с учетом смыслового значения содержащейся в них
информации. Отдельный сегмент может представлять собой подпрограмму, массив
данных и т. и. Деление виртуального адресного пространства па сегменты
осуществляется компилятором на основе указаний программиста или по умолчанию, на
основе принятых в системе соглашений. Максимальный размер сегмента определяется
разрядностью виртуального адреса, например при 32-разрядной организации процессора
он равен 4 Гбайт. При этом максимально возможное виртуальное адресное пространство
процесса представляет собой набор из N виртуальных сегментов, каждый размером по 4
Гбайт. В каждом сегменте виртуальные адреса находятся в диапазоне от 0000000016 до
FFFFFFFF16.
Сегменты не упорядочиваются относительно друг друга, так что общего для
сегментов линейного виртуального адреса не существует, виртуальный адрес задается
парой чисел: номером сегмента и линейным виртуальным адресом.
При загрузке процесса в оперативную память помещается только часть его сегментов,
полная копия виртуального адресного пространства находится в дисковой памяти. Для
каждого загружаемого сегмента ОС подыскивает непрерывный участок свободной
памяти достаточного размера. Смежные в виртуальной памяти сегменты одного процесса
могут занимать в оперативной памяти несмежные участки (это очевидно). Если во время
выполнения процесса происходит обращение по виртуальному адресу, относящемуся к
сегменту, который в данный момент отсутствует в памяти, то происходит прерывание.
ОС приостанавливает активный процесс, запускает на выполнение следующий процесс из
очереди, а параллельно организует загрузку нужного сегмента. При отсутствии в памяти
места, ОС выбирает сегмент на выгрузку.
На этапе создания процесса во время загрузки его образа в оперативную память
система создает таблицу сегментов процесса (аналогичную таблице страниц), в которой
для каждого сегмента указывается:
 базовый физический адрес сегмента в оперативной памяти;
 размер сегмента;
 правила доступа к сегменту;
 признаки модификации, присутствия и обращения к данному сегменту, а также
некоторая другая информация
Если виртуальные адресные пространства нескольких процессов включают один и тот
же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же
участок оперативной памяти, в который данный сегмент загружается в единственном
экземпляре.
Механизмы преобразования адресов в страничном и сегментном способах
организации памяти весьма схожи. Однако в них имеются и существенные отличия.
Эти отличия являются следствием того, что сегменты, в отличие от страниц имеют
произвольный размер.
Виртуальный адрес при сегментной организации можно представлен парой (g, s),
где g - номер сегмента, as- смещение.
Страницы имеют одинаковый размер, а значит, их начальные адреса кратны размеру
страниц. Поэтому ОС заносит в таблицы страниц не полные адреса, а номера физических
страниц, которые совпадают со старшими разрядами базовых адресов.
Сегмент может в общем случае располагаться в физической памяти начиная с любого
адреса. Следовательно, для определения местоположения в памяти необходимо задавать
его полный начальный физический адрес.
Использование операции сложения замедляет процедуру преобразования
виртуального адреса в физический по сравнению со страничной организацией (там
просто объединение старших и младших разрядов).
Другим недостатком сегментного распределения является избыточность. При
сегментной организации единицей перемещения между памятью и диском является
сегмент, общем которого, как правило, больший, чем страница. Но во многих случаях
для работы программы не требуется загружать весь сегмент целиком, достаточно было
бы одной или двух страниц. Аналогично при отсутствии свободного места не следует
выгружать целый сегмент, если можно ограничится несколькими страницами.
Но главный недостаток — это фрагментация, который возникает из-за
непредсказуемости размеров сегментов.
Наиболее существенным отличием сегментной организации от страничной является
возможность задания дифференцированных прав доступа процесса к его сегментам.
Например, сегмент данных исходной информации может иметь права доступа
«только чтение», а сегмент результатов, — «чтение и запись». Это свойство определяет
преимущество сперед страничной.
Сегментно-страничное распределение
Данный метод – попытка объединить достоинства обоих методов.
Здесь, как и при сегментной организации памяти, виртуальное адресное пространство
процесса разделено на сегменты. Это позволяет определять разные права доступа к
разным данным. Перемещение данных между памятью и диском осуществляется не
сегментами, а страницами. Для этого каждый сегмент и физическая память делятся на
страницы равного размера, что позволяет минимизировать фрагментацию.
В большинстве современных реализаций сегментно-страничной организации
диапазонов адресов при сегментной организации все виртуальные сегменты образуют
одно непрерывное линейное виртуальное адресное пространство.
Виртуальное адресное
пространство процесса
Оперативная память
FF…F
d3
d2
d1
00…0
d1
d2
d3
…..
…..
…..
Таблица
сегментов
процесса
Координаты байта при этом можно задать двумя способами. Во-первых, линейным
виртуальным адресом, который равен сдвигу данного байта относительно границы общего
линейного виртуального пространства, во вторых, парой чисел, одно из которых является
номером сегмента, а другое – смещением относительно сегмента.
При этом в отличие от сегментной модели для однозначного задания виртуального
адреса вторым способом необходимо указать также начальный виртуальный адрес
сегмента с данным номером.
Чаще всего используется второй способ, так как он позволяет непосредственно
определить принадлежность адреса некоторому сегменту и проверить права доступа
процесса к нему.
Для каждого процесса ОС создает отдельную таблицу сегментов, в которой
содержатся дескрипторы (описатели ) всех сегментов процесса. Описание сегмента
включает назначенные ему права доступа и другие характеристики, подобные тем,
которые содержатся в дескрипторах сегментов при сегментной организации памяти.
Однако есть отличия. В поле базового адреса указывается не начальный физический
адрес сегмента, а начальный линейный виртуальный адрес сегмента в пространстве
виртуальных адресов. Его наличие позволяет однозначно преобразовать адрес, заданный
парой (g, s) в линейный виртуальный адрес байта, который затем преобразуется в
физический адрес страничным механизмом.
Деление общего линейного виртуального адресного пространства процесса и
физической памяти на страницы осуществляется так же, как это делается при страничной
организации памяти.
Базовые адреса таблицы сегментов и таблицы страниц процесса являются частью его
контекста. При активизации процесса эти адреса загружаются в специальные регистры
процессов и используются механизмы преобразования адресов.
Преобразование виртуального адреса в физический происходит в два этапа.
Исходный виртуальный адрес
номер сегмента
смещение в сегменте
таблица сегментов
процесса
Дескриптор
сегмента
базовый
виртуальный адрес
сегмента
Первый
этап
+
логический
виртуальный
адрес
номер виртуальной
страницы
смещение в странице
таблица страниц
процесса
базовый
физический
адрес
страницы
Второй
этап
+
искомый
физический
адрес
1. На первом этапе работает механизм сегментации. Исходный виртуальный адрес
пары (g, s) преобразуется в линейный виртуальный адрес. Для этого на основании
базового адреса сегментов и номера сегмента вычисляется поле дескриптора и
выполняется проверка возможности выполнения заданной операции.
Если доступ к сегменту разрешен, то вычисляется линейный виртуальный адрес путем
сложения базового адреса сегмента, извлеченного из дескриптора, и смещения, заданного
в исходном виртуальном адресе.
2. Второй этап использует страничный механизм. Линейный виртуальный адрес
преобразуется в физический. В результате преобразования линейный виртуальный адрес
представляется в том виде, в котором он используется при страничной организации
памяти (пара: номер страницы, смещение в странице). Далее как уже изучали ранее.
Старшие разряды линейного виртуального адреса, содержащие номер виртуальной
страницы, заменяются номером физической операции, взятым из таблицы страниц, а
младшие разряды виртуального адреса, содержащие смещение, остаются без изменения.
Как следует из рассмотрения, механизм сегментации и страничный действуют
достаточно независимо друг от друга.
Поэтому не трудно представить себе реализацию памяти, когда механизм сегментации
выполняется, как было показано, а страничный механизм реализуется по двухуровневой
схеме: виртуальное адресное пространство делится сначала на разделы, а уж потом на
страницы.
В таком случае преобразование виртуального адреса в физический происходит в
несколько этапов.
Сначала механизм сегментации обычным образом, используя таблицу сегментов,
вычисляет линейный виртуальный адрес. Затем из этого адреса вычисляется номер
раздела, номер страницы и смещение. По номеру раздела из таблицы разделов
определяется адрес таблицы страниц, а затем по номеру виртуальной страницы из
таблицы страниц определяется номер физической страницы, к которой приписывается
смещение.
Именно этот подход реализован в процессорах i386, i486 и Pentium.
Рассмотрим еще одну схему управления памятью, основанную на сегментностраничном подходе.
Отличие этого подхода состоит в том, что виртуальные страницы нумеруются не в
пределах всего адресного пространства процесса, а пределах сегмента.
Виртуальный адрес в этом случае выражается тройкой (номер сегмента, номер
страницы, смещение в странице).
Загрузки процесса выполняются постранично. Для каждого процесса создается своя
таблица сегментов, а для каждого сегмента - своя таблица страниц.
Адрес таблицы сегментов загружается в специальный регистр процессора, когда .
Таблицы страниц полностью аналогичны таблице страниц в предыдущем случае.
В таблице сегментов имеются существенные отличия. Она состоит из дескрипторов
сегментов, которые вместо информации о расположении сегментов в виртуальном
адресном пространстве содержит описание расположения таблиц страниц в физической
памяти.
Виртуальный адрес (g, p, s)
номер сегмента - g
номер виртуальной
страницы - p
смещение - s
таблица сегментов
.
.
.
g
таблица страниц
сегмента g
p
номер физической
страницы
n
смещение s
Схема преобразования виртуального
адреса в физический для второго случая
1. По номеру сегмента, заданному в виртуальном адресе, из таблицы сегментов
извлекается физический адрес соответствующей таблицы страниц.
2. По номеру виртуальной страницы, заданному в виртуальном адресе, из таблицы
страниц извлекается дескриптор, в котором указан номер физической страницы.
3. К номеру физической страницы пристыковуется младшая часть виртуального адреса
- смещение.
Разделяемые сегменты памяти
Примером применения разделяемой области память может быть использование ее в
качестве буфера при межпроцессном обмене данными. Один процесс пишет в
разделяемую область, другой – читает.
Для организации разделяемого сегмента при наличии системы виртуальной памяти
достаточно поместить его в виртуальное адресное пространство каждого процесса,
которому нужен доступ к данному сегменту, а затем настроить параметры отображения
этих виртуальных сегментов так, чтобы они соответствовали одной и той же области
оперативной памяти.
Детали такой настройки зависят от памяти.
«Попадание» виртуальных сегментов на общую часть оперативной памяти достигается
либо за счет согласованной настройки ОС многочисленных дескрипторов для процессов,
либо помещением единственного разделительного виртуального сегмента в общую часть
виртуального адресного пространства процессов, которую обычно используют для
модулей ОС. В этом случае настройка дескриптора сегмента и дескрипторов страниц
выполняется один раз, а все процессы пользуются такой постройкой и совместно
используют часть оперативной памяти.
При работе с разделяемыми сегментами памяти необходимо соблюдать общие правила
использования разделяемых ресурсов – семафоры, мониторы и т.п.
Для отличия разделяемых сегментов памяти от индивидуальных. Дескриптор сегмента
должен содержать поле, имеющий два значения shared(разделяемый) или
private(индивидуальный).
Разделяемые сегменты выгружаются на диск системой виртуальной памяти по тем же
алгоритмам и с помощью тех же механизмов что и индивидуальные.
Кэширование данных
Память ЭВМ – это иерархия ЗУ, отличающихся средним временем доступа к данным,
объемом и стоимостью хранения 1 бита информации.
Фундамент этой пирамиды – память на жестких дисках, но время доступа к диску
исчисляется миллисекундами.
Оперативная память – время доступа 10-20 наносекунд (от нескольких мегабайт до
нескольких гигабайт)
Сверхоперативная память (десятки сотни килобайт) – 8нсек.
Внутренние регистры процессора – несколько десятков байт со временем доступа 2-3
наносекунд.
Кэш память или просто кэш способ совместного функционирования двух типов
запоминающих устройств, отличающихся временем доступа и стоимостью хранения
данных, который за счет динамического копирования в быстрые ЗУ наиболее часто
используемой информации из «медленного» ЗУ позволяет, с одной стороны, уменьшить
среднее время доступа к данным, с другой - сэкономить более дорогую
быстродействующую память.
Особенностью кэширования является то, что система не требует никакой внешней
информации об интенсивности использования данных, ни пользователи, ни программы не
принимают никакого участия в перемещении данных из ЗУ одного типа в ЗУ другого
типа, все это делается автоматически системными средствами.
Кэшем часто называют не только способ организации двух типов запоминающих
устройств, но и одно из устройств – «быстрое ЗУ». Оно дороже и сравнительно
небольшого объема в противовес «медленному» ЗУ – оперативной памяти.
Если кэширование используют для уменьшения среднего времени доступа к
оперативной памяти, то в качестве КЭШа используют более дорогую и
быстродействующую статическую память.
Если кэширование используется системой ввода-вывода для ускорения доступа к
данным, хранящимся на диске, роль кэш-памяти играют буфера, реализованные в
оперативной памяти.
Виртуальную память тоже можно рассматривать как частный случай кэширования.
Принцип действия кэш-памяти
Содержимое кэш-памяти представляет собой совокупность записей обо всех
загруженных в нее элементах данных из основной памяти. Каждая запись включает:

элементы данных;

адрес, который этот элемент имеет в основной памяти;

дополнительную информацию, которая используется для реализации алгоритма
включает признак модификации и признак действительности данных.
При каждом обращении к основной памяти по физическому адресу просматривается
содержимое кэш-памяти с целью определения, не находятся ли там нужные данные.
Кэш-память не является адресуемой, поэтому поиск нужных данных осуществляется
по содержимому - по взятому из запроса значению поля адреса в оперативной памяти.
Далее возможны два варианта развития:

данные обнаружены в кэш-памяти, т.е. произведено кэш-попадание (cache-hit),
они считываются и передаются источнику запроса;

нужные данные отсутствуют, т.е. произошел кэш-перенос (cache-miss), они
считываются из основной памяти, передаются источнику запроса и одновременно
копируются в кэш-память.
Эффективность кэширования зависит от вероятности попадания в кэш.
источник запросов к
основной памяти
медленный ответ
(кэш – промах)
основная память
КЭШ
быстрый ответ
(кэш - попадание)
Если обозначить вероятность кэш-попадания через p, а время доступа к основной
памяти через t1, время доступа через t2, то по формуле полной вероятности среднее время
доступа будет равно:
t=t2p+t1(1-p)
Если p=1, время доступа равно t2.
Вероятность обнаружения данных в кэше зависит от различных факторов, таких как:

объем кэша;

объем кэшируемой памяти;

алгоритм замещения данных в кэше;

особенностей выполняемой программы и т.п.
На практике процент попаданий оказывается весьма высоким – порядка 90%. Такой
процент объясняется наличием у данных объективных свойств таких как
пространственной и временной локальности.
Пространственная локальность. Если произошло обращение по некоторому адресу,
то с высокой вероятностью в ближайшее время произойдет обращение по соседним
адресам.
Временная локальность. Если произошло обращение по некоторому адресу, то
следующее обращение по тому же адресу с большой вероятностью произойдет в
ближайшее время.
Поскольку при выполнении программы очень высока вероятность, что команды
выбираются из памяти одна за другой из соседних ячеек, имеет смысл загружать в кэш
целый фрагмент программы. Аналогично и с массивами данных.
В процессе работы содержимое кэш-памяти постоянно обновляется. Вытеснение
данных означает либо просто объявление свободной некоторой области кэш-памяти
(сброс бита действительности) менялись либо в дополнение к этому копирование данных
в основную память, если они модифицировались.
Наличие в компьютере двух копий данных – в основной памяти и в кэше – порождает
проблему согласования данных.
Существует два подхода к решению этой проблемы:

сквозная запись (write through). При запросе к основной памяти (в том числе
при записи) просматривается кэш. Если данные по запрашиваемому адресу отсутствуют,
запись выполняется только в основную память. Если данные находятся в кэше, запись
делается и в кэш ив память.

обратная запись (write back). Выполняется просмотр кэша, если данных там нет,
то запись делается в основную память. В противном случае запись делается только в кэш.
При этом устанавливается признак модификации. При вытеснении данных из кэша эти
данные будут переписаны в основную память.
Способы отображения основной памяти на кэш.
Алгоритмы поиска и замещения данных в кэше зависят от того, как основная память
отображается на кэш.
Используются две схемы отображения:

случайное отображение;

детерминированное отображение.
При случайном отображении элемент оперативной памяти может быть размещен в
произвольном месте кэш памяти. Он помещается туда вместе со своим адресом в
оперативной памяти. Поиск информации осуществляется по этому адресу. Процедуры
простого перебора адресов при больших временных затрат.
Поэтому используется так называемый ассоциативный поиск, при котором сравнение
выполняется не последовательно с каждой записью в кэше, а параллельно со всеми его
записями. Признак, по которому выполняется сравнение, называется тэгом (tag). В
данном случае тэгом является адрес данных в оперативной памяти.
Электронная реализация такого поиска значительно удорожает кэш-память. Поэтому
этот метод используется для обеспечения высокого процента попадания при небольшом
объеме кэш-памяти.
В кэшах на основе случайного отображения вытеснение старых данных происходит
только в том случае, когда вся кэш-память заполнена и нет свободного места. Выбор
данных на выгрузку основывается на тех же принципах, что и при замещении страниц
(давно нет обращений, меньше всего обращений и т.д.).
При детерминированном способе отображения любой элемент основной памяти
отображается в одно и то же место кэш-памяти. В этом случае кэш-память разделена на
строки, каждая из которых предназначена для хранения одной записи об одном элементе
данных и имеет свой номер.
Между номерами строк кэш-памяти и адресами оперативной памяти устанавливается
соответствие «один ко многим»: одному номеру строки соответствует несколько
(довольно много) адресов оперативной памяти.
В качестве отображающей функции может использоваться простое выделение
нескольких разрядов из адреса оперативной памяти, которые интерпретируются как номер
строки кэш-памяти. Такое отображение называется прямым. Например, кэш рассчитан на
1024 записи (1024 строки). Тогда любой адрес оперативной памяти может быть отображен
на адрес кэш-памяти простым отделением 10 двоичных разрядов.
Адрес ОП из запроса
источник запросов
к основной памяти
тэг
основная
память
в данном случае 10
разрядов
номер элемента
кэш - памяти
Память тэгов
Память данных
искомые данные
КЭШ
При поиске данных в кэше используется быстрый прямой доступ к записи по номеру
строки, полученному из адреса оперативной памяти из запроса. Кроме того, выполняется
дополнительная проверка на совпадение тега с соответствующей частью адреса из
запроса.
При совпадении тега с соответствующей частью адреса из запроса констатируется кэш
попадание. Если нет констатируется кэш-промах и данные считываются из OI и
копируются в кэш.
Во многих современных процессорах кэш-память стоится на основе сочетания этих
двух подходов, что позволяет найти компромисс между сравнительно
При смешанном подходе произвольный адрес оперативной памяти отображается не на
один адрес кэш-памяти (как это характерно для прямого отображения), и не на любой
адрес кэш-памяти (как это делается при случайном отображении), а на некоторую группу
адресов). Все группы пронумерованы. Поиск в кэше осуществляется вначале по номеру
группы, полученному из адреса ОП из запроса, а затем в пределах группы путем
ассоциативного просмотра всех записей группы на предмет совпадения старших частей
адресов ОП
Адрес запроса
1010111
тэг
Память тэгов
0010
номер группы
Память данных
0 группа
1 группа
1010111
Иском. данные
.
.
.
.
.
.
2 группа
(0010)
n группа
Комбинирование прямого и
детерминированного отображения
При промахе данные копируются по любому свободному адресу из однозначно
заданной группы.
Если свободных адресов в группе нет, то выполняется вытеснение данных. Поскольку
кандидатов на выгрузку несколько – все записи из данной группы – алгоритм замещения
может учесть интенсивность обращения к данным и тем самым повысить вероятность
попаданий в будущем.
Как мы видели, кэш просматривается только с целью согласования содержимого кэша
и основной памяти. Если происходит промах, то запросы на запись не вызывают никаких
изменений кэша.
В некоторых реализациях кэш-памяти при отсутствии данных в кэше они копируются
туда из основной памяти независимо от того, выполняется запрос на чтение или запись.
В соответствии с описанной логикой работы кэш памяти при возникновении запроса
сначала просматривается кэш, а затем, если произошел промах, выполняется обращение к
основной памяти.
Однако, часто реализуется и другая схема работы кэша: поиск в кэше и основной
памяти начинается одновременно, затем в результате просмотра кэша, операция в
основной памяти либо продолжается, либо прерывается.
В ряде вычислительных систем используется двухуровневое кэширование.
Кэш первого уровня имеет меньший объем и более высокое быстродействие, чем кэш
второго уровня. Кэш второго уровня играет роль основной памяти по отношению к кэшу
первого уровня.
Кэш 1
Кэш 2
ОП
Сначала делается попытка обнаружить данные в кэше 1-го уровня. Если произошел
промах, поиск продолжается в кэше второго уровня. Если нужные данные отсутствуют и
здесь, тогда происходит считывание данных из основной памяти.
При считывании данных из ОП происходит их копирование в кэш второго уровня, а
если данные считываются из кэша второго уровня, то они копируются в кэш первого
уровня.
Кэши разных уровней могут согласовывать данные разными способами. Например, в
процессоре Pentium кэш первого уровня использует кэш первого уровня - обратную
запись.
Заметим, что мы рассматривали системы, в которых на каждом уровне имеется только
один кэш. Однако существует целый ряд систем – распределенных систем обработки
информации, в которых на каждом уровне имеется несколько кэшей.
Ввод – вывод и файловая система
Основными компонентами подсистемы ввода – вывода являются драйверы,
управляющие внешними устройствами, и файловые системы.
К подсистеме ввода – вывода можно также отнести и диспетчер прерываний;
правда это весьма условно, так как он обслуживает не только модули подсистемы ввода –
вывода но также планировщик или диспетчер потоков.
Файловую систему целесообразно рассматривать совместно с другими компонентами
ввода – вывода по двум причинам:

файловая система активно использует ввод – вывод;

модель файла может быть в основе большинства механизмов доступа к
устройствам ввода – вывода.
Задачи ОС по управлению файлами и устройствами
Подсистема ввода-вывода мультипрограммной ОС решает следующие основные
задачи:

организация параллельной работы устройств ввода – вывода и процессора;

согласование скоростей обмена и кэширование данных;

разделение устройств и данных между процессами;

обеспечение удобного логического интерфейса между устройствами и
остальной частью системы;

поддержка широкого спектра драйверов с возможностью простого включения в
систему нового драйвера;

динамическая загрузка и выгрузка драйверов;


поддержка нескольких файловых систем;
поддержка синхронных и асинхронных операций ввода – вывода.
Организация параллельной работы устройств ввода – вывода и
процессора.
Каждое устройство ввода – вывода – снабжено блоком управления – контроллером.
Контроллер взаимодействует с драйвером – системным программным модулем,
управляющим данным устройством.
Контроллер периодически принимает от драйвера выводимую на устройство
информацию и команды управления, которые определяют, что делать с этой
Устройство ввода – вывода работает под управлением контроллера в интервалах
между выдачей команд независимо от ОС.
От подсистем ввода – вывода требуется спланировать в реальном масштабе времени
запуск и приостановку драйверов, обеспечив приемлемое время реакции каждого
драйвера на независимые события контролера.
Для этого все драйверы распределяются по нескольким приоритетным уровням в
соответствии с требованиями по времени реакции и временными затратами
процессорного времени.
Для реализации этого процесса обычно используется диспетчер прерываний ОС.
Согласование скоростей обмена и кэширования данных
При обмене данными возникает задача согласования скоростей. Оно достигается за
счет буферизации данных в ОП и синхронизации доступа процессов к буферу.
Но буферизация только на основе ОП в подсистеме ввода – вывода оказывается
недостаточной – разница между скоростью обмена с ОП и скоростью работы внешнего
устройства оказывается слишком большой. С другой стороны, при больших объемах
ввода – вывода ОП просто может не хватить.
Для таких случаев в качестве буфера используется (spool - шпулька). Типичный
пример – вывод на принтер. Печать документа в несколько десятков мегабайт – не
редкость.
Другое решение проблемы – большая буферная память в контроллерах внешних
устройств. Пример – контроллеры графических дисплеев. Их ОП соизмерима с ОП
процессора.
Распределение устройств и данных между процессами
Устройства ввода – вывода могут предоставляться процессам, как в монопольном, так
и в разделяемом режимах.
ОС должна обеспечивать контроль доступа теми же способами, что и при доступе
процессов к другим ресурсам ВС.
ОС может контролировать доступ не только к устройству в целом, но и к отдельным
порциям данных. Например, при выводе на графический дисплей – информация по
отдельным окнам экрана.
Потому для организации совместного доступа к частям устройства или частям данных
непременным условием является задание режима совместного использования устройствам
или данных в целом.
ОС предоставляет устройства, отслеживая процедуры захвата и освобождения
использования устройств, оптимизируя последовательность операций ввода – вывода для
различных процессов в целях повышения общей производительности, если это возможно.
Например, при обмене данными нескольких процессов с дисками можно упорядочить
последовательность операций так
Обеспечение удобного логического интерфейса между
устройствами и остальной частью системы
Все современные ОС поддерживают в качестве основы такого интерфейса файловую
модель периферийных устройств. При таком подходе любое устройство выглядит как
набор байт, с которыми можно работать с помощью унифицированных системных
вызовов (например, read, write), задавая имя файла – устройства и смещение от начала
последовательности байт.
Привлекательность такой модели состоит в ее простоте и унифицированности для
устройств различного типа.
Иногда для специальных применений этот интерфейс используется как базовый и
требует дополнительной доработки. Например, при программировании операций сетевого
обмена или вводе на дисплей графической информации.
Поддержка широкого спектра драйверов и простота включения
нового драйвера в систему
Наличие разнообразных драйверов для всех типов внешних устройств является важной
характеристикой ОС. Например, такая прекрасная во многих отношениях ОС как ОС/2
была вытеснена ОС Windows благодаря богатству драйверов.
Поэтому открытость интерфейса драйверов, т.е. доступность его описания для
независимых разработчиков ПО – необходимое
Драйвер взаимодействует, с одной стороны с модулями ядра ОП (подсистемой ввода –
вывода, системными вызовами, управления процессами и памятью), с другой стороны, с
контролерами внешних устройств.
Поэтому существует 2 типа интерфейсов:

драйвер – ядро;

драйвер – устройство.
Интерфейс драйвер – ядро должен быть стандартизирован в любом случае.
Интерфейс драйвер – устройство имеет смысл стандартизировать тогда, когда
подсистема ввода – вывода не разрешает драйверу непосредственно взаимодейсвовать с
аппаратурой.
Экранирование драйвера от аппаратуры является весьма полезной функцией, так как
драйвер становится независимым от аппаратной платформы.
Для поддержки процесса разработки драйверов к ОС обычно выпускается пакет ДДК
(Diver Development Kit), представляющий собой инструментарий – библиотеки,
компиляторы и отладчики.
Динамическая загрузка и выгрузка драйверов
Включение драйвера в состав модулей работающей ОС представляет собой
самостоятельную проблему.
Так как набор потенциально поддерживаемых данной ОС периферийных устройств
всегда шире конкретной системе, то очень ценным свойством ОС является возможность
динамически загружать в ОП требуемый драйвер (без останова ОС) и выгружать его после
того, как потребность в поддержке устройства миновала. Это может существенно
экономить системную область памяти.
Альтернативой динамической загрузке драйверов при изменениях текущей
конфигурации внешних устройств является повторная компиляция кода ядра с требуемым
набором драйверов, что создает между всеми компонентами ядра статические связи
вместо динамических. Изменения в процессе работы ОС невозможны.
Поддержка нескольких файловых систем
Диски – особый род периферийных устройств, так как на них хранится большая часть
пользовательских и системных данных. Эти данные организуются в файловые сисемы,
свойства которых во многом определяют свойства ОС (отказоустойчивость,
быстродействие, макс. объем хранимых данных). Хорошая файловая система обычно
«кочует» из одной ОС в другую.
Так файловая система FAT первоначально была разработана для MS-DOS, затем
перекочевала в OS/2 и MS Windows (3.1).
Важно, чтобы архитектура подсистемы ввода- вывода позволяла бы достаточно просто
включать в ее состав новые типы файловых систем без необходимости переписывания
кода.
Для этого в ОС предусматривается специальный слой ПО, который отвечает за
решение данной задачи. Например, слой VFS (Virtual File System) в версиях UNIX.
Поддержка синхронных и асинхронных операций ввода – вывода
Операции ввода – вывода могут выполняться в синхронном и асинхронном режимах.
Синхронный режим означает, что процесс, запросивший операцию, приостанавливает
свою работу до тех пор, пока операция ввода – вывода не завершится.
При асинхронном режиме процесс выполняется в мультипрограммном режиме
одновременно с операцией ввода – вывода.
Подсистема ввода – вывода предоставляет своим клиентам (пользовательским
процессам и ядру ОС) возможность выполнять как синхронные, так и асинхронные
операции ввода – вывода в зависимости от потребностей вызывающей стороны.
Системные вызовы ввода – вывода чаще оформляются как синхронные процедуры в
связи с тем, что такие операции длятся долго и пользовательскому процессу или потоку
все равно придется ждать результатов, чтобы продолжить работу.
Внутренние вызовы из модулей ядра ОС выполняются как асинхронные процедуры,
так как ядру нужна свобода в выборе дальнейшего поведения после запроса операции
ввода – вывода.
Многослойная модель подсистемы ввода – вывода
При большом разнообразии устройств ввода – вывода, обладающих весьма
отличающимися позволяет соблюсти баланс между двумя противоречивыми
требованиями:

необходимостью учета всех особенностей каждого устройства;

единое логическое представление и унифицированный интерфейс для
устройств всех типов.
Нижние слои подсистемы ввода – вывода должны включать индивидуальные драйвера
конкретных физических устройств, а верхние слои должны обобщать процедуры
управления этими устройствами, предоставляя по возможности общий интерфейс.
Менеджер ввода – вывода
Модули подсистемы ввода – вывода, которые организуют согласованную работу всех
компонентов подсистемы и взаимодействие с пользовательскими процессами и другими
подсистемами ОС образуют как бы оболочку подсистемы.
Эта оболочка называется менеджером ввода – вывода.
Верхний слой менеджера поддерживает пользовательский интерфейс ввода –
вывода, т.е. принимает запросы на ввод – вывод и переадресует их драйверам, а также
возвращают процессам результаты операций ввода – вывода.
Нижний слой взаимодействует с контроллерами внешних устройств, экранирую
драйверы от особенностей аппар ввода – вывода, системы прерываний и т.п. Этот слой
принимает от драйверов запросы на обмен данными с регистрами контроллеров в
некоторой обобщенной форме с пользованием независимых от шины ввода – вывода
адресации и формата, преобразуя эти запросы в формат, понятный аппаратной платформе.
Еще одной функцией менеджера ввода – вывода является организация взаимодействия
модулей ввода –вывода с модулями других подсистем ОС, таких как подсистемы
управления процессами, виртуальной памятью и др.
Наличие стандартного виртуального межмодульного интерфейса повышает
устойчивость и улучшает расширяемость подсистемы ввода – вывода, хотя и замедляет ее
работу.
Многоуровневые драйверы.
Традиционные особенности и функции, выполняемые драйвером состоят в
следующем:

входит в состав ядра ОС, работая в привилегированном режиме;

непосредственно управляет внешним устройством, взаимодействуя с его
контроллером с помощью команд ввода – вывода компьютера;

обрабатывает прерывания от контроллера;

предоставляет программисту удобный логический интерфейс, экранируя от
ненужных деталей и подробностей;

взаимодействует с другими модулями
Традиционные драйверы н делились на слои. С развитием ОС наряду с
традиционными появились высокоуровневые драйверы, которые располагаются над
традиционными драйверами. При этом традиционные драйверы стали называть
аппаратными. С помощью высокоуровневого драйвера повышается гибкость и
расширяемость функций по управлению устройством – вместо жесткого набора функций,
которые сосредоточены в низкоуровневом драйвере, администратор ОС может выбрать
требуемый набор функций, установив нужный высокоуровневый драйвер.
Если различным приложениям необходимо работать с различными логическими
модулями одного и того же физического устройства, то для этого достаточно установить в
системе несколько драйверов на одном уровне, работающих над одним аппаратным
драйвером.
Количество уровней драйверов обычно не ограничивается. На практике используется
от 2 до 5 уровней.
Высокоуровневые драйверы оформляются по тем же правилам и придерживаются тех
де внутренних интерфейсов, что и аппаратные драйверы за исключением того, что они не
вызываются по прерываниям, так как взаимодействуют
Как общие принципы построения многоуровневых драйверов могут быть реализованы
применительно к конкретным устройствам можно рассмотреть на примере управления
дисками.
Прикладной программный интерфейс
системные вызовы
Блок – ориентированный интерфейс
VFS
VFS
NTFS
FAT
Дисковый кэш
Драйвер
HD
Драйвер
FD
Диспетчер прерывания, функции доступа к аппаратуре
Аппаратные драйверы поддерживают для верхних уровней представление диска как
последовательного набора блоков одинакового размера, преобразуя вместе с
контроллером номер блока в более сложный адрес из номера цилиндра, головки и сектора.
Понятие «файла» и файловой системы аппаратные драйверы не поддерживают
Эти абстракции создаются на более высоком уровне . Они могут поддерживать
несколько файловых систем одновременно. Для этого в ОС устанавливается несколько
высокоуровневых драйверов (UFS, NTFS, FAT). Они работают с общими аппаратными
драйверами, но по-своему организуют файловую систему пользователям и прикладными
процессам.
Для унификации представления различных файловых систем может использоваться
общий драйвер верхнего уровня VFS(Virtual File System). Такой драйвер используется,
например в системах UNIX.
В унификацию драйверов большой вклад внесла ОС UNIX. В ней все драйверы
разделены на 2 больших класса; блок – ориентированные и байт – ориентированные.
Например, драйвера графических и сетевых устройств относятся к байт –
ориентированным, а драйверы, управляющие устройствами прямого доступа, которые
хранят информацию в блоках фиксированного размера, - к блок – ориентированным
(диск).
Адресуемость блоков приводят к тому, что для устройств прямого доступа имеется
возможность кэширования данных в оперативной памяти. Это влияет на общую
организацию ввода – вывода таких устройств.
Специальные файлы
Специальные файлы, называемые иногда наборами данных, которые хранятся на
дисках. Они используются для унифицированного представления устройств ввода –
вывода.
Со специальным файлом можно работать так же, как и с обычным – открывать, читать
или записывать байты, а после завершения операции закрывать.
Для этого используется те же системные вызовы, что и для работы с обычными
файлами; open, create, read, write, close.
Традиционно специальные файлы помещаются в каталог /dev, хотя ничто не мешает
создать их любом каталоге файловой системы. При появлении нового устройства и,
соответственно, нового драйвера администратор системы может создать новую зарись
(например, с помощью команды mknod).
Логическая организация файловой системы
Логическая модель файловой системы материализуется в виде дерева каталогов,
выводимого на экран, например, с помощью Norton Commander или Windows Explorer, в
символьных составных именах файлов и командах работы с файлами.
Цели и задачи файловой системы
Файл – это именованная область внешней памяти в которую можно записывать и из
которой можно считывать данные. Обычно файлы хранятся на энергонезависимой памяти
– диске. Однако есть и исключения. Например, может быть создан
Основные цели использования файла:

долговременное и надежное хранение информации;

совместное использование информации.
Файл может быть создан одним пользователем, а использоваться другим. При этом
могут быть определены права доступа к информации.
Файловая система – часть ОС, которая включает;

совокупность всех файлов на диске;

наборы структур данных для управления файлами. Каталоги файлов.
дескрипторы файлов, таблицы распределения свободного и занятого пространства на
диске;

комплекс системных программных средств, реализующих операции над
файлами; создание, уничтожение, запись, чтение именования и поиск файлов.
Файловая система позволяет обходиться набором простых операций над некоторым
абстрактным объектом, наз. файлом.
Файловая система экранирует все сложности физической организации
долговременного хранения данных и предоставляет набор удобных в использовании
команд для манипулирования файлами.
Задачи, которые решает ФС, зависят от способа организации вычислительного
процесса в целом. Самый простой тип ФС – однопользовательская, однопрограммная. К
их числу принадлежит MS-DOS.
следующие:

именование файлов;

программный интерфейс для приложений;

отображение логической модели файловой системы на физическую
организацию хранилища данных;

обеспечение устойчивости файловой системы к сбоям питания, ошибка
аппаратных и программных средств.
Задачи ФС усложняются в однопользовательских мультипрограммных ОС. Примером
такой ОС является OS/2. Здесь добавляется новая задача совместного доступа к файлу из
нескольких процессов.
В этом случае файл – разделяемый ресурс со всеми вытекающими отсюда проблемами.
В многопользовательских системах добавляется еще одна задача; защита файлов от
несанкционированного доступа.
Типы файлов
Обычные файлы – содержат информацию произвольного характера. Большинство
современных ОС (UNIX, Windows, OS/2) никак не ограничивают и не контролируют
содержимое и структуру файла.
Все ОС должны распознавать хотя бы один тип файлов – их собственные исполняемые
файлы.
Каталоги – особый тип файлов. Они содержат системную справочную информацию о
наборе файлов, сгруппированных пользователями по какому – либо неформальному
признаку (например, один документ и т.п.).
Во многих ОС в каталог могут входить
для поиска.
Специальные файлы - это фиктивные файлы, ассоциированные с устройствами
ввода – вывода. Они используются с целью унификации механизма доступа к файлам и
внешним устройствам. Специальные файлы позволяют пользователю выполнять операции
ввода – вывода посредством обычных команд записи в файл или чтения из файла. Эти
команды обрабатываются сначала программами файловой системы, а затем на некотором
этапе выполнения запроса преобразуются ОС в команды управления соответствующим
устройством.
Иерархическая структура файловой системы
Большинство файловых систем имеет иерархическую структуру, в которой уровни
создаются за счет того, что каталог более низкого уровня может входить в каталог более
высокого уровня.
Сеть
Дерево
Граф описывающий иерархию каталогов может быть деревом или сетью. если файлу
разрешено входить только в один каталог, файлы образуют дерево. Сеть – файл может
входить сразу в несколько каталогов.
Например, в MS – DOC и Windows каталоги образуют древовидную структуру, а в
UNIX – сетевую.
В древовидной структуре каждый файл является листом. каталог самого верхнего
уровня называется корневым каталогом или корнем.
Имена файлов
В файловых системах используется три типа имен файлов: простые, составные и
относительные.
Простое (короткое, символьное) имя идентифицирует файл в пределах одного
каталога. Эти имена присваивают пользователи с учетом ограничений ОС. Мак в
файловой системе FAT длина имени ограничивается схемой 8.3 (8 символов имя, 3расшинение), а в файловых системах NTFS и FAT32, входящих в состав ОС Windows NT,
имя файла может содержать до 255 символов.
В иерархических файловых системах разным файлам разрешено иметь одинаковые
простые символьные имена при условии, что они принадлежат разным каталогам.
Для однозначной идентификации в таких системах используется так наз. полное имя.
Полное имя представляет собой цепочку через которые проходит путь от корня до
данного файла.
В древовидной файловой системе между файлом и его полным именем имеется
взаимно однозначное соответствие один файл – одно полное имя.
В случае сетевой структуры имеет место соответствие: один файл – много полных
имен.
Файл может быть также идентифицирован относительным именем. Оно образуется
через понятие текущий каталог. ОС фиксирует имя текущего каталога и использует его
как «добавку» к полному имени, используя относительное имя. Например. текущий
каталог USER относительное имя main.exe. Полное имя USER/main.exe.
Монтирование
Вычислительная система может иметь несколько дисковых устройств. Более того,
одни физическое устройство может иметь несколько логических дисков.
Возникает проблема хранения файлов в системе, которая имеет несколько устройств
внешней памяти.
Первое решение. На каждом из устройств размещается автономная файловая система.
Т.е. имеется два независимых дерева каталогов. Здесь в полное имя файла входит
идентификатор соответствующего логического
Второе решение. Файловые системы объединяются в единую файловую систему,
которая описывается единым деревом каталогов.
Такая операция наз. монтированием.
При этом ОС выделяет одно дисковое устройство, называемое системным. Пусть
имеется де файловые системы, расположенные на разных логически дисках, причем одни
из них является системным.
Файловая система. расположенная на системном диске, назначается корневой. для
связи иерархий файлов в корневой файловой системе выбирается некоторый
существующий каталог. После выполнения монтирования выбранный каталог становится
корневым каталогом второй файловой системы. Через этот каталог монтируемая файловая
система подсоединяется как поддерево к общему дереву.
файловая система 1
USER
dev
USER
2
2
2
man
файловая система 2
обычный
файл
каталог
устройство
(спецфайл)
local
man1
man2
write
susan
общая файловая система
dev
2
USER
2
man
local
man1
write
man2
susan
Атрибуты файлов
Атрибуты –информация, которая описывает свойства файла. Примеры возможных
атрибутов:

тип файла (обычный файл, каталог, спецфайл);

владелец файла;

создатель файла;

пароль для доступа к файлу;

информация о разрешенных операциях доступа к файлу;

времена создания, последнего доступа и последнего изменения;

текущий размер файла;

максимальный размер файла;

признак «только для чтения»;

признак «скрытый файл»;

признак «системный файл»;

признак «архивный файл»;

признак «двоичный/символьный»;

признак «временный» (удалить по завершении процесса);

признак блокирования;

признак записи в файл;

указатель на ключевое поле в записи;

длина ключа.
Конкретный перечень атрибутов определяется спецификой файловой системы.
сделано в MS-DOS
8
Имя файла
3
Расширение
Резервные Время
Дата
1
R A H S
Номер
первого
набора
4
Резервные
Размер
Другим вариантом является размещение атрибутов в специальных таблицах, когда в
каталогах содержатся только ссылки на эти таблицы. В такой файловой системе (ОС
UNIX) структура каталога очень простая
2
14
№ индексного
Имя файла
дескриптора
Индексный дескриптор файла – таблица, в которой сосредоточены значения атрибутов
файла. Такая система более гибкая. Файл может быть включен сразу в несколько
каталогов.
Логическая организация файла
Признаками, отделяющими один структурный элемент от другого, могут служить
определенные кодовые последовательности или просто известные программе значения
смещений этих структурных элементов относительно начала файла. Поддержание
структуры данных может быть либо целиком возможно на приложение, либо в той или
иной степени эту работу может на себя брать файловая система.
В первом случае файл представляется ФС неструктурированной последовательностью
данных. Приложение формулирует запросы к файловой системе на ввод – вывод,
используя общие для всех приложений системные средства, например, указывая
смещения от начала файла и количество байт, которые необходимо прочесть или записать.
Поступивший к приложению поток байт интерпретируется в соответствии с заложенной в
программе логикой.
Модель файла, в соответствии с которой содержимое файла представляется
неструктурированной последовательностью (потоком) байт, широко используется в
большинстве современных ОС (MS-DOS, Windows NT/2000). Неструктурированная
модель файла позволяет легко организовать разделение файла между несколькими
приложениями: разные приложения могут по-своему структурировать и интерпретировать
данные, содержащиеся в файле.
Другая модель файла – структурированный файл. Эта модель применялась ранее (в
OS/360). Поддержание структуры файла обеспечивается файловой системой. Она видит
файл как упорядоченную последовательность логических записей.
Приложение может обращаться к ФС с запросами на ввод – вывод на уровне записей.
Например, считав запись 25 из файла FILE.DOC ФС обладает информацией о структуре
файла достаточной для того, чтобы выделить любую запись. ФС предоставляет
приложению доступ к записи, а вся дальнейшая обработка данных, содержащихся в этой
записи, выполняется приложением.
Развитием этого
поддерживают сложные структуры данных и взаимосвязи между ними.
Логическая запись – наименьший элемент данных которым оперирует программист
при обмене с внешним устройством.
ФС может обеспечивать два способа доступа к логическим записям:

последовательный доступ;

прямой доступ (позиционируется файл на конкретную запись)
Физическая организация файловой системы
Представление о файловой системе как об иерархически организованном множестве
информационных объектов имеет мало общего с фактическим порядком хранения файлов
на диске.
Файл может быть разбросан «кусочками» по всему диску. Логически объединенные
файлы из одного каталога совсем не обязательно соседствуют на диске.
Принципы размещения файлов, каталогов и системной информации на реальном
устройстве описываются физической организацией файловой системы.
Основным носителем является жесткий диск, который состоит из пакета пластин.
На каждой стороне пластины размещены тонкие концентрические кольца - дорожки
(tracks), на которых хранятся данные, Количество дорожек зависит от типа диска.
Нумерация дорожек начинается с 0 от внешнего края в центру. Когда диск вращается,
головка считывает данные с магнитной дорожки или записывает их на дорожку.
дискретными шагами. Каждый шаг сдвигается на 1 дорожку. В некоторых дисках
вместо одной головки имеется по головке на каждую дорожку.
Совокупность дорожек одного радиуса на всех поверхностях всех пластин называется
цилиндром (cylinder). Каждая дорожка разбивается на фрагменты, называемые
секторами (sectors) или блоками (blocks).
Все дорожки имеют равное число секторов, в которых можно максимально записать
одно и то же число байт.
Сектор имеет фиксированный для конкретной системы размер, выражающийся
степенью двойки. Чаще всего – 512 байт. Поскольку дорожки разного радиуса имеют
одинаковое число секторов, плотность записи на дорожках различна – больше к центру.
Сектор – наименьшая адресуемая единица обмена данными с оперативной памятью.
Для того, чтобы контроллер мог найти на диске нужный сектор, необходимо задать
ему все составляющие адреса сектора; номер цилиндра, номер поверхности и номер
сектора.
Так как прикладной программе нужен не сектор, а некоторое количество байт, не
обязательно кратное размеру сектора, типичный запрос включает чтение нескольких
секторов, которые содержат требуемую информацию и одного или двух секторов с
избыточными данными.
ОС при работе с диском использует собственную единицу дискового пространства,
которое называют кластером. При создании файла на диске место ему выделяется
кластерами. Например, размер кластера может быть равен 1024 байт.
Дорожки и сектора создаются в результате выполнения процедуры физического (или
низкоуровневого)
Форматирование предшествует использованию диска.
Для определения границ блоков на диск записывается идентификационная
информация.
Низкоуровневый формат диска не зависит от типа ОС, которая этот диск использует.
Разметку диска под конкретный тип файловой системы выполняют процедуры
высокоуровневого или логического форматирования. При этом определяется размер
кластера и записывается информация, необходимая для работы файловой системы, в том
числе информация о доступном и неиспользуемом пространстве, о границах областей,
отведенных под файлы и каталоги о поврежденных областях. Кроме того, на диск
записывается загрузчик ОС – программа (обычно небольшая), которая начинает процесс
инициализации ОС после включения питания.
Прежде, чем форматировать диск под определенную файловую систему он может быть
разбит на разделы. Раздел – непрерывная часть физического диска. Его ОС представляет
как логическое устройство (логический диск).
Так как файловая система, с которой работает одна ОС, не может в общем случае
интерпретироваться ОС другого типа, логические диски не могут быть использованы ОС
разного типа.
На каждом логическом диске может создаваться только одна файловая система.
На разных логических дисках одного и того же физического диска могут
располагаться файловые системы разного типа.
Все разделы одного диска имеют одинаковый размер
низкоуровневого форматирования. Но при высокоуровневом форматировании в
разных логических дисках могут быть установлены файловые системы, размеры
кластеров которых имеют различные размеры.
ОС может поддерживать различные статусы логических дисков, особым образом их
различая. Одни разделы (диски) можно использовать для загрузки модулей ОС, в других
можно устанавливать только приложения и хранить файлы данных.
Один из разделов диска помечается как загружаемый (или активный). Именно из него
считывается загрузчик ОС.
Физическая организация и адресация файла
Физическая организация файла – это способ размещения файла на диске. Основными
критериями эффективности физической организации файлов являются:

скорость доступа к данным;

объем адресной информации файла;

степень фрагментированности дискового пространства;

максимально возможный размер файла.
Непрерывное размещение – простейший вариант физической организации. При этом
файлу предоставляется последовательность кластеров диска, образующих непрерывный
участок дисковой памяти. Основное достоинство – высокая скорость доступа, так как
затраты на поиск и считывание кластеров файла минимальны. Минимален и объем
адресной информации – достаточно хранить только номер первого кластера и объем
файла. Максимально возможный размер файла не ограничивается.
Этот вариант обладает существенным недостатком:

невозможно предсказать, какого размера должна быть непрерывная область,
если файл при каждой модификации может увеличивать размер;

большая проблема фрагментация (много свободных областей малого размера);
Размещение файла в виде связанного списка кластеров
При этом способе в начале каждого кластера содержится указатель на следующий
кластер.
Адресная информация минимальна: расположение файла задано одним числом –
номером первого кластера. Фрагментация на уровне кластеров отсутствует.
Недостаток: сложность реализации доступа к произвольно заданному месту файла;
нужно проследить всю цепочку кластеров от начала.
Использование связанного списка адресов
Файлу выделяется память в виде связанного списка кластеров. Номер первого кластера
запоминается в записи каталога, где хранятся характеристики этого файла. Остальная
адресная информация отделена от кластеров файла. С каждым кластером диска
связывается некоторый элемент – индекс. Индексы располагаются в отдельной области
диска. Эта таблица занимает один кластер. Когда память свободна, все индексы имеют
нулевое значение.
3
5
Область
индексов
1
2
3
4
Если некоторый кластер N назначен некоторому файлу, то индекс этого кластера
становится равным либо номеру M следующего кластера данного файла, либо принимает
специальное значение, являющееся признаком того, что этот кластер является для файла
последним. Индекс же предыдущего кластера файла принимает значение N, указывая на
вновь назначенный кластер.
Этот способ используется в ФС FAT.
Еще один способ состоит в простом перечислении номеров кластеров, занимаемых
файлом. Этот перечень и служит адресом файла.
Недостаток очевиден: длина адреса зависит от размера файла и для большого файла
может составить значительную величину.
Достоинство – высокая скорость доступа к произвольному кластеру, т.к. здесь
используется прямая адресация, а не просмотр цепочек.
Фрагментация также отсутствует.
В качестве примера рассмотрим физическую организацию ФС FAT.
Логический раздел, отформатированный под ФС FAT, состоит из следующих областей
(см. рис.):

загрузочный сектор. Содержит программу начальной загрузки ОС. Вид этой
программы зависит от типа ОС, которая будет загружаться из этого раздела.

основная копия FAT. Содержит информацию о размещении файлов и каталогов
на диске.

резервная копия FAT

область размером в 32 троки (16 Кбайт), что позволяет хранить 512 записей о
файлах и каталогах, т.к. каждая запись каталога состоит из 32 байт.

область данных. Предназначена для размещения всех файлов и всех каталогов,
кроме корневого каталога.
Загрузочный сектор (512 байт)
0
1
2
элементы
(указатели)
FAT
3
FAT1
FAT2 (копия)
32 байта – одна запись каталога
. Корневой каталог
.
.
0
1
2
3
…
кластеры
данных
Данные
FAT поддерживает всего два типа файлов; обычный файл и каталог. ФС распределяет
память только из области данных, причем использует в качестве
Таблица FAT (основная и копия) состоит из массива индексных указателей,
количество которых равно числу кластеров области данных. Между кластерами и
индексными указателями имеется взаимно однозначное соответствие.
Индексный указатель может принимать следующие значения, характеризующие
состояния связанного с ним кластера:

кластер свободен;

кластер используется файлом и не является последним кластером файла. В этом
случае индексный указатель содержит номер следующего кластера файла;

последний кластер файла;

дефектный кластер;

резервный кластер.
Таблица FAT – общая для всех файлов раздела.
В исходном состоянии, после форматирования, все кластеры свободны и все
индексные указатели (кроме тех, которые соответствуют резервным и дефектным блокам)
принимают значение «кластер свободен».
При размещении файла ОС просматривает FAT, начиная с начала, ищет первый
свободный индексный указатель. После его обнаружения в поле записи каталога «номер
первого кластера» фиксируется номер этого указателя. В кластер с этим номером
записываются данные файла. Он становится первым кластером файла. Если файл
умещается в одном кластера, то в указатель соответ
значение «последний кластер файла». Если размер файла больше .то ОС продолжает
просмотр FAT и ищет следующий указатель на свободный кластер. После обнаружения в
предыдущий указатель заносится номер этого кластера, и он становится следующим
кластером файла.
Процесс повторяется, пока не разместится весь файл и не будет создан связный список
всех кластеров файла.
Размер таблицы FAT и разрядность используемых в ней индексных указателей
определяется количеством кластеров в области данных. Для уменьшения потерь из-за
фрагментации желательно кластеры делать небольшими, а для сокращения объема
адресной информации и повышения скорости обмена наоборот.
При формировании диска под FAT обычно выбирают компромиссное решение, и
размеры кластеров выбираются из диапазона от 1 до 128 секторов или от 512 байт до 64
Кбайт.
Существует несколько разновидностей FAT отличающихся разрядностью индексных
указателей, которая используется в качестве условного обозначения FAT12, FAT16 и
FAT32. 12 разрядные указатели поддерживают 4096 кластеров, 16 разрядные – 65535, 32
разрядные – более 4 млн.
При удалении файла из ФС в первый байт соответствующей записи каталога заносится
признак о том, что запись свободна, а во все индексные указатели файла заносится
Остальные данные в записи каталога, в том числе номер первого кластера файла,
остаются нетронутыми, что оставляет шансы для восстановления ошибочно удаленного
файла.
Используемый в FAT метод хранения адресной информации о файлах не отличается
большой надежностью – при разрыве списка индексных указателей в одном месте ( по
разным причинам), теряется информация обо всех последующих кластерах файла.
FAT12 и FAT16 применялись в ОС MS-DOS, Windows 3.1, Windows NT/2000 и
Windows 95/98. В связи с ростом объемов дисков они вытесняются FAT32.
Для углубления изучения вопроса физической организации файловых систем,
рекомендовано ознакомиться с файловыми системами S5, UFS и NTFS, обратившись к
рекомендованной литературе.
Файловые операции
Файловая система предоставляет пользователям определенный набор операций по
работе с файлами.
Но какие бы операции не производились ОС необходимо выполнить ряд операций,
универсальных для всех выполняемых действий

по символьному имени файла найти его характеристики, которые хранятся в
файловой системе;

скопировать характеристики файла в оперативную память;

на основании характеристик файла проверить права пользователя на
выполнение запрошенной операции (чтение, запись, удаление и т.п.);

очистить область памяти, отведенную под временное хранение характеристик
файла.
ОС может выполнять последовательность действий над файлом двумя способами:

для каждой операции выполняются как универсальные, так и уникальные
действия. Такая схема иногда называется схемой без запоминания состояния операции;

все универсальные действия выполняются в начале и конце последовательности
операций, а для каждой промежуточной операции выполняются только уникальные
действия.
Большинство ФС поддерживают второй способ организации файловых операций как
более экономичный и быстрый.
Зато первый способ более устойчив к сбоям в работе системы, т.к. каждая операция
является самодостаточной и не зависит от результата предыдущей.
Открытие файла
Системный вызов open работает с двумя аргументами: символьным именем
открываемого файла и режимом открытия файла. Режим открытия говорит системе, какие
операции будут выполняться над файлом в последовательности операций до закрытия
файла
системному вызову close. Например, только чтение, только запись или чтение и
запись.
Обмен данными с файлом
Для обмена данными с файлом (предварительно открытым) используются процедуры
read и write. В том случае, когда необходимо явным образом указать, с какого байта файла
необходимо читать или записывать данные используются дополнительные системные
вызовы.
На основе системных вызовов ввода – вывода строятся более мощные библиотечные
функции ввода – вывода, составляющие прикладной интерфейс ОС.
Блокировка файлов
Блокировки файлов и отдельных записей в файлах являются средством синхронизации
между работающими в кооперации процессами, которые пытаются использовать одни и
тот же файл одновременно.
Многопользовательские ОС обычно поддерживают специальный системный вызов,
позволяющий программисту установить и проверить блокировки на файл и его отдельные
области.
Кооперирующиеся процессы обязательно должны проверять наличие блокировки на
файл, чтобы синхронизировать свою работу.
Контроль доступа к файлам.
Файлы – частный вид разделенных ресурсов, доступ к которым ОС должна
контролировать.
У каждого объекта доступа существует владелец. Владельцем может быть как
отдельный пользователь, так и группа пользователей. Владелец объекта имеет право
выполнять с ним любые допустимые для данного объекта операции. Во многих ОС
существует особый пользователь (superuser, root, administrator), который имеет все права
по отношению к любым объектам системы, не обязательно являясь их владельцем. Под
таким именем работает администратор системы, которому необходим полный доступ ко
всем файлам и устройствам для управления политикой доступа.
Различают два основных подхода к определению прав доступа:
Избирательный доступ. Имеет место, когда для каждого объекта сам владелец может
определить допустимые операции с объектами. Этот подход называется так же
произвольным доступом, так как позволяет администратору и владельцам объектов
определить права доступа произвольным образом, по их желанию. Между пользователями
и группами пользователей в системах с избирательным доступом нет жестких
иерархических взаимоотношений, которые определены по умолчанию и только для
администратора по умолчанию наделяемого всеми правами.
Мандатный доступ. Система наделяет пользователя определенными правами по
отношению к каждому разделяемому ресурсу в зависимости от того, к какой группе
пользователь отнесен.
От имени системы выступает администратор, а владельцы объектов лишены
возможности управлять доступом к ним по своему усмотрению.
Все группы пользователей в такой системе образуют строгую иерархию, причем
каждая группа пользуется всеми правами доступа группы более низкого уровня иерархии.
Членам какой-либо группы не разрешается предоставлять свои права членам групп
более низких уровней иерархии.
Мандатные системы доступа считаются более надежными, но менее гибкими, обычно
они принимаются в специализированных вычислительных системах с повышенными
требованиями к защите информации.
Механизм контроля доступа
Каждый пользователь и каждая группа пользователей обычно имеет символьное имя, а
также уникальный числовой идентификатор.
При выполнении процедуры логического входа в систему пользователь сообщает свое
символьное имя и пароль, а ОС определяет соответствующие числовые идентификаторы
пользователя и групп, в которые он входит.
Все идентификационные данные, в том числе имена и идентификаторы пользователей
и групп, пароли пользователей, а также сведения о вхождении пользователя в группы
хранятся
Вход пользователя в систему порождает процесс – оболочку, который поддерживает
диалог с пользователем и запускает для него другие процессы.
Процесс – оболочка получает от пользователя символьное имя и пароль и находит по
ним числовые идентификаторы пользователя и его групп. Эти идентификаторы
связываются с каждым процессом, запущенным оболочкой для данного пользователя.
Говорят, что процесс выступает от имени данных пользователя и данных групп
пользователей.
Определить права доступа к ресурсу – значит определить для каждого пользователя
набор операций, которые ему разрешено применять к данному ресурсу.
В разных ОС для одних и тех же типов ресурсов может быть определен свой список
дифференцируемых операций доступа.
Для файловых объектов этот список включает следующие операции:

создание файла;

уничтожение файла;

открытие файла;

закрытие файла;

запись в файл;

дополнение файла;

поиск в файле;

получение атрибутов файла;

установка новых значений атрибутов;

переписывание;

выполнение файла;

чтение каталога;

смена владельца;

изменение прав доступа.
В самом общем случае права доступа могут быть описаны матрицей прав доступа, в
котором столбцы соответствуют всем файлам системы, строки всем пользователям, а на
пресечении строк и столбцов указываются разные операции.
Имена файлов
Имена
пользователей
modern.txt
win.exe
Kira
читать
выполнять
Victor
читать
выполнять
Nataly
-
-
…
…
создать
.
.
.
Практически во всех ОП матрица прав доступа хранится “по частям”, т.е. для каждого
файла и каталога создается так называемый список управления доступом, в котором
описываются права на выполнение операций пользователей и группы пользователей по
отношению к этому файлу и каталогу. Список управителя доступа является частью
характеристик файла или каталога и хранится на диске в соответствующей области.
Однако, не все файловые системы поддерживают список управления доступом,
например, его не поддерживает ФС FAT, так она разрабатывалась для
однопользовательской MS – DOS.
Список управления доступом с добавленным к нему идентификатором владельца
называется характеристиками обязанности.
Download