Лекция 1. Введение в сетевые ОС

advertisement
Лекция 1. Введение в сетевые ОС
Современная информационно-вычислительная система (ИВС) является сложным многоуровневым комплексом взаимодействующих
аппаратных и программных компонентов (рис. 1.1).
Программы-приложения
Средства разработки ПО
Операционная система
Машинный язык
Системные программы
Оборудование, аппаратура
Микроархитектура
Физические устройства
Рис. 1.1. Структура ИВС
Аппаратные компоненты представлены тремя нижними уровнями:
1) физических устройств (представляет аппаратуру ИВС, состоящую из интегральных микросхем, проводников, механических
устройств и т. п.). Он целиком находится в области компетенции специалиста по электронике;
2) микроархитектуры (рассматривает аппаратные компоненты
ИВС, которые выступают в роли функциональных единиц, акцентируя внимание не на внутренней архитектуре и способе построения, а
на выполняемых ими задачах и взаимосвязи с другими компонентами). В качестве примера можно привести внутренние регистры процессора, арифметико-логическое устройство;
3) машинного языка (набор команд, используемый процессором,
обычно состоит из 50-300 команд, предназначенных преимущественно для перемещения данных по компьютеру, выполнения арифметических операций и операций сравнения).
Программные компоненты ИВС представлены верхними тремя
уровнями, которые можно разбить на два подуровня (системное ПО и
прикладное ПО):
1) прикладных программ (прикладное ПО), т. е. приложениями,
востребованными с точки зрения пользователей: текстовыми редакторами, СУБД, Интернет-приложениями и т. п.;
2) средств разработки ПО (системное ПО), т. е. компиляторами,
интерпретаторами, отладчиками и текстовыми редакторами исходных
текстов;
3
3) операционной системы (системное ПО), являющимся посредником между АО и прикладным ПО и играющим важную роль экрана
между разработчиком прикладного ПО и тонкостями функционирования АО. Его особенностью является то, что ПО, работающее на этом
уровне, запускается в привилегированном режиме и защищено от
вмешательства пользователя с помощью аппаратных средств. ПО, работающее на уровнях прикладных программ и средств разработки,
функционирует только в пользовательском режиме.
Можно выделить две основные функции ОС:
 управление ресурсами, которое включает такие задачи, как планирование ресурса (определение, какому процессу, когда и в каком количестве следует выделить данный ресурс), удовлетворение запросов
на ресурсы, мониторинг ресурса (поддержание оперативной информации о том, занят или свободен ресурс и какая доля уже распределена), разрешение конфликтующих запросов;
 функционирование в роли виртуальной машины (предоставление
доступа к аппаратуре ИВС как к набору виртуальных устройств,
скрывая специфику их функционирования, а также реализация для
этого механизмов защиты).
Следует заметить, что в данном контексте ресурс может быть как
программным, так и аппаратным. К числу аппаратных ресурсов можно отнести процессор (процессорное время), оперативную память,
дисковое пространство, внешние устройства, к программным ресурсам  трансляторы, компоновщики, средства программного управления внешними устройствами, библиотеки системных и прикладных
программ, базы данных и т. п.
Запросы на доступ к ресурсам поступают со стороны процессов.
Процессом (задачей) является последовательность действий, предписанных программой или ее логически законченной частью, а также
данные, используемые при этом (является минимальной единицей работы, для которой выделяются ресурсы).
В дальнейшем под термином операционная система мы будем
понимать комплекс программ, обеспечивающий управление ресурсами ИВС как виртуальной машины, а также управление процессами,
использующими эти ресурсы.
Поскольку операционная система выступает в роли менеджера ресурсов, то в ней должен быть реализован и интерфейс взаимодействия, с помощью которого пользователи или процессы могут обра-
4
щаться с запросами. Поэтому обязательной чертой ОС является наличие:
 пользовательского интерфейса, т. е. командного языка (символьного или графического) для управления функционированием системы
и набора сервисных услуг, освобождающих пользователя от выполнения рутинных операций;
 программного интерфейса, т. е. набора услуг, позволяющих программисту обходиться без кодирования рутинных операций.
Со времени своего появления ОС прошли долгий путь эволюции от
простейших однопользовательских однозадачных систем до современных многопользовательских многозадачных ОС. Для упрощения
рассмотрения различных представителей ОС в дальнейшем следует
провести их классификацию. Возможна следующая классификация
ОС.
1. По количеству пользователей, одновременно обслуживаемых
системой, – однопользовательские и многопользовательские. В однопользовательской системе все функциональные устройства компьютера находятся в полном распоряжении одного пользователя. Многопользовательская система включает компьютер без основных средств
интерфейса, предназначенных для обслуживания многих пользователей, и набор терминалов, обеспечивающих взаимодействие пользователей с этим компьютером. Как правило, в состав терминала входят
монитор, клавиатура и «мышь», а в современных системах – еще и
мини-компьютер с процессором и памятью для поддержки графического пользовательского интерфейса.
2. По числу процессов, которые могут одновременно выполняться
под управлением ОС, – однозадачные и многозадачные. Однозадачная
ОС позволяет одновременно присутствовать в памяти только одному
процессу, и все ресурсы находятся в его эксклюзивном пользовании.
Если ОС поддерживает возможность одновременного выполнения нескольких различных программ, но без разбиения программы на ряд
подзадач, то можно говорить о мультипрограммной ОС. Мультипрограммность представляет собой простейшую форму многозадачности.
Полностью реализованным многозадачный режим считается тогда,
когда существует возможность разбиения каждой из программ на задачи, что требует наличия в составе ОС средств для взаимодействия и
синхронизации процессов, и в данном случае можно говорить о многозадачности ОС.
5
Для поддержки различных режимов работы вычислительных систем существуют следующие типы ОС: однопользовательские однозадачные, однопользовательские многозадачные, многопользовательские многозадачные.
3. По дисциплине обслуживания – системы с вытесняющим или
согласующим режимом. Дисциплина обслуживания является важным
показателем для многопользовательских многозадачных ОС, т. к.
определяет порядок смены процессов на процессоре ИВС. В случае
вытесняющей многозадачности выделением задачам процессорного
времени занимается исключительно ОС. В случае согласующей (кооперативной) многозадачности каждая задача, получившая управление, сама определяет, когда ей отдать процессор другой задаче (в целом, режим более эффективный, т. к. позволяет задаче самой выбирать удобный и безопасный момент своего прерывания, однако она
должна отказаться при этом от монопольного использования процессора).
4. По типу доступа пользователя – системы с пакетной обработкой, системы разделения времени, системы реального времени. Специфика систем с пакетной обработкой заключается в том, что они
ориентированы на обработку больших объемов данных, и среди процессов ОС отсутствуют интерактивные (т. е. пользователь как элемент
ИВС исключен). Данное допущение позволяет оптимизировать работу
планировщика задач на переключение контекстов в наиболее подходящие для этого моменты, а не тогда, когда это необходимо пользователю.
Основной задачей интерактивных систем является организация
взаимодействия с пользователем и выполнение его запросов. Специфика в данном случае заключается в том, что оптимизируется не
столько эффективность вычислительного процесса, сколько скорость
реакции на действия пользователя.
В случае систем реального времени приходится говорить о планировании выполнения процессов в условиях периодического поступления внешних воздействий. При этом моменты наступления таких событий и время реакции на них известны. Планировщику необходимо
организовать переключение процессов таким образом, чтобы не
нарушить временные рамки. Среди систем реального времени можно
выделить системы с жесткими требованиями (нарушение временных лимитов не допустимо в принципе) и системы с мягкими требованиями (нарушение нежелательно, но не смертельно).
6
5. По типу средств вычислительной техники, для управления
ресурсами которых предназначены однопроцессорные, многопроцессорные, сетевые, распределенные ОС. Многопроцессорные системы
отличаются от однопроцессорных ОС тем, что нуждаются в синхронизации при одновременном доступе к данным в памяти, расширенными
средствами синхронизации процессов, а также управления транзакциями.
Сетевые и распределённые системы в отличие от автономных
должны дополнительно эффективно организовывать вычисления в сети и разделять ресурсы между множеством выполняемых в сети процессов.
Поскольку предметом изучения курса являются сетевые операционные системы и их функционирование в IP-сетях, то необходимо
определить понятие компьютерной сети.
Компьютерная сеть – это набор компьютеров, связанных коммуникационной системой и снабженных соответствующим ПО, позволяющим пользователям получать доступ к ресурсам этого набора
компьютеров.
В настоящее время существует множество стандартов построения
компьютерных сетей. Так, например, можно говорить о технологиях
локальных (множество взаимодействующих компьютеров территориально сгруппировано в одном месте), глобальных (взаимодействующие компьютеры удалены друг от друга на значительные расстояния
и связаны глобальными линиями передачи данных) и городских (занимают промежуточное положение между локальными и глобальными) сетей. Для всех из них де-факто стандартным стало применение
стека протоколов TCP/IP, основанного на IP-протоколе (ненадёжный
маршрутизируемый межсетевой протокол передачи данных), поэтому
можно говорить о таком виде сетей, как IP-сети.
Все формы сетевого взаимодействия так или иначе основываются
на понятии «клиент-серверной архитектуры». Клиентом является
сторона, обращающаяся с запросом, сервером  сторона, удовлетворяющая запрос. Клиент выполняет следующие функции: обеспечивает
интерфейс пользователя (причем для различных служб он может быть
разным), формирует запросы, отображает данные, полученные с сервера, в необходимой форме. Сервер выполняет запросы клиентов,
хранение и управление данными.
Сетевая ОС осуществляет задачу поддержки сетевой деятельности. Она выполняет следующие функции:
7
 связывает все компьютеры и периферийные устройства в единую
вычислительную систему, делая их ресурсы доступными через сеть;
 обеспечивает безопасность, контролируя доступ к сетевым ресурсам;
 осуществляет администрирование сети.
Сетевая ОС характеризуется тем, что предоставляет пользователю
некоторую виртуальную ИВС, работать с которой гораздо проще,
нежели с реальной сетевой аппаратурой. При этом пользователь сетевой ОС всегда помнит о том, что имеет дело с сетевыми ресурсами и
для доступа к ним необходимо выполнить определенные особые операции.
Направлением развития сетевых ОС является достижение как
можно более высокой степени «прозрачности» сетевых ресурсов. В
идеальном случае сетевая ОС должна представить пользователю их в
виде ресурсов единой централизованной виртуальной машины. Такую
систему можно назвать истинно распределенной ОС.
ПО сетевой ОС состоит из двух важных компонентов: клиентской
и серверной частей ОС. Совокупность серверной и клиентской частей
ОС, предоставляющих доступ к конкретному типу ресурса вычислительной системы через сеть, называется сетевой службой. Она дает
возможность пользователям иметь некоторый набор услуг, называемый также сетевым сервисом.
Основой клиентского ПО является редиректор, в задачу которого
входит перехват запросов пользователя. В зависимости от результатов
анализа, запрос либо передается на локальную шину компьютера, либо направляется через сеть серверу. Основой серверного ПО является
одноименный компонент, задача которого  обработка поступающих
запросов.
На практике сложилось несколько подходов к построению сетевых
операционных систем, различающихся глубиной внедрения сетевых
служб в операционную систему (рис. 1.2  1.4).
Операционная
система
Встроенные сетевые службы
Рис. 1.2. Сетевые службы глубоко встроены в ОС
8
Операционная система
Сетевая
оболочка
Рис. 1.3. Сетевые службы объединены в виде некоторого набора - оболочки
Операционная система
Отдельное
ПО
Рис. 1.4. Сетевые службы производятся и поставляются в виде отдельного ПО.
В зависимости от того как распределены задачи между рабочими
станциями сети, они могут выступать в трех ролях:
 рабочая станция, занятая исключительно обслуживанием запросов,
играет роль выделенного сервера сети;
 рабочая станция, обращающаяся с запросами к ресурсам другой
машины, исполняет роль клиентского узла;
 рабочая станция, совмещающая функции клиента и сервера, является одноранговым узлом.
IP-сети могут быть построены по одной из схем:
 одноранговая сеть – в этом случае на все компьютеры устанавливается ОС, которая предоставляет всем потенциально равные возможности (такая ОС называется одноранговой);
 сеть с выделенными серверами – в данном случае существует
дифференциация между узлами по типу используемой ОС. На сервер
устанавливается специализированная (серверная) ОС, лучше приспособленная для эффективной обработки интенсивно поступающих запросов. Клиенты же получают клиентскую версию ОС, из которой
удалена серверная часть, что значительно упрощает их организацию и
позволяет уделить большее внимание пользовательскому интерфейсу
и клиентским частям сетевых служб.
9
Лекция 2. Структура ОС
Под структурой ОС понимают набор составляющих ее программных модулей, а также связи и способы взаимодействия между ними.
Большинство современных ОС представляют собой хорошо структурированные модульные системы, способные к развитию, расширению и переносу на новые платформы. Какой-либо единой структуры
ОС нет, но существуют универсальные подходы к структурированию.
Далее будут рассмотрены пять различных использующихся (или использовавшихся ранее) структур: монолитные системы, многоуровневые системы, виртуальные машины, экзоядро и модель «клиент  сервер».
Первые ОС и системы для персональных компьютеров были монолитными, т. е. неструктурированными. Они работали без разделения на привилегированный и непривилегированный коды и допускали
произвольные вызовы процедур, операции чтения и записи. Тем не
менее и в такой неструктурированной системе возможно разделение
всех ее модулей на две группы:
 выполняющие основные функции ОС (управление процессами, памятью, устройствами ввода-вывода и т. п.);
 выполняющие вспомогательные функции ОС.
Вспомогательные модули ОС обычно подразделяются на следующие группы:
 утилиты – программы, решающие отдельные задачи администрирования;
 системные обрабатывающие программы – текстовые или графические редакторы, компиляторы, компоновщики, отладчики;
 программы предоставления пользователю дополнительных услуг –
специальные варианты UI, калькулятор, игры и т. п.;
 библиотеки процедур, упрощающие разработку приложений,
например библиотека математических функций, функций вводавывода и т. п.
Для обеспечения высокой скорости работы модули, выполняющие
основные функции ОС, постоянно находятся в оперативной памяти,
т. е. являются резидентными, а вспомогательные модули загружаются
по мере необходимости, т. е. выступают транзитными.
Для надежного управления ходом выполнения приложений ОС
должна иметь по отношению к ним определенные привилегии, обеспечить которые невозможно без специальных средств аппаратной
10
поддержки. АО должно поддерживать как минимум два режима работы – пользовательский и привилегированный (называемый также режимом ядра или режимом супервизора). Часть ОС, работающая в
привилегированном режиме, является ядром. Приложения ставятся в
подчиненное состояние за счет запрета выполнения в пользовательском режиме некоторых критичных команд, связанных с переключением процессора с задачи на задачу, управлением вводом-выводом и
т. д. Доступ к памяти разрешается, если обращение идет к области,
выделенной приложению, и запрещается при обращении к областям,
занимаемым ОС или другими приложениями. Каждое приложение работает в своем адресном пространстве.
Повышение устойчивости ОС, обеспечиваемое перенесением основных функций ОС в ядро, работающее в привилегированном режиме, достигается за счет замедления выполнения системных вызовов.
Системный вызов ядра инициирует переключение режимов работы
процессора, а при возврате происходит обратное переключение. Во
всех типах процессоров из-за дополнительной задержки переключения системное обращение к привилегированному ядру выполняется
медленнее (рис. 2.1).
Работа приложения
Системный вызов
Работа приложения
Пользовательский
режим
Работа ядра
Время
переключения режимов
Привилегированный
режим
Рис. 2.1. Системное обращение к привилегированному ядру
Вычислительную систему, работающую под управлением ОС на
основе ядра, можно рассматривать как систему, состоящую из трех
иерархически расположенных слоев: нижний слой образует аппаратура, промежуточный – ядро, а утилиты, обрабатывающие программы и
приложения, составляют верхний системный слой. Поскольку ядро
представляет собой сложный многофункциональный комплекс, то
следующим шагом является структурирование и самого ядра.
Результатом структуризации монолитной операционной системы
при АО, позволяющем реализовать несколько режимов работы, яви11
лась модель многоуровневой ОС. В подобной ОС функции системы
разделяются на отдельные слои. Каждый слой, или уровень, иерархии
системы создает уровень абстракции для вышележащих слоев. Он
пользуется сервисами, предоставляемыми нижними слоями, и сам
обеспечивает сервисами вышележащие слои. Строгие правила касаются только взаимодействия между слоями системы, а между модулями внутри слоя связи могут быть произвольными. Преимущество
данного подхода заключается в том, что изменение любого слоя не затрагивает уровни, находящиеся под ним. Идея была реализована в
экспериментальных системах THE [1968], Venus [1972].
Такую структуру принято изображать в виде системы концентрических окружностей, иллюстрируя тот факт, что каждый слой может взаимодействовать только со смежными. Структура уровня АО и
системного уровня ПО ИВС представлена на рис 2.2.
Аппаратура
Аппаратно-зависимые
модули
Менеджеры ресурсов
Интерфейс системных
вызовов
Средства аппаратной
поддержки ОС
Базовые механизмы
ядра
Рис. 2.2. Структура аппаратного и системного уровней ИВС
АО ИВС на данном рисунке представлено двумя нижними уровнями: аппаратуры и средств аппаратной поддержки ОС. В отдельный слой средств аппаратной поддержки от слоя аппаратуры выделяются те компоненты, которые прямо участвуют в организации вычислительного процесса (поддержка привилегированного режима, система прерываний, переключение контекстов процессов, защита областей
памяти и т. д.).
Верхние четыре уровня формируют ядро. Слой машиннозависимых компонентов ОС составляют программные модули, в ко12
торых отражена специфика аппаратной платформы компьютера (разрядность, архитектурные особенности процессора, набор команд и
т. п.). В идеале этот слой полностью экранирует вышележащие слои
от особенностей аппаратуры.
Слой базовых механизмов ядра обеспечивает наиболее примитивные операции, такие как программное переключение контекстов
процессов, диспетчеризацию прерываний, перемещение страниц из
памяти на диск и обратно. Модули данного слоя не принимают решений о распределении ресурсов, а только выполняют решения, принятые на вышележащих уровнях.
Слой менеджеров ресурсов состоит из модулей, реализующих
стратегические задачи по управлению основными ресурсами вычислительной системы, таких как менеджеры процессов, ввода-вывода,
файловой системы, оперативной памяти и т. п.
Слой интерфейса системных вызовов обеспечивает непосредственное взаимодействие приложений и системных утилит с ядром и
доступ к ресурсам, образуя прикладной интерфейс ОС.
Следует отметить, что разбиение на подобные уровни достаточно
условно. Некоторые слои могут объединяться в один (например, слой
аппаратно-зависимых компонентов и базовых механизмов, базовые
механизмы и менеджеры ресурсов) или распадаться на несколько подслоев (например, менеджер ввода-вывода на нижний слой драйверов
дисков и сетевых адаптеров и верхний слой драйверов файловых систем и протоколов сетевых служб). В ряде случаев для ускорения работы ядра происходит также обращение с верхних слоев напрямую к
функциям нижних (например, со слоя системных вызовов напрямую к
базовым механизмам ядра). Выбор количества слоев – компромисс
между расширяемостью и логичностью системы и замедлением работы.
Необходимость организации работы на распределенном АО и
улучшение расширяемости и переносимости ОС обусловили следующий шаг в эволюции ее структуры – появление клиент-серверной
ОС. Особенностью данной структуры является то, что существенная
часть модулей ядра переносится из привилегированного режима в
пользовательский и функционирует в качестве автономных серверов.
Получая запрос на операцию, клиентский процесс посылает запрос
серверному, который его обрабатывает и высылает ответ. Все серверы
работают как процессы в режиме пользователя (а не в режиме ядра) и
не имеют прямого доступа к оборудованию. В задачу ядра входит
13
главным образом только управление связью между клиентом и сервером (рис. 2.3).
Приложения
пользователей
Утилиты ОС
Приложения
пользователей
Утилиты ОС
Серверы ОС
Пользовательский режим
Привилегированный режим
Ядро ОС
Ядро ОС
Рис. 2.3. Различия между многоуровневой и клиент-серверной ОС
В том случае если набор функций ядра сделан минимально возможным (по схеме на рис. 2.2 это уровни аппаратно-зависимых модулей и базовых механизмов ядра), а все остальные функции перенесены
в пользовательский режим, то следует говорить о легковесном ядре
или микроядре. Соответствующая ОС называется ОС на основе микроядра.
Клиент-серверный (микроядерный) подход к построению ОС обладает своими достоинствами и недостатками. Главными достоинствами являются:
 расширяемость (простое добавление/удаление компонентов);
 облегченная конфигурируемость;
 надежность (серверы не могут повлиять друг на друга и не имеют
доступа к аппаратуре и данным ядра);
 поддержка распределенных вычислений, так как используются механизмы обмена сообщениями, идентичные сетевым.
Основным недостатком клиент-серверной ОС является ее пониженная (по отношению к многоуровневой) производительность, так
как при передаче сообщения необходимо переключать режимы работы процессора четыре раза вместо двух (рис. 2.4).
14
Сервер ОС
Приложение
Приложение
Режим
пользователя
t
Микроядро
t
t
Микроядро
t
Режим ядра
Рис. 2.4. Системный вызов в клиент-серверной ОС
В отличие от других типов ОС виртуальные машины не являются расширенными ОС, т. е. они не поддерживают файлы и прочие
удобства, а представляют собой точные копии аппаратуры, включая
поддержку режимов ядра и пользователя, ввод-вывод данных, прерывания и другие функции, присутствующие на реальном компьютере.
Основа виртуальной машины – монитор, работает с оборудованием и
обеспечивает многозадачность, предоставляя верхнему слою не одну,
а несколько виртуальных машин. Поскольку каждая виртуальная машина идентична настоящему оборудованию, на каждой из них может
работать любая операционная система, которая запускается прямо на
аппаратуре (рис.2.5).
Команды вводавывода
Прерывания
ОС-1
Системные
вызовы
ОС-2 ОС-3
Прерывания
Виртуальная машина
Реальная аппаратура
Рис. 2.5. Структура ОС виртуальной машины
ОС, построенная по принципу экзоядра, отличается от виртуальной машины тем, что каждый пользователь обеспечивается абсолютной копией реального компьютера, но с доступом только к подмножеству ресурсов (например, одна виртуальная машина получает доступ к
блокам диска с номерами от 0 до 1023, другая  от 1024 до 2047 и
т. д.). На нижнем уровне в режиме ядра работает программа, которая
называется экзоядро (exokernel). В ее задачу входит распределение ресурсов для виртуальных машин и последующая проверка их использования (отслеживание попыток использовать чужой ресурс). Преимущество этой программы заключается в том, что она позволяет
15
обойтись без карт отображения ресурсов. При других методах работы
каждая виртуальная машина считает, что она использует свой собственный диск с нумерацией блоков от 0 до некоторого максимума.
Поэтому монитор виртуальной машины должен поддерживать таблицы преобразования адресов на диске (и всех других ресурсов). Необходимость преобразования отпадает при наличии экзоядра, которому
нужно только хранить запись о том, какой виртуальной машине выделен данный ресурс. Такой подход имеет еще одно преимущество: он
отделяет многозадачность (в экзоядре) от операционной системы
пользователя (в пространстве пользователя) с меньшими затратами,
так как для этого ему необходимо всего лишь не допускать вмешательства одной виртуальной машины в работу другой.
Из перечисленных структур монолитные ОС представляют скорее
исторический интерес, так как заложенные в них принципы либо
устарели, либо были усовершенствованы в многоуровневых и клиентсерверных ОС. Виртуальные машины и ОС на основе экзоядра представляют скорее энциклопедический интерес, так как область их применения достаточно узка, и они мало распространены. Наиболее распространенными на данном этапе являются многоуровневые и клиентсерверные ОС, и для них существенно важной (и также влияющей на
структуру) является проблема совместимости.
Под совместимостью будем понимать возможность ОС выполнять приложения, написанные для других ОС. Необходимо различать
совместимость на двоичном уровне и на уровне исходных текстов.
Совместимость на уровне исходных текстов требует наличия соответствующего компилятора в составе ПО компьютера, на котором предполагается использование приложения, а также совместимость на
уровне библиотек и системных вызовов. Для конечного пользователя
основное значение имеет двоичная совместимость. Она зависит от
многих факторов, самый главный из которых – архитектура процессора, на котором работает ОС. Если процессор использует тот же набор
команд и тот же диапазон адресов, то двоичная совместимость может
быть достигнута достаточно легко. Для этого потребуется выполнение
следующих условий:
 вызовы функций API, которые содержит приложение, должны
поддерживаться данной ОС;
 внутренняя структура исполняемого файла приложения должна соответствовать структуре исполняемых файлов данной ОС.
16
Для обеспечения совместимости на процессорах разной архитектуры необходимо вести речь об эмуляции двоичного кода. Эмулятор
должен последовательно выбирать каждую двоичную инструкцию,
программно дешифровать ее, чтобы определить, какие действия она
задает, а затем выполнить эквивалентную подпрограмму. Выходом в
таких случаях является использование прикладных программных
сред. Одной из составляющих, формирующих прикладную программную среду, является набор функций API, которые ОС предоставляет
своим приложениям. Чтобы программа, написанная для одной ОС,
могла быть выполнена в рамках другой ОС, недостаточно лишь обеспечить совместимость API. Концепции, положенные в основу разных
ОС, могут входить в противоречие друг с другом. Необходимо организовать бесконфликтное сосуществование в рамках одной ОС нескольких способов управления ресурсами компьютера.
Существуют три основных варианта построения множественных прикладных сред (рис. 2.62.8).
Прикладная
среда ОС-2
Обычное
приложение
ОС-1
Прикладная
среда ОС-3
Приложение
ОС-2
API ОС-2
Режим пользователя
Транслятор
системных
вызовов
Приложение
ОС-3
API ОС-3
Режим ядра
API ОС-1
Менеджеры ресурсов
Базовые механизмы ядра
Машинно-зависимые модули
Рис. 2.6. Прикладные программные среды, транслирующие системные вызовы
17
Приложение Приложение Приложение
ОС-2
ОС-1
ОС-3
Режим пользователя
Режим ядра
API ОС-1 API ОС-2 API ОС-3
Менеджеры ресурсов
Базовые механизмы ядра
Машинно-зависимые модули
Рис. 2.7. Реализация совместимости на основе нескольких равноправных API
Приложение
другой ОС
Приложение другой
ОС
Сервер ОС
Режим пользователя
Режим ядра
Ядро
ОС
Рис. 2.8. Клиент-серверная реализация множественных прикладных сред
Не существует какого-либо однозначно лучшего способа реализации механизма множественных прикладных сред, их достоинства и
недостатки приведены в табл. 2.1.
Таблица 2.1. Сравнение подходов реализации прикладных сред
Подход
Преимущества
Недостатки
Трансляция системных
При отказе одной при- Излишнее потребление
вызовов прикладными
кладной среды остальные памяти (для каждого припрограммными средами
продолжают работать
ложения создается своя
Производительность вы- копия прикладной среды)
ше, чем у клиентсерверного подхода
Лёгкая расширяемость
Равноправные API
Высокая производительПлохая расширяемость,
ность, т.к. все
требуется изменение и
интерфейсы реализованы перекомпиляция ядра.
в ядре
Плохая надежность, т.к.
18
Подход
Клиент-серверная реализация
Преимущества
Недостатки
ошибки в прикладной
среде способны дестабилизировать ядро
Легкая расширяемость, Низкая
производительприкладные среды легко ность по причинам, обдобавлять и исключать.
щим для всех клиентВысокая надёжность и серверных ОС
стабильность, отказ одной из прикладных сред
затрагивает только приложения этой ОС
19
Лекция 3. Процессы и потоки в ОС
Одним из основных понятий, связанных с ОС, является процесс –
абстрактное понятие, описывающее работу программы. Различие
между процессом и программой трудноуловимо, но тем не менее имеет принципиальное значение. Процесс  это активность некоторого
рода, абстрактная сущность, имеющая набор ресурсов, входные и выходные данные, состояние и выполняющая свою программу. Программа это последовательность инструкций.
В многозадачной ОС процессор переключается между процессами, предоставляя каждому от десятков до сотен миллисекунд. При
этом в каждый конкретный момент времени процессор занят только
одним процессом, но за секунду он успевает поработать с несколькими, создавая у пользователей иллюзию параллельной работы. В этом
случае говорят о псевдопараллелизме в отличие от настоящего параллелизма в многопроцессорных системах. В наличии каждого процесса
находится собственный виртуальный центральный процессор.
В ОС новые процессы создаются в результате одного из следующих событий:
1) во время инициализации системы. Создаваемые в этом случае
процессы чаще всего являются фоновыми, не связанными с конкретными пользователями и выполняющими особые функции. Подобные
процессы называются также демонами;
2) при обработке изданного работающим процессом системного
запроса на создание процесса. В некоторых ОС родительский и дочерние процессы при этом остаются связанными между собой, формируя иерархию процессов;
3) в интерактивных системах – при обработке запроса пользователя на запуск процесса;
4) в системах пакетной обработки – при инициировании пользователем пакетного задания.
Процесс завершает свою работу, когда происходит одно из следующих событий:
1) обычный выход (преднамеренное завершение);
2) выход по ошибке (преднамеренное завершение);
3) выход по неисправимой ошибке (непреднамеренное);
4) уничтожение другим процессом (непреднамеренное).
В промежуток времени между созданием и уничтожением процесс
может находиться в одном из трех состояний (рис. 3.1):
20
 работающем (процесс использует процессор);
 ожидающем (процесс готов к выполнению, но процессор занят);
 блокированном (процесс не может быть запущен прежде, чем
произойдет некое внешнее событие).
Действие
2
1
Блокировка
3
4
Готовность
Рис. 3.1. Состояния процесса и переходы между ними: 1  процесс блокируется в
ожидании события, 2  планировщик выбирает другой процесс, 3  планировщик
выбирает данный процесс, 4  происходит ожидаемое событие
Для реализации модели процессов ОС имеет таблицу, называемую
таблицей процессов, в которой каждому процессу соответствует
один элемент. В нем содержится информация о состоянии процесса,
счётчике команд, указателе стека, использовании и распределении ресурсов, а также вся остальная информация, которую необходимо сохранять для переключения в состояние готовности или блокировки
для последующего запуска. Некоторые поля типичного элемента
представлены в табл. 3.1.
Таблица 3.1. Некоторые поля типичного элемента таблицы процессов
Управление процессом
Управление памятью Управление файлами
Регистры
Указатель на сегмент Идентификатор
Счётчик команд
кода
пользователя*
Указатель стека
Указатель на сегмент Идентификатор
Состояние процесса
данных
группы*
Приоритет
Указатель на сегмент Корневой каталог*
Параметры планирования
стека
Рабочий каталог*
Идентификатор процесса
Дескрипторы
Родительский процесс*
файлов*
Группа процесса*
Сигналы*
Время начала процесса
Использованное процессорное время
Время, оставшееся до таймаута
*  в некоторых ОС данные поля могут либо отсутствовать, либо находиться в
пространстве данных пользователя, а не в таблице процессов.
21
В ранних версиях ОС каждый процесс понимался как контейнер
для объединения ресурсов (адресное пространство, открытые файлы,
дочерние процессы, обработчики сигналов и т. д.) и одиночный
управляющий поток команд. Управлять ресурсами гораздо проще, если объединить их в форме процесса.
Однако позднее возникла необходимость иметь несколько квазипараллельных управляющих потоков для совместной обработки общих ресурсов. При этом за процессом остаётся роль контейнера ресурсов. Для обработки этих ресурсов процесс содержит также несколько (как минимум один) потоков исполняемых команд или просто
потоков. Каждый поток имеет счетчик команд, отслеживающий порядок выполненных действий, регистры, в которых хранятся текущие
переменные, и стек, содержащий протокол выполнения, где на каждую процедуру, вызванную, но еще не вернувшуюся, отведен отдельный фрейм.
Концепция потоков добавляет к модели процесса возможность одновременного выполнения в одной и той же среде процесса нескольких программ, в достаточной степени независимых. Потоки иногда
называют упрощенными процессами. Основные преимущества использования потоков таковы: 1) возможность использования параллельными объектами общего адресного пространства и всех содержащихся в нем данных; 2) легкость создания и уничтожения (примерно в
100 раз быстрее); 3) увеличение производительности при совмещении
вычислений и операций ввода-вывода; 4) параллелизм в мультипроцессорных системах.
Различные потоки в одном процессе не так независимы, как различные процессы. У всех потоков одно и то же адресное пространство, что означает совместное использование глобальных переменных. Ниже приведены элементы, совместно используемые потоками
процесса и индивидуальные для каждого.
Элементы процесса
Адресное пространство
Глобальные переменные
Открытые файлы
Дочерние процессы
Необработанные аварийные сигналы
Сигналы и их обработчики
Информация об использовании ресурсов
Элементы потока
Счетчик команд
Регистр
Стек
Состояние
22
Существуют два основных способа реализации пакета потоков: в
пространстве пользователя и ядре. Первый метод состоит в управлении потоками в пространстве пользователя, для чего каждый процесс
имеет свою таблицу потоков (рис. 3.2). Эта таблица аналогична таблице процессов, с той лишь разницей, что она отслеживает лишь характеристики потоков, такие как счетчик команд, указатель вершины
стека, регистры, состояние и т. п. При этом ядро ничего о потоках не
знает и управляет обычными, однопоточными процессами, а каждый
процесс имеет систему поддержки выполнения потоков (т. е. собственный диспетчер потоков, осуществляющий их планирование). В
этом случае пакет потоков можно реализовать даже в операционной
системе, не поддерживающей их.
Процесс
Поток
Пространство
пользователя
Пространство
ядра
Ядро ОС
Система поддержки Таблица Таблица
исполнения потоков потоков процессов
Рис. 3.2. Организация потоков в ОС в пространстве пользователя
В отличие от переключения процессов переключение потоков
осуществляется локальными вызовами процедур, а следовательно, не
требует затрат времени на переключение в режим ядра. Такой подход
к организации потоков легче масштабируется и эффективнее функционирует. Его недостатками являются блокировка при системных вызовах или при ошибках загрузки страниц памяти (на время загрузки в
память требуемой страницы процесс блокируется). При запуске одного потока на выполнение другой поток также не может быть запущен,
пока первый не отдаст управление самостоятельно, т. к. внутри процесса нет прерываний по таймеру.
При организации потоков в режиме ядра (рис. 3.3.), система поддержки исполнения потоков не нужна. Таблица потоков содержится в
структурах данных ядра, а для создания или уничтожения потока ис23
пользуются системные вызовы. Основным недостатком данного подхода является увеличенная задержка при выполнении системных запросов, а среди преимуществ можно отметить, что при блокировании
одного потока на системном вызове другие могут продолжить выполнение без помех.
Процесс
Поток
Пространство
пользователя
Пространство
ядра
Ядро ОС
Таблица
потоков
Таблица
процессов
Рис. 3.3. Организация потоков в ОС в ядре
В целях совмещения преимуществ обоих подходов была предложена смешанная реализация, при которой некоторое количество пользовательских потоков N мультиплексируется в M (N>=M) потоков ядра. Такой подход используется, например, в ОС Solaris, Mach.
За планирование процессов, выполняющихся на процессоре, отвечает специальная часть ОС – планировщик. Алгоритм, на основе которого он действует, называется алгоритмом планирования. В задачи планировщика входит правильный выбор текущего процесса (чтобы обеспечить максимально комфортную работу пользователя) и эффективное использование процессора, поскольку переключение между процессорами требует затрат.
Практически все процессы чередуют периоды вычислений с операциями ввода-вывода. Процессы, большую часть занятые вычислениями, называются ограниченными возможностями процессора, а
процессы, большую часть времени ожидающие ввода-вывода, – ограниченными возможностями устройств ввода-вывода.
Все алгоритмы планирования по их поведению после прерываний
можно разделить на две категории:
 без переключений (иногда называемые также согласующим
планированием)  выбирают процесс и позволяют ему работать вплоть
24
до блокировки или до того момента, пока процесс сам не отдаст процессор. Процесс не будет прерван, даже если он работает часами;
 с переключениями (называемые также вытесняющим планированием)  выбирают процесс и позволяют ему работать некоторое
время. Алгоритмы вытесняющего планирования могут основываться
либо на квантовании (необходимы прерывания таймера, чтобы передать управление планировщику), либо на приоритетах (фиксированных или динамических), либо быть смешанными (сочетать в себе элементы квантования и приоритетов).
Алгоритмы, основанные на квантовании, отводят поочередно
каждому потоку (процессу, если ОС является не многозадачной, а
многопрограммной) ограниченный непрерывный период процессорного времени – квант. Смена активного потока происходит в следующих случаях:
 поток завершился и покинул систему;
 произошла ошибка;
 поток перешел в состояние ожидания;
 исчерпан отведенный квант процессорного времени, в этом случае поток переходит в состояние готовности к выполнению и ожидает,
когда ему будет предоставлен новый квант, а на выполнение в соответствии с определенным правилом выбирается новый поток из очереди готовых.
Кванты, выделяемые потокам, могут быть либо фиксированными
для всех потоков, либо динамически изменяться в зависимости от поведения потока. Уменьшение времени кванта, с одной стороны, сокращает время отклика системы на внешние воздействия, а с другой 
увеличивает накладные расходы (потери процессорного времени) на
частое переключение контекстов.
Алгоритмы, основанные на приоритетах, при планировании исходят из величины приоритета потока – числа, характеризующего
степень привилегированности потока при использовании ресурсов
ИВС (в частности, процессорного времени). Существуют две разновидности приоритетного планирования: обслуживание с относительными и абсолютными приоритетами.
В обоих случаях выбор потока на выполнение из очереди готовых
осуществляется одинаково: запускается поток, имеющий наивысший
приоритет. Однако проблема определения момента смены активного
потока решается по-разному. В системах с относительными приоритетами активный поток выполняется до тех пор, пока он сам не покинет
25
процессор, перейдя в состояние ожидания (или произойдет ошибка,
или поток завершится). В системах с абсолютными приоритетами выполнение активного потока прерывается также в том случае, если в
очереди готовых потоков появился поток, приоритет которого выше
приоритета активного.
В разных средах требуются различные алгоритмы планирования.
Это связано с тем, что различные ОС и приложения ориентированы на
разные задачи. Можно выделить три основных типа сред:
1) системы пакетной обработки данных;
2) интерактивные среды;
3) системы реального времени.
В системах пакетной обработки нет пользователей, ждущих ответа. В подобных системах приемлемы алгоритмы без переключений
или с переключениями, но с увеличенной длительностью кванта. Такой метод уменьшает количество переключений и повышает эффективность работы ИВС.
В интерактивных системах необходимы алгоритмы с переключениями, чтобы предотвратить захват времени одним процессом. Кроме
того, длительность кванта должна быть не очень большой, чтобы
обеспечить меньшее время отклика на действия пользователя.
В системах реального времени приоритетность не всегда обязательна, поскольку процессы знают, что их время ограничено, и быстро
выполняют работу, а затем блокируются. Специфика сред реального
времени заключается в том, что в них работают только программы,
предназначенные для содействия конкретным приложениям.
Задачи алгоритмов планирования различаются в зависимости от
среды, кроме того, есть общие требования, предъявляемые ко всем алгоритмам планирования, см. табл. 3.2.
Таблица 3.2. Некоторые задачи алгоритмов планирования
Все системы
Системы пакетной
Интерактивные
обработки данных
системы
Справедливость Пропускная споВремя отклика –
– предоставлесобность – выполбыстрая реакция
ние каждому
нение максимальна запросы
процессу спраного количества
ведливой доли
заданий в час
Соразмерность –
процессорного
выполнение повремени
Оборотное время – желаний пользоминимизация вревателя
мени, затрачиваемого на ожидание
26
Системы реального времени
Окончание работы к сроку –
предотвращение
потери данных
Предсказуемость
– предотвращение деградации
качества в мультимедийных ОС
Все системы
Принудительное
применение политики – контроль за выполнением принятой политики
планирования
Системы пакетной
обработки данных
обслуживания и
обработку задачи
Интерактивные
системы
Системы реального времени
Использование
процессора – поддержка постоянной
занятости процессора
Баланс – поддержка занятости всех частей
системы
В системах пакетной обработки при планировании применяются
следующие алгоритмы:
 «первым пришёл – первым обслужен». Процессам предоставляется доступ к процессору в том порядке, в котором они его запрашивают. В ходе работы процессы не прерываются, а при блокировании запускается следующий процесс из очереди. После разблокирования процесс он помещается в конец очереди. Данный алгоритм легок
в понимании и программировании, но не учитывает специфику работающих процессов (ограничение по вычислениям или вводу-выводу);
 «кратчайшая задача – первая». Используется в том случае,
когда временные отрезки работы известны заранее. Если в очереди
есть несколько одинаково важных задач, планировщик выбирает первой самую короткую задачу. Алгоритм показывает лучший результат
по среднему оборотному времени только в том случае, если на момент
принятия решений все задачи присутствуют одновременно;
 «наименьшее оставшееся время выполнения». Данный алгоритм представляет, по сути, модификацию предыдущего в режиме работы с переключениями. На выполнение выбирается задача, имеющая
наименьшее оставшееся время выполнения. В этом случае также
необходимо знать время выполнения задач.
В интерактивных системах используются другие виды алгоритмов:
 «циклическое планирование». Каждому процессу выделяется
квант времени. Если к концу кванта процесс все еще работает, то он
прерывается, а управление передается другому процессу из очереди.
Эффективность напрямую зависит от выбранной величины кванта.
Алгоритм хорошо работает только с равнозначными процессами;
27
 «приоритетное планирование». Каждому процессу присваивается приоритет, и управление передается готовому к работе процессу
с самым высоким приоритетом. Чтобы предотвратить бесконечную
работу процессов с высоким приоритетом, планировщик может
уменьшать приоритет процесса с каждым тактом. Система может динамически присваивать приоритеты для достижения своих целей. Часто бывает удобно сгруппировать процессы в классы по приоритетам
и использовать приоритетное планирование среди классов, но циклическое между процессами одного класса;
 «самый короткий процесс следующий». Интерактивные процессы чаще всего работают по схеме «ожидание команды, исполнение
команды». Если рассматривать выполнение каждой команды как отдельную задачу, можно минимизировать общее среднее время отклика, запуская первой самую короткую задачу. Алгоритм пытается выяснить, какой процесс самый короткий, по оценке длины процесса, базирующейся на его предыдущем поведении. Если предполагаемое
время работы при предыдущем запуске было T1, а фактическое время
работы – T0, то новая оценка времени работы может быть получена
как aT0 + (1  a)T1, где a – коэффициент, влияющий на то, как долго
алгоритм оценки «помнит» о предыдущих запусках. Метод оценки
следующего значения серии через взвешенное среднее предыдущего
значения и предыдущей оценки называют старением;
 «гарантированное планирование». В основе данного алгоритма лежит обязательство системы по предоставлению фиксированной
части мощности процессора каждому процессу. Для выполнения этого
обещания ОС отслеживает распределение процессора между процессами с момента создания. Затем рассчитывается количество ресурсов
процессора, на которое процесс имеет право, например время с момента создания, деленное на количество процессов в системе. Теперь
можно сосчитать отношение времени, предоставленного процессу, ко
времени, на которое он имеет право. Полученное число 0,5 означает,
что процессу выделили только половину положенного времени, а 2,0 –
что процессу досталось в два раза больше чем положено. Затем запускается процесс, у которого это отношение наименьшее, пока оно не
станет больше, чем у ближайшего соседа;
 «лотерейное планирование». Алгоритм выдает процессам «лотерейные билеты» для доступа к процессору. Когда планировщику
необходимо принять решение, выбирается случайным образом лотерейный билет, и его обладатель получает доступ к процессору;
28
 «справедливое планирование». Алгоритм планирует процессы
с учётом хозяев процессов. Пользователю достается доля процессорного времени, и планировщик подбирает процессы в соответствии с
этим фактом.
Отдельно от прочих алгоритмов планирования следует рассматривать планирование в системах реального времени. Главным критерием эффективности является реакция на сигналы управляемого объекта в заданных временных ограничениях. Однако задача планирования облегчается тем, что весь набор выполняемых задач известен заранее. Кроме того, часто в системе имеется информация о длительности выполнения задач, моментах активации, предельных допустимых
сроках ожидания ответа и т. д. Эти данные могут быть использованы
планировщиком для создания статического расписания или построения адекватного алгоритма динамического планирования.
Системы реального времени бывают на жесткими, что означает
наличие жестких сроков для каждой задачи (в них обязательно надо
укладываться), и гибкими (в которых нарушения временного графика
нежелательны, но допустимы).
Внешние события, на которые система должна реагировать, можно
разделить на периодические (возникающие через регулярные интервалы времени) и апериодические (возникающие непредсказуемо). Возможно наличие нескольких периодических потоков событий, которые
система должна обрабатывать. В зависимости от времени, затрачиваемого на обработку одного из событий, может оказаться, что система
не в состоянии своевременно обработать все события. Если в систему
поступает m периодических событий, а длительность обработки событий Ci и периоды их поступления Pi известны, то все потоки могут
быть своевременно обработаны только при выполнении условия
ΣCi /Pi ≤ K, где K – количество доступных процессоров. Системы,
удовлетворяющие этому условию, называются поддающимися
планированию или планируемыми.
При возникновении апериодического события должны быть
известны время вычислений (время его обработки), предельный срок
(момент времени, к которому оно должно быть обработано) и резерв
(время, оставшееся до момента завершения). При планировании
апериодических событий применяются алгоритмы «сначала тот,
предельный срок которого ближе» и «сначала тот, резерв
которого меньше».
29
При планировании периодических процессов план их выполнения
должен быть составлен на основе длительности выполняемых
процессами операций и их частоты. Задача заключается в выборе
оптимального значения периода планирования, которым обычно
является минимальное значение периодов всех процессов.
Приоритетным монотонным планированием называется такая
схема планирования, когда каждому периодическому процессу
назначается приоритет, пропорциональный частоте его выполнения.
Чем выше эта частота, тем больше приоритет процесса. Планировщик
выбирает готовый процесс с наивысшим приоритетом и выполняет
его до тех пор, пока не завершится период его работы.
Рассмотренные алгоритмы планирования апериодических событий
могут использоваться и для периодических процессов. В этом случае
конец текущего периода интерпретируется как предельный срок и на
его основе вычисляется резерв.
30
Лекция 4. Управление памятью в ОС
Память является важнейшим ресурсом, требующим тщательного
управления со стороны мультизадачной ОС. Особая роль памяти объясняется тем, что процессор может выполнять инструкции программы
только в том случае, если они находятся в памяти. Функциями ОС по
управлению памятью являются:
 отслеживание свободной и занятой памяти;
 выделение памяти процессам, освобождение памяти по завершении процессов, а также динамическое её перераспределение во время
работы;
 частичное вытеснение содержимого оперативной памяти на диск,
когда размеры свободного места не достаточны для размещения всех
процессов, и возвращение вытесненного содержимого назад в оперативную память, когда в ней появляется место;
 организация преобразования адресов (совместно с АО ИВС). На
большинстве современных платформ внутри ОС и приложений используются виртуальные адреса– условные адреса, присваиваемые
переменным и командам программы транслятором. Совокупность
виртуальных адресов процесса называется виртуальным адресным
пространством (ВАП). Тем не менее для фактического считывания
содержимого ячейки памяти на шину адреса должен быть выставлен
физический адрес – линейный номер ячейки физической памяти при
сквозной нумерации от начала ОЗУ. Задачей ОС является отображение индивидуальных ВАП всех одновременно выполняющихся процессов на общую физическую память;
 защита памяти (совместно с АО ИВС) процессов друг от друга.
Способы выполнения перечисленных функций зависят в основном
от структуры ВАП. Можно выделить несколько стандартных подходов к его организации: линейное (плоское) ВАП, страничная и многоуровневая страничная организация ВАП, ВАП на основе сегментации,
сегментно-страничная организация ВАП.
Какая бы структура ВАП ни была реализована в ОС, базовой операцией является преобразование виртуальных адресов в физические.
Существуют два принципиально отличающихся подхода к преобразованию.
В первом случае замена виртуальных адресов на физические происходит разово при загрузке процесса в память, т. е. специальная программа – перемещающий загрузчик – на основании имеющихся у нее
31
исходных данных о начальном адресе физической памяти, а также
сведений о том, какие части кода процесса являются адреснозависимыми (эти сведения предоставляются транслятором), выполняет загрузку процесса, заменяя при этом адреса.
Второй способ заключается в том, что программа загружается в
память в неизменном виде в виртуальных адресах. Во время выполнения программы при каждом обращении к памяти выполняется преобразование виртуального адреса в физический. Данный способ является более гибким, т. к. перемещающий загрузчик жестко привязывает
программу к первоначально выделенному ей участку памяти, динамическое же преобразование позволяет перемещать программный код
процесса в течение всего периода его выполнения. Следует заметить,
однако, что использование перемещающего загрузчика более экономично и не требует специальной функциональности от АО ИВС (в отличие от динамического преобразования).
Остановимся подробнее на способах организации ВАП. Одни из
рассматриваемых вариантов представляют лишь исторический интерес, другие устарели, но все еще используются в карманных компьютерах и встроенных системах, некоторые активно используются и на
данном этапе.
Системы управления памятью можно разделить на два класса: те,
что перемещают процессы между оперативной памятью и диском во
время их выполнения, т. е. осуществляющие подкачку процессов целиком (swapping) или используют страничную подкачку (paging), и те,
которые этого не делают.
Самая простая из возможных схем организации адресного пространства реализована в однозадачной системе, в которой в каждый
момент времени работает только одна программа, при этом память
разделяется между программой и ОС. ОС может находиться в нижней
части памяти (ОЗУ), верхней части (ПЗУ) или быть разделенной
(драйверы устройств – в верхних адресах, т. е. в ПЗУ, а ОС – в нижних, т. е. в ОЗУ). Первый способ использовался ранее на миникомпьютерах и мэйнфреймах, но в настоящее время практически не
употребляется. Второй способ сейчас применяется на некоторых карманных компьютерах и встроенных системах. Третья модель устанавливалась на ранних персональных компьютерах (например, работающих с MS-DOS), при этом часть системы в ПЗУ носила название BIOS.
32
При подобной организации в каждый конкретный момент времени
может работать только один процесс. Как только пользователь набирает команду, ОС загружает запрашиваемую программу с диска и выполняет ее, а после окончания процесса выводит на экран символ приглашения и ждет новой команды. Следует заметить, что при этом преобразования виртуальных адресов в физические не требуется вообще,
так как они совпадают.
Тем не менее однозадачные системы сложно использовать где-то
ещё, кроме простейших встроенных систем. Самый легкий способ достижения многозадачности представляет собой статическое разделение памяти на несколько разделов (возможно, не равных). Такое
разбиение можно выполнить, например, вручную при запуске системы. После этого границы разделов не изменяются, что позволяет в
полной мере использовать для загрузки процессов в память перемещающий загрузчик.
Поступая в память, задание становится в очередь к наименьшему
разделу, достаточно большому для того, чтобы вместить это задание.
Но недостаток отдельных очередей очевиден, когда к большим разделам нет очередей, в то время как к маленьким выстроилось много задач. Альтернативная схема заключается в организации одной общей
очереди для всех разделов. Как только раздел освобождается, задачу,
находящуюся ближе всего к началу очереди и подходящую для выполнения в этом разделе, можно загрузить в него и начать обработку.
Поскольку нежелательно тратить большие разделы на маленькие задачи, существует другая стратегия: каждый раз после освобождения
раздела искать в очереди наибольшее из помещающихся в него заданий и именно это задание загружать. Но подобный алгоритм дискриминирует мелкие задачи, как недостойные того, чтобы для них отводился целый раздел. Выйти из положения можно, создав хотя бы один
маленький раздел памяти, позволяющий выполнять мелкие задания
без ожидания освобождения больших разделов (рис. 4.1).
Раздел 3 700K
Раздел 3
400K
Раздел 2
Раздел 2
а
200K
Раздел 1
100K
ОС
0
б
700K
400K
200K
Раздел 1 100K
ОС
0
Рис. 4.1. Распределение памяти с фиксированными разделами:
с раздельными очередями (а), общей очередью (б)
33
При другом подходе устанавливается следующее правило: задачу,
ожидающую обработки, можно пропустить не более k раз. Каждый
раз, когда через нее перескакивают, к счетчику добавляется единица.
Когда счетчик достигает значения k, игнорировать задачу нельзя.
При очевидном преимуществе – простоте реализации  данный
метод имеет существенный недостаток – жесткость. С одной стороны,
уровень мультипрограммности заранее ограничен числом разделов, с
другой – невозможно выполнить процессы, которые не помещаются
ни в один из разделов, но для которых было бы достаточно памяти нескольких разделов. Такой способ применялся в ранних мультипрограммных ОС (например, OS/360 от IBM), хотя он находит применение и на данном этапе в системах реального времени. Детерминированность вычислительного процесса систем реального времени компенсирует недостаточную гибкость данного способа управления памятью.
Попыткой преодолеть ограничения статического разбиения памяти
явилось распределение памяти динамическими разделами. Каждому поступающему на выполнение приложению на этапе создания
процесса выделяется вся необходимая ему память (если памяти не
хватает, то приложение не принимается на выполнение). После завершения процесса память освобождается, и на это место может быть
загружен другой процесс. Таким образом, в произвольный момент
времени оперативная память представляет собой случайную последовательность занятых и свободных разделов произвольного размера.
Поскольку в процессе работы разделы неизменны (исключением может быть только выгрузка на диск), то загрузка процессов в память
может осуществляться перемещающим загрузчиком.
Функциями ОС, предназначенными для реализации данного метода управления памятью, являются:
 ведение таблиц свободных и занятых областей;
 анализ требований к памяти, просмотр таблиц свободных областей, выбор раздела по различным правилам при создании нового
процесса;
 загрузка программы в выделенный ей раздел и корректировка
таблиц свободных и занятых областей;
 корректирока таблица свободных и занятых областей после завершения процесса.
Существуют два способа учета использования памяти: битовые
массивы и списки свободных участков (рис. 4.2, а, б).
34
A
B
8
11110001
11111001
11111110
00………
C
D
E
16
24
P 0 4
H 4 3
P 7 3
P 10 3
H 13 2
P 15 5
P 20 3
H 23 3
а
x
б
Рис. 4.2. Учёт использования памяти: с помощью битового массива (а);
с помощью связного списка (б)
При работе с битовым массивом память разделяется на единичные
блоки размером от нескольких слов до нескольких килобайт. В битовой карте каждому свободному блоку соответствует бит, равный нулю, а каждому занятому – бит, равный единице. Чем меньше размер
единичного блока, тем больше памяти потребует массив, зато тем менее будут потери памяти. Битовый массив – простой способ отслеживания блоков в памяти фиксированного объема. Основная его проблема заключается в том, что при решении загрузить k-блочный процесс
необходимо найти в битовой карте серию из k следующих друг за другом нулевых битов, а подобного рода операция является медленной
(так как искомая последовательность может пересекать границы слов
в битовом массиве).
Преимущество использования связных списков заключается в том,
что значительно упрощены операции поиска предыдущей записи и
оценки возможности соединения областей, а при сортировке списков
по убыванию или возрастанию размеров областей поиск блоков подходящего размера значительно ускоряется. Если занятые и свободные
участки хранятся в общем списке, отсортированном по адресам, существует несколько алгоритмов поиска области памяти требуемого объема.
1. Простейший алгоритм представляет собой выбор «первого подходящего участка». Менеджер памяти просматривает список областей до тех пор, пока не найдет достаточно большой свободный участок. Затем этот участок делится на две части: одна отдается процессу, а вторая остается неиспользованной. Так происходит всегда, кроме
статистически нереального случая точного соответствия свободного
участка и процесса. Это быстрый алгоритм, потому что поиск уменьшен настолько, насколько это возможно.
35
2. Алгоритм «следующий подходящий участок» действует с минимальными отличиями от предыдущего. Его отличие состоит в том,
что каждый раз, когда он находит соответствующий свободный фрагмент, то запоминает его адрес. При следующем обращении алгоритм
стартует с того самого места, где остановился в прошлый раз, вместо
того, чтобы каждый раз начинать поиск с начала списка.
3. Алгоритм «самый подходящий участок» выполняет поиск по
всему списку и выбирает наименьший по размеру подходящий свободный фрагмент. Вместо того чтобы делить большую незанятую область, которая может понадобиться позже, он пытается найти участок,
близко подходящий к действительно необходимым размерам. Алгоритм «самый подходящий» медленнее «первого подходящего», потому что каждый раз он должен произвести поиск во всем списке. На
практике оказалось, однако, что он выдает результаты худшие по отношению к «первому подходящему» или «следующему подходящему», так как стремится заполнить память маленькими бесполезными
свободными областями (фрагментирует память).
4. Алгоритм «самый неподходящий участок» был разработан в
целях эксперимента. Он выбирает самый большой свободный участок,
от которого после разделения остается область достаточно большого
размера. Моделирование показало, однако, что это также не совсем
хорошая идея.
Если для процессов и свободных фрагментов поддерживаются отдельные списки, то последний можно отсортировать по размеру, тогда
алгоритмы «первый подходящий» и «самый подходящий» будут работать быстрее, а алгоритм «следующий подходящий» утратит смысл.
Необходимо отметить, что все алгоритмы основанные на отсортированных по размеру списках имеют общий недостаток: при завершении
процесса или его выгрузке на диск поиск соседей с целью узнать, возможно ли слияние свободных областей, является трудоемкой операцией. А если не производить слияние областей, память очень скоро
окажется разбитой на огромное число маленьких свободных фрагментов, в которые не поместится ни один процесс.
5. Алгоритм «быстрый подходящий» поддерживает отдельные
списки для некоторых наиболее часто запрашиваемых размеров.
Например, могла бы существовать таблица, в которой первая запись
указывает на начало списка свободных фрагментов размером 4 Кбайт,
вторая – 8 Кбайт, третья – 12 Кбайт и т. д. Данный алгоритм находит
36
фрагмент требуемого размера чрезвычайно быстро, но операция поиска соседей является такой же трудоемкой.
Способом борьбы с фрагментацией является перемещение всех занятых участков в сторону старших или младших адресов так, чтобы
свободная память образовала единую непрерывную область. В этом
случае ОС время от времени должна производить копирование содержимого разделов из одного места в памяти в другое, корректируя таблицы свободных и занятых областей. Такая операция называется
уплотнением или сжатием памяти. Так как программы перемещаются в памяти в ходе своего выполнения, то в данном случае невозможно выполнить настройку адресов с помощью перемещающего загрузчика. Здесь более подходящим оказывается динамическое преобразование адресов.
37
Лекция 5. Организация виртуальной памяти в ОС
Необходимость размещения в памяти программ, требуемый объем
памяти которых превышает реально имеющийся в наличии, привела к
разработке концепции виртуальной памяти (ВП). Виртуализация
памяти может быть осуществлена на основе двух подходов: свопинга
(процессы выгружаются на диск и возвращаются в память целиком) и
подкачки (между ОЗУ и диском перемещаются части процессов –
сегменты, страницы и т. п.).
ВП не возможна без аппаратной поддержки. На компьютерах без
ВП виртуальные адреса выдаются процессором непосредственно на
шину адреса и вызывают для чтения или записи слово в физической
памяти с тем же адресом. Когда используется ВП, виртуальные адреса
передаются диспетчеру памяти, который отображает их на физические.
В настоящее время все множество реализаций ВП может быть
представлено тремя классами.
1. Страничная ВП организует перемещение данных между памятью и диском посредством страницами – частей ВАП фиксированного
и сравнительно небольшого размера.
2. Сегментная ВП предусматривает перемещение данных сегментами – частями ВАП произвольного размера, полученных с учетом
смыслового значения данных.
3. Сегментно-страничная ВП использует двухуровневое деление:
ВАП делится на сегменты, а затем сегменты – на страницы. Единицей
перемещения данных здесь является страница.
При страничной организации ВП пространство виртуальных адресов разделено на единицы, называемые виртуальными страницами.
Соответствующие единицы в физической памяти называются страничными блоками. Страницы и страничные блоки всегда имеют
одинаковый размер. Для каждого процесса ОС создает таблицу страниц, содержащую записи обо всех виртуальных страницах процесса
(рис. 5.1). Адрес таблицы страниц процесса хранится в специализированном регистре процессора.
38
Виртуальное адресное
пространство
Виртуальная страница
3236K X
2832K 5
Адрес физической памяти
2428K X
2024K 3
2024K
1620K 4
1620K
1216K 0
1216K
812K X
812K
1
48K
48K
2
Страничный блок
04K
04K
Рис. 5.1. Страничное распределение памяти
Каждый элемент таблицы (наиболее распространенный размер –
32 бита) хранит адрес страничного блока, в который загружена данная
виртуальная страница, бит блокирования кэширования для данной
страницы, а также модификатор защиты (указывает, разрешены ли
операции чтения и записи). Но сама по себе возможность отображения определенного количества виртуальных страниц на любой из некоторого множества страничных блоков с помощью установки соответствующей карты в диспетчере памяти не решает проблемы, заключающейся в том, что размер виртуального адресного пространства
больше физической памяти. Для этих целей в структуру элемента таблицы страниц включены признак присутствия (устанавливается в
единицу, если виртуальная страница находится в памяти), признак
модификации (устанавливается в единицу каждый раз, когда производится запись по адресу, относящемуся к данной странице), признак
обращения (устанавливается в единицу при каждом обращении по
адресу, относящемуся к данной странице). Признаки присутствия, модификации и обращения в большинстве моделей современных процессоров устанавливаются аппаратно, схемами процессора при выполнении операций с памятью.
Номер виртуальной страницы используется как индекс в таблице
страниц. По записи в таблице страниц находится номер страничного
блока, который затем присоединяется к старшим разрядам числа смещения, замещая номер виртуальной страницы и формируя физический
адрес (рис. 5.2).
39
Начальный адрес
таблицы страниц
4
3
2
1
Таблица страниц 0
Регистр
процессора
0 0 1 0 0 0 0 1 0 1 1 0 Виртуальный адрес
11
на входе
101
000
110
001
010
1
0
1
1
1
Бит присутствия/отсутствия
Физический адрес
на выходе
110 00010110
11
Рис. 5.2. Преобразование виртуального адреса в физический
при одноуровневой страничной адресации
Страничные прерывания
Если диспетчер памяти замечает, что страница отсутствует, то он
инициирует прерывание центрального процессора, передающее
управление ОС. Такое прерывание называется ошибкой из-за отсутствия страницы или страничным прерыванием.
Когда происходит страничное прерывание, выполняющийся процесс переводится в состояние ожидания, и активизируется другой
процесс из очереди готовых. Параллельно обработчик страничного
прерывания находит на диске требуемую виртуальную страницу (для
этого ОС должна помнить ее положение в страничном файле диска) и
пытается загрузить в оперативную память. Если в памяти имеется
свободная физическая страница, то загрузка выполняется немедленно,
в противном случае ОС должна выбрать страницу для выгрузки на
диск. Если удаляемая страница была изменена за время своего присутствия в памяти, ее необходимо переписать на диск, чтобы обновить
копию, хранящуюся там. Однако если страница не была модифицирована (например, она содержит текст программы), копия на диске все
еще является актуальной, и новая страница записывается просто поверх старой.
Эффективность алгоритма поиска кандидатов на выгрузку из памяти серьезнейшим образом влияет на временные задержки работы
всего менеджера памяти. Среди наиболее важных алгоритмов можно
отметить следующие:
 оптимальный алгоритм (легко описывается, но нереализуем) 
помечает каждую страницу числом команд, которые должен выполнить процессор перед тем, как потребуется доступ к этой странице.
Выгружается страница с наибольшей меткой. Причина, по которой
реализация не возможна, очевидна;
40
 алгоритм «не использовавшая в последнее время»  применяет два статусных флага – флаг модификации и флаг обращений. При
запуске процесса эти флаги для всех его страниц сбрасываются. Периодически (по таймеру) флаг обращений очищается, чтобы отличать
страницы, к которым давно не происходило обращений, от часто востребованных. Когда возникает страничное прерывание, ОС проверяет
все страницы и делит их на 4 категории на основании текущих значений флагов: класс 0 (не было обращений и изменений), класс 1 (не
было обращений, страница изменена), класс 2 (было обращение, страница не изменена), класс 3 (произошли и обращение, и изменение). С
помощью случайного поиска удаляется страница в непустом классе с
наименьшим номером. Подразумевается, что лучше выгрузить измененную страницу, к которой не было обращений, по крайней мере, в
течение одного тика системных часов, чем стереть часто используемую страницу. Алгоритм легок для понимания, умеренно сложен в
реализации и дает производительность, которая не оптимальна, но
может вполне оказаться достаточной;
 алгоритм «первая вошла – первая вышла»  хранит историю
поступления страниц в память и при возникновении страничного прерывания удаляет самую старую страницу. Однако не учитывается тот
факт, что самая старая страница может оказаться самой часто используемой, по этой причине он редко используется в такой форме;
 алгоритм «вторая попытка»  представляет собой модифицированную версию предыдущего алгоритма. При возникновении страничного прерывания анализируются обращения к самой старой странице. Если страница не использовалась (флаг обращений сброшен), то
на ее место немедленно загружается новая, которая помещается в самый конец списка. Если же флаг установлен, то он сбрасывается,
страница переносится в конец списка и дата ее поступления в память
принимается равной текущему моменту (имитируется повторная загрузка);
 алгоритм «часы» представляет модификацию алгоритма «вторая попытка». Недостатком предыдущего алгоритма является то, что
он постоянно перемещает страницы по списку. В алгоритме «часы»
поддерживается кольцевой список в форме часов, а «стрелка» (указатель на текущую запись) перемещается по кругу. При возникновении
прерывания проверяется та страница, на которую указывает «стрелка». Если флаг обращения сброшен, то на место текущей страницы в
круг встает новая, а «стрелка» смещается на позицию вперед. Если же
41
флаг установлен, то он сбрасывается, а «стрелка» переходит к следующей записи;
 алгоритм «не использовавшаяся дольше всего» отличается от
«не использовавшаяся в последнее время» тем, что ведется подсчет
количества периодов, в течение которых не было обращения к странице, и удаляет ту, у которой это значение максимальное. Алгоритм
теоретически реализуем, однако не является оптимальным в плане
вычислительных затрат. Кроме того, в записи элемента таблицы страниц необходимо наличие поля, достаточного для хранения значения
счетчика;
 алгоритм «рабочий набор» в процессе работы программа чаще
всего обращается к некоторому фиксированному набору страниц (рабочему набору). В этом ключе при возникновении страничного прерывания имеет смысл выгружать страницы, не входящие в рабочий
набор. В этих целях при всяком страничном прерывании для каждой
страницы изучается флаг обращений. Если он установлен, то текущий
момент запоминается в таблице страниц в поле «время последнего использования». Когда же он сброшен, то вычисляется разница между
текущим виртуальным временем и временем последнего использования, после чего эта разница сравнивается с заданным числом t. При
разнице больше t страница не находится в рабочем наборе и стирается, а на ее место загружается новая, после чего сканирование продолжается, обновляя остальные записи (для поддержания в актуальном
состоянии поля «время последнего использования»). Когда же разница меньше t, то страница все еще находится в наборе, она временно
обходится, но страница с наименьшим «временем последнего использования» запоминается. Если проверена вся таблица, а кандидат на
удаление не найден, то из всех таблиц со сброшенным флагом обращения выбирается имеющая максимальный возраст. Но когда все
страницы имеют установленный флаг обращения, то для удаления
случайным образом выбирается одна из них, причем желательно, чтобы у нее был сброшен флаг модификации;
 алгоритм «WSClock» представляет собой совмещение подходов
«часов» и «рабочего набора» (с временем старения). Перемещение
осуществляется по кругу. Если флаг обращения установлен, то он
сбрасывается в нуль, и происходит переход на следующую по кругу
запись. Когда он сброшен, то анализируются дополнительные условия: если возраст страницы больше чем некоторое значение «рабочего
набора», а страница – чистая, то на ее место загружается новая стра42
ница; если же страница «грязная», то ее нельзя немедленно стереть,
так как на диске нет последней копии. Чтобы избежать переключения
процессов на сохранение страницы на диск, ее запись включается в
график планирования, но на данный момент «стрелка» передвигается
на следующую страницу в списке. Несмотря на то что «грязная» страница может быть старше, чистая находится ближе в ряду страниц, которые можно использовать немедленно. После обхода стрелки по кругу возможны два варианта: запланированы (как минимум одна) операции записи на диск, ни одной операции записи не запланировано. В
первом случае стрелка продолжает движение, отыскивая чистую страницу. Поскольку запланирована одна или больше операций записи, то
со временем какая-нибудь из них будет выполнена, и соответствующая страница будет помечена как чистая. Во втором случае все страницы находятся в рабочем наборе, поэтому за недостатком дополнительной информации проще всего предъявить права на любую чистую
страницу и использовать ее.
Подкачка страниц работает лучше, когда в системе существует достаточное количество свободных страничных блоков, которые можно
затребовать при страничном прерывании. Чтобы обеспечить достаточный запас свободных блоков во многих системах со страничной
организацией памяти работает фоновый процесс, называемый страничным демоном, который большую часть времени спит, но периодически просыпается и проверяет состояние памяти. Если слишком
мало свободных блоков, демон начинает выбирать и удалять страницы из памяти используя определенный алгоритм замещения.
При работе со страницами возникают две важные проблемы:
1) таблица страниц может быть слишком большой (адресное пространство 32 бита – более миллиона страниц, причем для каждого
приложения своя таблица);
2) отображение должно быть быстрым (так как происходит при
каждом обращении к ячейке памяти, и не должно замедлять работу).
Организация многоуровневых таблиц страниц
Чтобы обойти проблему постоянного хранения в памяти огромных
таблиц страниц, часто используются многоуровневые таблицы. Все
ВАП процесса делится на разделы, а разделы – на страницы (рис. 5.3).
43
Виртуальный адрес
m n
k
Регистр процессора
Адрес таблицы разделов
1023
…
1023
4
…
Физический
3
адрес
3
2
2
m+n k
1
Таблица стра1
0 ниц
0
3-го раздела
Таблица разделов
1023
…
3
2
1
0
Таблица
страниц
2-го раздела
Рис. 5.3. Адресация при многоуровневой организации ВАП
Все страницы имеют одинаковый размер, а разделы содержат одинаковое количество страниц. Если размер и количество страниц в разделе выбрать равными степеням двойки (2k, 2n соответственно), то
принадлежность виртуального адреса к разделу и странице, а также
смещение внутри страницы можно определить очень просто: младшие
k двоичных разрядов дают смещение, следующие n разрядов дают номер виртуальной страницы, а оставшиеся старшие разряды содержат
номер раздела. Для каждого раздела строится собственная таблица
страниц, причем количество элементов таблицы и их размер подбираются такими, чтобы объем таблицы был равен объему страницы.
Например, в Pentium при размере страницы 4 Кбайта длина элемента
таблицы составляет 4 байта и количество записей в таблице страниц –
1024. Каждая таблица страниц описывается элементом в таблице разделов, называемой также каталогом страниц. Страница, содержащая
таблицу разделов, никогда не выгружается из памяти, а таблицы страниц могут при необходимости выгружаться на диск (это экономит память, но приводит к дополнительным затратам времени при получении физического адреса).
Инвертированные таблицы страниц
Таблицы страниц требуют в памяти по одной записи на каждую
виртуальную страницу, так как они индексируются по номеру этой
страницы. В случае если архитектура процессора 32-битная, размер
таблицы страниц будет составлять 4 Мбайта, но многоуровневые таблицы позволяют ОС не хранить все данные в ОЗУ одновременно. Но в
том случае если процессор использует 64-битную архитектуру, таблица страниц займёт 30 Тбайт, что нереально сейчас и не будет реальным в ближайшем будущем. Одним из способов организации 6444
битного адресного пространства является инвертированная таблица
страниц. В этой модели таблица содержит по одной записи на каждый страничный блок в реальной памяти, а не на страницу в ВАП.
Например, при 64-разрядных виртуальных адресах, размере страниц 4
Кбайта и 256 Мбайт ОЗУ таблица страниц потребует только 65 536
элементов. Недостатком инвертированных таблиц является то, что перевод виртуального адреса в физический становится намного сложнее.
АО не может более найти физическую страницу используя номер виртуальной страницы как индекс в таблице. Вместо этого необходимо
осуществлять поиск по всей таблице. Инвертированные таблицы используются в настоящее время на некоторых рабочих станциях IBM и
HP и будут встречаться все чаще, так как 64-битные машины получают все большее распространение.
Буфер быстрого преобразования адресов
К решению проблемы быстродействия при преобразовании виртуальных адресов существуют два противоположных подхода. Первый
из них – поддержание таблицы страниц с помощью массива быстрых
аппаратных регистров с одной записью для каждой виртуальной страницы. Преимущество метода – простота и отсутствие необходимости
обращения к памяти во время преобразования адресов. Недостатки –
большие временные затраты на инициализацию всех регистров при
контекстном переключении процессов и высокая стоимость аппаратуры (при большом количестве страниц). Альтернативой является хранение таблицы страниц целиком в оперативной памяти. Преимущество – возможность изменить карту памяти путем коррекции содержимого одного регистра. Недостаток – необходимость нескольких обращений к памяти для чтения записей таблицы страниц при дешифрации адреса. На практике чаще всего оба подхода совмещаются в виде
концепции буфера быстрого преобразования, представляющего собой
небольшой аппаратный кэш для записей таблицы страниц. Наличие
подобного кэша существенно помогает и в случае инвертированных
таблиц страниц.
При страничной организации ВАП процесса делится на равные части автоматически, без учета смыслового значения данных. Такой
подход не позволяет обеспечить дифференцированный доступ к разным частям программы (например, запретив запись в область кода
программы) или совместно использовать фрагменты программ разными процессами.
Сегментная организация памяти
45
Простое и предельно общее решение заключается в том, чтобы создать множеством полностью независимых адресных пространств,
называемых сегментами. Каждый сегмент содержит линейную последовательность адресов от 0 до некоторого разрешенного максимума (длины сегмента). Различия между страничной и сегментной адресацией приведено в табл. 5.1.
Таблица 5.1. Сравнение страничной организации памяти и сегментации
Вопрос
Страничная память Сегментация
Нужно ли программисту знать
о наличии подобной техники?
Нет
Да
Сколько в системе линейных
адресных пространств?
1
Много
Может ли суммарное адресное
пространство превышать размеры физической памяти?
Да
Да
Возможно ли разделение кода
и данных, а также раздельная
защита для них?
Нет
Да
Легко ли размещаются структуры данных с непостоянными
размерами?
Нет
Да
Облегчен ли совместный доступ пользователей к процедурам?
Нет
Да
Зачем была придумана эта Для
получения Для возможности разтехника?
большого линейно- биения программ и
го адресного про- данных на логически
странства без до- независимые
адресполнительных за- ные пространства, обтрат на физическую легчения совместного
память
доступа и защиты
На этапе создания процесса во время загрузки его образа в ОЗУ
система инициализирует таблицу сегментов процесса (аналогичную
таблице страниц), в которой для каждого сегмента указываются базовый физический адрес сегмента в оперативной памяти, размер сегмента, правила доступа к сегменту, признаки модификации, присутствия
и обращения к сегменту и т. д.
Механизмы преобразования адресов схожи со страничной организацией (рис. 5.4), однако имеются и существенные отличия. При страничной организации страницы имеют размер степени двойки, следовательно, в двоичном представлении он выражается числом с не46
сколькими нулями в младших разрядах. По этой причине ОС заносит
в таблицы страниц не полные адреса, а номера физических страниц,
которые совпадают со старшими разрядами базовых адресов. Сегмент
же в общем случае может располагаться в любом месте физической
памяти (начиная с любого адреса), поэтому необходимо задавать его
полный начальный физический адрес. Использование операции сложения вместо конкатенации замедляет процедуру преобразования
виртуального адреса в физический по сравнению со страничной организацией.
Виртуальный адрес
Номер сегмента Смещение в сегменте
Регистр процессора
+
Адрес таблицы
сегментов
Физический адрес
Базовый адрес сегмента
Рис. 5.4. Преобразование виртуального адреса при сегментации
Кроме замедленного преобразования адреса, среди прочих недостатков сегментной организации памяти можно отметить избыточность (единицей перемещения данных между диском и памятью является сегмент, имеющий в общем случае объем больший, чем страница) и фрагментацию (главный недостаток), возникающую из-за непредсказуемости размеров сегмента.
Сегментно-страничная организация памяти
Комбинированным способом, совмещающим достоинства обоих
подходов, является сегментно-страничная организация памяти. ВАП
процесса при этом разделено на сегменты, что позволяет определять
разные права доступа к областям памяти. Перемещение данных между
диском и памятью осуществляется страницами.
При совмещении страничной и сегментной организации существуют две альтернативные схемы преобразования виртуального адреса в физический.
Первая схема характеризуется тем, что виртуальный адрес преобразуется дважды, сначала посредством сегментирования, затем с
помощью страничной адресации.
Для каждого процесса ОС создает отдельную таблицу сегментов,
элементы которой схожи с элементами таблицы сегментов при сег47
ментной организации памяти, но в поле базового адреса сегмента указывается не начальный физический адрес сегмента, а начальный линейный виртуальный адрес сегмента в ВАП.
На первом этапе исходный виртуальный адрес, заданный в виде
пары (номер сегмента, смещение), преобразуется в линейный виртуальный адрес. Для этого на основании базового адреса таблицы сегментов и номера сегмента вычисляется адрес дескриптора сегмента.
Анализируются поля дескриптора и выполняется проверка возможности проведения заданной операции. Если доступ к сегменту разрешен,
то вычисляется линейный виртуальный адрес путем сложения базового адреса сегмента, извлеченного из дескриптора, и смещения, заданного в исходном виртуальном адресе.
На втором этапе полученный виртуальный адрес представляется в
виде пары (номер страницы, смещение в странице). Старшие разряды,
содержащие номер виртуальной страницы, заменяются номером физической страницы из таблицы страниц, а младшие разряды (содержащие смещение) остаются без изменения. В процессорах Intel i386,
i486, Pentium используется именно такой подход (с тем отличием, что
таблицы страниц реализованы двухуровневыми).
Вторая схема нумерует виртуальные страницы не в пределах всего
адресного пространства, а в пределах сегмента. Виртуальный адрес в
этом случае выражается тройкой (номер сегмента, номер страницы,
смещение в странице). Для каждого сегмента при этом поддерживается собственная таблица страниц, а таблица сегментов содержит не
виртуальный адрес начала сегмента, а адрес соответствующей сегменту таблицы страниц в физической памяти.
На первом этапе по номеру сегмента, заданному в виртуальном
адресе, из таблицы сегментов извлекается физический адрес соответствующей таблицы страниц.
На втором этапе по номеру виртуальной страницы из таблицы
страниц извлекается дескриптор страницы, содержащий номер физической страницы.
На третьем этапе к номеру физической страницы пристыковывается младшая часть виртуального адреса – смещение.
48
Лекция 6. Организация ввода-вывода в ОС
Одна из важнейших функций ОС состоит в управлении всеми
устройствами ввода-вывода компьютера. ОС передает этим устройствам команды, перехватывает прерывания и обрабатывает ошибки, а
также обеспечивает простой и удобный интерфейс между устройствами и остальной частью системы, который должен быть одинаковым
для всех устройств (для облегчения работы разработчиков ПО).
При изучении особенностей организации ввода-вывода в ОС необходимым является, прежде всего, понимание аппаратных принципов
функционирования устройств ввода-вывода и способов взаимодействия с ними, так как именно они налагают определенные ограничения на программные компоненты ОС.
Напомним их в контексте, необходимом для последующего изложения.
Классификация устройств ввода-вывода
Устройства ввода-вывода можно условно разделить на две категории: блочные и символьные устройства. Блочными называются
устройства, хранящие информацию в виде блоков фиксированного
размера, причем у каждого блока имеется адрес. Размер блока обычно
варьируется от 512 до 32 768 байт. Важное свойство блочного устройства состоит в том, что каждый его блок может быть прочитан независимо от остальных блоков. Наиболее распространенными блочными
устройствами являются диски.
Другим типом устройств ввода-вывода являются символьные
устройства, которые принимают или предоставляют поток символов
без какой-либо блочной структуры. Эти устройства не являются адресуемыми и не выполняют операцию поиска (например, принтеры, сетевые карты, «мыши» и т. д.).
Существуют также некоторые устройства, не вписывающиеся в
схему этих двух категорий. Например, часы не являются блокадресуемыми, а также не формируют и не принимают символьных потоков (их работа состоит в инициировании прерываний в определенные моменты времени). Экраны отображения также не умещаются в
рамки этой модели, однако все же она является настолько общей, что
может использоваться в качестве основы для достижения независимости от устройств некоторого ПО ОС, имеющего дело с вводомвыводом.
49
Взаимодействие с устройством
Устройства ввода-вывода обычно состоят из механической и электронной частей. Электронный компонент устройства называется контроллером устройства или адаптером и часто реализуется в виде
платы расширения компьютера. Механический компонент находится
в самом устройстве.
У каждого контроллера есть несколько управляющих регистров, с
помощью которых с ним может общаться процессор. При помощи записи в эти регистры ОС приказывает устройству предоставить данные, принять данные, включиться или выключиться и т. п. Чтение из
этих регистров позволяет ОС узнать состояние устройства, например,
готово ли оно к приему новой команды и т. д.
Помимо управляющих регистров у многих устройств есть внутренний буфер, посредством которого ОС может обмениваться с
устройством данными.
Существуют два альтернативных способа реализации доступа к
управляющим регистрам и буферам данных устройств. Первый заключается в том, что каждому управляющему регистру назначается
порт ввода-вывода (номер его задается 8- или 16-разрядным целым
числом), адресуемый независимо от основной памяти. Такая схема
называется использованием раздельных адресных пространств.
Второй подход состоит в отображении всех управляющих регистров внешних устройств на адресное пространство памяти. Каждому
управляющему регистру назначается уникальный адрес в памяти. Такая схема называется отображаемым на память вводом-выводом.
Обычно для регистров устройств отводятся адреса на вершине адресного пространства.
Также существуют различные гибридные схемы с отображаемыми на адресное пространство буферами данных и отдельными портами ввода-вывода (например, в процессорах Intel x86 и Pentium помимо
пространства портов с номерами от 0 до 65 535, адресное пространство от 640Kбайт до 1Мбайт зарезервировано под буферы данных
устройств ввода-вывода).
Обе схемы обращения к контроллерам имеют свои сильные и слабые стороны. К достоинствам отображаемого доступа относятся следующие особенности:
1) не требуется специальных машинных команд для взаимодействия с портами (IN, OUT);
50
2) не требуется специального механизма защиты от пользовательских процессов, пытающихся обратиться к внешним устройствам (достаточно исключить ту часть адресного пространства, на которую
отображаются управляющие регистры, из адресного пространства
пользователей).
Если управляющие регистры различных устройств отображаются на различные страницы памяти, ОС может предоставлять дифференцированный доступ различным пользователям. Для этого нужно
всего лишь включить номер соответствующей страницы памяти в карту памяти нужного пользователя. В результате такая схема позволяет
разместить драйверы различных устройств в различных адресных
пространствах, тем самым не только уменьшая размер ядра, но и
удерживая драйверы от вмешательства в дела друг друга;
3) Каждая команда процессора, обращающаяся к памяти, может с
тем же успехом обращаться и к управляющим регистрам устройства.
Если отображения нет, то управляющий регистр сначала считывается
в регистр процессора и только затем анализируется его состояние, т. е.
требуются две команды процессора вместо одной.
К недостаткам отображаемого доступа можно отнести две особенности:
1) в большинстве современных устройств применяется кэширование памяти, что недопустимо для управляющих регистров, то есть
необходима специальная аппаратура, способная выборочно запрещать
кэширование;
2) все устройства и модули памяти должны изучать все обращения
к памяти, чтобы определить, на какие из них следует реагировать. Если у компьютера одна шина, то реализовать такой просмотр не представляется сложным. Однако современные персональные компьютеры
используют выделенную высокоскоростную шину для обмена данными между процессором и памятью, и у устройств ввода-вывода самих
по себе нет возможности увидеть адреса памяти, выставляемые процессором на эту шину.
Для того, чтобы отображение могло работать, необходимы специальные меры:
 все обращения к памяти сначала посылаются по выделенной
шине (чтобы не снижать производительности), а если память не может ответить на эти запросы, процессор пытается сделать это ещё раз
по другим шинам; такое решение работоспособно, но требует дополнительного увеличения сложности аппаратуры;
51
 возможна установка на шину памяти специального следящего
устройства, передающего все адреса потенциально заинтересованным
устройствам ввода-вывода; проблема, однако, в том, что устройства
могут просто не успеть обработать эти запросы с той же скоростью,
что и память;
 возможна фильтрация адресов микросхемой моста PCI; эта микросхема содержит диапазоны памяти, занимаемые регистрами, и заполняется во время загрузки компьютера; недостаток схемы состоит в
необходимости принятия во время загрузки решения о том, какие адреса не являются адресами памяти.
Прямой доступ к памяти (DMA)
При взаимодействии с внешними устройствами процессору необходимо постоянно контролировать их работу, записывая команды в
управляющие регистры, считывая регистры-флаги и регистрыбуферы. При этом обработка поступающих данных по одному байту
крайне неэффективна, поэтому в современных ИВС применяется схема прямого доступа к памяти (DMA), управляемая специальным
DMA-контроллером. Суть этого метода заключается в том, что DMAконтроллер использует шину совместно с процессором (время от времени захватывая ее, в результате чего процессору возможно придется
ожидать) и взаимодействует с внешними устройствами от его имени
(устройства не видят разницы), контролируя процесс переноса данных
из ОЗУ в буферы контроллера устройства или наоборот. Процессор
при этом изначально программирует внешние устройства на выполнение различных операций, а затем программирует DMA-контроллер
для переноса данных, после чего переключается на другие задачи, а
DMA-контроллер далее действует самостоятельно. Некоторые DMAконтроллеры переносят данные от устройства в память напрямую, а
некоторые используют для промежуточного хранения внутренний буфер. Результатом этого является лишний такт шины на передачу каждого слова, но зато DMA-контроллер может использоваться для переноса данных не только от устройства в память, но и между устройствами или из памяти в память. Необходимо заметить, что быстродействие DMA-контроллера намного меньше быстродействия процессора, поэтому его использование дает выигрыш только в том случае, если у процессора есть другие задания, требующие обработки. Если
процессор простаивает, то операции переноса данных он выполнит
гораздо быстрее.
52
Прерывания устройств
Для оповещения процессора о готовности к выполнению операции
или о завершении предыдущей устройства ввода-вывода используют
прерывания, обрабатываемые специализированным контроллером
прерываний. Задачей контроллера является обработка поступающих
запросов согласно их приоритетам, и уведомление процессора о наличии прерываний выставлением сигнала на его выделенный контакт.
Номер, выставленный при этом на адресную шину компьютера, применяется как индекс в таблице векторов прерываний, из которой извлекается адрес соответствующей процедуры обработки. Процессор
сохраняет текущее состояние (чаще всего в стеке ядра), после чего
осуществляет переключение контекста на обработчик прерывания.
А теперь рассмотрим особенности программной реализации вводавывода.
Задачи ПО ввода-вывода
С точки зрения программной поддержки ввода-вывода в ОС ключевыми вопросами являются:
 концепция независимости от устройств, что означает возможность написания программ, способных получать доступ к любому
устройству ввода-вывода без предварительного указания его типа;
 принцип единообразного именования, смысл которого заключается в том, что имя файла или устройства должно быть простой текстовой строкой или числом и никоим образом не зависеть от физического устройства;
 обработка ошибок;
 способ переноса данных: синхронный (блокирующий) или асинхронный (управляемый прерываниями);
 способ буферизации;
 использование выделенных устройств и устройств коллективного пользования (с некоторыми устройствами, такими как диски, пользователи могут работать одновременно, другие же, такие как накопители на магнитной ленте, должны предоставляться в монопольное
владение одному пользователю).
Программные уровни ввода-вывода
Программное обеспечение ввода-вывода обычно организуется в
виде четырех уровней (рис. 6.1), каждый из них имеет четко очерченные функции, которые он должен выполнять, и строго определенный
интерфейс взаимодействия с соседними уровнями.
53
Программное обеспечение ввода-вывода уровня пользователя
Независимое от устройств программное обеспечение ОС
Драйверы устройств
Обработчики прерываний
Аппаратура
Рис. 6.1. Программные уровни ввода-вывода
Уровень обработчиков прерываний находится непосредственно над АО и отвечает за обработку события, инициировавшего прерывание, извлекая информацию из регистров контроллера устройства.
Схема обработки следующая:
1) запомнить состояние всех регистров, не сохраненных аппаратурой;
2) установить контекст для процедуры обработки прерываний (выполнение этого действия может включать установку TLB, MMU и
таблицы страниц);
3) установить указатель стека для процедуры обработки прерываний;
4) выдать подтверждение контроллеру прерываний. Если централизованного контроллера прерываний нет, разрешить прерывания;
5) скопировать содержимое регистров с того места, где они были
сохранены (возможно в стеке), в таблицу процессов;
6) запустить процедуру обработки прерываний. Она извлечет информацию из регистров контроллера устройства, инициировавшего
прерывание;
7) выбрать процесс, которому нужно передать управление. Если
прерывание разблокировало какой-либо высокоприоритетный процесс, он может быть выбран в качестве следующего;
8) установить контекст MMU для следующего работающего процесса. Также может понадобиться определенная установка TLB;
9) загрузить регистры нового процесса и начать его выполнение.
Уровень драйверов устройств отвечает за взаимодействие с
внешними устройствами (драйвером называется специальная программа, разработанная для управления устройством ввода-вывода).
Для унифицированного взаимодействия с драйверами в большинстве
ОС определены стандартные интерфейсы блочного и символьного
драйверов. Эти интерфейсы включают набор процедур, которые могут
вызываться остальной ОС для обращения к драйверу.
54
Чтобы иметь доступ к аппаратной части устройства (управляющим
регистрам), драйвер должен быть частью ядра ОС и работать в привилегированном режиме. В некоторых системах драйверы скомпилированы вместе с ядром, и при добавлении новых устройств требуется
перекомпиляция ядра (такой подход характеризуется большей сложностью в подключении новых устройств, однако отличается большей
устойчивостью), в то время как в других используется модель динамической загрузки драйверов (главным образом в настольных системах персональных компьютеров, конфигурация которых часто изменяется).
Поскольку один и тот же драйвер может обрабатывать несколько
устройств, и даже от одного устройства запросы могут приходить
быстрее, чем закончена обработка предыдущих, программный код
драйвера должен быть реентерабельным, т. е. позволять одновременное выполнение несколькими процессами одновременно.
Независимое от устройств ПО ввода-вывода должно выполнять
следующие функции:
1) обеспечивать однотипность именования устройств и единообразный интерфейс для драйверов. Например, в системе UNIX устройства идентифицируются по именам, которые указывают на индексы
специальных файлов, содержащих главный номер устройства (необходим для определения расположения подходящего драйвераобработчика) и номер второстепенного устройства (передается
драйверу для указания самого устройства);
2) осуществлять буферизацию. Буферизация поступающих данных
может происходить либо в буфере, расположенном в пространстве
пользователя (вариант плох тем, что страница, содержащая буфер,
может оказаться выгруженной на диск), либо в буфере, расположенном в пространстве ядра, содержимое которого при заполнении копируется в пользовательский буфер (вариант плох тем, что если данные
продолжают поступать, при полном буфере ядра, а буфер пользователя еще не готов для копирования, то они будут потеряны), либо в двух
буферах в пространстве ядра, чередующихся при заполнении (схема с
двойной буферизацией);
3) производить обработку сообщений об ошибках. Устройства
ввода-вывода стараются обработать возникающие ошибки как можно
ближе к уровню аппаратуры (например, контроллер диска может попытаться повторно считать сектор диска при несовпадении контроль-
55
ной суммы), но если это не удается, то обработать ошибку должно попытаться ПО;
4) обеспечить захват и освобождение выделенных устройств;
5) иметь независимый от устройств размер блока.
ПО ввода-вывода пространства пользователя чаще всего представлено подсоединенными библиотеками, а также системой спулинга (спулингом называется способ работы с выделенными устройствами в многозадачной системе, при котором поступающие задания
накапливаются в очереди согласно их приоритетам, после чего поочередно используют устройство).
Реальные устройства ввода-вывода
Типовыми устройствами ввода-вывода являются диски (жесткие и
гибкие), часы (таймер), клавиатура и дисплей.
Диски
Специфика ввода-вывода с участием дисков будет подробнее рассмотрена в следующей лекции, описывающей логику организации
файловых систем.
Таймер
Аппаратно задачи таймера заключаются только в инициировании
прерывания через определенные интервалы времени. Все остальные
функции, связанные со временем, выполняются программно драйвером таймера.
1. Слежение за временем суток (увеличение на единицу счетчика
при каждом импульсе сигнала времени часов).
2. Контроль за использованием активным процессом процессора,
т. е. предотвращение монополизации (при запуске процесса планировщик инициализирует счетчик, записывая в него выделенное процессу число тиков таймера, и при каждом прерывании драйвер таймера уменьшает его значение на единицу, а когда оно достигнет нуля,
обращается к планировщику).
3. Ведение учета использования процессора.
4. Обработка системных вызовов alarm, инициированных пользователем (пользовательских будильников).
5. Поддержание следящих таймеров для ОС (например, при ожидании разгона двигателя диска, при этом драйвер просто вызывает ту
процедуру, которая установила таймер).
6. Наблюдение, анализ и сбор статистики.
56
«Мягкие» таймеры
Для работы в системах с высокой загруженностью применяются и
«мягкие» таймеры, которые не вызывают прерываний при истечении
указанного промежутка времени. Вместо генерации прерываний, значение «мягкого» таймера изучается ядром каждый раз после выполнения системного вызова перед возвращением в режим задачи и сравнивается со значением часов реального времени. Если ожидаемый момент времени наступил, то выполняется запланированное событие.
После обработки таймер снова устанавливается. При этом отпадает
необходимость специального переключения в режим ядра, т.к. система и так уже в нем находится.
Проверка значений «мягких» таймеров происходит при обращении
к ядру при следующих событиях:
 системных вызовах;
 ошибках преобразования адреса TLB;
 страничном прерывании;
 прерывании ввода-вывода;
 временном отсутствии работы для процессора.
Частота возникновения таких событий определяет частоту срабатывания «мягких» таймеров, и если отмеченные события не происходят, это может привести к некоторому запаздыванию реакции. В этом
случае для «мягкого» таймера может быть принудительно установлена верхняя граница срабатывания при помощи аппаратного таймера.
Клавиатура
При программной обработке прерываний от клавиатуры драйвером ввода существуют две альтернативные концепции: необрабатываемого терминала (в этом случае задача драйвера заключается в сборе ввода и передаче его программам без всяких изменений) и обрабатываемого терминала (драйвер сам осуществляет редактирование
введенной строки, а программе пользователя возвращается только
окончательный результат). Концепцию необрабатываемого терминала
называют также символьно-ориентированной (режимом без обработки, неканоническим режимом), а обрабатываемого – строчноориентированной (режимом с обработкой, каноническим режимом).
Дисплей
Простейшим способом вывода информации для пользователя является использование текстового терминала, принимающего данные
для отображения в виде потока байтов и выводящего их один за дру57
гим. Ряд терминалов поддерживает наборы управляющих команд,
позволяющих перемещать курсор, удалять строки и т. п. Эти команды
часто реализуются в виде ESC-последовательностей, начинающихся с
символа ESC (0x1B).
Графические терминалы позволяют создать для пользователя
более дружественный графический интерфейс пользователя, основными элементами которого являются окна, пиктограммы, меню,
указывающее устройство. ПО графического интерфейса может быть
реализовано либо на уровне пользователя (как это сделано в UNIX),
либо включено в состав ядра ОС (как в случае Windows).
Сетевые терминалы используются для того, чтобы соединить
удаленного пользователя с компьютером по локальной или глобальной сети. Существуют две точки зрения на организацию сетевых терминалов. Одна заключается в том, что сетевой терминал должен обладать значительной вычислительной мощностью и памятью, что должно позволить работать на нем сложным протоколам и снизить объем
данных, пересылаемых по сети. Другая точка зрения состоит в том,
что терминал должен быть максимально простым и дешевым, в основном лишь отображая символы на экране.
Первый подход реализован в системе X Windows (рис. 6.2).
Пространство
пользователя
Пространство
ядра
Менеджер окон Приложение
Motif
Intrinsics
Xlib
X-клиент
UNIX
Аппаратура
X-протокол
Сеть
X-сервер
UNIX
Аппаратура
Рис. 6.2. Взаимодействие терминала и сервера в системе X Windows
X-терминал представляет собой компьютер, на котором работают
X-программы, взаимодействующие с программами, работающими на
на удаленном компьютере. На X-терминале запущена программа,
называемая X-сервером, обрабатывающая события от клавиатуры и
«мыши», а также команды от удаленного компьютера. X-сервер общается с X-клиентом, расположенным на удаленном компьютере. X-
58
клиент дает команды серверу выполнить те или иные действия,
например вывести текст или отобразить геометрическую фигуру.
Система X Windows на самом деле не является полным графическим интерфейсом пользователя, а лишь определяет протокол взаимодействия между X-клиентом и X-сервером. Для предоставления полного графического интерфейса поверх X Windows запускаются другие
уровни ПО:
 Xlib – набор библиотечных функций, необходимых для доступа
к функциям X Windows, который образует низкоуровневый базис;
 Intrinsics (встроенные средства)  набор инструментальных
средств (кнопки, полосы прокрутки и т. п.), представлен уровнем
сверху над Xlib;
 Motif  предназначен для задания стандарта на графический интерфейс пользователя (наиболее популярный стандарт);
 X-клиентский процесс, называемый оконным менеджером, 
занимается управлением окнами.
При запуске программы в системе X Windows устанавливается соединение с X-сервером с помощью надежного протокола (чаще всего
TCP/IP), по которому передаются четыре типа сообщений:
 команды рисования от программы к рабочей станции;
 ответы рабочей станции на запросы программы;
 объявления о различных событиях, например ввод с клавиатуры
или «мыши»;
 сообщения об ошибках.
В сумме X-протокол содержит сотни сложных сообщений для
управления окнами, рисования геометрических фигур и отображения
текста. В противовес ему можно отметить систему SLIM (Stateless
Low-level Interface Machine), в основе которой находится терминал,
содержащий лишь дисплей, клавиатуру и «мышь» без какого-либо
пользовательского ПО. Терминалы такого типа называют также
«тонкими» клиентами. В этом случае терминал хранит в своем буфере образ экрана, который он перерисовывает локально, но модифицирует его частично по командам, получаемым от сервера. В SLIM
определено всего пять сообщений от сервера: SET (заполнить прямоугольник новыми пикселами), FILL (залить прямоугольник указанным
цветом), BITMAP (отобразить приложенное к сообщению изображение с масштабированием), COPY (копировать прямоугольник из одной области буфера в другую), CSCS (преобразовать систему цветов
из терминальной в телевизионную).
59
Лекция 7. Файловые системы ОС
Структурно файловая система (ФС) является частью подсистемы
ввода-вывода ОС, но ввиду сложности, специфичности и важности
(как основного хранилища всей информации ИВС) ФС должна быть
рассмотрена отдельно.
Одной из основных задач ОС является предоставление пользователю удобств при работе с данными, хранящимися на дисках. Для этого ОС подменяет физическую структуру хранящихся данных некоторой удобной для пользователя логической моделью. Базовым элементом этой модели является файл, представляющий собой именованную
область внешней памяти, в которую можно записывать и из которой
можно считывать данные. Основными целями использования файлов
являются следующие:
 долговременное и надежное хранение информации (обеспечиваемое средствами энергонезависимого АО и надежного программного
кода);
 совместное использование информации (естественное, легкое,
но в то же время контролируемое и безопасное).
Эти цели реализуются средствами ФС. Файловая система – это
часть ОС, включающая:
 совокупность всех файлов на диске;
 наборы структур данных, используемых для управления файлами (каталоги файлов, индексы, таблицы распределения блоков диска);
 комплекс системного ПО, реализующего различные операции
над файлами (создание, чтение, запись, удаление, поиск и т. п.).
ФС может рассматриваться с двух позиций: позиции пользователя,
работающего с ОС, и позиции системного программиста, взаимодействующего с ней на низком уровне. Остановимся подробнее на каждом из подходов, начав с точки зрения пользователя.
Именование файлов
Файлы являются абстрактным механизмом работы с информацией
на диске. Важной характеристикой любого механизма абстракции является именование управляемых объектов. Точные правила именования файлов различаются от системы к системе, но чаще всего именем
файла является строка некоторой длины (от 8 до 255 символов), содержащая символы определенного алфавита (например, латинского),
цифры, а также специальные символы. В одних ФС различаются
строчные и прописные символы, для других – наличие расширения у
60
файла является обязательным (в случае Windows обработка файла
напрямую зависит от его расширения), для третьих расширение является понятием достаточно условным. Подобное имя файла называется
также простым именем и идентифицирует его в пределах одного каталога. Полное имя представляет собой цепочку простых имен всех
каталогов, через которые проходит путь от корня до данного файла.
Таким образом, полное имя является составным, в котором простые
имена отделены друг от друга принятым в ОС разделителем. Файл
может быть также идентифицирован относительным именем (которое
также является составным), определяемым относительно текущего каталога.
Структура файла
Файлы могут быть структурированы несколькими различными
способами. В первом варианте ОС не интересуется содержимым файла и представляет их в виде потока байтов, значение которым придается в программах пользователя (подход Windows, UNIX). Подобное
рассмотрение файлов обеспечивает максимальную гибкость, так как
программы пользователя могут помещать в файлы все что угодно, а
ОС не вмешивается в этот процесс.
Второй вариант организации представляет собой первый шаг по
направлению к структуре (его развитием стали СУБД). Файл представляет собой последовательность записей фиксированной длины,
каждая со своей внутренней структурой. Важным является то, что
операции чтения-записи работают с минимальным неделимым блоком
размером в одну запись. Данный подход обозначился в то время, когда обмен данных с ИВС происходил с помощью перфокарт с пробитыми отверстиями (на каждой помещалось 80 колонок, представляющих побитовое задание символов). ОС на мэйнфреймах оперировали
файлами, состоящими из записей размером 80 символов (образов
перфокарт). Подход применялся в ОС OS/360, DEC RSX, VMS.
Третий вариант  это дерево записей не обязательно одинаковой
длины. Каждая запись в фиксированной позиции содержит поле ключа. Дерево отсортировано по ключевому полю, что обеспечивает
быстрый поиск. Основной файловой операцией является получение
значения записи по указанному значению ключа. Данный подход до
сих пор применяется в специализированных ОС мэйнфреймов.
Типы файлов
Многие ОС поддерживают различные типы файлов. Например, в
системах Windows и UNIX проводится различие между регулярными
61
(обычными) файлами и каталогами. В системе UNIX также различаются символьные и блочные специальные файлы. К регулярным файлам относят все те, которые содержат информацию пользователя. Каталоги – это системные файлы, обеспечивающие поддержку структуры файловой системы. Символьные специальные файлы имеют отношение к вводу-выводу и используются для моделирования последовательных устройств ввода-вывода, таких как терминалы, принтеры и
сети. Блочные специальные файлы используются для моделирования
дисков. Регулярные файлы являются либо ASCII-файлами (текстовыми файлами, воспринимаемыми пользователем без какого-либо преображения), либо двоичными файлами.
Атрибуты файла
Кроме данных, содержащихся в файле и его имени, все ОС связывают с каждым файлом также и другую информацию, например дату и
время создания файла, а также его размер. Эти дополнительные сведения называются атрибутами файла. Некоторые возможные атрибуты файлов перечислены в табл. 7.1.
Таблица 7.1: Некоторые атрибуты файлов
Атрибут
Значение
Защита
Кто и как может получить доступ к файлу
Создатель
Идентификатор пользователя, создавшего файл
Владелец
Текущий владелец
Флаг «только чтение» 0 –для чтения / записи, 1 – только для чтения
Флаг «скрытый»
0 – нормальный, 1 – не показывать в перечне файлов
Флаг «системный»
0 – нормальный, 1 – системный
Флаг «архивный»
0 – заархивирован, 1 – требуется архивация
Флаг ASCII/двоичный 0 – ASCII, 1 – двоичный
Режим доступа
0 – последовательный доступ, 1 – произвольный
Флаг «временный»
0 – обычный файл, 1 – после окончания работы процесса файл следует удалить
Флаги блокировки
0 – файл не заблокирован, отличный от нуля – доступ к файлу заблокирован
Время создания
Дата и время создания файла
Время последнего до- Дата и время последнего доступа к файлу
ступа
Время последнего из- Дата и время последнего изменения файла
менения
Текущий размер
Количество байтов в файле
Операции с файлами
Работа с файлами в ОС может быть организована двумя способами. Первый из них требует наличия специализированного набора си62
стемных вызовов (create, open, write, read, append, delete, seek, get/set
attributes и т. п.). Другой характеризуется тем, что работа с содержимым файла осуществляется путем его наложения на адресное пространство процесса, после чего чтение / запись производится операциями обращения к памяти. В этом случае набор системных вызовов для
работы с файлами является более облегченным (map, unmap, delete,
get/set attributes).
Организация иерархической ФС
Простейшая форма системы каталогов состоит в том, что имеется
один каталог, в котором содержатся все файлы (данный подход был
применен в ОС CP/M). Иногда его называют корневым каталогом, но
поскольку он в таких системах единственный, то его название не существенно. Недостаток подобной системы заключается в том, что различные пользователи могут случайно задать для своих файлов одинаковые имена, что приведет к затиранию данных одного пользователя
данными другого.
Первым этапом в решении проблемы одинаковых имен файлов,
созданных различными пользователями, можно считать систему, в которой каждому пользователю выделяется один каталог. При этом
имена файлов разных пользователей не конфликтуют друг с другом.
Однако для работы в такой системе требуется начальная регистрация
пользователя, при которой он указывает свое имя. После регистрации
в системе для пользователя в качестве рабочего (и единственного)
устанавливается соответствующий каталог. При подобной реализации
в базовой форме пользователи могут получить доступ только к файлам в своем собственном каталоге. Для совместного доступа к файлам
требуется незначительная модификация системы (указывать не только
имя файла, но и имя его владельца, например mjackson:readme).
Наиболее общими являются иерархические файловые системы,
позволяющие пользователям самостоятельно строить дерево каталогов внутри своих личных.
Для того чтобы уяснить принципы функционирования ФС, после
рассмотрения прикладных аспектов организации необходимо перейти
к ее изучению с точки зрения разработчика системы.
Физическая организация данных на диске
Жесткий диск состоит из набора стеклянных или металлических
пластин, покрытых с одной или двух сторон магнитным материалом.
На каждой стороне пластины размечены тонкие концентрические
63
кольца – дорожки, на которых хранятся данные (их количество зависит от типа диска). Нумеруются дорожки от внешнего края к центру
диска.
Совокупность дорожек одного радиуса на поверхностях всех пластин называется цилиндром. Каждая дорожка разбивается на фрагменты, называемые секторами, так что все дорожки имеют одинаковое количество секторов. Современные жесткие диски имеют неодинаковое количество секторов на разных дорожках (это обусловлено
увеличением длины дорожки), но скрывают свою внутреннюю геометрию от ОС, представляя вместо этого виртуальную геометрию
диска. Сектор – наименьшая адресуемая единица обмена данных дискового устройства с ОЗУ. Для адресации сектора, контроллеру диска
необходимо указать составляющие адреса: номер цилиндра, номер
поверхности (номер головки), номер сектора.
ОС при работе с диском использует, как правило, собственную логическую единицу дискового пространства, называемую блоком (или
кластером).
Структура ФС
ФС хранятся на дисках, причем большинство дисков делится на
несколько разделов с независимой ФС в каждом из них. Раздел – это
непрерывная часть физического диска, которую ОС представляет
пользователю как логическое устройство (используются также названия логический диск, логический раздел). Раздел, отформатированный
под конкретную файловую систему, называется томом. Сектор 0 диска называется главной загрузочной записью (MBR) и используется
для загрузки компьютера. В конце главной загрузочной записи содержится таблица разделов, в которой хранятся начальные и конечные
адреса (номера блоков) каждого раздела. Один из разделов помечен
как активный. При загрузке компьютера BIOS считывает и исполняет
MBR, после чего загрузчик, содержащийся в MBR, определяет активный раздел диска, считывает его первый блок, называемый загрузочным, и исполняет его. Программа, находящаяся в загрузочном блоке,
загружает ОС из этого раздела.
Для единообразия каждый дисковый раздел начинается с загрузочного блока, даже если в нем не содержится операционной системы.
Во всем остальном строение раздела диска меняется от системы к системе. Часто ФС содержат некоторые из элементов, показанных на
рис. 7.1.
64
Таблица разделов
Раздел диска
MBR
Загрузочный СуИнформация о сво- I-узлы Корневой Файлы и
блок
перблок бодном пространстве
каталог каталоги
Рис. 7.1. Возможная структура файловой системы
Один из таких элементов, называемый суперблоком, содержит
ключевые параметры ФС («магическое число», количество блоков ФС
и т. п.) и считывается в память при загрузке компьютера или первом
обращении к ФС. Следом располагается информация о свободных
блоках ФС, например, в виде битового массива или списка указателей.
За этими данными следует информация об i-узлах (представляющая
собой массив структур данных по одной на файл, содержащих всю
информацию о файлах) или таблица размещения файлов (FAT). Следом может размещаться корневой каталог, содержащий вершину дерева ФС. Остальное место занимают каталоги и файлы.
Физическая организация файлов
Одним из наиболее важных моментов в реализации хранения файлов является учет соответствия блоков диска файлам. В различных ОС
применяются разные способы физической организации файлов, критериями эффективности при этом являются:
 скорость доступа к данным;
 объем адресной информации файла;
 степень фрагментированности дискового пространства;
 максимально возможный размер файла.
Простейшим вариантом физической организации является выделение непрерывного набора дисковых блоков. Преимуществ у подобного подхода два: минимальный объем адресной информации (для
определения блоков файла достаточно хранить только номер первого
блока и число блоков в файле) и высокая скорость доступа (так как
файл может быть считан за один проход, и нужна лишь одна операция
поиска). Основным, но существенным недостатком является постоянно увеличивающаяся фрагментация данных, для борьбы с которой
требуется периодическое проведение операции уплотнения. Тем не
менее при записи данных на компакт-диск, когда после записи размер
65
файла и его содержимое измениться не может, данный подход с успехом используется.
Второй метод состоит в представлении файла в виде связного
списка блоков, когда в начале каждого блока находится ссылка на
следующий. Адресная информация при этом минимальна, необходимо
хранить только адрес первого блока файла, фрагментация на уровне
блоков отсутствует, так как такой метод позволяет использовать каждый блок диска. Недостатком метода является крайне медленная скорость произвольного доступа, так как для получения доступа к блоку
N требуется прочитать N-1 дисковых блоков до него. Кроме того, подобная схема приводит к уменьшению полезного размера каждого
блока на несколько байт. Этот негативный эффект особенно заметен
при работе с теми программами, которые пишут данные на диск пакетами размером степени двух (для размещения данных в одном блоке
будет не хватать именно тех нескольких байтов, которые расходуются
на хранение ссылки на следующий блок).
Недостаток предыдущей схемы легко устранить, если хранить указатели на следующие блоки не внутри каждого дискового блока, а в
специальной таблице, разово загружаемой в память (рис. 7.2).
Физический блок 0
1
2
3
4
5
6
7
8
9
10
11
1
3
2
12
1
10
11
7
12
5
Начало файла 1
Конец файла 2
Начало файла 2
Конец файла 1
Рис. 7.2. Таблица размещения файлов
Такая таблица называется FAT-таблицей (File Allocation Table).
Подобная схема позволяет использовать для хранения данных весь
блок, кроме того, произвольный доступ становится гораздо быстрее,
адресная информация файла минимальна. Основной недостаток за66
ключается в том, что вся таблица должна постоянно находиться в памяти (для 20-гигабайтного диска с размером блока в 1 Кбайт –
2*106*4 = 80 Мбайт). Местом ее размещения может быть и виртуальная память, но и в этом случае ее размер является достаточным, кроме
того, постоянное обращение к диску для чтения страниц таблицы, отсутствующих в памяти, также привело бы к определенным задержкам
в работе.
Последний метод отслеживания принадлежности блоков дискам
состоит в связывании с каждым файлом структуры данных фиксированного размера, называемой i-узлом (индексом), содержащей атрибуты (идентификатор владельца, тип файла, права доступа к файлу, временные характеристики, число ссылок на индекс, размер файла) и адреса дисковых блоков. Большое преимущество данной схемы заключается в том, что конкретный индекс находится в памяти только тогда,
когда соответствующий ему файл открыт. С данным методом связана
проблема ограниченности размера индекса: в нем может не хватить
места для хранения всех блоков файла, если тот достаточно велик.
Решение состоит в резервировании части места в индексе для хранения адресов не блоков файла, а блоков, содержащих адреса блоков
файла, другими словами, – организации косвенной адресации (рис.
7.3).
Атрибуты файла
Адрес блока 0
Адрес блока 1
Адрес блока 2
…
Адрес блока N
Адрес блока
указателей
Блок косвенной
адресации
Рис. 7.3. Косвенная адресация блоков в индексе
Физическая организация каталогов
При работе с файлом ОС использует указанное пользователем имя,
чтобы найти запись файла в каталоге. Запись в каталоге необходима
для нахождения блоков файла, и в зависимости от системы это могут
быть адрес начального блока файла и размер (для непрерывных файлов), номер первого блока файла (обе схемы связных списков) или
номер i-узла. Во всех случаях основная функция системы каталогов
67
заключается в преобразовании ASCII-имени в информацию, необходимую для нахождения данных.
Кроме адресной информации, ФС должна хранить атрибуты файла. Один из возможных вариантов заключается в помещении атрибутов прямо в каталоговую запись (так поступает, например, ФС FAT16, FAT-32). Каталог при этом состоит из списка элементов фиксированной длины по одному на файл, содержащих имена файлов, их
структуру атрибутов, а также один или несколько адресов блоков.
ФС на основе i-узлов хранят атрибуты в i-узлах, а не в записях каталога. В этом случае каталог содержит только пары «имя файла –
номер узла».
Проблемой, заслуживающей не меньшего внимания является поддержка длинных имен файлов. Существует несколько способов хранения длинных имен в каталоге: ограничение максимальной длины,
переменный размер записей каталога, хранение имен файлов в «куче»
в конце каталога, использование нескольких записей в каталоге.
Простейший способ реализации состоит в установке ограничения
на длину имени файла (например, не более 255 символов) и резервировании достаточного места в каждой записи каталога. Подобная схема выливается в избыточный расход места на диске, так как длинные
имена имеют далеко не все файлы.
Альтернативный подход основывается на отказе от предположения о том, что все записи каталога должны иметь одинаковый размер.
В этом случае обычно запись начинается с порции фиксированного
размера (например, длины записи), за которой следуют данные в фиксированном формате (идентификатор владельца, дата создания и
т. п.). Следом идет часть переменной длины, содержащая имя файла.
Чтобы каждая запись могла начинаться с границы слова, имя каждого
файла дополняется до целого числа слов пустыми байтами. Недостаток данного метода заключается в том, что при удалении файла в каталоге остается промежуток переменной длины, в который другая запись может не поместиться (это аналогично проблеме фрагментации
непрерывных файлов на диске, хотя уплотнить каталог легче, чем
диск).
Еще один метод реализации состоит в том, чтобы сделать запись
каталога фиксированной длины и хранить в ней только указатель на
имя, а сами имена хранить отдельно в «куче» в конце каталога. В случае удаления файла оставшееся место точно подойдет под запись но-
68
вого файла, но проблема пробелов в «куче» останется и ее время от
времени придется «разгребать».
В некоторых ФС, например FAT-32, длинные имена поддерживаются путем их хранения в нескольких записях каталога, каждая из которых имеет фиксированный размер.
Ряд ФС организует каталог линейно, в этом случае при поиске записи просматриваются сверху вниз. Для больших каталогов это может
занять довольно много времени, поэтому некоторые ФС (например
NTFS) применяют построение хэш-таблиц и деревьев поиска.
69
Лекция 8. Примеры ФС
ФС CD-ROM (ISO 9660)
ФС для хранения данных на компакт-дисках являются самыми
простыми, так как создавались для носителей, запись на которые осуществляется только один раз. Кроме того, в этих ФС отсутствует учет
свободных блоков.
У CD-ROM нет концентрических цилиндров, как у магнитных
дисков. Вместо этого они содержат непрерывную спираль, на которой
последовательно размещены все биты (хотя перемещение поперек
спирали также возможно), разделенные на логические сектора по 2352
байта, полезная нагрузка которых составляет 2048 байт.
Каждый диск начинается с 16 блоков, функция которых не определена стандартом ISO (эта область может использоваться, например,
для размещения загрузчика ОС). Идущий следующим блок представляет собой основной дескриптор тома, содержащий общую информацию о диске: идентификатор системы (32 байта), идентификатор
тома (32 байта), идентификатор издателя (128 байт), идентификатор
компоновщика диска (128 байт). Эти поля могут быть заполнены произвольным образом, но содержат только символы верхнего регистра,
цифры и ограниченное множество знаков препинания. Кроме того, дескриптор содержит имена трех файлов, в которых могут храниться
краткий обзор, уведомление об авторских правах и библиографическая информация, а также некоторые характеристики диска: размер
логического блока (от 2048 и больше), количество блоков на диске,
дата создания и истечения годности диска, а также дескриптор корневого каталога (который позволяет найти его на диске).
Корневой и все вложенные каталоги могут иметь переменное количество записей, последняя из которых помечена специальным битом. Сами записи в каталоге имеют переменную длину и содержат от
10 до 12 полей, часть из которых представлена ASCII-строками, а
часть – двоичными полями. Двоичные поля кодируются дважды: один
раз в формате процессора Pentium (сначала младшие байты, затем
старшие), другой – в формате процессора SPARC (сначала старшие
байты, затем младшие).
Формат записи каталога представлен на рис. 8.1. Поскольку длина
записи переменная, то первое поле записи содержит ее длину. Записи
каталогов могут иметь расширенные атрибуты, и если они присут-
70
ствуют, то второе поле содержит длину записи расширенных атрибутов.
Байты
(продолжение)
11 8
8
7
1
2
4
1
4-15
4-15Расположе- Размер Дата и Флаги Чередо- CD# L Имя.расширение;
ние файла файла время
вание
версия
Длина записи
расширенных атрибутов
Длина записи каталога
(продолжение)
Заполнение
«SYS»
Рис. 8.1. Структура записи каталога файловой системы ISO 9660
Номер начального блока файла однозначно определяет размещение файла на диске, так как файлы хранятся на диске в виде последовательных непрерывных блоков.
Поле флагов содержит несколько управляющих битов, один из которых задает режим «скрытый» (запись не отображается в каталоге),
другой разрешает использование расширенных атрибутов, а третий
помечает последнюю запись в каталоге.
Поле CD # указывает расположение файла на дисках из набора.
Используется, например, при создании диска-оглавления.
Поле L содержит длину имени файла в байтах. Само имя состоит
из базового имени, точки, расширения и версии файла. В базовом
имени (до 8 символов) и расширении (до 3 символов) могут использоваться прописные символы, цифры от 0 до 9 и символ подчеркивания.
Имя файла может встречаться несколько раз, но с различными номерами версий.
Поле «заполнение» выравнивает размер записи каталога по двухбайтовой границе.
Функции и размер поля «SYS» стандартом не определяются, существует лишь то ограничение, что оно должно состоять из четного
числа байтов.
Все записи каталога, кроме первых двух, располагаются в алфавитном порядке. Первая запись представляет дескриптор самого каталога, вторая является ссылкой на родительский каталог. Количество
записей в каталоге не ограничено, но уровень вложенности каталогов
ограничен восемью уровнями.
Стандарт ISO определяет 3 уровня жесткости требований:
71
 уровень 1  характеризуется самыми жесткими ограничениями,
имена файлов ограничиваются схемой 8 + 3, имена каталогов – до
восьми символов без расширения, кроме того, файлы на диске
должны быть непрерывными;
 уровень 2  ослабляет ограничение на длину имени до 31 символа;
 уровень 3  ослабляет ограничение на длину имени до 31 символа,
кроме того, файл может состоять из нескольких разделов, каждый
из которых является непрерывной последовательностью блоков.
Одна и та же последовательность может несколько раз встречаться в одном файле или входить в разные файлы.
К стандарту ISO были предложены два дополнительных расширения, по-своему интерпретирующих значение неопределенного поля
«SYS»:
 Рок-Ридж было разработано для того, чтобы файловая система
UNIX могла быть записана на компакт-диск. Оно позволяет задавать
для файла POSIX-атрибуты (права доступа, ID пользователя, группы и
т. д.), символьные связи и альтернативные имена, записи специальных
файлов, а также устраняет ограничение на максимальную вложенность каталогов;
 Joliet было разработано Microsoft для того, чтобы на диск могла
записываться файловая система Windows. Основными нововведениями были:
1) длинные имена файлов;
2) поддержка в именах файлов набора символов Unicode;
3) глубина вложенности более восьми каталогов;
4) имена каталогов могут иметь расширения.
ФС CP/M
ФС использовалась для персональных компьютеров Intel 8080,
имеющих ОЗУ объемом 4 Кбайта и дисковод для дисков объемом 180
Кбайт. Принципы, заложенные в ФС CP/M, во многом были унаследованы ФС MS-DOS.
Система поддерживает всего один каталог, содержащий записи
фиксированного размера по 32 байта, в котором перечислены все
файлы ФС (размеры самого каталога могли различаться в разных версиях системы). При загрузке компьютера система считывает каталог и
рассчитывает битовый массив занятых и свободных блоков. Размер
блока на диске равен одному килобайту, поэтому массив занимает в
памяти 23 байта.
72
Каталог не хранится в памяти постоянно, а открывается для поиска
в нем записи файла при обработке системного вызова open. Формат
записи каталога представлен на рис. 8.2.
Байты
1
8
3
1
Код
Имя Расши- Экстент
пользователя файла рение
2
1
16
Счетчик Номера дискоблоков
вых блоков
Рис. 8.2. Формат записи каталога ФС CP/M
Поле кода пользователя указывает владельца файла (несмотря на
то что одновременно в системе может находиться только один пользователь, поочередно поддерживается работа нескольких). При поиске
имени файла ФС проверяет только те записи, которые принадлежат
текущему пользователю.
Размер имени – до 8 символов, расширение – до 3.
Счетчик блоков содержит размер файла в единицах по 128 байт,
так как размер физического сектора на диске равен 128 байт. Последний килобайтный блок файла может быть заполнен не до конца, поэтому способа определить точный размер файла нет (при необходимости его можно задать только с помощью пользовательского маркера).
Последние 16 полей содержат адреса логических блоков, занимаемых файлом (если размер блока – 1 Кбайт, то максимальный размер
файла – 16 Кбайт). Так как физические сектора диска имеют размер
128 байт, а размер логического блока – 1 Кбайт, то файлам выделяются фрагменты по 8 секторов.
Для преодоления ограничения в 16 Кбайт для хранения файлов
большего размера занимаются две (три и более) записи каталога: первая запись содержит номера первых 16 блоков файла, вторая – блоки
от 17 до 32, и т. д. Порядковый номер записи каталога хранится в поле
экстента (термин обозначает дополнительную запись), по значению
которого ФС может выстроить блоки в нужном порядке.
ФС MS-DOS
ФС MS-DOS представляет собой преемницу ФС CP/M: имена
файлов также ограничены схемой 8 + 3, первая версия MS-DOS также
имела только один каталог. Однако, начиная с MS-DOS 2.0, ФС была
значительно расширена, наиболее важным из улучшений был при
этом переход на иерархическую организацию системы каталогов. В то
же время из MS-DOS была изъята поддержка разных пользователей.
73
По этой причине любой вошедший в систему пользователь получал
доступ ко всем файлам.
При открытии файла с помощью системного вызова open (которому в качестве аргумента передается абсолютное или относительное
имя файла) ФС осуществляет пошаговый поиск в каталогах, являющихся компонентами пути, пока не обнаруживает дескриптор файла,
который необходимо открыть.
Ограниченным является только размер главного каталога, размер
же остальных – переменный, но записи используются одинакового
размера – 32 байта, их структура показана на рис. 8.3.
Байты
8
3
1
10
2
2
2
4
Имя Расши- Атри- Зарезер- Время Дата Номер пер- Размер
файла рение буты вировано
вого блока
Рис. 8.3. Формат записи каталога ФС MS-DOS
Имя файла выравнивается по левому краю пробелами.
Поле атрибутов содержит биты, указывающие, что для файла разрешено только чтение, он подлежит архивации и является системным
или скрытым.
В записи каталога хранится точный размер файла в байтах, под
поле размера отводится 4 байта, что позволяло бы поддерживать файлы размером до 4 Гбайт.
Нововведением в ФС MS-DOS по отношению к ФС CP/M является
то, что номера дисковых блоков хранятся не в записях каталога, а в
таблице размещения файлов, постоянно находящейся в ОЗУ (в записи
каталога хранится только номер первого блока файла).
Таблица размещения файлов имеет размер равный 65 535 элементам. Во всех модификация ФС MS-DOS размер дискового блока в
байтах может быть установлен кратным 512. FAT-16 поддерживает
блоки до 32 Кбайт, таким образом, максимальный размер дискового
раздела равен 32*64 Кбайта = 2Гбайта. Файловая система FAT-32 использует 28-разрядные (а не 32-разрядные адреса), что позволяет увеличить максимальный размер дискового раздела до 2 Тбайт, а для разделов меньшего размера использовать более мелкие блоки.
ФС MS-DOS использует FAT также для учета свободных блоков,
т. е. хранение информации о свободных блоках в виде битового мас-
74
сива или списка блоков не требуется. Недостатком является то, что
FAT должна постоянно находиться в памяти.
ФС WINDOWS 98
В ОС Windows 95 OSR2, а затем Windows 98 и Windows ME была
применена новая модификация ФС FAT-16, поддерживающая диски
большего размера и длинные имена файлов – FAT-32.
Поддержка длинных имен файлов могла быть обеспечена двумя
способами: изменением формата записи каталога (что выразилось бы
в несовместимости с предыдущими версиями ФС), разработкой специальной системы хранения и интерпретации длинных имен в прежних записях каталога. Для обеспечения совместимости в FAT-32 был
выбран второй вариант.
В записи каталога FAT-16 оставались незадействованными 10
байт, которые и были использованы в FAT-32 (рис. 8.4).
Байты
8
3
1
1 1
4
2
2
2Базовое Расши4
Атри- NT
Дата / время Дата послед- № 1-го
имя
рение буты
создания него доступа блока
4
2
4
Дата/время по- № 1-го Размер
(продолжение) следней записи блока файла
Старшие 16 бит
Младшие 16 бит
Рис. 8.4. Формат записи каталога FAT-32
Поле NT предназначено для совместимости с Windows NT и обеспечивает отображение имени файла в правильном регистре.
Поле «Дата/время создания» хранит дату создания файла с точностью до 10 мс.
Поле «Дата последнего доступа» хранит только дату (но не время)
последнего обращения к файлу.
Так как в FAT-32 используются 32-битные адреса дисковых блоков, то и номер начального блока теперь должен занимать не 2 байта,
а 4.
Для хранения длинных имен файлов предложен следующий способ: для каждого файла создается два имени, одно из которых совместимое со старой версией ФС, другое – длинное в формате Unicode.
Короткое имя образуется от длинного взятием первых 6 символов,
переводом их в верхний регистр, удалением пробелов и лишних точек,
75
заменой некоторых символов знаками подчеркивания и добавлением
суффиксов ~1, ~2 и т. д. Полученное имя хранится в дескрипторе каталога.
Если у файла есть также и длинное имя, то оно хранится в одной
или нескольких записях (по аналогии с экстентом в ФС CP/M), предшествующих дескриптору с коротким именем файла. Каждая запись в
таком случае имеет отличную структуру и может хранить до 13 двухбайтных символов Unicode (рис. 8.5).
Байты
1
10
1
1
1
12 2
4
№ последо- 5 сим- Атри- 0 Контроль- 6 сим- 0 2 симвательности волов буты
ная сумма волов
вола
Рис. 8.5. Формат записи каталога ФС FAT-32 с фрагментом длинного имени
Для отличия записей каталога с фрагментами длинного имени от
записи с коротким именем ФС применяет значение поля «Атрибуты»
0x0F, что соответствует невозможной комбинации атрибутов для дескриптора файла в ФС MS-DOS. Старые программы игнорируют подобные записи. Порядок следования фрагментов учитывается в первом байте, при этом последний фрагмент имеет порядковый номер,
увеличенный на 64. Поле контрольной суммы предназначено для обнаружения ошибок, которые могут возникнуть по причине того, что
старые версии программ повредят записи с длинными именами. Пример хранения длинного и короткого имен файла «One, one, one – little
dog run, Two, two, two – cat see you!.doc» в каталоге приведены на рис.
8.6 (пробелы отмечены с помощью знака подчеркивания).
69
4
3
2
1
O
see_y
o,_tw
_run,
_-_li
0x0F
0x0F
0x0F
0x0F
0
0
0
0
КС
КС
КС
КС
ou!.doc
o_-_ca
_Two,_
ttle_d
0
0
0
0
t_
tw
og
One,_
one,_o
ne
0x0F 0 КС
0
NEONE~1DOC ATR NT
CTime Date HI Date LO Размер
Рис. 8.6. Пример хранения длинного имени файла в FAT-32
Не считая поддержки разделов большего размера и длинных имен
файлов, реализация FAT-32 близка к FAT-16, однако вместо 65 535
76
элементов в таблице размещения файлов используется столько, сколько нужно, чтобы покрыть весь раздел диска. Для экономии памяти вся
FAT не хранится в памяти сразу, а используется окно, накладываемое
на таблицу.
ФС UNIX V7
ФС V7 применялась для ранних версий ОС UNIX. При этом ФС
представляет собой дерево, начинающееся с корневого каталога, в котором (по причине жестких связей) присутствуют циклы. Имена файлов могут быть длиной до 14 символов, включающих любые ASCIIсимволы, кроме косой черты и символа NUL (нулевого байта).
Каталоги содержат по одной записи для каждого файла, размер записи при этом фиксирован и составляет 16 байт (14 байт на имя файла, а 2 – на номер i-узла файла).
Описание файла (размер, временные штампы создания, доступа,
изменения, идентификаторы владельца и группы и т. д.) и номера дисковых блоков хранятся в i-узле. Если файл имеет большой размер, то
для хранения номеров его блоков используется косвенная адресация,
т. е. номера блоков файла хранятся в отдельном блоке на диске, а в iузле файла фиксируется ссылка на этот блок.
77
Лекция 9. Операционная система UNIX
ОС UNIX не является конкретной ОС, а обозначает целое семейство систем, обладающих достаточным количеством как сходств, так
и различий, но отслеживающих свое происхождение к общему предку. Среди стандартных систем UNIX наибольшее развитие получили
две различные и в чем-то несовместимые версии 4.3BSD и System V
Release 3 (SVR3), поэтому в дальнейшем особенности каждой из версий (при их наличии) будут обозначаться отдельно. В настоящее время значительной популярностью пользуется свободно распространяемая ОС Linux.
При изучении архитектуры UNIX мы будем рассматривать особенности выполнения задач ОС в том же порядке, как это было описано в предыдущих лекциях:
 структура ОС и процесс загрузки;
 организация процессов и потоков, работа планировщика;
 управление памятью;
 ввод-вывод в ОС;
 организация ФС.
Интерфейсы UNIX
ИВС на основе ОС UNIX можно рассматривать в виде пирамиды
(рис. 9.1).
Интерфейс пользователя
Пользователи
Стандартные обслуживающие про- Библиотечные
функции
граммы (оболочка, компиляторы и т. д.)
Стандартная библиотека (open, close, read,
write, fork)
Системные
вызовы
ОС UNIX (управление процессами, памятью, файловая система, ввод-вывод и т. д.)
Режим
пользователя
Режим
ядра
Аппаратное обеспечение (центральный процессор, память,
диски, терминалы и т. д.)
Рис. 9.1. Структура ИВС на основе ОС UNIX
ОС работает на «голой» аппаратуре, и ее функция заключается в
управлении АО и предоставлении всем программам интерфейса системных вызовов.
78
Программы обращаются к системным вызовам, помещая аргументы в регистры процессора (или в стек) и выполняя команду эмулированного прерывания. Так как на Си (системный язык ОС UNIX) невозможно написать команду эмулированного прерывания, то этим занимаются библиотечные функции, по одной на системный вызов. Следует заметить, что стандарт POSIX определяет интерфейс именно
библиотечных функций, а не системных вызовов.
Помимо ОС и стандартных библиотек, все версии UNIX содержат
большое количество стандартных программ. Именно эти программы и
организуют интерфейс с пользователем.
Таким образом, можно говорить о трех интерфейсах UNIX: системных вызовов, библиотечных функций и пользовательском интерфейсе, образованном набором стандартных программ.
Несмотря на то, что у многих версий UNIX имеется графический
интерфейс, «родной» для любой системы является интерфейс командной строки, называемый оболочкой. Вся функциональность оболочки
заключается в том, что, будучи запущенной, она печатает на экране
символ приглашения к вводу и ждет, когда пользователь введет командную строку. При получении строки, оболочка извлекает из нее
первое слово, ищет файл с таким именем, и, если это удается, запускает его. Сама она при этом приостанавливается в ожидании завершения
запущенной программы, после чего снова печатает приглашение и
ждет ввода следующей строки.
При работе программы типа оболочки получают доступ к трем
стандартным потокам: потоку ввода, потоку вывода и потоку ошибок.
По умолчанию всем трем потокам соответствует терминал (клавиатура для ввода и экран для вывода). Тем не менее стандартный ввод и
вывод можно перенаправить с использованием символов < (перенаправление ввода) и > (перенаправление вывода). С помощью перенаправления можно создавать фильтры – программы, считывающие
данные со стандартного ввода, выполняющие определенную обработку этих данных и записывающие результат в поток стандартного вывода.
Ряд программ в UNIX может быть также объединен в конвейер с
помощью символа канала |, при этом поток вывода программы, записанной до черты, является потоком ввода программы, записанной после нее.
Список команд оболочки может быть также помещен в файл, после чего можно запустить на выполнение оболочку с этим файлом в
79
качестве входного аргумента. Такие файлы называются сценариями
оболочки.
Структура ядра UNIX
Обзор структуры ядра системы UNIX представляет довольно непростое дело, так как существует множество различных версий этой
системы. Структура ядра UNIX 4.4BSD применима также с небольшими изменениями в тех или иных местах и ко многим другим версиям, по этой причине ее можно рассмотреть в качестве типового варианта:
Аппаратные и эмулированные
прерывания
Управление тер- Сокеты Именова- Отображе- Страничные
миналом
ние файла ние адресов прерывания Обра- Создание
ботка и заверОбрабо- Сетевые
сигна- шение
Необра- танный прото- Файловые
Виртуальная
лов процессов
ботан- терми- колы системы
память
ный
нал
терми- Дисцинал
плины Перена- Буферный
Страничный
Планирование
Системные вызовы
линии правлесвязи
ние
Символьные
устройства
Драйверы сетевых
устройс
тв
кэш
кэш
Драйверы
дисковых устройств
процессов
Диспетчеризация
процессов
Аппаратура
Большинство UNIX-систем структурированы как ОС на основе
многоуровневого ядра, хотя существуют и некоторые разновидности
на основе микроядра (например Mach).
Нижний уровень ядра состоит из драйверов устройств и низкоуровневой процедуры диспетчеризации процессов, написанной на ассемблере отдельно от процедуры планирования. Драйверы устройств
делятся на два класса: символьных устройств и блочных устройств.
Символьные устройства используются либо напрямую (данные от
них поступают в виде потока байтов без обработки), либо в обработанном виде.
Сетевое ПО часто бывает модульным, с поддержкой множества
различных устройств и протоколов. Уровень выше сетевых драйверов
80
осуществляет перенаправление пакетов между устройствами и протоколами. Над уровнем перенаправления находится стек протоколов,
обязательно включая IP и TCP/IP. Над сетевыми протоколами располагается интерфейс сокетов, необходимый для программирования сетевых приложений.
Над дисковыми драйверами располагаются буферный и страничный кэши файловой системы. Они объединены не случайно, так как
механизм кэширования функционирует одинаково как при обращении
к блокам файлов, так и при обращении к страницам памяти.
Большинство UNIX-систем поддерживает несколько ФС, и все они
совместно используют общий буферный кэш. Управление именованием файлов, каталогами, жесткими и символьными связями находится
выше уровня файловых систем, поскольку все эти механизмы должны
быть общими для всех ФС.
Над страничным кэшем располагается система виртуальной памяти, в которой сосредоточена вся логика обработки страниц (например,
алгоритм замещения страниц). Поверх нее размещаются программа
отображения файлов на виртуальную память и программа управления
страничными прерываниями (решающая, что делать при возникновении страничного прерывания).
Планировщик выбирает процесс, который должен быть запущен
следующим с использованием механизма, реализованного на нижнем
уровне диспетчеризации. Выше планировщика находятся программа
отправки и обработки сигналов, а также программа создания и уничтожения потоков.
Верхний уровень представляет интерфейс системы и состоит из
интерфейса системных вызовов и точки входа для аппаратных и эмулированных прерываний (сигналы, страничные прерывания, исключительные ситуации, прерывания ввода-вывода и т. п.).
Загрузка UNIX
При загрузке ОС UNIX последовательно выполняются следующие
этапы:
1) 512-байтовая программа, находящаяся в MBR диска, загружает
автономную программу boot;
2) boot копирует саму себя в фиксированный адрес памяти в старших адресах, освобождая нижнее пространство для ОС;
3) boot считывает корневой каталог с загрузочного устройства (для
этого она должна понимать формат ОС);
4) boot считывает ядро ОС и передает ему управление;
81
5) начальная программа ядра написана на ассемблере, она устанавливает указатель стека, определяет тип процессора, количество
ОЗУ, запрещает прерывания, разрешает работу диспетчера памяти и
вызывает процедуру main для выполнения основной части ОС;
6) main выделяет память под буфер сообщений (в который записываются сообщения о загрузке системы) и структуры данных ядра;
7) main начинает определять конфигурацию компьютера по файлам конфигурации, проверяет, какие устройства существуют (из указанных), найденные устройства добавляются в таблицу подключенных;
8) main загружает драйверы (в зависимости от разновидности ОС
они могут быть либо скомпилированными с ядром – 4.4 BSD, либо загружаться динамически – Linux);
9) main создает нулевой процесс и устанавливает его стек. Процесс
затем продолжает инициализацию, программируя таймер, монтируя
ФС, а также порождает процессы с идентификаторами 1 (init) и 2
(страничный демон);
10) init проверяет флаги и в зависимости от этого запускает ОС либо в однопользовательском, либо в многопользовательском режиме. В
первом случае он создает процесс, выполняющий оболочку, и ждет,
когда тот завершит работу. Во втором случае init создает процесс, исполняющий сценарии оболочки инициализации системы /etc/rc
(/etc/init), который может осуществлять проверку ФС, монтировать
дополнительные ФС, запускать демонов и т. п. Затем он считывает
файл /etc/ttys, в котором перечисляются терминалы и их свойства. Для
каждого терминала он создает копию самого себя, которая затем исполняет программу getty;
11) getty устанавливает для каждой линии скорость линии, после
чего выводит приглашение к входу в систему;
12) когда пользователь ввел имя, getty запускает программу
/bin/login, которая запрашивает у пользователя пароль, шифрует его,
сравнивает с имеющимися в системе в /etc/passwd;
13) если имя верное, то login запускает указанную для пользователя
оболочку, иначе ещё раз спрашивает имя пользователя.
Следует заметить, что в современных системах присутствует несколько сценариев оболочки /etc/rcX, каждый из которых используется по умолчанию для своих целей:
 rc0 – действия при остановке системы;
 rc1 – работа в однопользовательском режиме;
82
 rc2 – многопользовательский режим, без поддержки сетевых
файловых систем (если сеть отсутствует, то аналогичен 3-му сценарию);
 rc3 – полный многопользовательский режим;
 rc5 – работа с оконным интерфейсом X Windows;
 rc6 – перезагрузка системы.
Организация процессов и потоков
Единственными активными сущностями в ОС UNIX являются
процессы. При этом в классических системах процессы могли содержать единственную последовательность команд (понятие потока отсутствовало).
Появление в системе нового процесса возможно единственным
способом – с помощью системного вызова fork, при этом создается
новый процесс, являющийся точной копией исходного (исходный
процесс становится родительским, а новый – дочерним). Единственным отличием между процессами является то, что для родительского
процесса fork вернет PID его потомка, а для дочернего – нуль. После
завершения работы дочернего процесса его proc-структура не уничтожается. В ней сохраняется информация об использовании ресурсов
дочерним процессом, а также о статусе его завершения. Для блокировки в ожидании завершения дочернего процесса применяется библиотечная процедура waitpid.
Завершение процесса (добровольное) осуществляется с помощью
системного вызова exit. Если дочерний процесс завершил свою работу, а родительский не ожидает этого события, то он переходит в состояние зомби, т. е. не работая, продолжает занимать место в таблице
процессов. Его предком при этом назначается процесс init.
Для взаимодействия друг с другом процессы могут пользоваться
каналами (в которых один процесс пишет поток байтов, а второй – читает из него) или сигналами (процесс может посылать сигналы только
членам его группы процессов).
Для замены контекста выполнения одного приложения на другое в
рамках неизменного процесса предназначен системный вызов exec.
Ядро поддерживает две ключевые структуры данных, относящиеся
к процессам: таблицу процессов и структуру пользователя. Таблица
процессов содержит информацию, необходимую для всех процессов
(даже для тех, которых на данный момент нет в памяти), поэтому она
является резидентной и постоянно находится в памяти. Структура
83
пользователя выгружается на диск, освобождая место в памяти, когда
относящийся к ней процесс вытесняется на диск.
Единичной записью таблицы процессов является proc-запись
(proc-область), содержащая ряд категорий информации.
1. Параметры планирования: приоритет процесса, потребленное
процессорное время, количество времени в режиме ожидания, фактор
«любезности».
2. Образ памяти: указатели на сегменты кода, данных и стека, а
также, если используется страничная организация памяти, указатели
на соответствующие таблицы страниц. Если процесса нет в памяти, то
здесь также содержится информация о том, как найти части процесса
на диске.
3. Сигналы: маски, указывающие, какие сигналы игнорируются,
какие перехватываются, какие временно заблокированы, какие находятся в процессе доставки.
4. Прочее: состояние процесса, события, которые ожидает процесс,
время до истечения интервала будильника, PID процесса и его родителя, идентификаторы пользователя и группы.
Пользовательская область (структура пользователя) состоит из
информации, которая требуется только тогда, когда процесс активен и
выполняется. Область включает следующие данные:
1. машинные регистры;
2. состояние системного вызова (параметры и результаты);
3. таблицу дескрипторов открытых файлов (содержит ссылки на
записи общей таблицы открытых файлов в ядре);
4. учетную информацию (информация об использовании процессорного времени в пользовательском и привилегированном режимах);
5. стек ядра (используется при обработке системных вызовов);
6. таблицу потоков процесса (если в данной реализации ОС потоки
поддерживаются на уровне пользовательских библиотек).
Планирование процессов в UNIX
Основой планирования в UNIX-системах являются аппаратные
прерывания от таймера, на основании которых происходит выделение
процессорного времени процессам, а также вытеснение процесса с
процессора. Продолжительность тика таймера обычно составляет 10
мс.
В большинстве систем введено понятие основного тика, который
равен n тикам таймера. Ряд задач выполняется только на основном ти84
ке (например, перерасчет приоритетов, обработка сигналов тревоги,
возобновление работы системных процессов).
Приоритеты процессов могут находиться в диапазоне от 0 до 127
(меньшему значению соответствует более высокий приоритет), из которого значения от 0 до 49 зарезервированы для ядра (табл. 9.1), а область от 50 до 127 выделена прикладным процессам. В отличие от
пользовательских приоритетов, приоритеты ядра являются статическими, т. е. не изменяются со временем. Процесс получает приоритет
ядра в том случае, если при выполнении системного вызова в ядре он
был заблокирован до его завершения, отчего приоритеты ядра называют также приоритетами сна.
Таблица 9.1: Приоритеты ядра
Приоритет
Значение
Описание
PSWP
0
Свопинг
PSWP+1
1
Страничный демон
PSWP+1/2/4 1/2/4
Другие действия по обработке памяти
PINOD
10
Ожидание освобождения inode
PRIBIO
20
Ожидание дискового ввода-вывода
PRIBIO+1
21
Ожидание освобождения буфера
PZERO
25
Базовый приоритет
TTIPRI
28
Ожидание ввода с терминала
TTOPRI
29
Ожидание вывода на терминал
Один раз в секунду планировщик производит перерасчет приоритетов для всех процессов по следующей формуле:
Ppri  Puser  2  Nice 
TCPU
,
4
где nice – является фактором «любезности» и может находиться в
пределах от 0 до 39, со значением по умолчанию 20. Все значения,
превосходящие 20, приводят к понижении приоритета; те, что менее
20,  к его увеличению (повышать приоритет процесса может только
суперпользователь).
Активный процесс каждый тик таймера увеличивает на одну единицу значение времени использования процессора (TCPU). На каждый
четвертый тик таймера приоритет текущего процесса пересчитывается.
Каждую секунду также происходит уменьшение статистики использования процессора процессами исходя из значения фактора полураспада K: TCPU = TCPU  K. Для UNIX SVR3 K=0,5, для 4.3 BSD
K= (2load_average)/(2load_average + 1), где load_average – среднее
85
количество процессов, находящихся в состоянии готовности к исполнению, за последнюю секунду. Фактор полураспада обеспечивает
экспоненциально взвешенное среднее значение использования процессора в течение всего периода функционирования процесса. Формула SVR3, учитывающая простое экспоненциальное среднее, имеет
побочный эффект, заключающийся в росте приоритетов при увеличении загрузки системы. Рост происходит из-за того, что на сильно загруженной системе каждый процесс получает меньшее время. При
этом величина использования процессора остается низкой, поэтому
фактор полураспада со временем еще дополнительно ее сокращает. В
результате использование процессора не сильно влияет на приоритеты, и процессы, начавшие работу с более низкими приоритетами, простаивают в ожидании процессора непропорционально. В BSD фактор
полураспада зависит от загруженности системы. Если загрузка велика,
то и фактор увеличивается. Следовательно, для процессов, получающих процессорное время, снижение приоритетов будет происходить
быстро.
Планировщик содержит массив из 32 очередей выполнения. Каждая очередь соответствует четырем соседним приоритетам и содержит
указатель на голову двунаправленного связанного списка структур
proc. В глобальной переменной – флаге whichqs хранится битовая
маска тех очередей, которые содержат готовые к выполнению процессы (для каждой очереди отведен один бит).
Процесс с самым высоким приоритетом запускается всегда, если
только текущий процесс не находится в режиме ядра (так как ядро невытесняемое). Квант времени, равный 10 тикам таймера, принимается
в рассмотрение только при планировании тех процессов, которые
находятся в одной очереди выполнения. По истечении кванта времени
ядро циклическим сдвигом переставляет процессы в одной и той же
очереди. Если в состоянии готовности окажутся процессы с более высоким приоритетом, они будут запущены без ожидания. Когда в состоянии готовности находятся процессы только из очередей с более
низким приоритетом, то процесс продолжит выполнение даже после
истечения выделенного ему кванта времени.
Переключение контекстов процессов возникает если:
 текущий процесс блокируется в ожидании ресурса или завершает работу;
86
 в результате перерасчета приоритетов оказалось, что другой
процесс обладает более высоким приоритетом по отношению к текущему;
 текущий процесс или обработчик прерываний разбудил более
приоритетный процесс.
К ограничениям традиционного планировщика можно отнести
следующие особенности:
 не слишком хорошо масштабируется (если общее количество
процессов велико, он неэффективно пересчитывает приоритеты каждую секунду);
 не существует способов гарантированного предоставления части процессорного времени как ресурса определенной группе процессов или конкретному процессу;
 не существует никакого гарантированного времени реакции
приложений, имеющих свойства реального времени, так как ядро невытесняющее;
 приложения имеют скудные возможности для управления собственным приоритетом, механизм, работающий через значение «любезности», является слишком примитивным и не отвечающим поставленным требованиям;
 поскольку ядро является невытесняющим, высокоприоритетные
готовые к выполнению процессы могут находиться в ожидании в течение довольно значительного интервала времени. Такое свойство
называется инверсией приоритетов.
Управление памятью
Управление памятью в UNIX-системах изначально осуществлялось на основе сегментов, но в современных ОС присутствует еще и
страничная адресация. Каждый процесс имеет свое адресное пространство, состоящее из трех сегментов: текста (кода программы),
данных и стека.
Сегмент текста обычно разрешен только для чтения, по причине
этого большинством систем поддерживается совместное использование сегментов текста (если одновременно одним или несколькими
пользователями запущено более одной копии программы).
Сегмент данных состоит из двух частей: инициализированных
данных (для них резервируется место в памяти, в которое загружаются из файла сформированные компилятором данные) и неинициализированных (так как по умолчанию не инициализированные переменные
равны 0, то хранить эту область в исполняемом файле нет смысла,
87
хранится только ее размер, а место в памяти выделяется и заполняется
нулями непосредственно при запуске программы) данных. В отличие
от сегмента текста, сегмент данных может изменять свой размер в ходе работы программы.
Сегмент стека в большинстве систем начинается от старших адресов ВАП и растет вниз. Если указатель стека становится ниже границы сегмента, то происходит страничное прерывание, и ОС понижает
границу сегмента стека на одну страницу.
Изначально в UNIX-системах применялась поддержка виртуальной памяти на основе перемещения процессов между памятью и диском (свопинг). Выгрузка процессов инициировалась в следующих
случаях:
 cистемному вызову fork не хватало памяти для дублирования
адресного пространства родителя;
 происходило обращение к системному вызову brk для увеличения размера сегмента данных;
 возникало страничное прерывание при заполнении сегмента
стека;
 необходимо было загрузить вытесненный ранее на диск процесс, а свободное место в памяти отсутствовало.
При поиске процесса, подлежащего выгрузке, сначала анализировались заблокированные процессы (ожидающие наступления какоголибо события) и из них выбирался тот, у которого было максимальное
значение (приоритет + время нахождения в памяти). Если заблокированные процессы отсутствовали, то на основании того же критерия
выбирался один из готовых к выполнению. Один раз в несколько секунд исследовался список выгруженных процессов на предмет наличия процессов, находящихся в состоянии готовности к выполнению.
Из них выбирался тот, который дольше всех находился на диске. Процесс повторялся до тех пор, пока: (1) на диске не оставалось процессов, готовых к работе, (2) в памяти не оставалось места для новых
процессов. Чтобы избежать слишком частого перемещения процессов
из памяти на диск и обратно, процессы не выгружались на диск, если
их время пребывания в памяти было менее 2 с.
В большинстве современных UNIX-систем в дополнение к классической схеме перемещения процессов между диском и памятью добавилась подкачка страниц по запросу (это стало возможным при страничной организации ВАП). При страничной адресации для функционирования процесса в памяти необходимо иметь минимум – пользова88
тельскую область и таблицу страниц, остальное содержание адресного
пространства процесса может подгружаться постранично по запросу.
Перемещением процессов между диском и памятью (т. е. перемещением пользовательской области и таблицы страниц на диск и обратно)
занимается процесс свопинга, называемый также свопером (процесс
0). Подкачка страниц процессов, присутствующих в памяти, осуществляется страничным демоном (процесс 2).
Страничный демон просыпается каждые 250 мс, сравнивает количество страниц с заданным пороговым значением (так реализован
страничный демон в 4.4 BSD), если в системе обнаружена нехватка
страниц, то он начинает вытеснять их на диск (без учета принадлежности страниц процессам, т. е. применяется глобальная стратегия).
Отличием в реализации SV является то, что вместо одного порогового
значения используется пара (min, max). Как только количество свободных страниц становится меньше min, страничный демон начинает
освобождать страницы, пока их количество не сравняется с max.
При вытеснении используется алгоритм часов: в случае BSD с
двумя стрелками (угол между которыми определяет чуткость демона
по отношению к используемым страницам), в случае SV – стрелка одна, но выгружаются только те страницы, которые были помечены несколькими последовательными проходами.
Если подкачка происходит слишком часто, то свопер попытается
выгрузить несколько процессов на диск, уменьшив тем самым загруженность памяти. Изначально он пытается найти процессы, которые
бездействовали 20 или более секунд, и если это удается, то среди них
выбирается один с максимальным сроком бездействия. Если таких
процессов не найдено, то изучаются четыре самых больших, из них
берется самый старый. Параллельно с этим каждые несколько секунд
свопер изучает процессы, выгруженные на диск. Каждому выгруженному процессу присваивается значение, зависящее от его времени
пребывания в выгруженном состоянии, размера, фактора любезности,
а также от того, как долго процесс спал перед выгрузкой. При необходимости свопер загружает в память пользовательскую область и таблицу страниц, а остальные страницы загружаются подкачкой. При
этом для областей данных и стека образ страницы присутствует в виртуальной памяти на диске, а страницы сегмента текста загружаются из
выполняемого файла.
89
Организация ввода-вывода
Ввод-вывод в UNIX-системах осуществляется посредством специальных файлов (блочных и символьных), представляющих собой
внешние устройства. Специальный файл отсутствует в файловой системе как таковой, вместо этого его i-узел содержит старший и младший номера устройства, первый из которых идентифицирует драйверобработчик устройства, а второй – само устройство среди однотипных.
Работа с сетью осуществляется посредством сокетов, или гнезд.
Сокет однозначно идентифицируется комбинацией IP-адреса компьютера и номера порта сетевого взаимодействия (до 65 535). Существуют несколько типов сокетов, каждый из которых предназначен для
выполнения работ определенного типа:
 надежный, ориентированный на соединение поток байтов;
 надежный, ориентированный на соединение поток пакетов;
 ненадежный, не ориентированный на соединение поток пакетов.
Организация ФС
UNIX-системы характеризуются разнообразием поддерживаемых
ФС, начиная с V7 до сетевой файловой системы NFS.
Реализация классической ФС V7 уже была описана в лекции 8
«Примеры ФС», поэтому рассмотрение других ФС проще проводить с
помощью сравнения, взяв модель V7 за основу.
ФС Berkley Fast
Для этой системы характерны следующие особенности:
1) По сравнению с V7 имена файлов были увеличены до 255 символов. Структура каталогов была реорганизована, записи каталога имеют различные размеры и не отсортированы внутри него. Каждая запись содержит четыре фиксированных поля (номер i-узла, размер записи каталога в байтах, поле типа – файл или каталог, длина имени
файла) и поле переменной длины (имя файла, заканчивающееся нулевым байтом и дополненное до 32-битной границы);
2) поскольку поиск файла в каталоге может занять много времени,
то при анализе имен файлов ФС применяет кэширование;
3) для увеличения скорости работы диск разбит на группы цилиндров, каждая из которых имеет свой суперблок, узлы и сектора. По
мере возможности блоки для файла выделяются в той же группе, где
содержится его i-узел;
90
4) используются логические блоки не одного, а двух размеров.
При хранении файлов большого размера проще хранить данные в секторах большого размера, а при работе с малыми файлами снижение
перерасхода дискового пространства за счет неполного использования
сектора небольшим файлом достигается путем применения блоков
малого размера. Поддержка обоих вариантов достигается ценой значительной дополнительной сложности ОС.
ФС Linux Ext2 основывалась на ФС ОС MINIX, совместимой с
V7, поэтому допускалась длина файлов до 14 символов, а размер файла был ограничен 64 Мбайт.
В ФС Ext длина имени была увеличена до 255 символов, а размер
файла до 2 Гбайт, но полученная система оказалась медленнее, чем
оригинал, поэтому исследования продолжились, и результатом их
явилась ФС Ext2.
Ext2 имеет сходства с Berkley Fast, но с некоторыми отличиями.
Так как современные диски предлагают виртуальную геометрию, ФС
Ext2 делит диск на фрагменты не по цилиндрам, а просто по номерам
блоков. Каждая группа имеет собственный суперблок (указывающий,
сколько блоков и узлов в группе, размер группы блоков), описатель
группы (задает расположение битовых массивов, количество свободных блоков и узлов в группе, количество каталогов). ФС Ext2 пытается распределить каталоги равномерно по диску.
Размер каждого битового массива – один блок. Если размер блока
1 Кбайт, то в группе максимум – 8 192 блока и 8 192 узла. Размер
каждого узла – 128 байт. Вместо десяти прямых и трех косвенных адресов в ФС Ext2 используется двенадцать прямых и три косвенных.
Длина адресов дисковых блоков составляет 4 байта.
ФС NFS
NFS представляет собой сетевую файловую систему, в которой
каждая машина может быть клиентом и сервером. Сервер экспортирует один или несколько подкаталогов своих локальных ФС в сеть, а
клиенты затем могут смонтировать удаленные каталоги в свои локальные ФС. Для этого в ФС предусмотрены два протокола.
Протокол монтирования каталогов: клиент обращается к серверу, указывает сетевой путь к каталогу, сервер проверяет, экспортирован ли он, и если все проверки выполнены успешно, то возвращает
дескриптор файла, содержащий поля с типом ФС, диск, узел каталога,
информацию о правах доступа.
91
Протокол доступа к файлам. Данный протокол обеспечивает работу с удаленными файлами после того, как часть ФС удаленного
компьютера была смонтирована в качестве локальной. Вызовы open и
close не поддерживаются, вместо этого есть lookup, который возвращает дескриптор файла. После этого каждое сообщение read и write
является самодостаточным. Отслеживание состояния записи / чтения
файла должно производиться на стороне клиента, серверы не хранят
информации о клиентах, т. е. являются серверами без состояний.
Реализуется NFS чаще всего в виде трех уровней (рис. 9.2).
Ядро клиента
Ядро сервера
Уровень системных вызовов
v-узел
Уровень VFS
Локаль- Локальная ФС1 ная ФС2
Уровень VFS
Клиент
NFS
Клиент
NFS
Буферный кэш
Буферный кэш
Драйвер Драйвер
1
2
Локальный
диск 1
Локальный
диск 2
Локаль- Локальная ФС1 ная ФС2
Сообщение
от клиента
Сообщение
серверу
Драйвер Драйвер
1
2
Локальный
диск 1
Локальный
диск 2
Рис. 9.2. Структура уровней NFS
Верхний уровень представляет собой уровень системных вызовов.
Задачей уровня VFS является поддержание таблицы виртуальных
узлов (v-узел), используемых для различения локальных и удаленных
файлов. Уровень VFS взаимодействует с рядом локальных файлсерверов (разных систем) и клиентом NFS. Для удаленных файлов
предоставляется информация, достаточная для доступа к ним. Для локальных – сведения о ФС и i-узле. Для удаленных узлов клиент NFS
создает r-узлы (удаленные узлы) для хранения дескрипторов файлов.
V-узлы указывают на r-узлы для удаленных файлов и на i-узлы для
локальных.
92
Список используемых сокращений
ОС – операционная система
ФС – файловая система
ИВС – информационно-вычислительная система
ПО – программное обеспечение
АО – аппаратное обеспечение
UI – интерфейс пользователя
GUI – графический интерфейс пользователя
ОЗУ – оперативное запоминающее устройство
ПЗУ – постоянное запоминающее устройство
ВАП – виртуальное адресное пространство
ВП – виртуальная память
93
Содержание
Лекция 1. Введение в сетевые ОС ............................................................. 3
Лекция 2. Структура ОС ........................................................................... 10
Лекция 3. Процессы и потоки в ОС......................................................... 20
Лекция 4. Управление памятью в ОС ..................................................... 31
Лекция 5. Организация виртуальной памяти в ОС ................................ 38
Лекция 6. Организация ввода-вывода в ОС ........................................... 49
Лекция 7. Файловые системы ОС ............................................................ 60
Лекция 8. Примеры ФС ............................................................................ 70
Лекция 9. Операционная система UNIX ................................................. 78
94
Download