Text
                    ГЛАВА
Обзор
компьютерных
систем
1.1. Основные элементы
1.2. Регистры процессора
1.3. Исполнение команд
1.4. Прерывания
1.5. Иерархия запоминающих устройств
1.6. Кэш
1.7. Технологии ввода-вывода
1.8. Рекомендуемая литература
1.9. Задачи
Приложение А. Характеристики производительности
двухуровневой памяти
Приложение Б. Управление процедурами
1


Операционная система обслуживает пользователей, обращаясь при этом к ресурсам аппаратного обеспечения, в состав которых входит один или несколько процессоров. Кроме того, она управляет вторичной памятью и устройствами ввода-вывода. Поэтому прежде чем приступить к исследованию операционных систем, важно получить некоторое представление о компьютерных системах, на которых они работают. В данной главе представлен обзор аппаратного обеспечения компьютерных систем. Большинство вопросов освещено кратко, так как предполагается, что читатель знаком с предметом. Однако некоторые из них раскрыты более подробно, исходя из важности этих тем для дальнейшего усвоения материала. (ШХХЖОВНЫЕ ЭЛЕМЕНТЫ «af/./ ". '^Щ На макроуровне компьютер состоит из процессора, памяти и устройств ввода-вывода; при этом каждый компонент представлен одним или несколькими модулями. Чтобы компьютер мог выполнять свое основное предназначение, состоящее в выполнении программ, различные компоненты должны иметь возможность взаимодействовать между собой. Можно выделить четыре структурных компонента компьютера. • Процессор. Осуществляет контроль за действиями компьютера, а также выполняет функцию обработки данных. Если в системе есть только один процессор, он часто называется центральным процессором (central processing unit — CPU). • Основная память. Здесь хранятся данные и программы. Как правило, эта память является временной. Часто ее называют реальной, оперативной или первичной памятью. • Устройства ввода-вывода. Служат для передачи данных между компьютером и внешним окружением, состоящим из различных периферийных устройств, в число которых входят вторичная память, коммуникационное оборудование и терминалы. • Системная шина. Определенные структуры и механизмы, обеспечивающие взаимодействие между процессором, основной памятью и устройствами ввода-вывода. Упомянутые компоненты показаны на рис. 1.1. Одной из функций процессора является обмен данными с памятью. Для этого он обычно использует два внутренних (по отношению к процессору) регистра: регистр адреса памяти (memory address register — MAR), куда заносится адрес ячейки памяти, в которой будет производиться операция чтения-записи, и регистр буфера памяти (memory buffer register — MBR), куда заносятся данные, предназначенные для записи в память, или те, которые были прочитаны из нее. Ана- югично, номер устройства ввода-вывода задается в регистре адреса ввода- швода (I/O address register — I/O AR). Регистр буфера ввода-вывода (I/O )uffer register — I/O BR) служит для обмена данными между устройством (вода-вывода и процессором. 4 Часть 1. Основные понятия <щ ■а * 'Ы я И / ь.\-- Ль, л ■ и, \*s ь- а" ' I,- CPU ..I PC £ IR ХИсполняющий/ \ модуль 1 . - MAR * л MBR l/OAR I/O BR Основная память Контроллер ввода-вывода -* tl*1 г • Буфера ■"'= Системная шина • • • Команда Команда Команда • • Данные Данные Данные Данные * V ш 0 1 2 • # п-2 п-1 PC — программный счетчик IR — регистр команд MAR — регистр адреса памяти MBR — регистр буфера памяти I/O AR — регистр адреса ввода-вывода I/O BR— регистр буфера ввода-вывода Рис. 1.1. Компоненты компьютера: общая структура Модуль памяти состоит из множества пронумерованных ячеек. В каждую ячейку может быть записано двоичное число, которое интерпретируется либо к ' команда, либо как данные. Модуль ввода-вывода служит для передачи дан- от внешних устройств как в процессор и память, так и в обратном направ- .Шцрт. Для временного хранения данных в нем есть свои внутренние буферы. 1 Ш РЕГИСТРЫ ПРОЦЕССОРА ££2ШТ .1*1-4- В процессоре имеется набор регистров, представляющих собой область па- V/i быстрого доступа, но намного меньшей емкости, чем основная память. гистры процессора выполняют две функции. % , Регистры, доступные пользователю. Эти регистры позволяют программисту со- f;l кратить число обращений к основной памяти, оптимизируя использование регистров с помощью машинного языка или ассемблера. В состав языков высокого уровня входят оптимизирующие компиляторы, построенные на алгоритмах, которые, в частности, позволяют определить, какие переменные следует заносить в регистры, а какие — в основную память. Некоторые языки высокого %$ .уровня, такие, как С, предоставляют программисту возможность предложить X компилятору хранить те или иные данные в регистрах. '* Регистры управления и регистры состояния. Используются в процессоре 1: Для контроля над выполняемыми операциями; с их помощью привилегиро- ■ё\- два 1. Обзор компьютерных систем 35
ванные программы операционной системы могут контролировать ход выполнения других программ. Для разделения регистров на эти две категории не существует определенно- признака. Например, на некоторых машинах оператор имеет возможность одеть за состоянием программного счетчика, а на других — нет. Однако такое целение удобно при дальнейшем рассмотрении. тистры, доступные пользователю К доступным регистрам пользователь может обращаться с помощью команд шинного языка. К этим регистрам, как правило, имеют доступ все программ i — как приложения, так и системные. Обычно среди доступных регистров гъ регистры данных, адресные регистры и регистры кода условия. Регистры данных. Программист может применять их в различных целях. В 1де случаев они имеют общее назначение и могут использоваться любой ма-* инной командой для операций с данными. Однако зачастую при этом накла» лваются определенные ограничения. Например, некоторые регистры предна- 1ачены для операций над числами с плавающей точкой, в то время как осталь- ые — для хранения целых чисел. Адресные регистры. В них заносятся адреса команд и данных в основно амяти; в этих регистрах может быть записана только часть адреса, использую * даяся при вычислении полного или эффективного адреса. Рассмотрим следую цие примеры. • Индексный регистр. Используется в обычном режиме адресации, когда адрес получается в результате сложения содержимого индексного и базового регистра. v • Сегментный регистр. При сегментной адресации память разделяется на бло (сегменты), состоящие из различного количества машинных слов. Адрес ячейки памяти складывается из адреса сегмента и смещения относительно начала се - мента. Имея представление о таком режиме адресации, легче будет усвоить материал, изложенный в главе 7, "Управление памятью", в которой обсуждаются методы управления памятью. При этом режиме адресации базовый адрес сег мента (его начало) хранится в одном из регистров. Таких регистров может бы несколько; например, один — для операционной системы (т.е. использующий при выполнении процессором кода операционной системы), другие — для ис полняющихся в данный момент приложений. • Регистр стека. При стековой адресации1 выделяется специальный регистр, в котором размещен указатель на вершину стека. Этот режим адресации п зволяет использовать некоторые команды, в которых отсутствует поле ад са, например push и pop. В некоторых машинах вызов процедуры или подпрограммы приводит к а тематическому сохранению содержимого всех доступных пользователю регис ров, чтобы по возвращении их можно было восстановить. Процедура сохранени 1 Стек размещается в основной памяти в виде последовательности ячеек. Он iv хож на стопку бумаг, в которой листы с данными можно брать и класть только све ху. Более подробно стек рассматривается в приложении к данной главе. 36 Часть 1. Основные понятия й восстановления, Являющаяся составной частью команды вызова я возврата, выполняется процессором. Такой подход позволяет процедурам использовать регистры независимо друг от друга. В других машинах операция сохранения содержимого регистров, выполняемая при вызове процедуры, является обязанностью программиста, который должен включить в программу необходимые команды. Таким образом, в зависимости от типа машины функция сохранения и восстановления может выполняться либо аппаратно, либо программно. Управляющие регистры и регистры состояния Для контроля над работой процессора используются различные регистры. В большинстве машин эти регистры в основном не доступны пользователю. Некоторые из них могут быть доступны для машинных команд, исполняемых в так называемом режиме управления или режиме операционной системы. Конечно, у разных типов машин организация регистров отличается; для их классификации также используется различная терминология. Здесь приводится довольно полный список типов регистров и дается их краткое описание. Кроме ранее упомянутых регистров, MAR, MBR, I/OAR и I/OBR, важными для выполнения команд являются следующие. • Программный счетчик (program counter — PC). Содержит адрес команды, которая должна быть выбрана из памяти. • Регистр команд (instruction register — IR). Содержит последнюю выбранную из памяти команду. В состав всех процессоров входит также регистр (или набор регистров), известный под названием регистра слова состояния программы (program status word — PSW). В нем, как правило, содержатся коды условий и другая информация о состоянии, например бит разрешения/запрещения прерываний или бит режима системный/пользовательский. Коды условий (известные также как флаги) — это последовательность битов, устанавливаемых или сбрасываемых процессором в зависимости от результата выполненных операций. Например, в результате выполнения арифметического действия может получиться положительное число, отрицательное, ноль, или может произойти переполнение. В дополнение к сохранению полученного значения в памяти или регистре в результате арифметических операций устанавливаются также соответствующие коды условий. Впоследствии они могут быть проверены условной операцией ветвления. Биты кодов условий группируются в один или несколько регистров (обычно они составляют часть регистра Управления). Вообще говоря, есть машинные команды, позволяющие прочитать содержимое этих битов с помощью явных обращений к регистрам; однако изменять их содержимое явным образом нельзя, поскольку эти биты предназначены Для отображения результатов выполнения команд. В машинах, в которых используются различные виды прерываний, может Ь1ТЬ предусмотрено несколько регистров прерываний с указателями на каждую Рограмму обработки прерываний. Если при реализации некоторых функций ^например, вызова процедуры) используется стек, процессор должен иметь ре- стр — указатель стека. Для аппаратного обеспечения управления памятью (см. аву 7, "Управление памятью") нужны свои регистры. И, наконец, регистры сто используются при управлении операциями ввода-вывода. в& 1. Обзор компьютерных систем 37
На устройство и-организацию управлявши х ^регистров и регистров состояния влияют несколько факторов. Одним из них'-является поддержка операционной системы. Различные виды управляющей информации используются операционной системой по-разному. Если разработчик процессора имеет ясное представление об операционной системе, которая будет работать с этим процессором, он сможет так спланировать организацию регистров, чтобы обеспечить аппаратную поддержку ряда возможностей, таких, как защита памяти или переключение пользовательских программ. Еще одним ключевым конструкторским решением является распределение управляющей информации между регистрами и памятью. Общепринятым подходом является выделение для нее нескольких первых сотен или тысяч слов памяти. Конструктор должен решить, какая часть информации будет находиться в; более дорогих, но более быстрых регистрах, а какая часть — в более дешевой, но. медленной основной памяти. §1.3. ИСПОЛНЕНИЕ КОМАНД .«jjp ^Ш Ж' Программа, которую выполняет процессор, состоит из набора хранящихся в^ памяти команд. В простейшем виде обработка команд проходит в две стадии: процессор считывает (выбирает) из памяти, а затем запускает очередную команду. Исполнение программы сводится к повторению процесса выборки команды и ее исполнения. Для выполнения одной команды может потребоваться несколько операций; их число определяется природой самой команды. Набор действий, требующихся для реализации одной команды, называется, ее циклом. На рис. 1.2 показан процесс обработки команд процессором в такой упрощенной схеме, включающей два этапа. Эти этапы называются циклом выборки и циклом исполнения. Прекращение работы программы происходит при" выключении машины, в случае возникновения какой-либо фатальной1' (неисправимой) ошибки, или если в программе имеется команда останова. Цикл выборки Цикл исполнения Рис. 1.2. Базовый цикл исполнения программы Выборка и исполнение команды В начале каждого цикла процессор выбирает из памяти команду. Обычно адрес ячейки, из которой нужно извлечь очередную команду, хранится в программном счетчике (PC). Если не указано иное, после извлечения каждой команды процессор увеличивает значение программного счетчика на единицу. Таким образом, команды выполняются в порядке возрастания номеров ячеек памяти, в которых они хранятся. Рассмотрим, например, упрощенный компьютер, в котором каждая команда занимает одно 16-битовое слово памяти. Предположим, что значение программного счетчика установлено равным 300. Это значит, Часть 1. Основные понятия чТО следующая команда, которую должен извлечь процессор, находится в 300-й ячейке. При успешном завершении цикла команды процессор перейдет к извлечению команд из ячеек 301, 302, 303 и т.д. Однако, как мы вскоре узнаем, эта последовательность может быть изменена. Извлеченные команды загружаются в регистр команд (IR). Команда состоит из последовательности битов, указывающих процессору, какие именно действия оН должен выполнить. Процессор интерпретирует команду и выполняет требуемые действия. Все действия можно разбить на четыре категории. • Процессор — память. Данные передаются из процессора в память или обратно. • Процессор — устройства ввода-вывода. Данные из процессора поступают на периферийное устройство через устройство ввода-вывода. Возможен и обратный процесс. • Обработка данных. Процессор выполняет с данными различные арифметические или логические операции. • Управление. Команда может задавать изменение последовательности выполнения команд. Например, если процессор извлекает из ячейки 149 команду, которая указывает, что следующей по очереди должна быть исполнена команда из ячейки 182, то процессор устанавливает значение программного счетчика равным 182. Таким образом, в следующем цикле выборки команда извлекается не из ячейки 150, а из ячейки 182. Для выполнения команды может потребоваться последовательность, состоящая из комбинации вышеперечисленных действий. Рассмотрим, например, гипотетическую машину, характеристики которой приведены на рис. 1.3. В процессоре имеется один регистр данных, который называется аккумулятором (accumulator — АС). Команды и данные имеют длину 16 бит. В такой ситуации память удобно организовать в виде 16-битовых ячеек, в каждой из которых помещается одно слово. Формат команды предусматривает выделение 4 бит для кода операции. Таким образом, всего может быть 2 = 16 различных кодов операций (их можно представить одной шестнадцатеричной2 цифрой), а адресовать можно до 212 = 4096 (4 К) слов памяти (которые можно представить трехзначным шестнадцатеричным числом). Рис. 1.4, на котором показаны определенные ячейки памяти и регистры процессора, иллюстрирует исполнение фрагмента программы. В этом фрагменте слово, хранящееся в памяти по адресу 940, складывается со словом, хранящимся в памяти по адресу 941, а результат сложения заносится в ячейку 941. Для выполнения этого действия потребуются три команды, каждая из которых включает свой цикл выборки и цикл исполнения. о Основные сведения по системам счисления (десятичной, двоичной, шестнадцатерич- н°и) можно найти на узле Computer Science Student Support no адресу: WilliamStallings. com/ Student Support, html. лава 1. Обзор компьютерных систем 39
бит 0 Щ- 15 Код операции •• Адрес а) Формат команды бит 0 1 15 Знак Значение б) Формат целого числа Программный счетчик (PC) = Адрес команды Регистр команды (IR) = Исполняемая инструкция Аккумулятор (АС) = Временная память в) Внутренние регистры процессора 0001 = Загрузить значение из памяти в аккумулятор 0010 = Сохранить содержимое аккумулятора в памяти 0101= Добавить к аккумулятору значение ячейки памяти г) Коды операций (фрагмент; бинарный формат) Рис. 1.3. Характеристики гипотетической машины Память 300 301 302 940 941 Шаг П. 300 301 302 940 941 Шаг П 300 301 302 940 941 Шаг 19 4 0 5 9 4 1 2 9 4 1 • 0 0 0 3 0 0 0 2 1 эмять 19 4 0 5 9 4 1 2 9 4 1 • • 0 0 0 3 0 0 0 2 3 эмять 19 4 0 5 9 4 1 2 9 4 1 1 ш 0 0 0 3 0 0 0 2 5 Регистры процес 1. 3 0 01 PC 19 4 0 сора АС IR Реп ^* стры процес 3 0 1 PC 0 0 03 5 9 4 1 сора АС (R Реп лстры процес 3 0 2 PC 0 0 0 5 2 9 4 1 сора АС IR Память 300 301 302 940 941 Шаг П 300 301 302 940 941 Шаг П 300 301 302 940 941 Шаг 1 9 4 5 9 4 2 9 4 • • 0 0 0 0 0 0 2 амять 1 9 4 5 9 4 2 9 4 • • 0 0 0 0 0 0 4 амять 1 9 4 5 9 4 2 9 4 1 ш 0 0 0 0 0 0 6 0 1 1 3 2 0 1 1 3 2 0 1 1 3 5 Регистры процессора Г 1 3 0 1 PC 0 0 0 3 19 4 0 AC IR J Регистры процессора С \, 3 0 2 PC 0 0 0 5 5 9 4 1 AC ) 3j.2 = 5 —' __>* Реп Г 1стры процес 3 0 3 PC 0 0 0 5 2 9 4 1 сора ч AC IR J Рис. 1.4. Пример исполнения программы (содержимое памяти и регистров представлено шестнадцатиричны ни числами) Часть 1. Основные понятия 1* Адрес первой команды, хранящ #ся в программном счетчике, — ЗОО. Эта команда (она представлена шестнадцатеричным числом 1940) загружается в регистр команд (IR), а показание программного счетчика увеличивается на 1. Следует отметить, что в этом процессе участвуют регистры адреса и буфера памяти, однако для упрощения они игнорируются. 2. Первые 4 бит (первая шестнадцатеричная цифра) регистра команд указывают на то, что нужно загрузить значение в аккумулятор. Остальные 12 бит (три шестнадцатеричные цифры) указывают адрес 940. 3. Из ячейки 301 извлекается следующая команда (5941), после чего значение программного счетчика увеличивается на 1. 4. К содержимому аккумулятора прибавляется содержимое ячейки 941, и результат снова заносится в аккумулятор. 5. Из ячейки 302 извлекается следующая команда (5941), затем значение программного счетчика увеличивается на 1. 6. Содержимое аккумулятора заносится в ячейку 941. Этот пример показывает, что для сложения содержимого ячеек 940 и 941 необходимы три цикла команды. При более сложном наборе команд циклов понадобилось бы меньше. Современные процессоры выполняют команды, в состав которых может входить несколько адресов. При этом во время цикла исполнения некоторых команд иногда выполняется несколько обращений к памяти. Вместо обращений к памяти в команды может быть задана операция ввода-вывода. Функции ввода-вывода До сих пор мы рассматривали операции компьютера, управляемые процессором, основное внимание обращая на взаимодействие процессора и памяти. О роли компонентов ввода-вывода было упомянуто лишь вскользь. Процессор может не только читать данные из памяти и записывать их туда» обращаясь по адресу к определенной ячейке, но также читать и записывать данные в устройство ввода-вывода. Таким образом устройство ввода-вывода (например, контроллер диска) обменивается данными с процессором. При этом процессор должен идентифицировать устройство, которое будет управляться определенным устройством ввода-вывода. Из команд ввода-вывода можно сформировать такие же последовательности, как показанные на рис. 1.4 последовательности команд обращения к памяти. Иногда желательно, чтобы обмен данными с памятью выполнялся непосредственно устройством ввода-вывода, а процессор в это время выполнял Другие задания В этом случае процессор передает устройству ввода-вывода полномочия для чтения из памяти и записи в память, что позволяет освободить процессор. Во время такой передачи данных устройство ввода-вывода читает или записывает команды в память, принимая на себя ответственность за этот обмен. Такой режим» известный под названием прямого доступа к памяти (direct memory access — DMA), рассматривается в следующих разделах этой главы. Глава 1. Обзор компьютерных систем 41
(ill ч-ТЛ/Ч «wjw ' i. : п p a Во всех компьютерах предусмотрен механизм, с помощью которого различ ' ые устройства (ввода-вывода, памяти) могут прервать нормальную работу про '•■. гссора. Основные общепринятые классы прерываний перечислены в табл. 1.1. k аблица 1.1. Классы прерываний рограммное Генерируется в некоторых ситуациях, возникающих в результате выполне- 1* >ерывавие ния команд. Такими ситуациями могут быть арифметическое переполнение, *, деление на ноль, попытка выполнить некорректную команду и ссылка на v область памяти, доступ к которой пользователю запрещен f' рерывание Генерируется таймером процессора. Это прерывание позволяет операци- ( i таймеру онной системе выполнять некоторые свои функции периодически, через 1 заданные промежутки времени л эерывавие Генерируется контроллером ввода-вывода. Сигнализирует о нормальном а ода-вы>ода завершении операции или о наличии ошибок in а ратное Генерируется при возникновении таких аварийных ситуаций, как, напри- i срывание мер, падение напряжения в сети или ошибка контроля четности памяти Прерывания в основном предназначены для повышения эффективности ра$ ты. Например, большинство устройств ввода-вывода работают намного мед- ■ ннее, чем процессор. Предположим, что процессор передает данные на принтер, схеме, показанной рис. 1.2. После каждой операции процессор вынужден деть паузу и ждать, пока принтер не примет данные. Длительность этой паузы,. >жет быть в сотни и даже тысячи раз больше длительности цикла команды, т торой участвуют обращения к памяти. Ясно, что подобное использование про-^ ссора является неэффективным. Такое положение дел проиллюстрировано на рис. 1.5,а. Программа пользовате- ' содержит ряд вызовов процедуры записи WRITE, в промежутках между которыми ' ^положены другие команды. В отрезках 1, 2 и 3 находятся последовательности! манд кода, в которых не используется ввод-вывод. При вызове процедуры WRITE . равление передается системной утилите ввода-вывода, которая выполняет соответ-,_' »ующие операции. Программа ввода-вывода состоит из трех частей. \1 1 Последовательность команд, обозначенных на рисунке цифрой 4, которые '■' служат для подготовки к собственно операциям ввода-вывода. В эту после- : довательность могут входить копирование выводимых данных в специальный буфер и подготовка набора параметров, необходимых для управления устройством. Собственно команды ввода-вывода. Если программа не использует прерываний, ей следует ждать, пока устройство ввода-вывода не выполнит требуемые операции (или периодически проверять его состояние путем опроса). При этом программе не остается ничего другого, как просто ждать, постоянно проверяя, завершилась ли операция ввода-вывода. Последовательность команд, обозначенных на рисунке цифрой 5, которые ■ служат для завершения операции. Эта последовательность может содержать в себе установку флагов, свидетельствующих об успешном или неудачном завершении операции. Часть 1. Основные понятия Программа пользователя 0 WRITE Программа ввода-вывода © WRITE © ** | ' I / / . / / ■Команда ввода-вывода / / / / / / / / Программа пользователя Программа ввода-вывода CD WRITE - - Л' 1 1® i i " © WRITE WRITE © i~t" " Команда "i i ввода-вывода / / / / / / / / ^ it /v *" ^ Обработчик i" / / / / • *J ^прерывании J 1© \ i END Программа пользователя © WRITE © WRITE Программа ввода-вывода © j\ i e x ' *-" Команда - / / / / / / / / / / / / / / / / / / / / ввода-вывода WRITE *^ ' © -v-'- Обработчик прерываний © END i""~ J J- V WRITE + 1 / ' 1 /' \ I а) Без прерываний б) С прерываниями; быстрый ввод-вывод в) С прерываниями; медленный ввод-вывод Рис. 1.5. Ход выполнения программы без прерываний и с их использованием Из-за того что для выполнения операции ввода-вывода может потребоваться сравнительно длительный промежуток времени, программа замедляет работу, ожидая завершения операции. Таким образом, там, где встречается вызов WRITE, производительность программы существенно уменьшается. Прерывания и цикл команды Благодаря прерываниям во время выполнения операций ввода-вывода процессор может быть занят обработкой других команд. Рассмотрим ход процесса, показанный на рис. 1.5,6. Как и в предыдущем случае (без использования прерываний), вызвав процедуру WRITE, программа обращается к системе. При этом активизируется программа ввода-вывода, которая состоит из подготовительного кода и собственно команд ввода-вывода. После исполнения этих команд управление передается программе пользователя. Тем временем внешнее устройство занято приемом данных из памяти компьютера и их обработкой (например, если этим устройством является принтер, то под обработкой подразумевается распечатка). Ввод-вывод происходит одновременно с выполнением команд программы пользователя. В тот момент, когда внешнее устройство освобождается и готово для дальнейшей работы, т.е. оно готово принять от процессора новую порцию данных, контроллер ввода-вывода этого устройства посылает процессору сигнал запроса прерывания. В ответ процессор приостанавливает выполнение текущей программы, переключаясь на работу с программой, обслуживающей данное устройство ввода-вывода (эту программу называют обработчиком прерываний). Обслужив внешнее устройство, процессор снова возобновляет прерванную работу. На рис. 1.5,6 места программы, в которых происходит прерывание, обозначены крестиком. Глава 1. Обзор компьютерных систем 43
С точки зрения программы пользователя^1^рывайия — это не что иное, к нарушение обычной последовательности исполнения. После завершения об- ботки прерывания работа возобновляется (рис. 1.6). Таким образом, програм- [ пользователя не должна включать в себя какой-нибудь специальный код, обы приспосабливаться к прерываниям. За приостановку программы пользова- ая и возобновление ее работы с того самого места, в котором она была прерва- , отвечают процессор и операционная система. Пользовательская программа Здесь произошло прерывание ) ' •л /'+ 1 —— 1 ~ 1 ^^^^^ * • • • / t J ■у i 4 Обработчик прерываний 1 М Рис. 1.6. Передача управления через прерывание Чтобы согласовать прерывание с программой, в цикл команды добавляется [ кл прерывания (см. рис. 1.7, сравните с рис. 1.2). В цикле прерывания про-'< :сор проверяет наличие сигналов прерываний, свидетельствующих о проис- .; дших прерываниях. При поступлении прерывания процессор приостанавлива- ■-. работу с текущей программой и выполняет обработчик прерываний. Обработ-: ^и прерываний обычно входят в состав операционной системы. Как правило, ;< [ программы определяют природу прерывания и выполняют необходимые дей- ' ия. Например, в используемом примере обработчик должен определить, ка- i из контроллеров ввода-вывода сгенерировал прерывание; кроме того, он мо- ' г передавать управление программе, которая должна вывести данные на уст- кство ввода-вывода. Когда обработчик прерываний завершает свою работу, щессор возобновляет выполнение программы пользователя с того места, где . l была прервана. Ясно, что этот процесс включает в себя некоторые непроизводительные за- ,}. ты. Для определения природы прерывания и принятия решения о последую- х действиях обработчик прерываний должен выполнить дополнительные ко- ) 1ды. Тем не менее, ввиду того что для ожидания завершения операций ввода- иэда потребовался бы сравнительно большой отрезок времени, с помощью , рываний процессор можно использовать намного эффективнее. Часть 1. Основные понятия Цикл выборки Цикл исполнения Цикл прерывания ( Запуск \ Выборка следующей команды Запрет прерываний Исполнение команды С Разрешение прерываний Проверка наличия прерываний и их обработка Останов 3 Рис. 1.7. Цикл команды с прерываниями Чтобы оценить выигрыш в эффективности, рассмотрим временную диаграмму (рис. 1.8), иллюстрирующую ход процессов, показанных на рис. 1.5,а и б. В ситуации, показанной на рис. 1.5,6 и 1.8, предполагается, что для выполнения операций ввода-вывода требуется сравнительно короткое зремя, т.е. меньшее, чем время обработки команд, которые расположены в программе пользователя между операциями записи. Более типичным, особенно для таких медленных устройств, как принтер, является случай, когда операции ввода-вывода занимают намного больше времени, чем требуется для выполнения последовательности команд пользователя. Такая ситуация показана на рис. 1.5,е. В этом случае программа пользователя дойдет до следующего вызова WRITE еще до завершения операции ввода-вывода, порожденной предыдущим вызовом. В результате в этом месте программа пользователя будет приостановлена. После завершения обработки предыдущей операции ввода-вывода придет очередь обработать новое обращение к процедуре WRITE, и будут запущены новые операции ввода-вывода. На рис. 1.9 представлена диаграмма выполнения программы в среде без прерываний и с прерываниями для описанного случая. Как видно, в такой ситуации выигрыш в эффективности все равно существует, так как часть времени, в течение которого выполняются операции ввода-вывода, перекрывается выполнением команд пользователя. Глава 1. Обзор компьютерных систем 45
Время ;t^f% О © I Процессор в состоянии ожидания © © © Процессор всостоянии ожидания © © I Операция ввода-вывода I Операция ввода-вывода "О © 0 © 0 © 0 © 0 Т Операция ввода-вывода Т Операция ввода-вывода б) С прерываниями ■:1 а)Без прерываний Рис. 1.8. Временная диаграмма программы: быстрый ввод-вывод ) ■работка прерываний > Прерывание вызывает ряд событий, которые происходят как в аппаратном, и в программном обеспечении. На рис. 1.10 показана типичная последова- ьность этих событий. После завершения работы устройства ввода-вывода про- одит следующее. Устройство посылает процессору сигнал прерывания. Перед тем как ответить на прерывание, процессор должен завершить исполнение текущей команды (см. рис. 1.7). Процессор производит проверку наличия прерывания, обнаруживает его и посылает устройству, приславшему это прерывание, уведомляющий сигнал об успешном приеме. Этот сигнал позволяет устройству снять свой сигнал прерывания. Часть 1. Основные понятия Время © Процессор в состоянии П ожидания © "© Процессор - всостоянии ожидания © Операция ввода-вывода Операция ввода-вывода © © i © "'"' Процессор в состоянии ■"■ ожидания © © © -л Процессор в состоянии ожидания © Операция ввода-вывода г к Операция " © б) С прерываниями а) Без прерываний Рис. 1.9. Временная диаграмма программы: медленный ввод-вывод 4. Теперь процессору нужно подготовиться к передаче управления обработчику прерываний. Сначала необходимо сохранить всю важную информацию, чтобы в дальнейшем можно было вернуться к тому месту текущей программы, где она была приостановлена. Минимальная требуемая информация — это слово состояния программы и адрес очередной выполняемой команды, который находится в программном счетчике. Эти данные заносятся в системный управляющий стек. Глава 1. Обзор компьютерных систем 47
Аппаратное обеспечение Программное обеспечение Контроллер устройства или другой элемент аппаратного обеспечения генерирует прерывание Процессор прекращает исполнение текущей команды Процессор сигнализирует о получении прерывания Сохранение остальной информации о состоянии процесса Обработка прерывания Процессор заносит слово состояния и программный счетчик в стек управления В программный счетчик процессора загружается новое значение, определяемое прерыванием Восстановление информации о состоянии процесса Восстановление старого слова состояния программы и содержимого программного счетчика Рис. 1.10. Обработка простого прерывания Далее в программный счетчик процессора загружается адрес входа программы обработки прерываний, которая отвечает за обработку данного прерывания. В зависимости от архитектуры компьютера и устройства операционной системы может существовать как одна программа для обработки всех прерываний, так может быть и своя программа обработки для каждого устройства и каждого типа прерываний. Если для обработки прерываний имеется несколько программ, то процессор должен определить, к какой из них следует обратиться. Эта информация может содержаться в первоначальном сигнале прерывания; в противном случае для получения необходимой информации процессор должен по очереди опросить все устройства, чтобы определить, какое из них отправило прерывание. Как только в программный счетчик загружается новое значение, процессор кодит к следующему циклу команды, приступая к ее извлечению из памяти, как команда извлекается из ячейки, номер которой задается содержимым эаммного счетчика, управление переходит к программе обработки прерыва- Исполнение этой программы влечет за собой следующие операции. Часть 1. Основные понятия 6. Содержимое программного счетчика и слово сбстояния прерываемой программы уже хранятся в системном стеке. Однако это еще не вся информация, имеющая отношение к состоянию исполняемой программы. Например, нужно сохранить содержимое регистров процессора, так как эти регистры могут понадобиться обработчику прерываний. Поэтому необходимо сохранить всю информацию о состоянии программы. Обычно обработчик прерываний начинает свою работу с записи в стек содержимого всех регистров. Другая информация, которая должна быть сохранена, обсуждается в главе 3, "Описание процессов и управление ими". На рис. 1.11,а показан простой пример, в котором программа пользователя прерывается после выполнения команды из ячейки N. Содержимое всех регистров, а также адрес следующей команды (N+1), в сумме составляющие М слов, заносятся в стек. Указатель стека при этом обновляется, указывая на новую вершину стека. Обновляется и программный счетчик, указывая на начало программы обработки прерывания. 7. Теперь обработчик прерываний может начать свою работу. В процесс обработки прерывания входит проверка информации состояния, имеющая отношение к операциям ввода-вывода или другим событиям, вызвавшим прерывание. Сюда может также входить пересылка устройствам ввода-вывода дополнительных инструкций или уведомляющих сообщений. 8. После завершения обработки прерываний из стека извлекаются сохраненные ранее значения, которые вновь заносятся в регистры, возобновляя таким образом то состояние, в котором они пребывали до прерывания (см., например, рис. 1.11,6). 9. Последний этап — восстановление из стека слова состояния программы и содержимого программного счетчика. В результате следующей будет выполняться команда прерванной программы. Из-за того что прерывание не является подпрограммой, вызываемой из программы, для полного восстановления важно сохранить всю информацию состояния прерываемой программы. Однако прерывание может произойти в любой момент и в любом месте программы пользователя. Это событие непредсказуемо. Множественные прерывания До сих пор нами рассматривался случай возникновения одного прерывания. Представим себе ситуацию, когда может произойти несколько прерываний. Например, программа получает данные по коммуникационной линии и сразу же распечатывает результат. Принтер будет генерировать прерывание при каждом завершении операции печати, а контроллер коммуникационной линии — при каждом поступлении новой порции данных. Эта порция может состоять из одного символа или из целого блока, в зависимости от установленного порядка обслуживания. В любом случае возможна ситуация, когда коммуникационное прерывание произойдет во время обработки прерывания принтера. Глава 1. Обзор компьютерных систем 49
Т-М Стек управления Y+L Начало —I Л/+1 к-1 Профаммный счетчик Возврат! Программа обработки прерываний N W+1 Регистры общего назначения CZZZH Указател стека Процессор Т-М Пользовательская профамма Основная память а) Прерывание произошло после команды по адресу N Т-М Стек управления ТПТ Y+L Начало бозврат ъ\ VH Program counte Программа обработки прерываний ч N ы общего назначения Т-М Указатель - стека Процессор Пользовательская профамма Основная память б)Возврат после обработки прерывания Рис. 1.11. Изменение памяти и регистров при обработке прерывания \V В такой ситуации возможны два подхода. Первый — это запретить новые ? - >ывания до тех пор, пока обрабатывается предыдущее. Запрет прерываний озна т. [то процессор может и должен игнорировать любой новый сигнал прерывания. Ест ' это время происходит прерывание, оно обычно остается в состоянии ожидания' и [о него дойдет очередь, когда процессору вновь будет можно обрабатывать прер - шя. Таким образом, если во время работы программы пользователя происхо ит Ерерывание, на другие прерывания тут же накладывается запрет. После заверше . \я •аооты программы обработки прерывания запрет снимается, и перед возвратом к. V юлнению прерванной программы процессор проверяет наличие других преры То удачный и простой подход, при котором прерывания обрабатываются в стрО госледовательном порядке (рис. 1.12,а). О Часть 1. Основные поня Пользовательская программа Обработчик прерываниях Обработчик прерывания У а) Последовательная обработка прерываний Пользовательская программа Обработчик прерываниях ч N Ч Обработчик ** -. ^прерывания У б) Вложенная обработка прерываний Рис. 1.12. Передача управления при множественных прерываниях Однако недостатком такого подхода является то, что он не учитывает приоритет прерываний и те ситуации, в которых время является критическим параметром. Например, когда по коммуникационной линии приходит какая-то Информация, может понадобиться быстро ее принять, чтобы освободить место Для других входных данных. Если не обработать первый пакет входных данных Перед получением второго пакета, данные могут потеряться вследствие загруженности и переполнения буфера устройства ввода-вывода. При втором подходе учитывается приоритет прерывания, что позволяет приостановить обработку прерывания с более низким приоритетом в пользу прерывания с Глава 1. Обзор компьютерных систем 51
олее высоким приоритетом (рис. 1.12,6)- Как пример применения этого по ход» рассмотрим систему с тремя устройствами ввода-вывода: принтером, диском и [уникационной линией, которым присвоены приоритеты в возрастающей последо ельности — 2, 4 и 5, соответственно. На рис. 1.13 показана очередность обра ' ц рерываний, поступивших от этих устройств. Программа пользователя запускаете^ » гомент времени t = 0. В момент t = 10 происходит прерывание принтера. Инфо '" а. ;ия о программе пользователя заносится в системный стек, и в действие встуще», гандартная программа обслуживания прерывания (interrupt service routine — ШШ ,о время ее работы в момент t = 15 происходит коммуникационное прерывание. Из а того что его приоритет выше, чем приоритет прерывания принтера, проц D риступает к его обработке. ISR принтера прерывается, информация о ее состо ешосится в стек, а управление передается коммуникационной ISR. Далее, пока та грамма выполняется, происходит прерывание диска (в момент времени ( = т ак как его приоритет ниже, коммуникационная ISR продолжает свою работу, по а е закончит ее. •■'-» Пользовательская программа ISR принтера ISR линии коммуникации t = 0 As f I г Рис. 1.13. Пример последовательности обработки множественных прерыва- '& ний [TANE90] ':} После выполнения ISR коммуникационной линии (t — 25) восстанавливается >едыдущее состояние процессора, т.е. работа с ISR принтера. Однако прежде чеЩ пеет выполниться хоть одна команда этой программы, процессор приступает к об? ботке прерывания диска, которое обладает более высоким приоритетом, и ущ>Щ ние передается ISR диска. Только после завершения этой программы (t = 35) во бновляет работу ISR принтера. И, наконец, после завершения обработки этого пре^. •гвания управление передается программе пользователя. [ногозадачность Бывает, что для эффективного использования процессора одних прерываний: достаточно. Обратимся, например, к рис. 1.9,6". Если время, которое требуете Часть 1. Основные понятия? ддя выполнения операций ввода-вывода, шиюли *,„ , .__ фрагмента пользовательского кода, который находится между вызовами ввода- рьшода (обычная ситуация), то большую часть времени процессор будет простаивать. Чтобы решить эту проблему, нужно позволить нескольким программам пользователя быть активными в одно и то же время. Предположим, процессору нужно выполнить две программы. Одна из них, ^тающая данные из памяти и выводящая их на внешнее устройство, достаточно рроста; другая программа — некое приложение, выполняющее сложные вычисления. Процессор может начать работу с программой вывода, сгенерировать команду записи на внешнее устройство, а затем перейти к вычислениям, требующимся для выполнения другого приложения. Если процессор работает с несколькими программами, то последовательность их выполнения зависит от относительного приоритета этих программ, а также от того, ожидают ли они завершения ввода-вывода. Если программа прервана с передачей управления обработчику прерываний, то после завершения обработки управление не обязательно сразу же передается программе пользователя, которая выполнялась до этого. Управление может быть передано какой-либо другой программе, которая находится в состоянии ожидания и обладает более высоким приоритетом. Прерванная программа пользователя возобновит работу, когда она будет обладать наиболее высоким приоритетом среди оставшихся программ. Эта концепция обработки нескольких программ, воплощенная на практике, называется многозадачностью и обсуждается в главе 2, "Обзор операционных систем". ri.s; иерархия запоминающих ^ *ФЩ |- . УСТРОЙСТВ- . *■ ■,!„ rWf: $Ж Конфигурация памяти компьютера в основном определяется тремя параметрами: объем, быстродействие, стоимость. Вопрос об объеме решить не так просто. Какой большой ни была бы память, все равно будут разработаны приложения, которым ее не хватит. В отношении быстродействия памяти все ясно; чем быстрее, тем лучше. Для достижения высшей производительности память должна иметь возможность быстро обмениваться данными с процессором. Но в реальной жизни едва ли не главным становится третий параметр. Стоимость памяти должна быть сравнима со стоимостью других компонентов. Очевидно, можно найти некоторый компромисс между перечисленными характеристиками памяти. На любом этапе развития технологий производства запоминающих устройств действуют следующие, достаточно устойчивые, соотношения. • Чем меньше время доступа, тем дороже каждый бит. • Чем выше емкость, тем ниже стоимость бита. • Чем выше емкость, тем больше время доступа. Теперь ясна дилемма, стоящая перед конструктором. Вследствие возрастания требований к ресурсам конструктор стремится использовать те технологии, Которые обеспечивают производство устройств с большой емкостью. Однако что- 6bi удовлетворить потребности в высокой производительности, конструктор дол- 53 Глава 1. Обзор компьютерных систем
жен использовать дорогую память с меньшей емкостью (зато и с меньшим pg. менем доступа) Чтобы найти выход из сложившейся ситуации, необходимо опираться не на отдельно взятый компонент памяти или технологию, а выстроить иерархию.: поминающих устройств. На рис. 1.14 показана типичная иерархическая пи мида. При спуске к ее основанию происходит следующее. 1. Снижается стоимость бита 2. Возрастает емкость. 3. Возрастает время доступа. 4. Снижается частота обращений процессора к памяти. .Л - \ ' к Ч' eS* <& *eVu*** OP *0> & & £ Jt $r & *«*%* ** ы i±J -'V" Рис. 1.14. Иерархия запоминающих устройств '& Таким образом, к более дорогим устройствам с меньшей емкостью и бо "ее »ысокой производительностью добавляются более емкие, дешевые, но мен е производительные. При такой организации ключом к успеху является сниже е гастоты обращения к последним. Эта концепция будет рассмотрена более -ально в следующих разделах данной главы, при обсуждении кэша и виртуальной памяти. А теперь рассмотрим конкретный пример. '"_ Предположим, процессор имеет доступ к памяти двух уровней. На пер ровне содержится 1000 слов, и он характеризуется временем доступа 0A/.IS . Допу'. >4 Часть 1. Основные понят чтив» что к словам, расположенным на первом уровне, процессор может обращаться непосредственно. Если же нужно получить доступ к слову, находящемуся на втором уровне, то это слово сначала передается на первый уровень, и лишь потом процессор ролучает к нему доступ. Опустим для простоты вопрос о времени, которое требуется процессору для определения, на каком именно уровне находится слово. На рис. 1.15 доказан вид кривой, описывающей данную ситуацию. На графике представлена зависимость среднего времени доступа к памяти второго уровня от результативности яоиска Н. Символом Н обозначено отношение числа нахождений нужного слова в быстрой памяти (например, в кэше) к числу всех обращений, Т, — время доступа к уровню 1, Тг — время доступа к уровню 2.3 Видно, что при высокой частоте обращения к уровню 1 среднее время доступа намного ближе ко времени доступа к уровню 1, чем ко времени доступа к уровню 2. h*h Результативность поиска (вероятность обращения к уровню 1) Рис. 1.15. Производительность простой двухуровневой памяти Предположим, что в нашем примере 95% обращений к памяти приходится на кэш (Н = 0.95). Тогда среднее время доступа можно записать как 0.95 х 0. 1jU5 + 0.05 х (0. lju* + ljus) = 0.095 + 0.055/^ = 0.15jus Получившийся результат довольно близок ко времени доступа к быстрой памяти. Таким образом, описанная стратегия работает, но лишь при соблюдении Условий 1-4. Существует целый ряд разнообразных запоминающих устройств, с°зданных с применением различных технологий, для которых выполняются условия 1-3. К счастью, условие 4 тоже в целом справедливо. Основой соблюдения условия 4 служит принцип, известный как принцип локализации обращений [DENN68]. Адреса, к которым во время исполнения про- ^аммы обращается процессор, имеют тенденцию собираться в группы. Как правило, Назовем попаданием такое обращение к памяти, при котором нужное слово нахо и,пся в быстрой памяти. Соответственно промахом, назовем ситуацию, когда его там нет. 55 AjiaBa 1. Обзор компьютерных систем
программы содержат в себе повторяющиеся ц^клы и подпрограммы. Как тольк > ступает очередь цикла или подпрограммы, процессор обращается лишь к небо му повторяющемуся набору команд. Работа с таблицами и массивами также пр* латает доступ к сгруппированным данным. Со временем одни используемые к i ры заменяются другими, но в течение небольших промежутков времени npoi преимущественно работает с фиксированными кластерами памяти. Поэтому представляется возможным организовать данные в иерархия структуре так, чтобы частота обращений к каждому более низкому уровню бы, много меньше, чем частота обращения к уровню, расположенному на ступень Рассмотрим уже описанный пример с двумя уровнями памяти. Пусть на уро находятся все команды и данные программы. Обрабатываемые в данный м кластеры можно поместить на уровень 1. При этом получится, что большиясти ращений происходит к командам и данным, находящимся на уровне 1. Этот принцип можно применять не только к памяти с двумя уровням i. мую быструю, малоемкую и дорогую память образуют внутренние регистры » цессора. Обычно в нем имеется несколько десятков таких регистров, хотя которых процессорах могут быть сотни регистров. Спустимся на две сту вниз, туда, где находится основная память, являющаяся важным внутре запоминающим устройством компьютера. Каждая ее ячейка характерна своим уникальным адресом, и при выполнении большинства машинных ко. обращения происходят по одному или нескольким адресам. Расширением о. ной памяти служит кэш, который обладает меньшей емкостью, но является лее быстрым. Кэш обычно не виден программисту или, что по сути то же» п цессору. Это устройство выступает в роли промежуточного хранилища д при их перемещении между основной памятью и регистрами процессора, ! зволяет повысить производительность. Три только что описанных вида памяти являются обычно временными ( отключении питания находящаяся в них информация исчезает) и произво на основе полупроводниковой технологии. Наличие этих уровней основа о том, что существуют различные по скорости и стоимости виды полупроводн i вой памяти. Постоянными являются внешние устройства хранения боль о объема данных, наиболее часто встречающиеся из которых — жесткий д к такие съемные устройства, как переносные диски, ленты и оптические зало нающие устройства. Внешнюю, постоянную память называют также втор или вспомогательной памятью. Такие устройства используются для хране файлов с программами и данными и доступны программисту чаще всего (но всегда) только на уровне файлов и записей, а не отдельных слов или б то Диск используется также как расширение основной памяти, известное по званием виртуальной памяти (см. главу 8, "Виртуальная память"). В описываемую иерархическую структуру памяти программное обеспеч • может добавлять и дополнительные уровни. Например, часть основной п может быть использована как буфер для временного хранения считываем диска данных. Повышение производительности с применением такой техн гии, которую иногда называют дисковым кэшем (подробнее она рассматрива в главе 11, "Управление вводом-выводом и дисковое планирование"), дости ся за счет следующих ее особенностей. ~ • Данные на диск записываются в виде кластеров. Вместо передачи боль количества маленьких порций данных мы считываем несколько боль 56 Часть 1. Основные поня г порций. Это повышает производительность диска и сводит к минимуму использование процессора. Программа может обращаться к некоторым данным, предназначенным для записи на диск, до ее начала. В этом случае намного быстрее искать данные в кэше, чем на медленном диске. Производительность памяти с несколькими уровнями рассматривается в яложении А к данной главе. &КЭШ > Хотя кэш и невидим для операционной системы, он взаимодействует с аппаратным обеспечением, связанным с памятью. Более того, многие из принципов, используемых в схемах виртуальной памяти (см. главу 8, "Виртуальная па- мяТЬ")> применимы также к кэш-памяти. Обоснование При выполнении каждого цикла команды процессор по крайней мере один раз обращается к памяти, чтобы произвести выборку команды. Часто это происходит повторно, причем возможны случаи нескольких повторных обращений, при которых извлекаются операнды и/или сохраняются результаты. Частота, с которой процессор исполняет команды, ограничена временем обращения к памяти. Годами это ограничение было существенной проблемой из-за постоянного несоответствия между скоростью процессора и скоростью доступа к основной памяти — скорость процессора возрастала быстрее, чем скорость доступа к памяти. Постоянно нужно было искать компромисс между скоростью, стоимостью и емкостью. В идеале основная память должна была бы производиться по той же технологии, что и регистры процессора, чтобы время цикла памяти было сравнимо со временем цикла процессора. Однако эта стратегия приводит к слишком большим затратам. Решением проблемы стало использование принципа локализации, при котором между процессором и основной памятью помещается память с небольшой емкостью и быстрым временем доступа, а именно — кэш. Принципы работы кэша Кэш предназначен для того, чтобы приблизить скорость доступа к памяти к максимально возможной, и в то же время обеспечить большой объем памяти По Цене более дешевых типов полупроводниковой памяти. Эта концепция представлена на рис. 1.16. Итак, наряду с относительно большой и более мед- Ленной основной памятью у нас есть кэш, обладающий меньшей емкостью, но меньшим временем доступа. В кэше хранится копия фрагмента основной па- яти. Когда процессор пытается прочесть слово из памяти, выполняется пробка на наличие этого слова в кэше. Если оно там есть, слово передается процессору. Если же его там нет, в кэш считывается блок основной памяти, со- °ящий из слов с определенными адресами. Вследствие локализации Ращений при считывании в кэш блока данных, содержащего одно из требуе- х слов, последующие обращения к данным с высокой вероятностью тоже дУт выполняться к словам из этого блока. ава 1. Обзор компьютерных систем 57
Передача слова "'««Л С Центральный процессор Г Кэш {— г Основная память < Рис. 1.16. Кэш и основная память •$ Г] На рис. 1.17 показана структура основной памяти и кэша. Основная.память состоит из 2" адресуемых слов, каждое из которых характеризуется своим уникальным л-битовым адресом. Предполагается, что вся память'-о- стоит из определенного количества блоков фиксированной длины, в кажды из которых входит К слов. Таким образом, всего имеется М =2"/К блоков. Кэш состоит из С слотов, по К слов в каждом- При этом количество ело оа намного меньше количества блоков {С«К)А. Некоторое подмножество бло ов основной памяти хранится в слотах кэша. Если нужно прочесть из пам ти слово из какого-то блока, которого нет в кэше, то этот блок передается в один из слотов кэша. Из-за того, что блоков больше, чем слотов, нельзя * а- крепить за каждым блоком свой слот. Поэтому каждый слот должен сод р- чкать дескриптор, идентифицирующий хранящийся в нем блок. В роли д ск- эиптора обычно выступает число, состоящее из старших битов адреса, и по *ему происходит обращение ко всем адресам, которые начинаются этой о- :ледовательностью битов. Рассмотрим простой пример, в котором адреса состоят из шести битов, а ' - :крипторы — из двух. Дескриптор 01 указывает на то, что в слоте находи ся шок, в который входят следующие адреса: 010000, 010001, 010010, 0100 1 U0100, 010101, 010110, 010111, 011000, 011001, 011010, 011011, 0111 0, И1101, 011110, 011111. На рис. 1.18 показана блок-схема операции чтения слова из памя \. 1роцессор генерирует адрес слова, которое нужно прочесть. Если это ело о ранится в кэше, оно передается процессору. В противном случае блок, со- ержащий это слово, загружается в кэш, и слово передается процессору п - ле загрузки блока в кэш. \\ Символ «означает "намного меньше, чем", а символ » означает "намног лыие, чем" Часть 1. Основные поняти Номер слота дескриптор О 1 2 Блок С-1 .Длина блока (К слов) а) Кэш Адрес памяти О 1 2 3 2"-1 Блок (К слов) •Блок -Длина ► слова б) Основная память Рис. 1.17. Структура кэша и основной памяти глава 1. Обзор компьютерных систем 59
ГНачапо работы) Получить от процессора адрес слова < Содержится ли блок \ с этим словом в кэше? ?' Нет Обратиться к блоку основной памяти, в котором содержится запрошенное слово Да Получить из кэша запрошенное слово и передать его процессору Выбрать слот кэша для загрузки блока основной памяти Выполняется параллельно Загрузить блок основной памяти в слот кэша ^_1 ПСонец работьЛ* Передать процессору запрошенное слово с- ■ L Г. Рис. 1.18. Операция чтения из кэша \ Внутреннее устройство кэша ; Выданной книге внутреннее устройство кэша подробно не рассматривает я. i этом разделе кратко перечислены лишь основные его элементы. В дальней "" штатель сможет убедиться, что при изучении устройства виртуальной памят и (искового кэша мы имеем дело с похожими вопросами. Все их можно разбить" i ;ледующие категории: • размер кэша; .;< • размер блока; -; • функция отображения; • алгоритм замещения; • стратегия записи. £ то гг* ТаК°Й хаРактеРистикой' ка* Размер кэша, мы уже знакомы. Оказывается ™.™ Сравнительно маленький кэш может оказать значительное влияние на Фоизводительность компьютера. Другим важным параметром является разме ьа. задающий величину порции данных, которая передается из основной п Ю Часть 1. Основные поняти яТи в кэш. При увеличении размера блока в соответствии с принципом локали- ил обращений растет результативность поиска, поскольку в кэш попадает ' лЬще полезных данных. Однако есть некое предельное значение, при превы- енйи которого результативность поиска начинает уменьшаться. Это происходит гяа, когда вероятность использования вновь считанных данных становится еньше, чем вероятность повторного использования данных, которые необходи- 0 удалить из кэша, чтобы освободить место для нового блока. При считывании в кэш нового блока данных функция отображения определяет, какое место будет отведено для этого блока. Разрабатывая эту функцию, необходимо учитывать два фактора, накладывающих на нее определенные ограничения. Во-первых, при считывании блока, вероятно, он заменит другой блок в кэше. Хотелось бы сделать это таким образом, чтобы свести к минимуму вероятность того, что заменяемый блок понадобится в ближайшем будущем. Чем более гибкой является функция отображения, тем больше возможностей для разработки такого алгоритма замены, который бы позволил увеличить результативность поиска. Во-вторых, с увеличением гибкости функции отображения должны усложняться схемы, позволяющие определить наличие в кэше требуемой информации и обеспечить ее поиск. При загрузке блоков в кэш в конце концов наступает момент, когда все слоты заполняются и новый блок нужно записывать на место, занятое каким-то другим блоком. Выбор этого блока осуществляется в соответствии с алгоритмом замещения, на который накладывает ограничения отображающая функция. При этом желательно было бы убрать именно тот блок, который, скорее всего, не понадобится в ближайшем будущем. Хотя достоверно определить его невозможно, достаточно эффективной стратегией является замена блока, к которому дольше всего не было обращений. Такая стратегия называется политикой недавнего использования блока (least-recently-used — LRU). Для определения используемости блоков необходим соответствующий аппаратно реализованный механизм. Перед изменением содержимого слота кэша его старое содержимое необходимо записать в основную память. Случаи, когда нужно выполнять операции записи, определяются стратегией записи. Одним из предельных случаев является такой, когда запись производится при каждом обновлении блока. В другом случае запись производится только при замене данного блока новым. Такая стратегия сводит к минимуму количество операций записи в память, но при этом в блоках основной памяти содержится устаревшая информация, что может привести к ошибкам при многопроцессорной работе, а также при прямом доступе к памяти со стороны модулей ввода-вывода. SL.7. ТЕШЙЙШИЙ ТВВО•'■&. ЙН8Ь$&Г"' * Возможны три метода выполнения операций ввода-вывода: • программируемый ввод-вывод; • ввод-вывод с использованием прерываний; • прямой доступ к памяти (direct memory access — DMA)r *лава 1. Обзор компьютерных систем 61
Программируемый ввод-вывод >"$№ Когда процессору при выполнении программы встречается команда, связа ная с вводом-выводом, он выполняет ее, передавая соответствующие ком ^ контроллеру ввода-вывода. При программируемом вводе-выводе это устроЙс во выполняет требуемое действие, а затем устанавливает соответствующие биты в регистрах состояния ввода-вывода. Контроллер ввода-вывода больше не посыдае? процессору никаких сигналов, в том числе и сигналов прерываний. Таким обра юм, ответственность за периодическую поверку состояния модуля ввода-вы- да несет процессор; он должен производить проверку до тех пор, пока операция звода-вывода не завершится. При использовании такого метода процессор отвечает за извлечение из основ ой тамяти данных, предназначенных для вывода, и размещение в ней данных, по тивших с устройств ввода. Программное обеспечение для ввода-вывода разрабатЫва- ;тся таким образом, что процессор непосредственно управляет операциями вво а- }ывода, включая опознание состояния устройства, пересылку команд чтения-записи i передачу данных. Таким образом, в набор используемых команд входят комав ы даода-вывода, принадлежащие следующим категориям. \ • Управление. Команды этой категории используются для того, чтобы и- вести внешнее устройство в действие и сообщить ему, что нужно дела ь. Например, блоку с магнитной лентой можно отдать команду перемотки чи перемещения вперед на одну запись. • Состояние. Используется для проверки состояния контроллера ввода-вывода и соответствующих периферийных устройств. * • Передача. Используется для чтения и/или записи данных в регистры процессора и внешние устройства и из регистров процессора и внешних устройств. -у, На рис. 1.19 приведен пример использования программируемого ввода- ывода для считывания в память блока данных, поступивших из внешнего ус - ойства (например, записи с магнитной ленты). Данные считываются по одно у лову. При считывании каждого слова процессор должен выполнять цикл п - ерки состояния, пока он не обнаружит, что это слово уже доступно в регист е анных модуля ввода-вывода. На приведенной блок-схеме видны основные н - остатки такого метода: процессор выполняет большое количество операций, ко- эрых можно было бы избежать; теряется много времени. бвод-вывод с использованием прерываний Проблема программируемого ввода-вывода состоит в том, что процессо элжен долго ждать, пока контроллер ввода-вывода будет готов читать или при- имать новые данные. Во время ожидания процессор должен постоянно произ- >дить опрос, чтобы узнать состояние модуля ввода-вывода. В результате значи ;льно падает производительность всей системы. При альтернативном подходе процессор может передать контроллеру ко анду ввода-вывода, а затем перейти к выполнению другой полезной работы атем, когда контроллер ввода-вывода снова будет готов обмениваться данным процессором, он прервет процессор и потребует, чтобы его обслужили. Процес ■р передает ему новые данные, а затем возобновляет прерванную работу. г Часть 1. Основные понятия X to m 3 О. 8. о. о * X уче с; О с= ^ X ТОЙ « о t_l <г S С_Э о: О 3 о: S •и. \ X 3 в н а о о a э> в & С о о Е а? з
■у Рассмотрим для начала, как все это выглядит с точки зрения кон , лера ввода-вывода. Сначала он получает от процессора команду READ и ц ходит к считыванию данных из связанного с ним периферийного устройс/ Как только эти данные поступят в регистры контроллера, он посылает $ цессору по шине управления сигнал прерывания и ожидает, когда процес ц запросит эти данные. При поступлении запроса контроллер передает дан/ по информационной шине и переходит в состояние готовности для но операций ввода-вывода. С точки зрения процессора передача входных данных выглядит следую образом. Процессор генерирует команду READ, а затем сохраняет содерж программного счетчика и других регистров, соответствующих выполняемой ' грамме, и переходит к выполнению других операций (например, он в одно^и : же время может выполнять несколько различных программ). В конце ка. дого цикла команды процессор проверяет наличие прерываний (см. рис. 1.7). При поступлении прерывания от контроллера ввода-вывода процессор сохраняет информацию о выполняющейся в данный момент задаче и выполняет программу обрабатывающую прерывания. При этом он считывает слова из контроллера ввода-вывода и заносит их в память. Затем он восстанавливает контекст програм- мы, от которой поступила команда ввода-вывода и продолжает работу. Использование для чтения блока данных ввода-вывода, управляемого прерываниями, показано на рис. 1.19,6. Ввод-вывод с прерываниями намного эффективнее, чем программируемый ввод-вывод, так как при нем исключается ненужное ожидание. Однако этот процесс все еще потребляет много процессорного времени, потому что каждое слово, которое передается из памяти в модуль вво да-вывода или в обратном направлении, должно пройти через процессор. Почти в каждой компьютерной системе есть несколько контроллеров ввода- вывода, поэтому нужны механизмы, позволяющие процессору определить, акое из устройств вызвало прерывание, а если прерывание одно, то решить, какое из них будет обрабатываться в первую очередь. В некоторых системах имеется несколько шин прерываний, так что каждый контроллер ввода-вывода посылает сигнал по своей шине, причем у каждой шины — свой приоритет. Есть и друго вариант, когда прерывающая шина всего одна, но тогда используются дополн - тельные шины, по которым передаются адреса устройств. В этом случае каждому устройству также присваиваются разные приоритеты. V щ Прямой доступ к памяти '•■* Хотя ввод-вывод, управляемый прерываниями, более эффективен, чем стой программируемый ввод-вывод, он все еще занимает много процессорно, времени для передачи данных между памятью и контроллером ввода-выво (при этом через процессор должны пройти все пересылаемые данные). Таким разом, обе описанные формы ввода-вывода обладают двумя недостатками. 1. Скорость передачи данных при вводе-выводе ограничена скоростью, с кото рой процессор может проверять и обслуживать устройство. 2. Процессор занят организацией передачи данных; при вводе-выводе для к ждой передачи данных должна быть выполнена определенная последов тельность команд. 64 Часть 1. Основные поняти Для перемещения больших объемов данных может использоваться более эффективный метод — прямой доступ к памяти (direct memory access — DMA). Функции DMA выполняются отдельным контроллером системной шины или могут быть «строены в контроллер ввода-вывода. В любом случае метод работает следующим образом. Когда процессору нужно прочитать или записать блок данных, он генерирует команду для модуля DMA, посылая ему следующую информацию: • указание, требуется ли выполнить чтение или запись; • адрес устройства ввода-вывода; • начальный адрес блока памяти, использующегося для чтения или записи; • количество слов, которые должны быть прочитаны или записаны. Передав полномочия по выполнению этих операций контроллеру DMA, процессор продолжает работу. Контроллер DMA слово за словом передает весь блок данных в память или из нее, не задействуя при этом процессор. После окончания передачи контроллер DMA посылает процессору сигнал прерывания. Таким образом, процессор участвует только в начале и в конце передачи (рис. 1.19,е). Для передачи данных в память и из нее контроллеру DMA нужен контроль над шиной. Если в это время процессору также нужна шина, может возникнуть конфликтная ситуация, и процессор должен ждать окончания работы модуля DMA. Заметим, что в этом случае нельзя говорить о прерывании, так как процессор не сохраняет информацию о состоянии задачи и не переходит к выполнению других операций. Вместо этого он вынужден сделать паузу на время выполнения одного цикла шины. В результате это приведет к тому, что во время передачи данных с использованием прямого доступа к памяти замедляется выполнение процессором тех команд, для которых ему требуется шина. Тем не менее при передаче большого количества информации прямой доступ к памяти намного более эффективен, чем программируемый ввод-вывод или ввод-вывод, управляемый прерываниями. i Обсуждающиеся в этой главе темы детально описаны в книге [STALOO]. Кроме нее, имеется много других руководств по устройству и архитектуре компьютеров. В числе достойных внимания учебников можно отметить следующие: исчерпывающий обзор представлен в [РАТТ98]; [HENN96] — более специализированная книга тех же авторов, в которой акцент делается на количественных аспектах, характеризующих структуру компьютера. HENN96 Henneey " J., Patterson D. Computer Architecture: A Quantitative Approach. — San Mateo, CA: Morgan Kaufmann,1996. PATT98 Patterson D., Hennesy J. Computer organization and Design: The Hardware/Software Interface. — San Mateo, CA: Morgan Kaufmann,1998. ! STALOO Stallings W. Computer Organization and Architecture. 5th ed.,— Upper Saddle River, NJ: Prentice Hall, 2Q00. - . Глава 1. Обзор компьютерных систем 65
xi лот Е Б УПРАВЛЕНИ Общепринятым методом осуществления управления вызовами проце у« i возвратами из них является использование стека. В данном приложе' \щ фиводится краткое описание свойств стека и его использования при ра ?е [роцедур. ; Реализация стека > Стек — это упорядоченный набор элементов, причем при обращении к н му ожно получить доступ лишь к одному из элементов. Этот элемент называв я ершиной стека. Число элементов стека (его длина) является переменным, о- 1вления или удаления можно делать только на вершине стека, поэтому его лвают магазинным списком, или списком, организованным по принц пу юследним вошел — первым вышел" (last-in-first-out — LIFO). ? Для реализадии стека необходим набор ячеек памяти, в которые будут ' - >ситься его элементы. Типичный подход проиллюстрирован на рис. 1.25. В шной (или виртуальной) памяти для стека резервируется блок смежных яч к. >лыпук> часть времени он частично заполнен элементами стека. Для обеспл е- [я нормальной работы нужно помнить следующие адреса, которые хранятся в гистрах процессора. i, 't ► Указатель стека. Содержит адрес вершины стека. Если в стек добавляв новый элемент (PUSH) или из него удаляется элемент (POP), указатель соответственно увеличивается или уменьшается на единицу. После этого н вновь содержит адрес вершины стека. База стека. Содержит адрес нижней ячейки зарезервированного блока. Пр добавлении элемента в пустой стек эта ячейка используется первой. П и попытке извлечь элемент из пустого стека генерируется сигнал ошибки. & Предел стека. Содержит адрес второго конца, т.е. вершины зарезервиров - ного блока. При попытке добавить новый элемент в заполненный стек гея - рируется сигнал ошибки. v Традиционно сложилось так, что у большинства современных машин осно- стека является ячейка с максимальным адресом, а его пределом — ячейка [имальным адресом. Таким образом, стек является обращенным, и при его >астании заполняются ячейки с убывающими адресами. [зов процедуры и возврат из нее Общепринятым методом управления вызовами процедур и возвратами и . является использование стека. При обработке вызова процессор помещает й адрес возврата. При возврате из процедуры процессор использует адрес С шны стека. На рис. 1.26 и 1.27 показано использование стека при работе с <енными процедурами. Часть 1. Основные понятия Основная память Регистры процессора Предел стека Указатель стека База стека Свободно Используется Блок памяти зарезервированный под стек Адреса 4000 4100 4101 4800 Рис. 1.25. Организация типичного стека Основная память CALL Procl RETURN Главная программа 4500 4600 4601 4650 4651 CALL Proc2 CALL Proc2 RETURN Процедура Procl Процедура Proc2 4 I «Л r \ *+r*< а) Вызовы и возвраты б) Последовательность исполнения Рис. 1.26. Вложенные процедуры Глава 1. Обзор компьютерных систем 77
f%# 4101 4601 4101 4101 ■ а) Первоначальное содержимое стека б) После CALLProcl в) Первый CALL Proc2 J г) После RETURN Is ё 4101 Д) После CALL Ргос2 * е) После RETURN *) После v. RETURN ^iwrut CALLProc2 RETURN RETURN ,• Рис. 1.27. Использование стека при обработке вложенных процедур, показан-! ных на рис. 1.26 л|, ''■'•1 Часто вместе с вызовом процедуры бывает необходимо передать ей некоторые параметры. Это можно сделать при помощи регистров; другой возмо но стью является хранение параметров в памяти сразу после команды вызова. В этом случае возврат должен осуществляться к ячейке памяти, расположе но сразу после параметров. Оба этих подхода имеют свои недостатки. При использовании передачи параметров в регистрах необходимо согласование вызываю ей и вызываемой процедур, гарантирующее одинаковое распределение параме ов по регистрам. При сохранении параметров в памяти усложняется передача пере менного числа параметров. Большую гибкость при передаче параметров обеспечивает стек. При q pa- ботке вызова процессор заносит в стек не только адрес возврата, но и параметр i, передаваемые вызываемой процедуре, которая легко может получить досту к ним. При возврате из процедуры возвращаемые значения также можно занесп стек, располагая их под адресом возврата. Набор всех параметров (включая1 рее возврата), который сохраняется при обращении к процедуре, называв с кадром стека (stack frame). j- Рассмотрим пример программы, в которой используются процедуры Р и Q. В процедуре Р объявлены локальные переменные xl и дг2, а в Q — локаль ые переменные у\ и у2. Процедура Q может быть вызвана из Р. Схема работы сте ■ при выполнении такой программы показана на рис. 1.28. На этом рисунке точ '& возврата из каждой процедуры является первой ячейкой соответствующего кового кадра. Следующим сохраняется указатель на начало предыдущего кадра. Это необходимо на случай, если количество или размер заносимых в стек па а- метров являются переменными. Реентерабельные процедуры Реентерабельная (повторно входимая) процедура является весьма полезн сонцепцией, особенно успешно применяемой в многопользовательских и мног - адачных системах. Реентерабельной называется процедура, последовательность :оманд которой может одновременно использоваться несколькими пользоват - ями. Это свойство процедуры имеет два основных аспекта: программный код не олжен быть самомодифицирующимся, а локальные данные каждого пользова гля должны храниться отдельно друг от друга. Исполнение реентерабельное роцедуры может быть приостановлено с помощью прерывания, а после возврат з него — корректно продолжиться. В многопользовательских и многозадачны^ гстемах реентерабельность позволяет более эффективно использовать основну шять: в ней хранится только одна копия программного кода процедуры, даж ли к ней обращаются несколько разных приложений. Часть 1. Основные поняти $ х2 х1 Указатель старого кадра р. I Точка возврата Указатель ' стека Указатель ' кадра Q: Р: У2 У1 Указатель старого кадра* Точка возврата х2 х1 Указатель старого кадра Точка возврата 4 >~ < Указатель стека Указатель кадра а) Активная процедура Р б) Вызов Q из Р Рис. 1.28. Увеличение стекового кадра при вызове процедур Р и Q Таким образом, в реентерабельной процедуре должна быть неизменная часть (команды, из которых состоит процедура) и переменная часть (указатель на вызывающую программу, а также локальная область памяти, в которой хранятся локальные переменные, используемые данной программой). При каждом запуске процедуры, который называется ее активацией, исполняется код неизменной части, но при этом должна быть создана отдельная копия локальных переменных и параметров. Переменную часть, связанную с каждой активацией, называют записью активации. Реентерабельные процедуры удобнее всего реализовывать с помощью стека: при вызове процедуры соответствующая запись активации заносится в стек. Таким образом, запись активации становится частью стекового кадра, создаваемого при вызове процедуры. 1 лава 1. Обзор компьютерных систем 79
1 ГЛАВА Обзор операционных систем 2.1. Предназначение и функции операционных систем 2.2. Эволюция операционных систем 2.3. Основные достижения 2.4. Характеристики современных операционных систем 2.5. Обзор операционной системы Windows 2000 2.6. Традиционные системы UNIX 2.7. Современные системы UNIX 2.8. Рекомендуемая литература 2.9. Задачи 2
Зта глава содержит краткий обзор истории развития операционных си , Цель обзора — показать ретроспективу становления данной области также рассмотреть принципы работы операционных систем. Мы начйё' обсуждения предназначения и функций операиионных систем, а затем про е дим за их развитием, начиная от примитивных пакетных и заканчивая слож ы ми многорежимными многопользовательскими системами. Остальная часть па вы посвящена описанию истории развития и общих характеристик двух о ' tZ ционных систем, приводимых в этой книге в качестве примера. е а с е """ "^ ' ' * У±2£Ж-Ъ5&?-?Ъ ЩИ ПРЕДНАЗНАЧЕНИЕ ИШ^НКцШ -1#ЛПЕРАЦИОННЬ1Х СИСТЕМ '« 'AS*' ' ::.Ь "-"««Я^» Операционная система — это программа, контролирующая работу прик. ад. ных программ и системных приложений и исполняющая роль интерфейса ме кду приложениями и аппаратным обеспечением компьютера. Ее предназнач ние можно разделить на три основные составляющие. Г V • Удобство. Операционная система делает использование компьютера ро- стым и удобным. '{.. • Эффективность. Операционная система позволяет эффективно использо ать ресурсы компьютерной системы. ;.'■* • Возможность развития. Операционная система должна быть организо' на так, чтобы она допускала эффективную разработку, тестирование и вне' ре- ние новых приложений и системных функций, причем это не должно^ мешать нормальному функционированию вычислительной системы. Рассмотрим все три аспекта работы операционных систем по очереди. '., Операционная система как интерфейс между * пользователем и компьютером f На рис. 2.1 представлена иерархическая структура программного и па- ратного обеспечения, использующегося для предоставления конечному пользователю возможности работы с приложениями. Конечный пользователь обычн не интересуется деталями устройства аппаратного обеспечения компьютера, ом- пьютер видится ему как набор приложений. Приложение можно написать н : к - ком-то из языков программирования; эту задачу выполняют программисты!:' Если бы кто-то задумал разработать реализованную в виде набора машинных! команд программу, которая полностью отвечает за управление аппара ы обеспечением компьютера, то это оказалось бы слишком сложной задачей то- бы упростить ее, имеется набор системных программ, некоторые из которых н - зываются утилитами. С их помощью реализуются часто использующиеся ф к- ции, которые помогают при создании пользовательских программ, работе с ' лами и управлении устройствами ввода-вывода. Программист использует . средства при разработке собственных программ, а приложения во время вы ol нения обращаются к утилитам для выполнения определенных функций. Н более важной из системных программ является операционная система, кото скрывает от программиста детали аппаратного обеспечения и предоставляет . 82 * Часть 1. Основные поня * удобный интерфейс для использования системы. Операционная система выступает в роли посредника, облегчая программисту и программным приложениям доступ к различным службам и возможностям. J .Конечный | [пользователь! I Программист I ^ *~х<'. м*.■sf~.. Прикладные программы Утилиты lorn Разработчик операционной ] системы Операционная система МЛ Аппаратное обеспечение компьютера Рис. 2.1. Уровни и различные точки зрения на вычислительную систему Приведем краткий список сервисов, предоставляемых типичными операционными системами. • Разработка программ. Содействуя программисту при разработке программ, операционная система предоставляет ему разнообразные инструменты и сервисы, например редакторы или отладчики. Обычно эти сервисы реализованы в виде программ-утилит, которые поддерживаются операционной системой, хотя и не входят в ее ядро. Такие программы называются инструментами разработки приложений. • Исполнение программ. Для запуска программы требуется выполнить ряд действий. Следует загрузить в основную память команды и данные, инициализировать устройства ввода-вывода и файлы, а также подготовить другие ресурсы. Операционная система выполняет всю эту рутинную работу вместо пользователя. ^ Доступ к устройствам ввода-вывода. Для управления работой каждого устройства ввода-вывода нужен свой особый набор команд или контрольных сигналов. Операционная система предоставляет пользователю единообразней интерфейс, который скрывает все эти детали, и обеспечивает программисту доступ к устройствам ввода-вывода с помощью простых команд чтения и записи. 1 Ва 2. Обзор операционных систем 83
• Контролируемый доступ к файлам. При работе с файлами управл нце стороны операционной системы предполагает не только глубокое nog isjftl природы устройств ввода-вывода (дисковода, лентопротяжного устрб 1СТв но и знание структур данных, записанных в файлах. Многопольэо"^ ские операционные системы, кроме того, могут обеспечивать работу ме> низмов защиты при обращении к файлам. !? • Системный доступ. Операционная система управляет доступом к сов iecx используемой или общедоступной вычислительной системе в целом, а ак»- к отдельным системным ресурсам. Она должна обеспечивать защиту Cv сов и данных от несанкционированного использования, а также раз mj. конфликтные ситуации. • Обнаружение ошибок н их обработка. При работе компьютерной системы .топ происходить разнообразные сбои. К их числу относятся внутренние и в ещна ошибки, возникшие в аппаратном обеспечении (например, ошибки памя и, о каз или сбой устройств). Возможны и различные программные ошибки,/ ак«е как арифметическое переполнение, попытка обратиться к ячейке памят!, дос туп к которой запрещен, или невозможность выполнения запроса прило ения В каждом из этих случаев операционная система должна выполнить де ствия, минимизирующие влияние ошибки на работу приложения. Реакция операод. онной системы на ошибку может быть различной — от простого сообще я об ошибке до аварийного останова программы, вызвавшей ее. • Учет использования ресурсов. Хорошая операционная система д т- на иметь средства учета использования различных ресурсов и отображения параметров производительности. Эта информация крайне важна в любо системе, особенно в связи с необходимостью дальнейших улучшений настройки вычислительной системы для повышения ее производительно I Операционная система как диспетчер ресурсов Компьютер представляет собой набор ресурсов, поддерживающих выполнение задач накопления, перемещения, хранения и обработки данных, а же контролирующих работу этих и других функций. Ответственность за управление этими ресурсами лежит на операционной системе. ; Можно ли сказать, что именно операционная система управляет перемеще ием. хранением и обработкой данных? На вопрос можно ответить положительно с уч том того, что, управляя ресурсами компьютера, операционная система контролир> 6го основные функции. Однако это управление осуществляется не обычным образом* Ми обыкновенно представляем себе управляющий механизм как нечто внешнее по от ношению к тому, чем он управляет, или, по крайней мере, как нечто отличают ся dt управляемой системы или являющееся ее отдельной частью. Например, си Mfl этопления жилых помещений управляется термостатом, который реализован в иДе отдельного узла и отличается от аппаратуры выделения и распределения тепл • С шерационной системой дело обстоит по-другому, так как этот управляющий М va тизм является необычным в двух отношениях. • Функции операционной системы работают точно так же, как и все ост ь ное программное обеспечение; т.е. они реализованы в виде отдельных °" грамм или набора программ, исполняющихся процессором. 14 Часть 1. Основные поня \% 0Перационная система часто передает управление другим процессам и оЛясна ожидать, когда процессор снова позволит ей выполнять свои обя- -■ данности. Операционная система — это, по сути, набор компьютерных программ. Как ? бая ДРУгая программа, она отдает процессору команды. Ключевым отличи- * „—„,„ ->™« irnnmoMMu Пттрпйттипнняя система указывает поо- вчяется назначение этой программы. Операционная система указывает про- oDY. как использовать ДРУгие системные ресурсы и как распределять время !Ln исполнении других программ. Но для того, чтобы реализовать действия, писываемые операционной системой, процессор должен приостановить рабо- ней и перейти к выполнению других программ. Таким образом, операцион- система уступает управление процессору, чтобы он смог выполнить некото- «о ''полезную" работу, а затем возобновляет контроль ровно настолько, чтобы „готовить процессор к следующей части работы. Прочитав данную главу, чи- атель должен получить отчетливое представление о механизмах, принимающих участие в этих процессах. На рис. 2.2 показаны основные ресурсы, которыми управляет операционная система. Часть операционной системы находится в основной памяти. В эту часть входит ядро (kernel), содержащее основную часть наиболее часто используемых функций; там же находятся и некоторые другие компоненты операционной системы, использующиеся в данный момент времени. Остальная используемая часть основной памяти содержит другие программы и данные пользователя. Вскоре читатель сможет убедиться, что размещение этих данных в основной памяти управляется совместно операционной системой и аппаратной частью процессора, предназначенной для управления памятью. Операционная система принимает решение, когда исполняющаяся программа может использовать нужные ей устройства ввода-вывода, и управляет доступом к файлам и их использованием. Процессор также является ресурсом, поэтому операционная система должна определить, сколько времени он должен уделить исполнению той или иной пользовательской программы. В многопроцессорной системе решение должно быть принято по отношению ко всем процессорам. Возможность развития операционной системы Большинство операционных систем постоянно развиваются. Происходит это в силу следующих причин. * Обновленке и возникновение новых видов аппаратного обеспечения. Например, ранние версии операционных систем UNIX и OS/2 не использовали Механизмы страничной организации памяти, потому что они работали на Машинах, не обеспеченных соответствующими аппаратными средствами1. Более поздние версии операционных систем были доработаны таким образом, чтобы они могли использовать новые аппаратные возможности. Точно так же на устройство операционных систем повлияло использование графических терминалов и терминалов, работающих в страничном режиме, вместо алфавитно-цифровых терминалов с построчной разверткой. Такой тер- Краткое рассмотрение страничной организации памяти приведено в последую- „* Разделах данной главы; более подробно этот материал изложен в главе 7, пРавление памятью". ■р ^ава 2. Обзор операционных систем 85
ложениями в различных окнах эГп Г ^«временно с нескольк ^ — поддержи со -^^SS^LSZT-" ™£V Компьютерная система Устройства веода-еыеода :"» ""' Принтеры, "€t клавиатура -^ м°Демит.п. <, Ч'" к? ■:■■ Ь> $ ■Ф р Рис. 2.i?. Операционная система как диспетчер ресурсов к ^.jp у*.«. ifpvue Д • Новые сервисы. Для удовлетворения требований пользователей или нужд темных администраторов операционные системы предоставляют новые вощ • ности. Например, если станет трудно поддерживать высокую производит ь ность при работе с имеющимся на определенный момент инструмента^ пользователя, в операционную систему могут быть добавлены новые hhv менты для контроля и оценки производительности. Другой пример — од- держка новых приложений, использующих окна на экране дисплея. Эта можность потребовала значительного обновления операционной системы. 'у. Исправления. В каждой операционной системе есть ошибки. Время от в мени они обнаруживаются и исправляются. Конечно, в исправление мо т вкрасться новая ошибка... Необходимость регулярных изменений операционных систем накладывает О еленные требования на их устройство. Очевидно, что эти системы должны им ^ ульную конструкцию с четко определенным взаимодействием модулей; очеч ную роль играет хорошая и полная документированность. Для больших про ш, которыми на сегодняшний день являются типичные операционные систем «таточно выполнить то, что называется непосредственной модуляризацй, Часть 1. Основны е поняти VttfgOa] — нужно сделать нечто большее, чем простая разбивка целой программы пьные подпрограммы. В данной главе мы вернемся к этому вопросу. - фрР- "эволюция операционных систем Пытаясь понять основные требования, предъявляемые к операционным систе- также значение основных возможностей современных операционных систем, '.1*аМ' я0 проследить за их эволюцией, происходившей на протяжении многих лет. Последовательная обработка данных В самых первых компьютерах, в период от конца 40-х до средины 50-х го- * поограммы непосредственно взаимодействовали с аппаратным обеспечением ^ тины; операционных систем в то время еще не было. Эти компьютеры управ- ;? ялись с пульта управления, состоящего из сигнальных ламп, тумблеров, некоторого устройства для ввода данных и принтера. Программы, машинные коды и паяные загружались через устройство ввода данных (например, устройство ввода с перфокарт). Если из-за ошибки происходил останов программы, о возникнове- ...' Яии сбойной ситуации свидетельствовали аварийные сигнальные лампы. Чтобы ^ определить причину ошибки, программист должен был проверить состояние ре- * гистров процессора и основной памяти. Если программа успешно завершала \ свою работу, ее выходные данные распечатывались на принтере. Ранние системы имели две основные проблемы. • Расписание работы. На большинстве машин нужно было предварительно заказать машинное время, записавшись в специальный график. Обычно пользователь мог заказать время, кратное некоторому периоду, например, получасу. Тогда, записавшись на 1 час, он мог закончить работу за 45 минут, что приводило к простою компьютера. С другой стороны, если пользователь не укладывался в отведенное время, он должен был прекращать работу, прежде чем задача завершит выполнение. • Время подготовки к работе. Для запуска каждой программы, называемой заданием (job), нужно было загрузить в память компилятор и саму программу, обычно составленную на языке высокого уровня (исходный текст), сохранить скомпилированную программу (объектный код), а затем загрузить и скомпоновать объектный код с библиотечными функциями. Для каждого из этих этапов могли понадобиться установка и съем магнитных лент или загрузка колоды перфокарт. При возникновении фатальной ошибки беспомощному пользователю не оставалось ничего другого, как начинать весь подготовительный процесс заново. Таким образом, значительное время затрачивалось лишь на то, чтобы подготовить программу к собственно исполнению. Такой режим работы можно назвать последовательной обработкой данных. То название отражает тот факт, что пользовательские программы исполнялись компьютере последовательно. Спустя некоторое время в попытке повысить Ффективность последовательной обработки были разработаны различные сис- е-Мные инструменты. К ним относятся библиотеки функций, редакторы связей, агРузчики, отладчики и драйверы ввода-вывода, существующие в виде про- Рзммного обеспечения, общедоступного для всех пользователей. лава 2. Обзор операционных систем 87
Простые пакетные системы *' Первые машины были очень дорогими, поэтому было важно использова ь ь как можно эффективнее. Простои, происходившие из-за несогласованности р*спц ния, а также время, затраченное на подготовку задачи, — все это обходилось ц ком дорого; эти непроизводительные затраты были непозволительной роскошью^ Чтобы повысить эффективность работы, была предложена концепция п ' 0* шерационной системы. Похоже, первые пакетные операционные системы (и ш первые операционные системы какого бы то ни было типа) были разработаны Ц1не 50-х годов в компании General Motors для машин IBM 701 [WEIZ81]. Вп ь явии эта концепция была усовершенствована и внедрена определенным кругом юльзователей на IBM 704. В начале 60-х годов некоторые поставщики разработали 1акетные операционные системы для своих компьютеров. Одной из заметных с" ^ чэго времени является IBSYS фирмы IBM, разработанная для компыо ров '090/7094 и оказавшая значительное влияние на другие системы. \ Главная идея, лежащая в основе простых пакетных схем обработки, со тоит i использовании программы, известной под названием монитор (monitor)!.' Ис- гользуя операционную систему такого типа, пользователь не имеет непоср дет- енного доступа к машине. Вместо этого он передает свое задание на перфок р. ах или магнитной ленте оператору компьютера, который собирает разные * а- :ия в пакеты и помещает их в устройство ввода данных. Так они перед ются [онитору. Каждая программа составлена таким образом, что при завершен} и ее аботы управление переходит к монитору, который автоматически загру ьает ледующую программу. ^ Чтобы понять работу этой схемы, рассмотрим ее с точки зрения монито а и роцессора. ■£ • Работа схемы с точки зрения монитора. Монитор управляет послед ва- тельностью событий. Чтобы это было возможно, большая его ч сть должна всегда находиться в основной памяти и быть готовой к ра оте (рис. 2.3). Эту часть монитора называют резидентным монитором. 0с тавшуюся часть составляют утилиты и общие функции, которые загру жаются в виде подпрограмм, вызываемых программой пользовате я в начале выполнения каждого задания (если они для него требуются). Монитор считывает с устройства ввода данных (обычно это устро ство ввода с перфокарт или магнитная лента) по одному заданию. При этом текущее задание размещается в области памяти, предназначенной ля программ пользователя, и ему передается управление. По завершении задания оно возвращает управление монитору, который сразу же н чи- нает считывать следующее задание. Результат исполнения каждого, з ■ Дания направляется на устройство вывода, например принтер. ^ • Работа схемы с точки зрения процессора. Допустим, в некоторый мо времени процессор исполняет команды, которые находятся в той части новной памяти, которую занимает монитор. Это приводит к тому, ч Другую область памяти считывается новое задание. После того как зад " полностью считано, монитор отдает процессору команду перехода, по к. торой он должен начать исполнение программы пользователя. Процессор * реходит к обработке программы пользователя и выполняет ее команды Д тех пор, пока не дойдет до конца или пока не возникнет сбойная ситуац &• т с- \ Часть 1. Основные поняти vtl В любом из этих двух случаев следующей командой, которую процессор извлечет из памяти, будет команда монитора. Таким образом, фраза "контроль передается заданию" означает, что процессор перешел к извлечению и выполнению команд программы пользователя. Фраза же "контроль возвращается монитору" означает, что теперь процессор извлекает из памяти и выполняет команды монитора. Монитор Граница монитора Обработка прерываний Драйверы устройств Обработка последовательности заданий Интерпретатор . языка управления Область программ пользователей Рис. 2.3. Схема размещения резидентного монитора в памяти Как видите, монитор решает проблему разработки графика. Задания в пакетах выстраиваются в очередь и выполняются без простоев настолько быстро, насколько это возможно. Кроме того, монитор помогает в подготовке программы к исполнению. В каждое задание включаются простые команды языка управления заданиями (job control language — JCL). Это специальный тип языка программирования, используемый для того, чтобы отдавать команды монитору. Рассмотрим простой пример, в котором нужно принять на обработку программу пользователя, составленную на языке FORTRAN, и дополнительные данные, используемые этой программой. Все команды языка FORTRAN и данные находятся на отдельных перфокартах или в отдельных записях на магнитной ленте. Каждое задание, кроме операторов языка FORTRAN и данных, содержит команды управления заданием, каждая из которых начинается знаком $. Формат задания в целом выглядит следующим образом: 5 JOB SFTN .1 [инструкции FORTRAN $L0AD Гл ава 2. Обзор операционных систем 89
■ данные } я л $END a Чтобы выполнить это задание, монитор читает строку $FTN и загружает fc щ. минающего устройства большой емкости (обычно это лента) компилятор с .* , вующего языка. Компилятор преобразует программу пользователя в объектный ко который записывается в память или на запоминающее устройство. Если этот код за носится в память, то операция называется "компиляция, загрузка и запуск". Ее, же он записывается на магнитную ленту, то нужна дополнительная команда $ Монитор, к которому вернулось управление после компиляции, читает эту ко ад- и обращается к загрузчику, который загружает объектную программу в паи (ц. место компилятора) и передает ей управление. В таком режиме различные пойсис! мы совместно используют один и тот же участок основной памяти, хотя в ; - ы момент времени работает только одна из этих подсистем. £& Во время выполнения программы пользователя по каждой команд©* ввод считывается только одна строка данных. Команда ввода программы поль- овате- ля обращается к подпрограмме ввода, которая является составной частью, пера ционной системы. Подпрограмма ввода проверяет, не произошло ли случайное считывание строки языка JCL. Если это произошло, управление передав я монитору. При успешном (или неудачном) завершении задания пользователя мони тор проверяет строки задания, пока не дойдет до строки с командой на/язьл управления, что защищает систему от программ, в которых оказалось с* шком много или слишком мало строк с данными (иначе очередным задание^мопи оказаться излишние данные предыдущего задания, или часть нового ания могла бы рассматриваться как недостающие данные предыдущего задания' Таким образом, монитор, или пакетная операционная система, — эти обычная компьютерная программа. Ее работа основана на способности проц ссора выбирать команды из различных областей основной памяти; при этом п исхо дит передача и возврат управления. Желательно также использование и. ^уги возможностей аппаратного обеспечения. ■?§ .* • Защита памяти. Во время работы программы пользователя она не олжна вносить изменения в область памяти, в которой находится монито Если же такая попытка предпринята, аппаратное обеспечение процессора олжно обнаружить ошибку и передать управление монитору. Затем монитор снимет задачу с выполнения, распечатает сообщение об ошибке и загруз т cie- дующее задание. • Таймер. Таймер используется для того, чтобы предотвратить ситуац но, ко гда одна задача захватит безраздельный контроль над системой. Таймер выставляется в начале каждого задания. По истечении определенного промежутка времени программа пользователя останавливается и управление передается монитору. • Привилегированные команды. Некоторые команды машинного оВ& имеют повышенные привилегии и могут исполняться только мой °Р°" ' Если процессор натолкнется на такую команду во время исполнен» п™ граммы пользователя, возникнет ошибка, при которой управление буД передано монитору. В число привилегированных команд входят к - aS^ 90 Часть 1. Основные п яТ ввода-вывода; это значит, что все устройства ввода-вывода контролируются монитором. Это, например, предотвращает случайное чтение программой пользователя команд управления, относящихся к следующему заданию. Если программе пользователя нужно произвести ввод-вывод она должна запросить для выполнения этих операций монитор. Прерывания. В первых моделях компьютеров этой возможности не было. Она придает операционной системе большую гибкость при передаче управления программе пользователя и его возобновлении. Конечно, операционную систему можно разработать и без учета описанных ; tiuie возможностей. Однако поставщики компьютеров скоро поняли, что это 0ведет к хаосу, поэтому даже сравнительно простые пакетные операционные ' сйстемы обращались к таким возможностям аппаратного обеспечения. При работе пакетных операционных систем машинное время распределялось между исполнением программы пользователя и монитора. При этом в жертву приносились два вида ресурсов: монитор занимал некоторую часть оперативной памяти, им же потреблялось некоторое машинное время. И то и другое приводило к непроизводительным издержкам. Несмотря на это, простые пакетные системы существенно повышали эффективность использования компьютера. Многозадачные пакетные системы Процессору часто приходилось простаивать даже при автоматическом вы- ; полнении заданий под управлением простой пакетной операционной системы. Проблема заключается в том, что устройства ввода-вывода работают намного медленнее, чем процессор. На рис. 2.4 представлены соответствующие расчеты, • выполненные для программы, которая обрабатывает файл с записями, причем для обработки одной записи требуется в среднем 100 машинных команд. В этом примере 96% всего времени процессор ждет, пока устройства ввода-вывода закончат передачу данных в файл и из него. На рис. 2.5,а показана такая ситуация для одной программы. Некоторое время процессор исполняет команды; затем, дойдя до команды ввода-вывода, он должен подождать, пока она не закон- - чится. Только после этого процессор сможет продолжить работу. ' Чтение одной записи из файла 0.0015 s Выполнение 100 машинных команд 0.0001 s Внесение одной записи в файл 0.0015 s Всего 0.0031 s 0.0001 nMr% no/w Степень использования процессора = = 0.032 = 3.2% 0.0031 Рис. 2.4. Пример использования системы \ Эффективность использования процессора можно повысить. Мы знаем, что , амятц должно хватить, чтобы разместить в ней операционную систему ■ 3иДентный монитор) и программу пользователя. Представим, что в памяти Паточно места для операционной системы и двух программ пользователя. Те- ' v ^Ь' к°гда одно из заданий ждет завершения операций ввода-вывода, процессор j >Кет переключиться на другое задание, для которого в данный момент ввод- В°Д, скорее всего, не требуется (рис. 2.5,6). Более того, если памяти достаточ- ■-I :- ава 2. Обзор операционных систем 91
'*ХЧ»«Ф?.'» но для размещения большего количества программ, то процессор может вь* нять их параллельно, переключаясь с одной на другую (рис. 2.5,в). Такой реэ : известен как многозадачность (multiprogramming) и является основной че То современных операционных систем. -1 . Программа А Работа Время Ожидание Работа а) Однозадачность Ожидание Работа Программа А Программа В Ожидание | Работа Ожидание Ожидание Работа I Работе! Ожидание Ожидание Совместная работа Работа А Работа ■ щ Время Ожидание Работа А Работа В , б) Многозадачность — две программы Ожидание л: Программа А Работа Ожидание Работа Программа В Ожидание Работа Ожидание Работа Программа С Совместная работа Ожидание Работа У/// Ожидание Ожидание Ожидание V7A Работа' Ожидание Работа А Работа .Работа^ . С ■ Ожидание Работа А Работа В Работа ' с л Ожидание ?:, Время ». в) Многозадачность — три программы ,'. Рис. 2.5. Пример многозадачности Приведем простой пример, иллюстрирующий преимущества многозада о ста. Рассмотрим компьютер, имеющий 256 К слов памяти, не используе операционной системой, диск, терминал и принтер. На обработку одновреме н 92 Часть 1. Основные поня i «сняты три программы, JOB1, JOB2 и JOB3, атрибуты которых перечислены в бл- 2.1- Предположим, что для выполнения заданий JOB2 и JOB3 использова- V е процессора минимально, и задание JOB3 постоянно обращается к диску и >"* йнтеру- В простой среде с пакетной обработкой эти задания выполняются по- яовательно. Для завершения JOB1 требуется 5 мин. Задание JOB2 должно ать, пока пройдут эти 5 мин, после чего оно выполняется в течение 15 мин. п истечении 20 мин начинает работу задание JOB3; его выполнение заканчива- через 30 мин после того, как оно было принято на обработку. Средний про- 6 нт использования ресурсов, производительность и время отклика показаны в олбце табл. 2.2, соответствующем однозадачности, а на рис. 2.6,а показано ис- ользование различных устройств в этом режиме. Очевидно, что эффективность использования всех ресурсов, усредненная по всему периоду времени (30 мин), является крайне низкой. Таблица 2.1. Свойства трех программ-примеров JOB1 JOB2 JOB3 Ткп задания Продолжительность Требуемая память Требуется ли диск Требуется ли терминал Требуется ли принтер Интенсивные вычисления 5 мин 50 К Нет Нет Нет Интенсивный ввод-вывод 15 мин 100 К Нет Да Нет Интенсивный ввод-вывод 10 мин 80 К Да Нет Да Таблица 2.2. Влияние многозадачности на использование ресурсов Однозадачность Многозадачность Использование процессора 22% Использование памяти Использование диска Использование принтера Затраченное время Производительность Среднее время отклика 30% 33% 33% 30 мин 6 заданий/час 18 мин 43% 67% 67% 67% 15 мин 12 заданий/час 10 мин Теперь предположим, что задания выполняются одновременно под управлением многозадачной операционной системы. Из-за того что они используют разные ресурсы, их совместное выполнение на компьютере длится минимальное Ремя (при условии, что заданиям JOB2 и JOB3 предоставляется достаточно Роцессорного времени для поддержки осуществляемого ими ввода и вывода в тивном состоянии). Для выполнения задания JOB1 потребуется 5 мин, но к °Щ времени задание JOB2 будет выполнено на треть, а задание JOB3 — на ловину. Все три задания будут выполнены через 15 мин. Если посмотреть на °лбец табл. 2.2, соответствующий многозадачному режиму, его преимущества нУт очевидны, как и из гистограммы, приведенной на рис. 2.6,6. ав& 2. Обзор операционных систем 93
г Процессор Память ■-.&!■■ * * 1 --■■■■•«- у; ■■-■■»,.- " J-1t«%. ^M&s^S- 0% 100% 0% 100% Процессор Память .г": iff •V ■ ^w -?S ■ РРРД Диск Терминал Принтер 0% 1-100% ■0% 100% Диск Терминал Принтер 0% Выполнение J0B1 JOB2 заданий I i i l _L JOB3 1 30 10 15 20 25 Минуты а) Однозадачность Рис. 2.6. Гистограммы использования ресурсов Выполнение JOB1 заданий JOB3 1"-' 10 Щ 15 Минуты б) Многозадачность Работа многозадачной пакетной системы, как и работа простой пакета системы, базируется на некоторых аппаратных особенностях компьютера. Наиболее значительными дополнениями, полезными для многозадачности, явд тся аппаратное обеспечение, поддерживающее прерывания ввода-вывода, и яыо доступ к памяти. Используя эти возможности, процессор генерирует # ан_, ввода-вывода для одного задания и переходит к другому на то время, по троллером устройства выполняется ввод-вывод. После завершения опер да-вывода процессор получает прерывание, и управление передается прОЕ обработки прерываний из состава операционной системы. Затем операхЩ система передает управление другому заданию. М Многозадачные операционные системы сложнее систем последова обработки заданий. Для того чтобы можно было обрабатывать несколько ний одновременно, они должны находиться в основной памяти, а для этого буется система управления памятью. Кроме того, если к работе готовы с о ь ко заданий, процессор должен решить, какое из них следует запустить, д необходим некоторый алгоритм планирования. Эти концепции обсужда следующих разделах данной главы. -# Системы, работающие в режиме разделения времени J Использование многозадачности в пакетной обработке может привё существенному повышению эффективности. Однако для многих заданий тельно обеспечить такой режим, в котором пользователь мог бы непосредс кон- в м е н ьво ада- че! 94 Часть 1. Основные по т ^'^действовать с компьютером. В самом деле, во многих случаях интерак- - »лй режим является обязательным условием работы. "' Многозадачность не только позволяет процессору одновременно обрабаты- несколько заданий в пакетном режиме, но может быть использована и для в*ТЬбоТкИ нескольких интерактивных заданий. Такую организацию называют Р пением времени, потому что процессорное время распределяется между I** ичными пользователями. В системе разделения времени несколько пользо- ^^ лей одновременно получают доступ к системе с помощью терминалов, а опе- ' ** онная система чередует исполнение программ каждого пользователя через ые промежутки времени. Таким образом, если нужно одновременно обслу- " ^ п пользователей, каждому из них предоставляется лишь 1/л часть полной пости компьютера, не считая затрат на работу операционной системы. Однако инимая во внимание относительно медленную реакцию человека, время от- ика на компьютере с хорошо настроенной системой будет сравнимо со временем реакции пользователя. Как пакетная обработка, так и разделение времени используют многозадачность. Основные отличия этих двух режимов перечислены в табл. 2.3. , Таблица 2.3. Пакетная многозадачность и разделение времени Пакетная многозадачность Разделение времени * Основная цель Максимальное использова- Уменьшение времени отклика t ние процессора Источник указаний Команды языка управления Команды, вводимые с терминала <: операционной заданиями, помещаемые в ] системе задание Одной из первых операционных систем разделения времени была система : CTSS (Compatible Time-Sharing System) [CORB62], разработанная 11 Массачусетсом технологическом институте группой, известной как Project MAC. Первоначально система была разработана для IBM 709, а затем перенесена на IBM 7094. По сравнению с более поздними системами, CTSS была довольно примитивна. Она работала на машине с основной памятью емкостью 32000 36-битовых слов, из которых 5000 слов занимал монитор. Когда управление должно было быть передано очередному интерактивному пользователю, его программа и данные загружались в остальные 27000 слов основной памяти. Программа всегда загружалась так, что ее начало находилось в ячейке номер 5000, что упрощало управление как монитором, Так и памятью. Приблизительно через каждые 0.2 с системные часы генерировали Ч^Рьшание. При каждом прерывании таймера управление передавалось операцион- ои системе, и процессор мог перейти в распоряжение другого пользователя. Таким Разом, данные текущего пользователя через регулярные интервалы времени вы- РУЖались, а вместо них загружались другие. Перед считыванием программы и дан- Нового пользователя программа и данные предыдущего пользователя записыва- на диск для сохранения до дальнейшего выполнения. Впоследствии, когда оче- этого пользователя наступит снова, код и данные его программы будут тановлены в основной памяти. ■ *и обы Уменьшить обмен с диском, содержимое памяти, занимаемое данны- ' 5ой ^>Льзователя, записывается на него лишь в том случае, если для загрузки Программы не хватает места. Этот принцип проиллюстрирован на рис. 2.7. а 2. Обзор операционных систем 95
Предположим, что всего работает четырейщльзователя, которым нужн дующие объемы памяти: и. • JOB1 • J0B2 • JOB3 • J0B4 15000 20000 5000 10000 « 32000 а) О 5000 25DD0 32000 Монитор JOB 2 777777777, /Свободная память^ б) О 5000 10000 25000 32000 Монитор. JOBa': (JOB 2k Свободнаяпз ят в) V 0 5000 20000 25000 32000 Монитор J0B1 (JOB 2) 777777777+ ^Свободная память^ 0 5000 15000 20000 25000 32000 Монитор JOB 4 (JOB1) [JOB 2) ////////// /Свободная память/ \sss7ssssA Д) Рис. 2.7. Работа CTSS 0 5000 Монитор 25000 32000 JOB 2 Свобо ная е) ■& ть Сначала монитор загружает задание JOB1 и передает ему управле (<* Затем он принимает решение передать управление заданию JOB2. Из-за; or что JOB2 занимает больше памяти, чем JOB1, сначала нужно сохранить Д JOB1, а затем можно загружать JOB2 (б). Затем для обработки загр JOB3. Но поскольку это задание меньше, чем JOB2, часть задания JOB2 о е оставаться в основной памяти, сокращая время записи на диск (в). Позже, он тор вновь передает управление заданию JOB1. Чтобы загрузить его в памя# ♦ в диск необходимо записать еще часть задания JOB2 (г). При загрузке JOB4 в памяти остается часть заданий JOB1 и JOB2 (д). Если теперь будет, к визировано задание JOB1 или JOB2, то потребуется лишь частичная его 3 Р ка. Следующим в этом примере запускается задание JOB2. Для этого требЗГ тс чтобы JOB4 и оставшаяся в памяти часть JOB1 были записаны на диск, ^ п мять была считана недостающая часть JOB2. { Подход CTSS по сравнению с современными принципами разделения е ни является примитивным, но вполне работоспособным. Его простота поз i использовать монитор минимальных размеров. Из-за того что задание всег а 96 Часть 1. Основные по далось в одно и то же место в памяти, не было необходимости применять во : „еМЯ загрузки методы перемещения (которые рассматриваются позже). Необхо- «М был лишь метод записи, позволяющий уменьшить активность диска. Рабо- « на. машине 7094, CTSS могла обслуживать до 32 пользователей. С появлением разделения времени и многозадачности перед создателями опера- 0яных систем появилось много проблем. Если в памяти находится несколько за- яяйй, их нужно защищать друг от друга, иначе одно задание может, например, из- лить данные другого задания. Если в интерактивном режиме работают несколько льзователей, то файловая система должна быть защищена, чтобы к каждому кон- оетному файлу доступ был только у определенных пользователей. Нужно разре- тать конфликтные ситуации, возникающие при работе с различными ресурсами, например с принтером и устройствами хранения данных. Нами будут рассмотрены ати и Другие возможные проблемы, а также пути их решения. - :3?ОСНОВНЫЕ ДОСТИЖЕНИЯ % чШ&. ,««$ Операционные системы относят к числу самых сложных программ. В этом проявляется стремление их разработчиков сделать системы такими, чтобы они удовлетворяли требованиям удобства и эффективности и при этом не утратили способности к развитию. Согласно [DENN80a], в процессе развития операционных систем были проведены исследования в пяти основных направлениях. • Процессы. • Управление памятью. • Защита информации и безопасность. • Планирование и управление ресурсами. • Структура системы. Каждое из этих направлений можно охарактеризовать наборов абстрактных принципов, разработанных для решения сложных прикладных задач. В основном развитие современных операционных систем также происходит по пяти перечисленным выше направлениям. Краткий их обзор, приведенный в этом разделе, поможет читателю получить представление о содержании большей части настоящей книги. Процессы Одной из основополагающих концепций, помогающих понять структуру операционных систем, является концепция процессов. Этот термин впервые был применен х годах разработчиками операционной системы Multics [DALE68] и с тех пор ^^фоко используется. Есть много определений термина "процесс", в том числе: выполняющаяся программа; экземпляр программы, выполняющейся на компьютере; "Ъект, который можно идентифицировать и выполнять на процессоре; Диница активности, которую можно охарактеризовать единой цепочкой оследовательных действий, текущим состоянием и связанным с ней набором системных ресурсов. Mbbl 2. Обзор операционных систем 97
Данная концепция станет более понятной по таере освоения материала В процессе развития компьютерных систем при решении проблем, д3а ных с распределением времени и синхронизацией, был сделан определ цн. вклад в развитие концепции процесса: разработаны системы групповой об ^ ки нескольких программ, разделения времени и транзакций в реальном^ ел, ни. Как мы уже могли убедиться, многозадачный режим дает возможное д.. цессору и устройствам ввода-вывода работать одновременно, повышая тем, с m^v эффективность использования компьютерной системы. При этом испольа етг механизм, принцип работы которого заключается в следующем: в ответ и сиг налы, свидетельствующие о завершении транзакций ввода-вывода, процес ор пе реключается с одной программы на другую (при условии, что в оперативна t Па мять одновременно загружено несколько программ). =•?»* Другим направлением развития являются системы разделения времен . <v новная цель их разработки — удовлетворение потребностей каждого пол~~^ вате- ля при условии их одновременной работы. В этих системах используе тот факт, что пользователь реагирует на события намного медленнее, чем ко тьютер. К примеру, если потребность пользователя во времени процессора для бра- ботки его действий в среднем составляет 2 с в течение 1 мин, то одной и й же системой, не мешая друг другу, могут пользоваться до 30 пользователей. неч- но же, в таких расчетах нужно учитывать время, которое требуется для р<шоты самой операционной системы. f!* Еще одним важным направлением развития являются системы обр отки транзакций в реальном времени. При работе таких систем некоторое число пользователей отправляют запросы в базу данных или вносят в нее изменения»-; Пример — система бронирования авиабилетов. Основное различие между сист мой обработки транзакций и системой разделения времени состоит в том, что. первой из них выполняются одно-два приложения, в то время как пользо тели системы с разделением времени могут заниматься разработкой программ, ап>с- кать их и пользоваться многими различными приложениями. В обоих ел 1аях ключевым фактором является время отклика системы. v| Прерывание было важным инструментом, который стал доступен систе ым программистам еще на ранних стадиях развития многозадачных и многопо ва- тельских интерактивных систем. Выполнение любого задания может быть п * ано при наступлении определенного события, например завершения ввода-вывоДйЙ При этом процессор должен сохранить определенную информацию (такую, как сод яримое программного счетчика, общих и системных регистров) и переключиться-; выполнение программы обработки прерываний, которая выясняет природу пре ыва- ния, обрабатывает его, а затем возобновляет исполнение одного из заданий. -.^' Устройство системного программного обеспечения, координирующего подобные процессы, оказалось очень сложным. При одновременной обработке': s0* гих заданий, каждое из которых включает в себя длинную последователе сТЬ действий, нельзя проанализировать все возможные комбинации последов» лЬ ностей событий. Ввиду отсутствия систематических средств обеспечения ко Ди" нации и взаимодействия разных видов деятельности систем программисты ir Pa тились к специальным методам, основанным на представлении о той среде. Р8 боту которой должна контролировать операционная система. При этом °& подвергались риску допустить трудноуловимые ошибки, которые прояв только в очень редких случаях, при выполнении определенных последоват г о- "8 Часть 1. Основные пон г* событий. Такие ошибки трудно обнаружить, потому что их нужно отличить -днбок в приложениях и ошибок, возникающих при сбоях аппаратного обес- едия. Еще одной особенностью, затрудняющей определение причины этих ибок (когда они обнаружены), является то, что воспроизвести точные усло- Jr в которых эти ошибки проявляются, крайне трудно. Ниже перечислены ос- * яые причины подобных ошибок [DENN80a]. Неправильная синхронизация. Часто случается так, что программа должна приостановить свою работу и ожидать наступления какого-то события в системе. Например, программа, которая начала операцию ввода-вывода, не сможет продолжать работу, пока в буфере не будут доступны необходимые ей данные. Б этом случае требуется передача сигнала от какой-то другой программы. Недостаточная надежность сигнального механизма может привести к тому, что сигнал будет потерян или что будет получено два таких сигнала. т Сбой взаимного исключения. Часто один и тот же совместно используемый ресурс одновременно пытаются использовать несколько пользователей или несколько программ. Например, в системе бронирования авиабилетов два пользователя могут запросить доступ к базе данных и при наличии свободных мест изменить ее, забронировав билеты. Если этот доступ не контролируется должным образом, возможно возникновение ошибок. Для корректной работы требуется некоторый механизм взаимного исключения, позволяющий в каждый момент времени выполнять транзакцию только одной программе. Правильность реализации такого взаимного исключения при всех возможных последовательностях событий крайне трудно проверить. • Недетерминированное поведение программы. Результат работы каждой программы обычно должен зависеть только от ее ввода и не должен зависеть от работы других программ, выполняющихся в этой же системе. Однако в условиях совместного использования памяти и процессора программы могут влиять на работу друг друга, переписывая общие области памяти непредсказуемым образом. При этом результат работы программ может зависеть от порядка, в котором они выполняются. • Взаимоблокировки. Возможны ситуации, в которых две или большее число программ зависают, ожидая действий друг друга. Например, двум программам может понадобиться, чтобы устройства ввода-вывода выполнили некоторую операцию (например, копирование с диска на магнитную ленту). Одна из этих программ осуществляет управление одним из устройств, а другая — другим. Каждая из них ждет, пока другая программа освободит нужный ресурс. Выйти из такой тупиковой ситуации может помочь система распределения ресурсов. Для решения перечисленных проблем нужен систематический метод, основный на слежении за различными выполняющимися процессором программа- и Управлении ими. В основе такого метода лежит концепция процесса. Мыс- Но процесс можно разделить на три компонента. Выполняющаяся программа. Данные, нужные для ее работы (переменные, рабочее пространство, буферы и т.д.). контекст выполнения программы. j & 2. Обзор операционных систем 99
Последний элемент является очень важным. Контекст выполнения ( jc Cu context), или состояние процесса (process state), включает в себя всю инфо , нужную операционной системе для управления процессом, и процессору -* 1я выполнения. Данные, характеризующие это состояние, включают в себя со ^ различных регистров процессора, таких, как программный счетчик и реги ы * , ных. Сюда же входит информация, использующаяся операционной системой та как приоритет процесса и сведения о том, находится ли данный процесс в с ' ожидания какого-то события, связанного с вводом-выводом. % На рис. 2.8 показан пример реализации процессов. Два процесса, А и ft находятся в различных областях основной памяти. Другими словами, к дом процессу отведен блок памяти, в котором содержатся код программы,- аннь и информация о состоянии процесса. Каждый процесс заносится в список по* цессов, который создается и поддерживается операционной системой; Част этого списка, соответствующая определенному процессу, содержит ук затеп размещения этого процесса в памяти. Кроме того, сюда же частично и. и по- ностью может входить и информация о состоянии процесса. Остальныеаннь могут храниться в самом процессе. В регистре индекса процесса соде'''нсит~- индекс выполняющегося в текущий момент времени процесса, иде филирующий его в списке процессов. Содержимое программного счетчика указывает на очередную инструкцию, которую нужно выполнить. Базовый и■-' * аннч- ный регистры задают область памяти, занимаемую процессом. В базоый pt гистр заносится адрес начальной ячейки этой области, а в граничны — е* размер (в байтах или словах). Содержимое программного счетчика иве х ссы лок на данные отсчитываетея от значения базового регистра; по своей- личг не эти ссылки не могут превосходить значение граничного регистра .( то защищает процессы от воздействия друг на друга). f^ Регистр индекса процесса, изображенный на рис. 2.8, указыв т, чт выполняется процесс В. До этого выполнялся процесс А, но он ър менн прерван. Содержимое всех регистров в момент прекращения этого Ц цесс записано в виде данных о состоянии процесса. Впоследствии опера онная система сможет вернуться к выполнению процесса А; при этом буде сохранен контекст выполнения процесса В и восстановлен контекст вып ненн процесса А. Когда в программный счетчик загружается значение, yic* ыва1- щее на область кода программы процесса А, автоматически возобнр чяетс выполнение этого процесса. й Таким образом, процесс реализуется в виде структуры данных»-?.Он может выполняться или находиться в состоянии ожидания. Состояние процесс в каждый момент времени заносится в специально отведенную обла.с ь Да ных. Использование структуры Позволяет развивать мощные методы КрорД нации и взаимодействия процессов. В рамках операционной систем.^ на нове данных о состоянии процесса путем их расширения и добавленй в й дополнительной информации о процессе можно разрабатывать нов е в можности операционных систем. При чтении книги нам встретится м 9&е во примеров использования описанной структуры в решении задач.*) возв кающих при разработке многозадачных и многопользовательских оп РаЯ онных систем. " ^ ЮО Часть 1. Основные п я Основная память Список процессов ьЬ ш Процесс А *Ь Процесс В :КонГвйП?г. фетра *оте*ст5; Дайные Код програмцы Регистры процессора Индекс | ,) процесса Программный L счетчик Базовый регистр Граничный регистр 2 1 Другие _ регистры"] Рис. 2.8. Типичная реализация процессов Управление памятью Лучше всего потребности пользователя удовлетворяются вычислительной средой, поддерживающей модульное программирование и гибкое использование Данных. Нужно обеспечить эффективный и систематичный контроль над размещением данных в запоминающем устройстве со стороны управляющих программ операционной системы. Исходя из сформулированных требований, операционная система должна выполнять такие функции. • Изоляция процессов. Операционная система должна следить за тем, чтобы ни один из независимых процессов не смог изменить содержимое памяти, отведенное другому процессу, и наоборот. Автоматическое размещение и управление. Программы должны динамически размещаться в памяти в соответствии с определенными требованиями. Распределение памяти должно быть прозрачным для программиста. Таким образом, программист будет избавлен от необходимости следить за ограничениями, связанными с конечностью памяти, а операционная система повышает эффективность работы вычислительной системы, выделяя заданиям т°лько тот объем памяти, который им необходим. , Ва 2. Обзор операционных систем 101
• Поддержка модульного программирования. Программист должен; имет возможность определять модули программы, а также динамически Со давать, уничтожать и изменять их размер. • Защита и контроль доступа. При совместном использовании памяти на к :д0Л( ее иерархическом уровне есть вероятность, что одна программа обрати я V. пространству памяти другой программы. Такая возможность может п юд0 биться, если она заложена в принцип работы данного приложения. С угой стороны, это угроза целостности программ и самой операционной си ■ мы Операционная система должна следить за тем, каким образом различные о чь зователи могут осуществлять доступ к различным областям памяти. •■'*/ • Долгосрочное хранение. Многим приложениям требуются средства, помощью которых можно было бы хранить информацию в течение дли ьно- го периода времени после выключения компьютера. f i' Обычно операционные системы выполняют эти требования с пом > цью средств виртуальной памяти и файловой системы. Файловая система обес ечи- вает долгосрочное хранение информации, помещаемой в именованные оъек- ты, которые называются файлами. Файл — это удобная для широкого испочь- зования структура данных, доступ к которой и ее защита осуществляются операционной системой. Виртуальная память — это устройство, позволяющее программистам рассматривать память с логической точки зрения, не заботясь о наличии !че- ской памяти достаточного объема. Принципы работы с виртуальной паМ тью были разработаны, чтобы задания нескольких пользователей, выполняя параллельно, могли одновременно присутствовать в основной памяти. При, пкой организации процессов нет задержки между их выполнением: как только один из процессов заносится на вспомогательное запоминающее устройство, сч тыва- ется следующий процесс. Из-за различий в количестве памяти, требующемс для разных процессов, при переключении процессора с одного процесса на угой трудно компактно разместить их в основной памяти. Поэтому были разра ртяны системы со страничной организацией памяти, при которой процесс разби тся на блоки фиксированного размера, которые называются страницами. ОбраЩ ние программы к слову памяти происходит по виртуальному адресу (virtual ad г ss), который состоит из номера страницы и смещения относительно ее начала? Страницы одного и того же процесса могут быть разбросаны по всей основной. П мЯ" ти. Система разбивки на страницы обеспечивает динамическое соответстви между виртуальным адресом, использующимся программой, и реальным (rt? 1 а"- dress), или физическим, адресом основной памяти. \ Следующим логическим шагом развития в этом направлении (при на* ичии аппаратного обеспечения, позволяющего выполнять динамическое отобр , ,,ue' было исключение требования, чтобы все страницы процесса одновременно °х°" дились в основной памяти; достаточно, чтобы все они хранились на дис ■ °° время выполнения процесса только некоторые его страницы находятся в ноВ' ной памяти. Если программа обращается к странице, которая там отсутс. >е" аппаратное обеспечение, управляющее памятью, обнаружит это и организм т за] грузку недостающих страниц. Такая схема называется виртуальной пам т 1°' она проиллюстрирована на рис. 2.9. I 102 Часть 1. Основные пой; т * л А1 В.О В.4 А.0 А5 В.1 А.9 В.5 А.2 В.2 А.7 А.8 В.6 В.З Основная память Основная память состоит из кадров фиксированной длины, равной размеру страницы. Для работы программы все ее страницы или некоторые из них должны находиться в основной памяти. 10 Программа В Программа А Диск Во вторичной памяти может храниться большое количество страниц фиксированной длины. Страницы программ и операционной системы хранятся на диске в формате, поддерживаемом операционной системой. Рис. 2.9. Концепция виртуальной памяти Аппаратное обеспечение процессора вместе с операционной системой предоставляют пользователю "виртуальный процессор", который имеет доступ к ВиРтуальной памяти. Это хранилище может быть организовано в виде линейного Пресного пространства или в виде набора сегментов, представляющих собой не- ^Рывные блоки переменной длины. При каждом из этих способов организации с помощью средств языка программирования можно обращаться к ячейкам вир- памяти, в которых содержится программа и ее данные. Чтобы изолировать процессы друг от друга, каждому из них можно выделить свою область ал1яти, не пересекающуюся с областью памяти другого процесса. Общее исполь- °вание памяти можно организовать, частично перекрывая участки двух облас- виртуальной памяти. Файлы создаются на долговременном запоминающем СтРойСТве Чтобы с ними могли работать программы, файлы или их фрагменты ГУТ Копироваться в виртуальную память. ав& 2. Обзор операционных систем 103
Рис. 2.10 поясняет концепцию адресации в схеме виртуальной уя Кранилище состоит из основной памяти, открытой для прямого доступа, осуь, :твляемого с помощью машинных команд, а также более медленной вспо.мог гельной памяти, доступ к которой осуществляется косвенно путем загрузи j g сов в основную память. Между процессором и памятью находятся апларатт :редства преобразования адреса. Программы обращаются к ячейкам памя'и п редством виртуальных адресов, преобразующихся в ходе обращения в ред. ьнь дреса основной памяти. Если происходит обращение к виртуальному .' рес ;оторый не загружен в основную память, то один из блоков реальной ■ \1ят геняется местами с нужным блоком, который находится во вспомогател но амяти. Во время этого обмена процесс, который обратился к данному рес.. олжен быть приостановлен. Задача разработки такого механизма преобразова ия адресов, который бы не требовал больших дополнительных ресурсов, и те ой стратегии размещения данных в хранилище, которая бы сводила к ми шму. у перемещение данных между различными уровнями памяти, возлагае *я на азработчика операционной системы. Виртуальный адрес Блок управления памятью Реальный адрес Адрес на диске Основная память % Вторичная память Рис. 2.10. Адресация виртуальной памяти ицита информации и безопасность : шовениГ',П011УЛЯРНОСТа СИСТеМ раЗДелени* вР<"*™и - а впоследствии с оз- ~сИ4 0Кт°0(5ПЬЮтеРНЫХ СеТСЙ - В°ЗНИКЛа Про6лема «Щ™ информации. В 'ациеГ^жеГбГтГсаТ™ """Т УГР°ЗЫ' НаВИСШ6Й НВД °пр~ноГ орга- • сие™ I Разнообразной. Однако в компьютеры и операци я- S^T* ВСТР°еНЫ НеКОТ°РЫе «™»™ общего назначен . гь ЕспГг! Раэлич"ые "еханизмы защиты и обеспечивающие безо с- Дос^помТкоГ. " °бЩИХ ЧеРТаХ' МЫ ™"^» с проблемой конт^о' я BoZTZ, компьютеРНЬ1м системам и хранящейся в них информации " условно разбить на три категории. •:. t Часть 1. Основные понятия Контроль над доступом. Связан с регулированием доступа пользователя к ., системе в целом, к ее подсистемам и данным, а также к различным ресурсам и объектам системы. - Контроль над перемещением информации. Регулирование потока данных '- внутри системы и при их доставке пользователю. Сертификация. Повышает уверенность в том, что механизмы доступа и перемещения данных работают в соответствии со своими спецификациями и обеспечивают проводимую политику защиты и безопасности. Совместное использование ресурсов и управление ими Одной из важных задач операционной системы является управление имеющимися в ее распоряжении ресурсами (основной памятью, устройствами ввода- вывода, процессором), а также их распределение между разными активными процессами. При разработке стратегии распределения ресурсов необходимо принимать во внимание следующие факторы. • Равноправность. Обычно желательно, чтобы всем процессам, претендующим на какой-то определенный ресурс, предоставлялся к нему одинаковый доступ. В особенности это касается заданий, принадлежащих к одному и тому же классу, т.е. заданий с аналогичными требованиями к ресурсам. • Дифференциация отклика. С другой стороны, может понадобиться, чтобы операционная система по-разному относилась к заданиям различного класса, имеющим различные запросы. Нужно попытаться сделать так, чтобы операционная система выполняла распределение ресурсов в соответствии с целым набором требований. Операционная система должна действовать в зависимости от обстоятельств. Например, если какой-то процесс ожидает доступа к устройству ввода-вывода, операционная система может спланировать выполнение этого процесса так, чтобы как можно скорее освободить устройство для дальнейшего использования другими процессами. • Эффективность. Операционная система должна повышать пропускную способность системы, сводить к минимуму время ее отклика и, если она работает в системе разделения времени, обслуживать максимально возможное количество пользователей. Эти требования несколько противоречат друг другу; насущной проблемой исследования операционных систем является поиск нужного соотношения в каждой конкретной ситуации. Задача управления ресурсами и их распределения типична для исследований операционных систем; здесь могут применяться математические результаты, полученные в этой области. Кроме того, важно измерять активность системы, что позволяет следить за ее производительностью и вносить коррективы в ее работу. На рис. 2.11 показаны основные элементы операционной системы, участвующие в планировании процессов и распределении ресурсов в многозадачной сРеде. Операционная система поддерживает несколько очередей, каждая из ко- °рых является просто списком процессов, ожидающих своей очереди на использование какого-то ресурса. В краткосрочную очередь заносятся процессы, кото- РЫе (или, по крайней мере, основные части которых) находятся в основной па- яти и готовы к выполнению. Выбор очередного процесса осуществляется Лава 2. Обзор операционных систем 105
том что7ыТажГ ^ ЩИК°М' ИЛИ ДИСПе^ером. Общая стратегия сое о 1и такой МДУ Находяи<емУся в °^Реди процессу давать доступ пГЛ ди, такой метод называют циклическим (round-robin) Кроме того п^ Ч^ можно присваивать различный приоритет Р ' Пр° е<* Операционная система Вызов сервиса из процесса Обработчик обращений к сервисам Прерывание от процесса Прерывание от устройства ввода-вывода Обработчик прерываний - Долгосрочная ^очередь Кратко- Очереди срочная к устройствам очередь ввода-вывода .-Л* Краткосрочный планировщик *4 . Л* 1 »_ -.3- - Передача управления >: процессу Рис. 2.11. Ключевые элементы многозадачной операционной системы В долгосрочной очереди находится список новых процессов, ожидак» их возможности использовать процессор. Операционная система переносит из долгосрочной очереди в краткосрочную. В этот момент процессу необхо имо выделить определенную часть основной памяти. Таким образом, операцио н я система должна следить за тем, чтобы не перегрузить память или проце ор, добавляя в систему слишком много процессов. К одному и тому же устройс, bv ввода-вывода могут обращаться несколько процессов, поэтому для ка. го устройства создается своя очередь. И здесь операционная система должна, Ре~ шать, какому процессу предоставить освободившееся устройство ввода-в Да в первую очередь. } Во время прерывания управление переходит к обработчику прерываний*. ° торый является частью операционной системы. В силу своей функциональ тИ процесс может обратиться к некоторому сервису операционной системы, и 1' мер к драйверу устройства ввода-вывода. При этом происходит вызов обрабо ,и ка обращений к сервисам, который становится точкой входа в операцией VI° систему. Независимо от того, произошло ли прерывание или обращение к сф =у, после его обработки планировщик выберет из краткосрочной очереди про сС ^ля выполнения. д Далее в этом разделе приводится чисто функциональное описание; эти моду в различных операционных системах имеют разные особенности и устройство. Л L06 ч1 Часть 1. Основные пон ! /структура системы «,-' С добавлением в операционные системы все новых функций, а также с рос- -roirf возможностей управляемого операционными системами аппаратного обеспе- ция и его разнообразия возрастает степень их сложности. Операционная сис- ема CTSS, введенная в эксплуатацию в Массачусетском технологическом инсти- ^те в 1963 году, занимала в памяти около 32000 36-битовых слов, лдерадионная система OS/360, выпущенная фирмой IBM через год, содержала более миллиона машинных команд. Система Multics, совместная разработка коброй была завершена специалистами Массачусетского технологического института и компанией Bell Laboratories к 1975 году, разрослась до 20 миллионов команд-* Ради справедливости отметим, что впоследствии на меньших машинах стали появляться операционные системы и попроще, но и они неуклонно усложнялись с развитием аппаратного обеспечения и ростом требований со стороны пользователей. Так, современная система UNIX по своей сложности намного превосходит свой почти игрушечный первоначальный вариант, разработанный несколькими талантливыми программистами в начале 70-х годов. То же самое произошло с простой системой MS-DOS, со временем переросшей в сложные и мощные операционные системы OS/2 и Windows 2000. Так, операционная система Windows NT содержит около 16 миллионов строк кода, а в Windows 2000 этот показатель увеличен более чем в два раза. Увеличение размера полнофункциональных операционных систем и сложности выполняемых ими задач стало причиной возникновения трех широко распространенных проблем. Во-первых, операционные системы доходят до пользователей с хроническим опозданием. Это касается как выпуска новых операционных систем, так и обновления уже существующих. Во-вторых, в системах появляются скрытые ошибки, которые начинают проявлять себя в рабочих условиях и требуют исправления и доработки системы. В-третьих, рост производительности зачастую происходит не так быстро, как планируется. Как же следует организовать структуру операционных систем, чтобы упростить работу с ними и преодолеть перечисленные проблемы? Некоторые решения очевидны. Программное обеспечение должно состоять из модулей, что упростит организацию процесса его разработки и облегчит выявление и устранение ошибок. Модули по отношению друг к другу должны иметь тщательно разработанные и максимально простые интерфейсы, что также облегчит задачи программиста. Кроме того, меньше усилий потребует эволюция такой системы. Если взаимодействие модулей друг с другом происходит по простым и четким правилам, изменение любого модуля окажет минимальное влияние на остальные. Однако оказалось, что для больших операционных систем, код которых состоит из миллионов или десятков миллионов строк, принцип модульного программировался сам по себе не избавляет от всех проблем. По этой причине возросла популярность концепции уровней иерархии, а также информационной абстракции. В иерархической структуре современной операционной системы различные функции находятся на разных уровнях в зависимости от их сложности, временных характеристик степени абстракции. Систему можно рассматривать как набор уровней, каждый из вторых выполняет свой ограниченный круг заданий, входящий в комплекс задач еРационной системы. Работа компонентов определенного уровня основывается на 0Те компонентов, находящихся на более низком уровне; функции более высокого ^°вня используют примитивы нижнего по отношению к нему уровня. В идеале л&ва 2. Обзор операционных систем 107
уровни должны быть определены так, чтобы при изменении одного из них и нялись остальные. ^ Как правило, чем ниже уровень, тем меньше время работы его ком Не тов. Некоторые элементы операционной системы должны непосредственна* взиг, модействовать с аппаратным обеспечением компьютера, элементарные процР - в котором иногда длятся не более нескольких миллионных долей секунда* р ставляющие операционной системы, поддерживающие взаимосвязь с польао а-*» лем, находятся на другом конце временного диапазона. Пользователи ввод ^ манды весьма медленно — до одной команды за несколько секунд. "'.. В каждой отдельно взятой операционной системе перечисленные прин ^ применяются по-разному. Для получения общего представления об опер НОй ных системах на данном этапе изложения представим пример обобщенной моде ли иерархической операционной системы, описанной в [BROW84] и [DE& 841 Она, несомненно, полезна для понимания сути дела, хотя и не соответству т на одной реальной операционной системе. Сама модель приведена в табл. 2. и состоит из следующих уровней. > • Уровень 1. В него входят электронные схемы; объектами данного вня являются регистры, ячейки памяти и логические элементы. Над этим объ- ектами выполняются различные действия, такие, как очистка содеряс мого регистра или считывание ячейки памяти. Тг • Уровень 2. Набор команд процессора. В число операций, выполняем х на этом уровне, входят те, которые допускаются набором команд маш ного языка, например сложение, вычитание, загрузка значения из регистр и та сохранение в нем. "^ • Уровень 3. Содержит концепцию процедуры (подпрограммы), а также операции вызова и возврата. '?. • Уровень 4. Уровень прерываний, которые заставляют процессор сохр нить текущий контекст и выполнить подпрограмму обработки прерывания/ На самом деле первые четыре уровня не являются частями операционной ;истемы, они составляют аппаратное обеспечение процессора. Однако н£ этих уровнях уже появляются некоторые элементы операционной системы, , акие, пак программы обработки прерываний. Вплотную к операционной системе мы юдходим только на пятом уровне, на котором возникают концепции, связ ные : многозадачностью. *f • Уровень 5. На этом уровне вводится понятие процесса, под которым подразумевается работающая программа. В число фундаментальных требо ий к операционной системе, способной поддерживать одновременную рабо ве" скольких процессов, входят способность приостанавливать процессы и з°" зобновлять их выполнение. Для этого необходимо сохранять содер и#ое регистров аппаратного обеспечения, чтобы можно было переключаться с оД ного процесса на другой. Кроме того, если процессы должны взаимо ейст- вовать между собой, необходим механизм их синхронизации. Одной кЭ важнейших концепций устройства операционных систем является е#в" фор — простейший способ передачи сигналов, который рассмотрен , г*1а* ве 5, "Параллельные вычисления: взаимоисключения и многозадачное • L08 Часть 1. Основные пон тйЯ \-§ Уровень 6. Компоненты этого уровня взаимодействуют со вспомогательными запоминающими устройствами компьютера. На этом уровне происходит позиционирование считывающих головок и физическая передача блоков данных. Для планирования работы и уведомления процесса о завершении запрошенной операции уровень 6 использует компоненты уровня 5. Уровень 7. Создает логическое адресное пространство процессов. Уровень организует виртуальное адресное пространство в виде блоков, которые могут перемещаться между основной памятью и вспомогательным запоминающим устройством. Широко распространены следующие три схемы: использование страниц фиксированного размера, использование сегментов переменного размера и комбинация тех и других. Если нужный блок отсутствует в основной памяти, то данный уровень передает уровню 6 запрос о передаче этого блока. До сих пор речь шла только о взаимодействии операционной системы с процессором. Компоненты операционной системы, относящиеся к восьмому и более высоким уровням, вступают во взаимодействие с внешними объектами, такими, как периферийные устройства, а возможно — с сетью и компьютерами, подключенными к сети. Объектами этих уровней являются логические именованные объекты, которые могут совместно использоваться несколькими процессами, исполняющимися на одном или на нескольких компьютерах. • Уровень 8. Отвечает за обмен информацией и сообщениями между процессами. На этом уровне происходит более богатый обмен информацией, чем на уровне 5, который обеспечивает работу первичного сигнального механизма для синхронизации процессов. Одним из наиболее мощных инструментов подобного типа является конвейер, представляющий собой логический канал передачи данных между процессами. Конвейер определяется как канал, передающий вывод одного процесса на вход другого; кроме того, он может быть использован и для связи с процессом внешних устройств или файлов. Эта концепция рассматривается в главе 6, "Взаимоблокировка и голодание". • Уровень 9. Обеспечивает долгосрочное хранение файлов. На этом уровне данные, хранящиеся на вспомогательном запоминающем устройстве, рассматриваются как абстрактные объекты переменной длины, в противоположность алпа- ратно-зависимому рассмотрению вторичной памяти как набора дорожек, секторов и блоков фиксированного размера, присущему уровню 6. • Уровень 10. Предоставляет доступ к внешним устройствам с помощью стандартных интерфейсов. Уровень 11. Поддерживает связь между внешними и внутренними идентификаторами системных ресурсов и объектов. Внешний идентификатор — это имя, которое может использоваться приложением или пользователем. Внутренний идентификатор — это адрес или другой индикатор, используемый нижними Уровнями операционной системы для обнаружения объекта и управления им. •эта связь поддерживается с помощью каталога, который включает в себя не только взаимное отображение внешних и внутренних идентификаторов, но и такие характеристики, как, например, права доступа. Ровень 12. Предоставляет полнофункциональные средства поддержки Роцессов. Возможности этого уровня намного превосходят возможности ;. а 2. Обзор операционных систем 109
уровня 5, на котором поддерживается только содержимое регистров р0ц сора, имеющее отношение к процессу, и логика диспетчеризации про с На уровне 12 эта информация используется для упорядоченного упр еа процессами. Сюда же относится и виртуальное адресное пространс " п цессов, список объектов и процессов, с которыми оно может взаимоде ст» вать, и правила, ограничивающие это взаимодействие; параметры, од д ные процессам при их создании, и прочие характеристики процессов^ ь-п, рые могут быть использованы операционной системой для управления^ • Уровень 13. Обеспечивает взаимодействие операционной системы с Польз вателем. Этот уровень называется оболочкой (shell), так как он о еля пользователя от деталей внутреннего устройства операционной cncTf ы представляет ее пользователю как набор сервисов. Оболочка приним' т к манды пользователя или инструкции управления заданиями, интер HDV ет их, создает необходимые процессы и управляет ими. На этом уровв , на пример, может быть реализован графический интерфейс, предоставля щцй пользователю возможность выбора команды с помощью меню и от бра. жающий результаты работы на экране. л Описанная гипотетическая модель операционной системы дает преде aBie- ние о ее структуре и может служить руководством по реализации конк тной операционной системы. В процессе изучения изложенного в настоящей? ниге курса читателю будет полезно время от времени возвращаться к этой стр Tvpe, чтобы лучше понимать, как отдельные компоненты операционных систе соотносятся друг с другом. Таблица 2.4. Иерархическая модель операционной системы2 Уровень Название Объекты Пример операций у- ■■% 12 11 10 Оболочка Пол ьзовате л ьск ие процессы Каталоги Устройства Файловая система Пользовательская среда программирования Пользовательские процессы Инструкции командно языка оболочки vf Завершение процесса^ приостановка, возобн ние работы '%, Создание, удаление, д' подключение, поиск ^ Внешние устройства (принтер, Открытие, закрытие, '^, Каталоги монитор, клавиатура) Файлы 8 Коммуникации Конвейеры Виртуальная память Локальная вторичная память Сегменты, страницы Блоки данных, каналы устройств чтение, запись Создание, удаление, х открытие, закрытие, Ч ние, запись Создание, удаление, > открытие, закрытие, чтение, запись Чтение, запись, выборк Чтение, запись, распред ление, выборка &■■' Заштрихованная область представляет аппаратное обеспечение. I 110 Часть 1. Основные noir * Окончание табл. 2.4 <^нь Название Объекты Пример операций ж. В Примитивные процессы Прерывания Процедуры Набор команд Электронные схемы Примитивные процессы, семафоры, список процессов Программы обработки прерываний Процедуры, стеки вызова, дисплеи3 Стек вычисления, интерпретатор микропрограмм, данные Регистры, шлюзы, шины и т.п. Приостановка, возобновление выполнения, ожидание и передача сигнала Вызов, маскирование, повтор Вызов, возврат Загрузка, сохранение, сложение, вычитание, ветвление Очистка, пересылка, активация £ 4. ХАРАКТЕРИСТИКИ СОВРЕМЕННЫХ I ОПЕРАЦИОННЫХ СИСТЕМ FuFb" fir Год за годом происходит эволюция структуры и возможностей операционных систем. В последнее время в состав новых операционных систем и новых версий уже существующих операционных систем вошли некоторые структурные элементы, которые внесли большие изменения в природу этих систем. Современные операционные системы отвечают требованиям постоянно развивающегося аппаратного и программного обеспечения. Они способны управлять работой многопроцессорных систем, работающих быстрее обычных машин, высокоскоростных сетевых приспособлений и разнообразных запоминающих устройств, число которых постоянно увеличивается. Из приложений, оказавших влияние на устройство операционных систем, следует отметить мультимедийные приложения, средства доступа к Internet, а также модель клиент/сервер. Неуклонный рост требований к операционным системам приводит не только к улучшению их архитектуры, но и к возникновению новых способов их организации. В экспериментальных и коммерческих операционных системах были опробованы самые разнообразные подходы и структурные элементы, большинство из которых можно объединить в следующие категории. • Архитектура микроядра. • Много поточность. • Симметричная многопроцессорность. • Распределенные операционные системы. • Объектно-ориентированный дизайн. (см., Под дисплеем в данном случае подразумевается стек ссылок на записи активаци например, раздел 7.4 в кнше Ахо А, Сети Р.. Ульман Д. Компиляторы: принципы, техно* ЛогИи и инструменты. — М.: Издательский дом "Вильяме", 2001.) — Прим. ред. ■„ Лава 2. Обзор операционных систем 11
, уровня о, на котором поддерживается .трлъко содержимое регистров п ц€ сора, имеющее отношение к процессу, и логика диспетчеризации проц Ссо На уровне 12 эта информация используется для упорядоченного управ -йй' процессами. Сюда же относится и виртуальное адресное пространству про цессов, список объектов и процессов, с которыми оно может взаимоде ^во вать, и правила, ограничивающие это взаимодействие; параметры, пере ан ные процессам при их создании, и прочие характеристики процессов,'"' То рые могут быть использованы операционной системой для управления. ■■, • Уровень 13. Обеспечивает взаимодействие операционной системы с па, вателем. Этот уровень называется оболочкой (shell), так как он отде пользователя от деталей внутреннего устройства операционной систе представляет ее пользователю как набор сервисов. Оболочка принимав манды пользователя или инструкции управления заданиями, интерпре"' ру- ет их, создает необходимые процессы и управляет ими. На этом уровне, например, может быть реализован графический интерфейс, предоставляющий пользователю возможность выбора команды с помощью меню и от ра- жающий результаты работы на экране. }V Описанная гипотетическая модель операционной системы дает предст Bie- ние о ее структуре и может служить руководством по реализации конкретной операционной системы. В процессе изучения изложенного в настоящей книге курса читателю будет полезно время от времени возвращаться к этой струк? ре, чтобы лучше понимать, как отдельные компоненты операционных систем ©относятся друг с другом. | зо- ет н ко- РУ- Габлица 2.4. Иерархическая модель операционной системы* Ф вровень Название Оболочка Объекты Пользовательская среда программирования Пользовательские Пользовательские процессы процессы О Каталоги Устройства Файловая система Каталоги Пример операций Инструкции командного?," языка оболочки %\ Завершение процесса, \i%* приостановка, возобновл ние работы Создание, удаление, подключение, поиск Внешние устройства (принтер, Открытие, закрытие, МОНИТПП. К ТТЯПИотп-иЛ монитор, клавиатура) Файлы Коммуникации Конвейеры Виртуальная память Локальная вторичная память Сегменты, страницы Блоки данных, каналы устройств чтение, запись Создание, удаление, открытие, закрытие, чтбг ние, запись Создание, удаление, открытие, закрытие, чтение, запись Чтение, запись, выборка j Чтение, запись, распреде^' ление, выборка \ За штрихованная область представляет аппаратное обеспечение. L0 Часть 1. Основные понят я Окончание табл. 2.4 Название Примитивные процессы Прерывания Процедуры Набор команд Электронные схемы Объекты Пример операций Примитивные процессы, семафоры, список процессов Программы обработки прерываний Процедуры, стеки вызова, дисплеи3 Стек вычисления, интерпретатор микропрограмм, данные Регистры, шлюзы, шины и т.п. Приостановка, возобновление выполнения, ожидание и передача сигнала Вызов, маскирование, повтор Вызов, возврат Загрузка, сохранение, сложение, вычитание, ветвление Очистка, пересылка, активация Е.4. ХАРАКТЕРИСТИКИ СОВРЕМЕННЫХ! I ОПЕРАЦИОННЫХ СИСТЕМ л ^ j Год за годом происходит эволюция структуры и возможностей операционных систем. В последнее время в состав новых операционных систем и новых версий уже существующих операционных систем вошли некоторые структурные элементы, которые внесли большие изменения в природу этих систем. Современные операционные системы отвечают требованиям постоянно развивающегося аппаратного и программного обеспечения. Они способны управлять работой многопроцессорных систем, работающих быстрее обычных машин, высокоскоростных сетевых приспособлений и разнообразных запоминающих устройств, число которых постоянно увеличивается. Из приложений, оказавших влияние на устройство операционных систем, следует отметить мультимедийные приложения, средства доступа к Internet, а также модель клиент/сервер. Неуклонный рост требований к операционным системам приводит не только к улучшению их архитектуры, но и к возникновению новых способов их организации. В экспериментальных и коммерческих операционных системах были опробованы самые разнообразные подходы и структурные элементы, большинство из которых можно объединить в следующие категории. • Архитектура микроядра. • Многопоточность. • Симметричная многопроцессорность. • Распределенные операционные системы. • Объектно-ориентированный дизайн. (см. Под дисплеем в данноч случае подразумевается стек ссылок на записи акти&ации • например, раздел 7.4 в кни-ге Ахо А., Сети Р.. Ульман Д. Компиляторы: принципы, техно- л ..« ii л st S1 * ъ тт _ .,. ,. .. л°гии и инструменты. — М.: Издательский дом "Вильяме", 2001.) — Прим. ред Глава 2. Обзор операционных систем 111
Отличительной особенностью большинства операционных систем на е 1яшний день является большое монолитное ядро. Ядро операционной сие мы «еспечивает большинство ее возможностей, включая планирование, рабо с айловой системой, сетевые функции, работу драйверов различных устройст гравление памятью и многие другие. Обычно монолитное ядро реализуется как циный процесс, все элементы которого используют одно и то же адресное ро. ранство. В архитектуре микроядра ядру отводится лишь несколько са, щ 1жных функций, в число которых входят работа с адресными пространствами >еспечение взаимодействия между процессами (interprocess communicatio ^_ >С) и основное планирование. Работу других сервисов операционной сие мы >еспечивают процессы, которые иногда называют серверами. Эти процессы за- ,гскаются в пользовательском режиме и микроядро работает с ними так же^к к с другими приложениями. Такой подход позволяет разделить задачу разрд т- л операционной системы на разработку ядра и разработку сервера. Сер ры ожно настраивать для требований конкретных приложений или среды. В де. шие в структуре системы микроядра упрощает реализацию системы, обесп чи- 1ет ее гибкость, а также хорошо вписывается в распределенную среду. Факти- ;ски микроядро взаимодействует с локальным и удаленным сервером по о ной той же схеме, что упрощает построение распределенных систем. ^ Многопоточность (multithreading) — это технология, при которой процесс, лполняющий приложение, разделяется на несколько одновременно выпол яе> ых потоков. Ниже приведены основные различия между потоком и процесс м. • Поток. Диспетчеризуемая единица работы, включающая контекст про ссора (куда входит содержимое программного счетчика и указателя верш ы стека), а также свою собственную область стека (для организации вы ова подпрограмм и хранения локальных данных). Команды потока выпол ют- ся последовательно; поток может быть прерван при переключении про ес- сора на обработку другого потока4. '.■ V • Процесс. Набор из одного или нескольких потоков, а также связаны х с этими потоками системных ресурсов (таких, как область памяти, в кото ю входят код и данные, открытые файлы, различные устройства). Эта' он- цепция очень близка концепции выполняющейся программы. Раз в приложение на несколько потоков, программист получает все преимуще тва модульности приложения и возможность управления связанными с пр. о- жением временными событиями. ; Многопоточность оказывается весьма полезной для приложений, выпоч зющих несколько независимых заданий, которые не требуют последователь ого :полнения. В качестве примера такого приложения можно привести сервер а л данных, который одновременно принимает и обрабатывает несколько з >в клиентов. Если в пределах одного и того же процесса обрабатываются ;Н ■ солько потоков, то при переключении между различными потоками непрои ятельный расход ресурсов процессора меньше, чем при переключении ме 1зными процессами. Кроме того, потоки полезны при описанном в после ю Следует отметить, что процессы, как правило, обладают каждый своим отдехь Пресным пространством, а у потоков адресное пространство общее. — Прим. ред. > 12 Часть 1. Основные поня * л лх главах структурировании процессов, которые являются частью ядра операционной системы. До недавнего времени все персональные компьютеры, рассчитанные на од- го пользователя, и рабочие станции содержали один виртуальный микропроцессор общего назначения. В результате постоянного повышения требований к '. ^оизводительности и понижения стоимости микропроцессоров производители flP шли к выпуску компьютеров с несколькими процессорами. Для повышения "лфективности и надежности используется технология симметричной многопро- Э<ессорности (symmetric multiprocessing — SMP). Этот термин относится к архи- И ктуре аппаратного обеспечения компьютера, а также к образу действий опера- Т<ионной системы, соответствующему этой архитектурной особенности. Симмет- "ичную многопроцессорность можно определить как автономную компьютерную систему со следующими характеристиками. 1. В системе имеется несколько процессоров. 2. Эти процессоры, соединенные между собой коммуникационной шиной или какой-нибудь другой схемой, совместно используют одну и ту же основную память и одни и те же устройства ввода-вывода. 3. Все процессоры могут выполнять одни и те же функции (отсюда название симметричная обработка). Операционная система, работающая в системе с симметричной многопроцессорностью, распределяет процессы или потоки между всеми процессорами. У многопроцессорных систем есть несколько потенциальных преимуществ по сравнению с однопроцессорными, в число которых входят следующие. • Производительность. Если задание, которое должен выполнить компьютер, можно организовать так, что какие-то части этого задания будут выполняться параллельно, это приведет к повышению производительности по сравнению с однопроцессорной системой с процессором того же типа. Сформулированное выше положение проиллюстрировано на рис. 2.12. В многозадачном режиме в один и тот же момент времени может выполняться только один процесс, тогда как остальные процессы вынуждены ожидать своей очереди. В многопроцессорной системе могут выполняться одновременно несколько процессов, причем каждый из них будет работать на отдельном процессоре. • Надежность. При симметричной мультипроцессорной обработке отказ одного из процессоров не приведет к остановке машины, потому что все процессоры могут выполнять одни и те же функции. После такого сбоя система продолжит свою работу, хотя производительность ее несколько снизится. * Наращивание. Добавляя в систему дополнительные процессоры, пользователь может повысить ее производительность. * Масштабируемость. Производители могут предлагать свои продукты в различных, различающихся ценой и производительностью, конфигурациях, предназначенных для работы с разным количеством процессоров. Важно отметить, что перечисленные выше преимущества являются скорее °ТеНциальными, чем гарантированными. Чтобы надлежащим образом реализо- ать потенциал, заключенный в многопроцессорных вычислительных системах, ~ ава 2. Обзор операционных систем ИЗ
операционная система должна предоставлять адекватный набор инструмен ив возможностей 5 Время Процесс 1 Процесс 2 «и Процесс 3 к*м ч- а) Чередование (многозадачность, один процессор) Процесс 1 Процесс 2 щ Тг ■ ■'i Процесс3 is s s ss si^^^^^ / 6} Чередование и перекрытие (многозадачность несколько процессоров) ^./л Заблокирован ^^н Выполняется £ Рис. 2.12. Многозадачность и многопроцессорность I •i Часто можно встретить совместное обсуждение многопоточности и i ого- процессорное™, однако эти два понятия являются независимыми. Многоп точность — полезная концепция для структурирования процессов приложе ft и ядра даже на машине с одним процессором. С другой стороны, многощюц ор- ная система может обладать преимуществами по сравнению с однопроцессор ой, даже если процессы не разделены на несколько потоков, потому что в такой не- теме можно запустить несколько процессов одновременно. Однако обе эти? возможности хорошо согласуются между собой, а их совместное использована го* жет дать заметный эффект. $ Заманчивой особенностью многопроцессорных систем является то^ что наличие нескольких процессоров прозрачно для пользователя —за pacttp деление потоков между процессорами и за синхронизацию разных процессов отвечает операционная система. В этой книге рассматриваются мехакиз ы планирования и синхронизации, которые используются, чтобы все прод ссЫ и процессоры были видны пользователю в виде единой системы. Друг за дача более высокого уровня — представление в виде единой системы кл\ те ра из нескольких отдельных компьютеров. В этом случае мы имеем д# о с набором компьютеров, каждый из которых обладает своей собственной, основной и вторичной памятью и своими модулями ввода-вывода. Рас Де ленная операционная система создает видимость единого пространства °с новной и вторичной памяти, а также единой файловой системы. Хотя Я ПУ" лярность кластеров неуклонно возрастает и на рынке появляется все бо &е кластерных продуктов, современные распределенные операционные сие? ^ все еще отстают в развитии от одно- и многопроцессорных систем. С пф °^* ными системами вы познакомитесь в шестой части книги. % 114 Часть 1. Основные поня й' \ ;" Одним из последних новшеств в устройстве операционных систем стало исполь- ' ние объектно-ориентированных технологий. Объектно-ориентированный дизайн зоВаогаеТ навести порядок в процессе добавления к основному небольшому ядру до- п07А„ИТельных модулей. На уровне операционной системы объектно-ориентированная n0J1vKTVpa позволяет программистам настраивать операционную систему, не нарушая СТР епостности. Кроме того, этот подход облегчает разработку распределенных инст- 66 ^еНТОв и полноценных распределенных операционных систем. %Ъ ОБЗОР ОПЕРАЦИОННОЙ СИСТЕМЫ WINDOWS 2000 В этом разделе изложены основные особенности операционной системы Windows 2000. Описание операционной системы UNIX представлено в следующем разделе. Для краткости вместо Windows 2000 мы будем употреблять название W2K. История возникновения Операционная система W2K появилась в результате развития операционной системы под названием MS-DOS (или PC-DOS), разработанной фирмой Microsoft для первого персонального компьютера фирмы IBM. Первая версия этой операционной системы, DOS 1.0, была выпущена в августе 1981 года и существенно отличалась от современной W2K. Операционная система DOS 1.0 содержала в себе 4000 строк исходного ассемблерного кода. Эта система работала на микропроцессоре Intel 8086 и занимала 8 Кбайт памяти. Когда фирма IBM начала выпускать персональные компьютеры PC XT с жестким диском, фирма Microsoft разработала DOS 2.0, которая вышла в 1983 году. Данная версия операционной системы обеспечивала поддержку жесткого диска, а также иерархическую структуру каталогов. До этого на диске мог находиться только один каталог с файлами, количество которых не превышало 64. Если в эпоху дискет этого было достаточно, то с появлением жесткого диска это стало слишком сильным ограничением. Новая версия операционной системы позволяла хранить в каталогах не только файлы, но и подкаталога, а кроме того, она предоставляла пользователю более богатый набор команд. С помощью этих команд можно было выполнять действия, которые в предыдущей версии выполнялись с помощью внешних служебных программ. Некоторые добавленные возможности были привнесены из операционной системы UNIX, например, такие, как перенаправление ввода-вывода (т.е. возможность изменять источник ввода и приемник вывода данного приложения) и печать в Фоновом режиме. Постоянно находящаяся в оперативной памяти часть этой операционной системы возросла до 24 Кбайт. Когда в 1984 году фирма IBM объявила о выпуске компьютера PC AT, Mi- rosoft выставила на рынок программных продуктов версию DOS 3.0. Персо- ^ьные компьютеры AT работали на процессоре Intel 80286, который обладал 0 сравнению со своим предшественником дополнительными возможностями Расширенной адресации и защиты памяти. Операционной системой DOS эти воз- жности не использовались. Чтобы сохранять совместимость с предыдущими Рсиями, эта операционная система использовала процессор 80286 просто как стрый процессор 8086". Эта система обеспечивала поддержку новой клавиа- ры и новых жестких дисков. Даже с учетом таких ограниченных возможно- ва 2. Обзор операционных систем 115
:тей потребляемая операционная память возросла до 36 Кбайт. С тех пор То делано несколько обновлений версии 3.0, о которых следует упомянуть. Ci ia DOS 3.1, вышедшая в 1984 году, поддерживала сети персональных komq 'еров. Размер ее резидентной части не изменился, что было достигнуто за' увеличения подкачиваемой с диска части операционной системы. DOS 3.3," ы гущенная в 1987 году, обеспечивала поддержку новой серии машин фй'м ВМ — PS/2. Эта версия, как и предыдущие, не использовала всех преимутеСтв процессора компьютера PS/2, которые предоставлялись благодаря микросх ' ам $0286 и 32-битовой 80386. На этой стадии минимальная резидентная часть' ic чемы, которая зависела от определенных дополнительных возможностей, воз- юсла до 46 Кбайт. ^ До этого времени операционная система DOS далеко не полностью исщ> ь. ювала возможности системы, на которой она эксплуатировалась. Появивши i я процессор 80486, а впоследствии и Pentium, обеспечивали возможности и п из- юдительность, которые бесхитростная операционная система DOS была п" сто ie в состоянии использовать. Тем временем в начале 80-х годов фирма Micro oft тчала разрабатывать графический интерфейс пользователя (graphical user Г Г- асе — GUI), который служил бы посредником между пользователем и 0S. 1ричиноЙ этого послужило то, что фирма Microsoft решила посостяза ' с фирмой Macintosh, операционная система которой на то время не имела! е >авных по простоте использования. К 1990 году Microsoft разработала гра иче- :кий интерфейс пользователя, известный под названием Windows 3.0, ко " рый 1риблизился к Macintosh по своей дружественности к пользователю. О ко Windows 3.0 имел тот недостаток, что он был надстройкой поверх DOS. ^ Фирмой Microsoft была также предпринята неудачная попытка разраб тать шерационную систему нового поколения совместно с фирмой IBM5. Эта о ращенная система должна была в полной мере использовать мощности но ых дикропроцессоров и в то же время быть такой же удобной в использованииу к к 1 Windows. После этого Microsoft самостоятельно разработала операцион! ю :истему Windows NT, которая использует возможности современных микро ро- ;ессоров и обеспечивает многозадачность в однопользовательской или м го- юльзовательской среде. ?.;■ Первая версия Windows NT — 3.1 — появилась в 1993 году с такь ье 'рафическим интерфейсом пользователя, как и у Windows 3.1, другой опер и- >нной системы фирмы Microsoft, которая последовала за Windows 3.0. О о ^Т 3.1 была новой 32-битовой операционной системой, которая поддерж ia хриложения предыдущих версий DOS и Windows, а также приложения one и- >нной системы OS/26. _..*/- После выпуска нескольких версий NT 3.x фирма Microsoft выпустила/ *с- гему NT 4.0, которая, в основном, имела ту же внутреннюю архитектуру, . я 1.x. Наиболее заметным внешним изменением было то, что NT 4.0 предост i-q- ia такой же интерфейс пользователя, как и Windows 98. Главное же изме^ние фхитектуры состояло в том, что некоторые графические компоненты, котор » в . "•$' ■ v Фирме IBM удалось собственными усилиями разработать операционную си / ^ак и Windows NT, OS/2 Warp является современной многозадачной многоп\ юй операционной системой. Точько 16-битовые приложения OS/2. — Прим. ред. ^ Ч" Часть 1. Основные пон ,. ! .$■■ а-осиях З.дс работали как часть подсистемы Win32 в режиме приложений пользователей, были перенесены в исполняющую систему Windows NT, которая ра- ■ таеТ в режиме ядра. В результате работа этих важных функций ускорилась, стало несомненным преимуществом. Потенциальным недостатком стало то, wj теперь эти графические функции получили доступ к сервисам низкого уров- что могло негативно повлиять на надежность операционной системы. В 2000 году фирма Microsoft сделала еще одно важное обновление, которое перь называется Windows 2000. Архитектура исполняющей системы и микро- па не претерпела фундаментальных изменений по сравнению с NT 4.0, однако системе появились некоторые новые особенности. В операционную систему W2K были добавлены дополнительные сервисы и возможности, поддерживающие распределенную обработку. Главной особенностью W2K стала служба Active Directory, которая обслуживает распределенные каталоги и может на основании имен объектов выдавать информацию о них. В заключение сделаем одно замечание о различии между W2K Server и W2K Professional. Архитектура микроядра и архитектура исполняющей системы по существу являются одинаковыми, однако в версии Server содержатся некоторые сервисы, которые необходимы для использования системы в качестве сетевого сервера. Однопользовательская многозадачность Операционная система W2K является типичным представителем операционных систем для микрокомпьютеров (в качестве других примеров можно привести OS/2 и MacOS). Она была вызвана к жизни необходимостью использовать возможности современных 32-битовых микропроцессоров, которые по скорости, совершенству используемого аппаратного обеспечения и емкости памяти сравнимы с теми мейнфреймами, которые выпускались еще несколько лет назад. Одна из наиболее примечательных особенностей этих операционных систем состоит в том, что хотя они и предназначены для интерактивной работы одного пользователя, эти системы являются многозадачными. Необходимость введения многозадачности на персональных компьютерах, рабочих станциях и серверах была продиктована двумя основными качественными изменениями программного обеспечения. Во-первых, увеличение скорости и объема памяти, с которой способны работать микропроцессоры (включая возможность использования виртуальной памяти), привело к тому, что приложения стали более сложными и взаимосвязанными. Представим, например, что пользователю для создания документа понадобились текстовый редактор, программа для создания графических изображений и приложение для подготовки электронных таблиц. Если пользователь захочет создать рисунок и вставить его в текст, то ему понадобится ВЫп°лнить такие шаги. *• Открыть программу для создания изображений. *• Создать нужный рисунок и сохранить его в виде файла или временно поместить в буфер обмена. ' Закрыть графическую программу. ■ Открыть текстовый редактор. ' Вставить рисунок в нужное место. ав& 2. Обзор операционных систем 117 '%■
Если же рисунок нужно изменить, пользователь должен будет закрыть т^ ;товый редактор, открыть графический редактор, внести изменения в изобр >^е ше, сохранить его, а затем вставить обновленное изображение назад в докум t T 1о мере возрастания мощности и разнообразия предоставляемых пользоват ikj :ервисов и возможностей программного обеспечения однозадачная среда?" Се юлыпе ограничивает удобство их использования и становится все меньше р^ кественной по отношению к пользователю. В многозадачной среде пользова ^. шжет открыть любое приложение и оставить его открытым на время рабо ы с [ругим приложением. Существенно упрощается и обмен информацией м >азными приложениями. Второй причиной появления многозадачности является увеличение с ;ычислений в соответствии с моделью клиент/сервер. При этом персонал* ьф :омпьютер или рабочая станция (клиент) и главная вычислительная си ема сервер) используются для совместного выполнения данного приложения^,' е тшины связаны между собой, и за каждой из них закреплена та часть зад я юторая отвечает возможностям данной машины. Модель клиент/сервер мо ет ыть реализована в локальной сети персональных компьютеров и серверов ти с омощью установления непосредственной связи между системой пользовате я и лавной вычислительной системой. Для обработки приложения могут пр ie- аться один или несколько персональных компьютеров и один или неско ько врверов. Используемая при этом операционная система должна поддерж в ть ложное сетевое аппаратное обеспечение реального времени, а также связанные с им протоколы обмена информацией и компоненты передачи данных. К тому • *е перационная система должна постоянно поддерживать взаимодействие с и' ть- эвателем. Приведенные выше замечания касаются версии W2K Professional, ерсия Server также является многозадачной, но она может поддерживать'" о- у нескольких пользователей, используя для связи с сервером несколько те \ш- алов, а также предоставляя разделяемые сервисы. Используемая в качестве 1п- srnet-сервера W2K может одновременно поддерживать тысячи Web-coeflHHeEt 1Й. Архитектура На рис. 2.13, взятом из [SOL098b], представлена общая структура опер u i- *ной системы W2K. Модульная структура этой системы делает ее довольно 1бкой. Она в состоянии работать на самых разных аппаратных платформах и эддерживать приложения, написанные для разных операционных систем'. К оменту написания этой книги операционная система W2K была реализована шько на аппаратной платформе Pentium/x86. Д Как и прочие операционные системы, W2K различает прикладные ро- >аммы и программы операционной системы. К последним относятся исйол- нощая система, микроядро, драйверы устройств и уровень аппаратных а - 1кций (hardware abstraction layer — HAL), которые выполняются в режиме ЯД* l- Программы, выполняющиеся в этом режиме, имеют доступ к систе ы [иным и к аппаратному обеспечению. Остальные программы, работающй шьзовательском режиме, имеют ограниченный доступ к системным данным*; V Организация операционной системы В операционной системе W2K трудно однозначно выделить микрояД • десто этого W2K имеет структуру, которую фирма Microsoft называет мод "* '* L° Часть 1. Основные понят «Ярованной архитектурой микроядра. Как и обычной архитектуре микроядра, перационной системе W2K присуще четкое разделение на модули. Каждая лункция системы управляется только одним компонентом операционной систе- -.J^. Остальные ее части и все приложения обращаются к этой функции через таНдартный интерфейс. Доступ к основным системным данным можно получить только через определенные функции. В принципе любой модуль можно удалить, обновить или заменить, не переписывая всю систему или стандартный интерфейс прикладного программирования (application program interface — API). Однако в отличие от систем с четко выделенным микроядром, у W2K многие функции системы, которые не входят в микроядро, выполняются в режиме ядра, что сделано с целью повышения производительности. Разработчики системы W2K обнаружили» что использование традиционного подхода с выделением микроядра приводит к тому, что многие функции, не входящие в микроядро, требуют наличия нескольких переключателей процессов или потоков, переключателей режимов, а также используют дополнительные буферы памяти. Сервисы Системные процессы Контроллер сервисов | WinLoqon Диспетчер сессий Режим пользователя I | Репликатор Обработчик извещений Удаленный вызов процедур Регистратор событий I Приложения Г Л Пользовательские приложения Подсистема DLL Подсистемы среды | POSIX I OS/2 Win32 U I NTDLLDLL Режим ядра Системный поток Исполняющая система Windows 2000 API исполняющей системы Диспетчер ввода-вывода Файловые системы Средства локального вызова процедур Диспетчер кэша Диспетчер процессов и потоков Монитор безопасности обращений Диспетчер виртуальной памяти Диспетчер окон Управление объектами; библиотека этапа исполнения Драйверы устройств Микроядро Уровень аппаратных абстракций Интерфейсы аппаратного обеспечения (шины, устройства ввода-вывода, V таймеры, прямой доступ к памяти, контроллер кэша и т.п.) N. Рис. 2.13. Архитектура операционной системы Windows 2000 Одной из целей создателей операционной системы W2K была ее переносимость, т.е. возможность ее использования на самых разнообразных аппаратных латформах. Для достижения этой цели большая часть исполняющей системы ^К рассматривает лежащее в основе аппаратное обеспечение с одной и той же **ки зрения, используя представленную ниже структуру уровней. лйва 2. Обзор операционных систем 119
о ь- то • Уровень аппаратных абстракций. На этом "уровне формируется отоб между общими командами и ответными сигналами аппаратного обесп , и таковыми для конкретной платформы. Этот уровень отделяет опер дЧо ную систему от особенностей используемой аппаратной платформы, бл д3 чему системная шина, контроллер прямого доступа к памяти, контрАл прерываний, системные таймеры и память выглядят с точки зрений одинаково. Кроме того, на этом уровне поддерживается симметричная процессорность, принцип работы которой объясняется далее. ;^' • Микроядро. В микроядро входят наиболее часто используемые компон ты операционной системы. Ядро отвечает за распределение ресурсов Ц( процессами, их переключение и синхронизацию. В отличие от остад части исполняющей системы и от процессов, исполняемых на уровне о зователя, код микроядра не разделяется на потоки. Таким образом, то единственная часть операционной системы, которая не может быть в "теснена или выгружена на диск. >*■ ■у • Драйверы устройств. К ним относится как файловая система, так и дра 1ве- ры аппаратных устройств, которые преобразуют поступившие от пол о а- теля вызовы функций ввода-вывода в запросы для конкретных устройс* . Исполнительная система W2K включает модули, обеспечивающие по р» <у ее функций и предоставляющие работающим в пользовательском ре и е трограммам соответствующий API. Ниже приведено краткое описание к ого 13 модулей исполнительной системы. -\- • Диспетчер ввода-вывода. Поддерживает доступность для приложений: у т ройств ввода-вывода. Кроме того, этот диспетчер отвечает за координ ию работы драйверов устройств, выполняющих дальнейшую обработку.:^ ис- петчер ввода-вывода реализует все API ввода-вывода W2K и (с помошью диспетчера объектов) следит за безопасностью и именованием устройте и файловых систем. Система ввода-вывода W2K рассматривается в главе 11, "Управление вводом-выводом и дисковое планирование". с, • Диспетчер объектов. Создает и удаляет объекты и абстрактные типьг>:. н- ных исполнительной системы W2K, а также управляет ими. Эти объе# ы п абстрактные типы данных используются для представления таких ресу ов, как процессы, потоки и объекты синхронизации. Диспетчер объектов г- печивает выполнение стандартных правил поддержки объектов, именова ия и безопасности. Кроме того, этот диспетчер создает дескрипторы объекто . в которых содержится информация о правах доступа и указатель на объект. Объекты операционной системы W2K обсуждаются немного позже. V • Монитор безопасности обращений. Обеспечивает выполнение правил в доступа и аудита. Объектно-ориентированная модель операционной сие ы W2K позволяет сформировать согласованный и единообразный взгляд безопасность фундаментальных составляющих исполняющей системы. Для авторизации доступа и аудита всех защищенных объектов, вклю файлы, процессы, адресные пространства и устройства ввода-вывода, оП ' ционная система W2K использует одни и те же служебные прогрвд ., Безопасность W2K обсуждается в главе 15, "Безопасность". ^" Часть 1. Основные пон * я Диспетчер процессов и потоков. Создает и удаляет объекты, а также следит -■€■■ за процессами и потоками. Управление процессами и потоками в операци- ,: онной системе W2K рассматривается в главе 4, "Потоки, симметричная Г мультипроцессорная обработка и микроядра". Средства локального вызова процедур. В рамках одной системы устанавливают взаимосвязь между приложениями и исполняющими подсистемами по модели клиент/сервер. Этот модуль похож на средства удаленного вызова Процедур, который используется при распределенной обработке данных. Диспетчер виртуальной памяти. Отображает виртуальные адреса адресного пространства процессов на физические страницы памяти компьютера. Управление виртуальной памятью в операционной системе W2K описано в главе 8, "Виртуальная память". • Диспетчер кэша. Повышает производительность файлового ввода-вывода путем хранения в основной памяти тех данных с диска, к которым недавно производилось обращение. Кроме того, обеспечивает отложенную запись на диск, некоторое время храня в памяти обновления дисковых файлов. • Графические модули. Создают оконный экранный интерфейс и управляют графическими устройствами. Пользовательские процессы Операционная система W2K поддерживает четыре основных типа пользовательских процессов. • Специальные процессы системной поддержки. К таким процессам относятся служебные программы, которые не вошли в операционную систему W2K, например процесс входа в систему и диспетчер сессий. • Серверные процессы. Другие сервисы W2K, такие, как журнал регистрации событий. • Подсистемы среды. Предоставляют приложениям пользователя сервисы W2K, обеспечивая таким образом среду операционной системы. Поддерживаются такие подсистемы, как Win32, POSIX и OS/2. В каждую подсистему среды входят динамически компонуемые библиотеки, преобразующие вызовы приложений пользователя в вызовы операционной системы W2K. • Приложения пользователя. Могут быть одного из пяти типов: Win32, POSIX, OS/27, Windows 3.1 или MS-DOS. Операционная система W2K поддерживает приложения, написанные для W2K, Windows 98 и нескольких других операционных систем. Эта поддержка обеспечивается с помощью единой и компактной исполнительной системы через аЩищенные подсистемы среды, к которым относятся части операционной сис- емы W2K, взаимодействующие с конечным пользователем. Каждая из подсис- ем является отдельным процессом, а исполнительная система защищает адрес- 0е пространство этих подсистем от вмешательства других подсистем и прило- еннц. Защищенная подсистема предоставляет пользователю графический Здесь и в предыдущем пункте имеются в виду только 16 битовые приложения '*■ ~~ Прим. ред. Лава 2. Обзор операционных систем 121
интерфейс или интерфейс командной строке который определяет внешни и наполнение операционной системы для конечного пользователя. Кроме^ г г каждая защищенная подсистема обеспечивает свой API для каждой из оп 1ц онных сред. Это означает, что приложения, разработанные для опреде н0 операционной среды, могут быть запущены W2K в неизменном виде, так ад v ! будет предоставлен тот интерфейс операционной системы, для которого о f ли созданы. Так, 16-битовые приложения для операционной системы OS/Z.^J*' но j шускать в операционной системе W2K без каких-либо изменений. БоЛ ■!*" го, поскольку W2K разработана независимой от платформы (что обеспечив» -т° наличием уровня аппаратных абстракций), защищенные подсистемы и првд0 -^ аия, которые они поддерживают, должны сравнительно легко перенос п* эдной аппаратной платформы на другую. Во многих случаях для этого ну ° лишь обычная перекомпиляция. ;л *** Наиболее важной из подсистем является Win32. Win32 — это API, к ipuf реализован как для W2K, так и для Windows 98. Некоторые возможности* поде юте мы Win32 недоступны в Windows 98, но все возможности, реализована в Windows 98, идентичны возможностям, имеющимся в W2K. Некоторые оси вные функции, которые предоставляет программисту Win32, перечислены в табл. 2. Габлица 2.5. Некоторые области API Win32 [RICH97] VroMbi Безопасность Ж. Звод с помощью клавиатуры и мыши Время "'\ Зывод на печать Графические примитивы i Динамически компонуемые библиотеки Журнал регистрации событий & Г Соммуникации Конвейеры и почтовые ящики \ Сонсоли Мультимедиа )перации с буфером обмена Отладка ■•&•''' врожденные окна Процессы и потоки f; *езервное копирование на магнитную ленту Ресурсы ;?■* Сервисы Сети ^ ' :истемная информация Структурированная обработка исклгоч lift 'правление окнами Управление памятью ') 'правление реестром Файлы '%* л- Модель клиент/сервер Структура исполнительной системы, защищенных подсистем и пр по хений выполнена в соответствии с вычислительной моделью *' и- нт/сервер — общепринятой моделью распределенных вычислений, ко Р осуждается в части 6, "Распределенные системы". Можно сказать, чте* та труктура внутренне присуща W2K. ^ Каждая подсистема среды и каждая исполнительная служебная подси Mfl еализуется в виде одного или нескольких процессов. Каждый процесс ож т «шроса клиента к одной из его служб (например, на обслуживание памяти». соз- ание процесса и т.п.). Клиент, в роли которого может выступать прогр во риложение или другой модуль операционной системы, производит запрос по- 22 '" Часть 1. Основные пон ** ством сообщения. Это сообщение передается соответствующему серверу через С лнительную систему. Сервер выполняет запрашиваемую операцию и воз- '* тает результат или информацию о состоянии с помощью другого сообщения, ..^Р* ое через исполнительную систему передается клиенту. *° К преимуществам модели клиент/сервер можно отнести следующие.8 Бчагодаря этой модели упрощается исполнительная система. Можно разработать ряд API, не имеющих конфликтов или дублирования по отношению к исполняющей системе. Новые API могут быть легко добавлены в систему. Эта модель способствует повышению надежности. Каждый модуль, реализующий сервис исполнительной системы, запускается в виде отдельного процесса, которому отводится своя область памяти, защищенная от воздействия других модулей. Более того, клиент не может непосредственно обращаться к аппаратному обеспечению или изменять содержимое той области памяти, в которой находится исполнительная система. Сбой в работе одного из клиентов не приводит к аварийному отказу или повреждению остальной части операционной системы. • В этой модели приложениям с помощью локальных вызовов процедур предоставляются однотипные средства обмена информацией с исполнительной системой, что не приводит к потере гибкости. Процесс передачи сообщения скрыт от клиента функциями-заглушками из динамически компонуемых библиотек. При вызове приложением API заглушка пересылает переданные при вызове параметры в виде сообщения подсистеме сервера, реализующей этот вызов. • Эта модель является базой для распределенных вычислений. Обычно распределенные вычисления используют модель клиент/сервер, с реализацией удаленных вызовов процедур посредством распределенных модулей клиентов и серверов, а также путем обмена сообщениями между клиентами и серверами. В операционной системе W2K локальный сервер может передавать сообщение от локального приложения-клиента для обработки на удаленном сервере. Клиентам нет нужды иметь информацию о том, как обрабатываются их запросы — локально или удаленно, ведь способ обработки может изменяться динамически в зависимости от загруженности систем и от изменений конфигурации. Потоки и симметричная многопроцессорность Возможности поддержки потоков и поддержки симметричной многопроцессорности, о которых мы говорили в разделе 2.4, — две важные характеристики операционной системы W2K. Ниже перечислены основные возможности поддержки потоков и SMP в операционной системе W2K [CUST93]. ■ Служебные программы операционной системы могут выполняться на любом Из свободных процессоров; различные программы могут выполняться одновременно на разных процессорах. о Подробнее об этой модели в приложении к W2K можно узнать, например, из кни- Оберг Р. Технология СОМ+. Основы и программирование. — М.: Издательский дом "льямс". 2000. — Прим. ред. ава 2. Обзор операционных систем 123
• Операционная система W2K поддерживает выполнение одного прд jeCr разделенного на несколько потоков. Эти потоки могут выполняться дн временно на нескольких процессорах. Г • Серверные процессы могут использовать несколько потоков при од pSto менной обработке запросов, поступающих от разных клиентов. ^ • Операционная система W2K предоставляет механизмы совместного исщочь зования данных и ресурсов различными процессами, а также гибки© во можности обмена информацией между процессами. :-?® / *■ Объекты Windows 2000 ш Устройство операционной системы W2K в значительной мере основано на объектно-ориентированных концепциях. Этот подход способствует совместко\1\ использованию ресурсов и данных различными процессами, а также заппгге ре*_ сурсов от несанкционированного доступа. Операционная система W2K испо ьзу- ет следующие объектно-ориентированные концепции. ,^ • Инкапсуляция. Объект состоит из одного или нескольких полей д" ных (атрибутов), и одной или нескольких процедур, с помощью которых )к жно обрабатывать эти данные (методов, сервисов). Единственный способ/оij чить доступ к данным объекта — запросить один из его методов (серв сов) Таким образом, данные объекта легко защитить от несанкциониров ного или некорректного использования. & • Классы объектов и экземпляры. Класс объекта представляет собой шабчон, в котором перечислены его атрибуты и сервисы, а также определены, некоторые его характеристики. При необходимости операционная система может создавать экземпляры объектов класса. Например, имеется класс одиночных процессов, объектом которого является текущий процесс. /Г кой подход упрощает создание объектов и управление ими. ,^ • Наследование. Этот механизм не поддерживается на уровне пользовател - но в некоторой степени поддерживается на уровне исполнительной системы. Н 1пш- мер, объекты-каталоги являются примерами объектов-контейнеров, одним из свойств которых является то, что содержащиеся в них объекты могут наследовать свойства контейнеров. Например, предположим, что у нас имеется каталог файловой системы с установленным флагом сжатия. В таком случае у* х файлов, создаваемых в этом каталоге, будет установлен этот флаг. "&£, • Полиморфизм. Для управления объектами любого типа операционная пс тема W2K использует общий набор функций API — в этом и заклюй тсЧ ее полиморфизм. Однако W2K не является полностью полиморфной, по, м> что в ее состав входит множество API для конкретных типов объектов*; Не все сущности операционной системы W2K являются объектами. CHS ь' ты используются в тех случаях, когда данные открыты для доступа в пол тельском режиме, а также при совместном использовании данных и огранич [И1 доступа. Среди представляемых объектами сущностей —файлы, процессы, от°' ки, семафоры, таймеры и окна. Система W2K создает все типы объеК ' управляет ими одним и тем же способом — с помощью диспетчера объект00 124 Часть 1. Основные пон llfi л^от диспетчер отвечает за создание и удаление объектов, нужных для работы . риложений, а также за предоставление доступа к сервисам и данным объектов. Каждый объект исполнительной системы (иногда эти объекты называются й-ьектами ядра, чтобы отличать их от объектов пользовательского уровня, не реющих отношения к исполнительной системе) находится в области памяти, оделяемой ядром, доступ к которой имеет только ядро. Некоторые элементы руктуры данных присущи объектам всех типов (например, имена объектов, параметры безопасности, счетчик использований). С другой стороны, каждый тдеЛьный тип объектов имеет свои специфические элементы (например, приоритет потока объекта). Структуры данных объектов ядра доступны только через про; приложение не может ни размещать в памяти эти структуры данных, ни непосредственно считывать или записывать в них информацию. Вместо этого приложения манипулируют объектами опосредованно, через набор функций для работы с объектами, которые поддерживаются исполнительной системой. Когда создается объект для какого-нибудь приложения, последнему возвращается дескриптор созданного объекта, который, по сути, является указателем на объект. Впоследствии дескриптор объекта может использоваться любым потоком этого процесса при вызове функций Win32, работающих с объектами. С объектами может быть связана информация о безопасности, представленная в виде дескриптора безопасности (Security Descriptor — SD). Эта информация используется для ограничения доступа к объекту. Например, процессом может быть создан объект, являющийся именованным семафором, открывать и использовать который будет позволено лишь некоторым пользователям. В дескрипторе защиты этого семафора могут быть перечислены пользователи, которым разрешен (или запрещен) к нему доступ, а также тип разрешенного доступа (для чтения, записи, изменения и т.д.). В операционной системе W2K объекты могут быть именованными или неименованными. Если при работе процесса создается неименованный объект, то диспетчер объектов возвращает дескриптор этого объекта. Впоследствии обратиться к этому объекту можно будет только через его дескриптор. У именованного объекта есть имя, с помощью которого другие процессы могут получить его дескриптор. Например, если нужно, чтобы процесс А выполнялся синхронно с процессом В, в нем можно создать объект-событие, а затем передать его имя процессу В, в котором это событие будет использовано для синхронизации. Однако если нужно синхронизовать два потока одного и того же процесса А, то в нем можно создать неименованный объект-событие, потому что другие процессы Не должны ничего о нем знать. В качестве примера объектов, которые управляются операционной системой W2K, ниже приведены две категории объектов, управляемых микроядром. • Объекты управления. Объекты этого типа используются для управления операциями микроядра, не связанными с диспетчеризацией и синхронизацией. Объекты управления микроядра перечислены в табл. 2.6. * Объекты диспетчера. Используются для диспетчеризации и синхронизации операций системы. Эти объекты описаны в главе 6, "Взаимоблокировка и голодание". л&ва 2. Обзор операционных систем 125
Таблица 2.6. Объекты управления микроядра NT [MS96] Асинхронный Используется для прерывания выполнения определенного ц ^|Г^ вызов процедуры вызова процедуры в указанном режиме процессора Прерывание Используется для связи источника прерывания с программой ofic. й шш прерывания посредством записи из таблицы диспетчеризации, \ ваний (Interrupt Dispatch Table — IDT). Такая таблица, используеЛш - диспетчеризации прерываний, имеется у каждого процессора .' Процесс Представляет собой виртуальное адресное пространство и управ. информацию, которые необходимы для выполнения набора пото жОВ процессе содержится указатель на карту адресов, список готовых й . полвению потоков, список всех потоков процесса, совокупное время полнения всех потоков процесса, а также базовый приоритет .. й Профиль Используется в качестве меры при распределении времени 1н ния в пределах блока кода. Профиль может быть определен __ кода пользователя, так и для кода системы Jj **v~~— Операционная система W2K не является объектно-ориентированной ночном смысле. Она реализована не на объектно-ориентированном языке программирования. Структуры данных, содержащиеся в компоненте исполнительной системы, не представлены в виде объектов. Тем не менее W2K иллюстрирует мощь объектно-ориентированной технологии и ее использование при разработке операционных систем. /I Й.6. ТРАДИЦИОННЫЕ СИСТЕМЫ UNIXg** Я*ЯК£^Я -й™. Г*ЛЗЗТ#Г к-а 2£Г" VsST Ь- -JHCS-ЖЁИ чий Ф^^чЖя-йзшчй»; й^йкь чЛ ^ЛЖвй!: -**ь *^ г Историческая справка Ч Историю возникновения операционной системы UNIX часто можно* тре- тить во многих книгах, поэтому здесь она приводится лишь схематична,— основные этапы развития изображены на рис. 2.14, взятом из [SALU94].9 ,t Изначально операционная система UNIX была разработана компани и Bell Labs и запущена в эксплуатацию в 1970 году на системе PDP-7. Некоторые сотрудники Bell Labs принимали участие также в работе над системой раад ления времени, выполняемой в рамках проекта MAC в Массачусетсом техно* огпче- ском институте. В результате выполнения этого проекта возникла операционная система CTSS, а затем Multics. Хотя часто говорят, что система UNIX . это уменьшенная версия Multics, сами разработчики UNIX утверждали, что н«' их в эольшей степени повлияла работа над CTSS [RITC78b]. Тем не менее в с т ме UNIX воплощено много идей, позаимствованных от Multics. ,■-' В результате разработки системы UNIX в компании Bell Labs, а впос^ гт- вии — ив других местах, появились различные версии этой операционной., "1 с" темы. Первой значительной вехой стал перенос системы UNIX с PDP-7 на,,, Р* 11. Это послужило первым указанием на тот факт, что система UNIX м т 5ыть использована в качестве операционной системы на всех компьютерах^ °" эым важным этапом развития этой системы стало то, что она была перепяс а *а языке программирования С. Для того времени это было неслыханно. fl Более полное генеалогическое дерево приведено в [MCKU96]. 126 Часть 1. Основные пои т 1 чТО такая сложная программа, какой является операционная система, для ^ *' ой важным параметром является время ее работы, должна быть написана ■ *°Р° на языке ассемблера. Реализация на языке С продемонстрировала пре- ЛЬК^гтво языка программирования высокого уровня если не для всех, то для ** пяюшего большинства фрагментов системного кода. В настоящее время , оД^й ^се реализации операционной системы UNIX написаны на С. \tP VI V6 Xenix * * BSD Xenix2 Linux Рис. 2.14. История развития системы UNIX Ранние версии UNIX были очень популярны в пределах компании Bell Labs. В 1974 году система UNIX была впервые описана в техническом журнале [RITC74], 410 вызвало к ней большой интерес. Лицензии на UNIX были предоставлены комическим организациям и университетам. Версия 6 этой системы, появившаяся в 1976 году, стала первой широко используемой за пределами Bell Labs версией. Сле- Лава 2. Обзор операционных систем 127
.u.jjpi/uvui жжъыал, версия г, выпущенная в 1978 щцу, стала прототипом боль ц современных систем UNIX. Наиболее важные системы, не являющиеся про т фирмы AT&T, были разработаны в Калифорнийском университете в Беркли а 0 чили название UNIX BSD; они эксплуатировались на машинах PDP и VAX. др AT&T доработала и улучшила эти системы. В 1982 году компания Bell Labs сддомб, нировала несколько вариантов системы UNIX фирмы AT&T в единую систему, f-0TJ рая появилась в продаже под названием UNIX System III. Впоследствии к этой рационной системе было добавлено несколько новых возможностей, в результа « ч го появилась система UNIX System V. 'Ч Описание Д; 'Л Рис. 2.15 дает общее представление об архитектуре системы UNIX. Леж ее в основе аппаратное обеспечение окружено программным обеспечением оператд^каой системы. Операционную систему часто называют системным ядром или ^ ^ ядром, чтобы подчеркнуть ее изолированность от пользователя и приложений * Именно эта часть системы UNIX будет представлять для нас интерес в данной *~ Однако UNIX снабжается различными пользовательскими сервисами и интерфе са. 1, ми, которые рассматриваются как часть этой системы. Их можно сгруппиров ть в • оболочку, интерфейс и компоненты компилятора С (компилятор, ассемблер, грузчик). Внешний по отношению к этой части системы уровень состоит из прило ний пользователя и интерфейса компилятора С. ;.•'■ ■У -"' ?: 41 &* '»f i». & Рис. 2.15. Общая архитектура системы UNIX V Рис. 2.16 дает более полное представление о системе. Программы пол теля могут вызывать сервисы операционной системы непосредственно либо ,- мощью библиотечных программ. Интерфейс системных вызовов позволяет , граммам высших уровней получить доступ к определенным функциям Нижние уровни операционной системы содержат простые программы, Koto l^X \ посредственно взаимодействуют с аппаратным обеспечением. Между этими _0внями находятся компоненты системы; их можно разделить на две основные &сти, одна из которых относится к управлению процессами, а другая — к вво- У^вЫводу. Подсистема управления процессами отвечает за управление памятью, «определение ресурсов между процессами, диспетчеризацию, синхронизацию и взаимодействие разных процессов. Файловая система производит обмен дан- 38 удои между памятью и внешними устройствами либо в виде потоков символов, ибо в виде блоков с использованием различных драйверов устройств. Поблочная передача данных осуществляется с участием дискового кэша — системного буфера основной памяти, являющегося промежуточным звеном между адресным пространством пользователя и внешним устройством. Программы пользователя Уровень пользователя Уровень ядра "; \ Библиотеки —ж Интерфейс системных вызовов Зе. Файловая подсистема Й&; 1 ■ -;. i p. Символ Буфер кэша] А i ! 1 1 Подсистема управления процессом Взаимодействие между процессами Планировщик Управление памятью Блок Драйверы устройств ш Управление аппаратным обеспечением Уровень ядра г. "' Уровень аппаратного обеспечения -к • ■•у» [ Аппаратное обеспечение Ч Рис. 2.16. Ядро традиционной системы UNIX [BACH86] В этом разделе рассказывается о тех системах UNIX, которые можно начать традиционными; в [VAHA96] этот термин используется, когда речь иДет о System V Release 3 (SVR3), 4.3BSD и более ранних версиях. Ниже приведены общие положения, касающиеся традиционных систем UNIX Они предназначены для работы на однопроцессорных системах и не обладают Достаточной возможностью по защите своих структур данных от одновремен- 128 Часть 1. Основные пояй "лава 2. Обзор операционных систем 129
«процессорах. Их ядра не ел r—UUviupoHHii; они поддерживают один тип файловой системы, стра распределения ресурсов между процессами и формата исполняемых ф Ядро традиционной системы UNIX не является наращиваемым, в нем возможностей повторного использования кода. Все это приводило к тому при добавлении в очередных версиях UNIX новых возможностей прихо лось в больших количествах писать новый код. В результате ядро ока ы$ лось громоздким и немодульным. -»-.. 2.7. СОВРЕМЕННЫЕ СИСТЕМЫ UJVIX .rf" В процессе развития операционной системы UNIX появилось много ее лизаций, каждая из них обладала своими полезными возможностями. Вп т ствии возникла необходимость создать реализацию, в которой были бы i цированы многие важные нововведения, добавлены возможности других сов менных операционных систем и которая бы обладала модульной архитек ро Архитектура типичного современного ядра системы UNIX изображен а рис. 2.17. В этой архитектуре имеется небольшое ядро, которое может рабо ать различными модулями, предоставляющими различным процессам операцио но системы необходимые функции и сервисы. Каждый внешний круг рисунка соо ветствует различным функциям и интерфейсу, которые можно реализовать ел мыми различными способами. А теперь перейдем к рассмотрению некоторых примеров современных?'сие тем UNIX. j. System V Release 4 (SVR4) t h Версия SVR4, разработанная совместно компаниями AT&T и Sun Micrbsvs tems, сочетает в себе особенности версий SVR3, 4.3 BSD, Microsoft Xenix Sy tern V и SunOS. Ядро System V было почти полностью переписано, в результате чего появилась очищенная от всего лишнего, хотя и сложная реализация. Среди новых возможностей этой версии следует отметить поддержку обработки данн \ в реальном времени, наличие классов планирования процессов, динамически рас пределяемые структуры данных, управление виртуальной памятью, нал. чие виртуальной файловой системы и ядра с вытеснением. X При создании системы SVR4 объединились усилия как коммерчес их. так и академических разработчиков; разработка системы велась, чтобы р. ее печить унифицированную платформу для коммерческих реализаций оп ря ционной системы UNIX. Эта цель была достигнута, a SVR4 на данный^ю- иент, по-видимому, является важнейшей версией UNIX. В ней удачно, ( гочки зрения конкурентоспособности) сочетаются наиболее важные воз ~. юсти, реализованные во всех предыдущих системах UNIX. Система S\K4 южет работать на компьютерах самых разнообразных типов, начиная с я" цин, в которых установлены 32-разрядные процессоры, и заканчивая су омпьютерами; эта система является важнейшей из всех ранее разрабо я* ых операционных систем. Именно из нее взяты многие примеры, привеД в' ые в этой книге для иллюстрации работы системы UNIX. i Y f Y *0 Часть 1. Основные поня -Т. ,**' a .oi cofl Переключатель^ вида ^исполню»***/ файлов elf NFS FS Отображение файлов - ОтобР* 1*ение ;Тройств Анонимное отображение Структура виртуальной памяти;: Драйверt диска эрвкпючатейьХ блочных устройств драйвер магнитной ленты ( Общие i 1 средства ч, У [ Потоки 1 Драйвер сетевого устройства л» мгтем "* Драйвер телетайпа ы UNIXI ИнтерфейсJ\ ynode/vte|^__^ s5fe / Процессы •'-ч. в режиме ^/ ■ ' -^V^ разделения J.' . +-\ времени (Планировщик 1 Системные процессы rVAHA96] i Рис. 2.17. Ядро современной системы Solaris 2.X . системы UNIX, разработанная сьн, - это версия операционной см™*" вЫшедшей вер- Система Solans -это ^ написания книги последне ми фирмой Sun на -нове SVR4- HajP«^ систеМЫ ^ в^^ладоо^^ ^ сией Solaris была версия *£*£^ некоторыми Д^^^^ишальная под- возможностями системы SVR4, а такж поляофуНИ^^ Solaris - полная выгесняемость, «^^J^^ интерфейс файловых си^ом™за- это наиболее широко применяемая и ™^е*римерЫ возможностей операдионн ция операционной системы UWJA- Solaris, систем, встречающиеся в этой книге, взяты 4-4BSD ttp тва операционных систем сыг- „ пазвитии теории устройства оп*Р** нийском универ- -ете.^ 4.*BSD —^ коммерческих продуктов UNIX. она послужила основой для создани 131 Глава 2. Обзор операционных систем •44
По мнению автора, именно благодаря версиям этой серии UNIX прио свою популярность, а многие улучшения этой операционной системы п вые появились в версиях BSD. .'. Последней версией этой серии, выпущенной в Беркли, является сад ^ 4.4.BSD. Эта версия является основным обновлением версии 4.3BSD, куда - *овая система управления виртуальной памятью, ядро с измененной струк р к i также длинный список улучшений других возможностей. ■% Linux / История возникновения '/ Система Linux возникла как вариант операционной системы UNIX, npe-jHa- (наченный для персональных компьютеров с IBM-совместимой архитек ой Тервоначальная версия была написана Линусом Торвальдсом (Linus Tory Id » финским студентом, изучающим теорию вычислительных машин. В 1991. ду Горвальдс представил в Internet первую версию системы Linux. С тех пор мно- кество людей, сотрудничая посредством Internet, развивают Linux под руково- [ством ее создателя. Благодаря тому что система Linux является бесплатной и южно беспрепятственно получить ее исходный код, она стала первой альтерна- ивой рабочим станциям UNIX, предлагавшимся фирмами Sun Microsystems, )igital Equipment Corp (теперь Compaq) и Silicon Graphics. На сегодняшний день лпих является полнофункциональной системой семейства UNIX, способно ра- отать на всех этих и других платформах. ,| Залогом успеха системы Linux является то, что она бесплатно распррс ра- яется при поддержке Фонда бесплатно распространяемых программ (Free, oft- rare Foundation — FSF). Целью этой организации является создание наде ого ппаратно-независимого программного обеспечения, которое было бы бес 1ат- ым, обладало высоким качеством и пользовалось широкой популярностыо* и пользователей. Фонд предоставляет инструменты для разработки прогр ого обеспечения под эгидой общедоступной лицензии GNU (GNU Public icense — GPL). Таким образом, система Linux в таком виде, в котором о у- ;ествует сегодня, является продуктом, появившимся в результате усилий^ ор- альдса, а затем и многих других его единомышленников во всем мире, щ рас- ространяющимся в рамках проекта GNU. '1^ Linux используется не только многими отдельными программист ми; на проникла и в корпоративную среду [MANCOO]. В основном это про зош- 0 благодаря высокому качеству ядра операционной системы Linux, а не из- 1 того, что эта система является бесплатной. В эту популярную версию вне- я и свой вклад многие талантливые программисты, в результате чего полился впечатляющий технический продукт. К достоинствам системы их ожно отнести то, что она является модульной и легко настраивается/ ча" >даря этому можно достичь высокой производительности ее работы на са- ых разнообразных аппаратных платформах. К тому же получая в свое с* эряжение исходный код, производители программного обеспечения ,, г T яучшать качество приложений и служебных программ, с тем чтоб**.\ и ?овлетворяли определенным требованиям. В этой книге изложены по ° >сти внутреннего устройства ядра Linux. /t й„" ^2 Часть 1. Основные пон '":; Модульная структура %£* ЯдРа большинства версий операционной системы UNIX являются монолит- ■■*. мй. Напомним, что монолитное ядро — это ядро, которое виртуально включа- *:, „ Себя все возможности операционной системы в виде одного большого блока * е « который запускается как единый процесс в едином адресном пространстве. - функциональные компоненты такого ядра имеют доступ ко всем его внут- :-, йМ структурам данных и ко всем программам. При внесении изменений в /J. ™ gVIO Из частей типичной монолитной операционной системы все ее модули и *рОГраммы необходимо повторно компоновать и переустанавливать, а перед м как изменения вступят в силу, систему нужно будет перезагрузить. В ре- I vnbTaTe все модификации, такие, как добавление драйвера нового устройства '■ и Новых функций файловой системы, усложняются. Особенно остро эта про- I блема стоит в системе Linux, глобальную разработку которой выполняют объе- i яИненные на добровольных началах группы независимых программистов. ; Для решения этой проблемы система Linux организована в виде набора от- -■ носительно независимых блоков, которые называются загружаемыми модулями I (loadable modules) [GOYE99]. Загружаемые модули Linux имеют две отличительные особенности. • Динамическое связывание. Любой модуль ядра может быть загружен в па- " мять и подсоединен к ядру в то время, когда само ядро уже находится в ; памяти и выполняется. Любой модуль может быть также отсоединен от яд- \ ра и удален из памяти в любой момент времени. • Стековая организация. Модули организованы в виде определенной иерархической структуры. Отдельные модули могут выполнять роль библиотек при обращении к ним модулей более высоких уровней в рамках этой структуры; они г сами также могут обращаться к модулям на более низких уровнях. Динамическое связывание [FRAN97] облегчает настройку системы и экономит память, которую занимает ядро. В системе Linux программа пользователя или сам пользователь может загружать или выгружать модули с помощью команд insmod и rmmod. Само ядро управляет работой отдельных функций и по мере надобности загружает нужные модули или выгружает те, нужда в которых уже отпала. Кроме того, стековая организация позволяет задавать зависимости модулей, что дает два основных преимущества. 1- Код, являющийся общим для набора однотипных модулей (например, драйверы похожих устройств), можно поместить в один модуль, что позволяет сократить количество повторений. 2. Ядро может проверить наличие в памяти нужных модулей, воздерживаясь от выгрузки модуля, который нужен для работы других, зависимых от него, и загружая вместе с новым требуемым модулем все необходимые дополнительные модули. На примере, приведенном на рис. 2.18, показаны структуры, которые пользуются операционной системой Linux для управления модулями. На рисун- е приведен список модулей ядра после загрузки модулей FAT и VFAT. Каждый ДУ-^ь задается двумя таблицами: таблицей модулей и таблицей символов. В «лицу модулей входят перечисленные ниже элементы. 4j -Пава 2. Обзор операционных систем 133 »•
next. Указатель на следующий модуль. Все модули организованы в' связанного списка. Этот список начинается псевдомодулем (на рис. 2.1 не показан) ref. Список модулей, которые используются данным модулем. symtab. Указатель на таблицу символов данного модуля. name. Имя модуля. size. Размер модуля в страницах памяти addr. Начальный адрес модуля. state. Текущее состояние модуля. * cleanup С). Указатель на программу, которая запускается при выгр данного модуля. ■1\ Модуль next re r symtab name size addr state *cleanuD( ) FAT s ymboltable size n_symbols n_refs symbols references Модуль next rer symtab name size addr state *cleanup( ) VFAT symboltable size n_symbols ■ n_rets symbols references .1 i*: *ъ: 1 ^ Puc. 2.18. Пример списка модулей ядра операционной системы Linux M Таблица символов определяет символы, контролируемые данным модул . :пользуемые где-либо еще. В таблицу входят такие элементы. • size. Полный размер таблицы. • n_syiribols. Количество символов. • n refs. Количество ссылок. — А' • symbols. Таблица символов. ;".• • references. Список модулей, зависящих от данного. \ На рис. 2.18 модуль VFAT загружается после модуля FAT и зависит от него. ;.= V. 'л'1 'Л Часть 1. Основные понят гящ iEX ь- Написано много книг по операционным системам, в которых также описы- еТся и архитектура компьютера. В [SILBOO], [NUTTOO] и [CROW97] речь идет л основных принципах (с использованием результатов исследований нескольких яжнейших операционных систем). В [VAHA96] рассматривается внутреннее устройство операционной системы TTNIX, приводится сравнительный анализ нескольких ее вариантов. Полное и очное описание версии UNIX SVR4 со множеством технических подробностей представлено в [GOOD94]. Настоятельно рекомендуем популярное в академических кругах издание по UNIX 4.4BSD [MCKU96], вышедшее в Беркли. Собрание статей по операционной системе UNIX, представляющее большой интерес, было опубликовано в июле-августе 1987 года в журнале Bell System Technical Journal и в октябрьском издании 1984 года журнала AT&T Bell Laboratories Technical Journal. Эти статьи были переизданы [АТТ87а, АТТ87Ъ]. В [GRAH95] дается в сжатой форме полное описание операционной системы Solaris 2.x. О внутреннем устройстве операционной системы Linux подробно рассказано в [ВЕСК98] и [CARD97]. О внутреннем устройстве операционной системы Windows 2000 пока что написано немного. Прекрасное описание внутреннего устройства Windows NT можно найти в [SOL098]. ■Ч£Г5Г |АТТ87а AT&T. UNIX System Readings and Examples. Volume I, — Englewood t Cliffs, NJ: Prentice Hall, 1987. ?ATT87b AT&T. UNIX System Readings and Examples. Volume II. —- Englewood j > Cliffs, NJ: Prentice Hall, 1987. j BECK98 Beck M. et al. Linux Kernel Internals. — Reading, MA: Addison-Wesley, I - 1998. CARD97 Card R., Dumas E., Mevel F. The Linux Kernel Book. — New York: Wiley, 1997. CROW97 Crowley С Operating Systems: A Design-Oriented Approach. — Chicago: Irwin, 1997. GOOD94 Goodheart В., Сох J. The Magic Garden Explained: The Internals of UNIX System V Release 4. — Englewood Cliffs, NJ: Prentice Hall, 1994. GRAH95 Graham J. Solaris 2л: Internals and Architecture. — New York: McGraw- Л Hill, 1995. MCKU96 McKusick M„ Bostic K., Karels M., Quartermain J. The Design and Imple- > mentation of the 4.4BSD UNIX Operating System. — Reading, MA: Addison- Wesley, 1996. NUTTOO Nutt G. Operating Systems: A Modern Perspective. — Reading, MA: Addison-Wesley, 2000. SILB00 Silberschatz A., Galvin P., Gagne G. Applied Operating System Concepts. — Reading, MA: Addison-Wesley, 2000. , SOL098 Solomon D. Inside Windows NT. — Redmond, WA: Microsoft Press, 1998. VAHA96 Vahalia U. UNIX Internals: The New Frontiers. — Upper Saddle River, NJ: j L Prentice Hall, 1996. j л&ва 2. Обзор операционных систем 135
Предположим, у нас есть многозадачный компьютер, в котором каждое зада \ г имеет идентичные характеристики. В течение цикла вычисления одного зад utl^ Т половину времени занимает ввод-вывод, а вторую половину — работа п сора. Для выполнения каждого задания требуется N циклов. Допустим, что планирования используется простой алгоритм циклического обслуживания й ввод-вывод может выполняться одновременно с работой процессора. Опред$ цт значения следующих величин. -,; • Реальное время, затрачиваемое на выполнение задания. % • Среднее количество заданий, которое выполняется в течение одного цикла • Доля времени, в течение которого процессор активен (не находится в и ме ожидания). -г» Вычислите эти значения для одного, двух и четырех одновременно выполняю хся заданий, считая, что время цикла Т распределяется одним из следующих сп в а. В течение первой половины периода выполняется ввод-вывод, а в те. нне второй — работа процессора. ■%- б. В течение первой и четвертой четвертей выполняется ввод-вывод, а в те ние второй и третьей — работа процессора. к,, .2. Перегруженной операциями ввода-вывода называется такая программа, которая, будучи запущена сама по себе, тратит больше времени на ввод-вывод, че. а работу процессора. Программой, преимущественно использующей процесор, называется программа, в которой соотношение затрат времени изменяется в пользу процессора. Предположим, что в алгоритме краткосрочного планирования предпочтение отдается тем программам, которые в течение недавнего времени использовали процессор меньше других. Объясните, почему в этом алгоритме отдается предпочтение программам, перегруженным операциями ода- вывода, хотя тем программам, которые преимущественно используют процес ор, тоже отводится некоторое процессорное время. 3. В компьютере есть кэш, основная память и диск, который используется для организации виртуальной памяти. Если слово, к которому производится обращение, находится в кэше, для доступа к нему требуется 20 ns. Если это слово находится в основной памяти, но отсутствует в кэше, то оно сначала загружается в кэш за 60 ns, а затем к нему производится обращение. Если нужного слова нет в основной памяти, то чтобы найти его на диске и загрузить в основную память, требуется 12 ms; еще 60 ns нужны, чтобы скопировать его в кэш, и только затем к этому слову производится обращение. Результативность обращений к кэшу равна 0.9, а результативность обращений к основной памяти — 0.6. Найдите среднее время, которое требуется для доступа системы к нужному ей слову. 4. Сравните стратегии планирования, которые могли бы использоваться для оптимизации системы разделения времени и многозадачной пакетной системы. 5. В чем заключается предназначение системных вызовов и как они соотносятся с операционной системой и с концепцией работы в режиме ядра и режиме пользователя? S. Одним из основных модулей ядра операционной системы OS/390 для мейнф й* мов IBM является System Resource Manager (SRM). Этот модуль распредел т ресурсы между адресными пространствами (процессами). Именно этот мод i делает операционную систему OS/390 одной из самых интеллектуальных. Ни кие другие операционные системы для мейнфреймов, а тем более другие в операционных систем не могут выполнять функций, аналогичных тем, котор *" Часть 1. Основные понят '^ выполняет модуль SRM. В концепцию ресурсов входят: процессор, реальная память и каналы ввода-вывода. SRM собирает статистику относительно использования процессора, каналов и различных ключевых структур данных; на основе анализа собранной статистики обеспечивается оптимальная производительность системы. Может производиться дополнительная настройка модуля для различных целей, в соответствии с которыми модуль динамически изменяет конфигурацию и характеристики производительности выполнения заданий. Модуль SRM, в свою очередь, составляет отчеты, на основании которых подготовленный оператор может улучшить производительность и изменить настройку системы с целью улучшения обслуживания клиентов. В этой задаче идет речь об одном из видов деятельности модуля SRM. Реальная память подразделяется на блоки одинакового размера, которые называются кадрами. Компьютер может содержать многие тысячи кадров, в каждом из которых может находиться блок виртуальной памяти, называющийся страницей. Управление к модулю SRM переходит с частотой примерно 20 раз в секунду; при этом происходит проверка каждой из страниц памяти. Если данная страница не запрашивалась и не изменялась, показания счегчика увеличиваются на 1. Время от времени модуль SRM усредняет эти числа и определяет среднее время, в течение которого система не использует данную страницу кадра памяти. Для чего можно использовать эти данные, и что для этого должен предпринять модуль SRM? ава 2. Обзор операционных систем 137
Часть 2 ПрОЦеССЫ Основной задачей любой операционной системы является управление процессами. Операционная система должна распределять между ними ресурсы, предоставлять им возможность совместно использовать информацию и обмениваться ею, защищать ресурсы, используемые одним процессом, от их использования другими процессами, а также обеспечивать возможность синхронной работы процессов. Для этого операционная система должна поддерживать для каждого процесса свою структуру данных, в которой задается состояние данного процесса и указываются ресурсы, которыми он владеет. Это позволяет операционной системе осуществлять управление процессами. В многозадачной однопроцессорной системе несколько различных процессов могут выполняться, чередуясь один с другим. В многопроцессорной системе несколько процессов могут не только чередоваться, но и выполняться одновременно. Эти типы параллелизма вызывают массу сложных проблем, с которыми сталкивается как создающий приложение программист, так и операционная система. Во многих современных операционных системах положение с управлением процессами усложняется введением понятия потока. В многопоточной системе принадлежность ресурсов остается атрибутом процесса, в то время как сам процесс представляет собой множество параллельно выполняющихся потоков. ПУТЕВОДИТЕЛЬ 1ВДШ0ТЙ 2!:f™5 + ■ Глава 3. Описание процессов и управление ими Основная работа традиционной операционной системы связана с управлением процессами. В любой момент времени этапы исполнения каждого процесса характеризуются одним из нескольких состояний, в число которых входят состояние готовности, выполнения и заблокированности. Операционная система отслеживает состояния процессов и управляет их изменением, для
го ей приходится поддерживать довольно подробные структуры данных, п вающие каждый процесс. Операционная система должна выполнять фут цианирования и предоставлять инструментарий для совместного выпо ейй оцессов и их синхронизации. В главе 3 рассматриваются указанные стру»; р яных и методы, используемые типичной операционной системой для упр зле я процессами. % шва 4. Потоки, симметричная мультипроцессорная \ |работка и микроядра \ Во многих операционных системах традиционная концепция процесса раз. гена на две части: одна из них связана с принадлежностью ресурсов (процесс) ругая — с выполнением машинных команд (поток). Процесс может содер ать :колько потоков. Многопоточная организация помогает лучше структу про- ъ приложения, а также повысить производительность их работы. В ' laae еже рассматривается симметричная многопроцессорность (symmetric lulti- icessor — SMP), представляющая собой компьютерную систему с несколькими щессорами, каждый из которых способен исполнять все приложения и сис- шый код. Многопроцессорная организация системы улучшает производ ель- :ть и надежность ее работы. SMP часто используется совместно с многопоточ- :тью, но может давать значительный выигрыш производительности и без, нее. наконец, в главе анализируется работа микроядра (представляющего бой [ль разработки операционной системы, при котором объем системного *ода, ютающего в режиме ядра, сводится к минимуму) и его преимущества. -* Ь. ава 5. Параллельные вычисления: взаимоисключения многозадачность ч Двумя центральными темами, связанными с современными операционными темами, являются многозадачность и распределенные вычисления. Их'' сно- 1, как и основой технологий разработки операционных систем, являются панельные вычисления. В главе рассматриваются два важных аспекта п рал- ьных вычислений: взаимоисключения и синхронизация. Взаимное искйюче- ! означает такое совместное использование кода, ресурсов или да ых колькими процессами (или потоками), при котором в каждый момент в ,". ме- доступ к совместно используемым объектам имеет только один процесс, ш- низация тесно связана с взаимным исключением, и представляет собой спо- ность нескольких процессов координировать свою деятельность путем об ена формацией. В главе дается широкий обзор вопросов, связанных с параллель- йи вычислениями, начинающийся с рассмотрения вопросов архитектуры пе- ионных систем, имеющих отношение к этому понятию. Здесь же обсужда тся аратная поддержка параллельных вычислений, а также важнейшие м хамы программной поддержки: семафоры, мониторы и передача сообщений. ава 6. Взаимоблокировка и голодание ? В этой главе рассматриваются два дополнительных аспекта параллельны^ [ислений. Ситуация, в которой два или большее количество процессов на- ятся в состоянии ожидания, причем ни один из них не может продолжать ) Часть 2. Процессы пк> работу» называется взаимоблокировкой. Взаимоблокировка — это явле- vt*o которое трудно предугадать, и простых общих методов решения этой про- н: еМЫ не существует. В главе представлены три основных подхода к обработке V яцмоблокировки: предотвращение, устранение и обнаружение. Ситуация, в \ , тоРой готовый к выполнению процесс долго не получает доступа к процессо- из-за того, что он выполняет другие процессы, называется голоданием. Го- яание в основном связано с планированием, поэтому детальнее оно рассмат- ается в чеТвертой части. Основное внимание в главе уделяется взаимоблокировке, голодание же рассматривается в плане разрешения проблемы взаимоблокировок для его исключения. Часть 2. Процессы
ГЛАВА Описание процессов и управление ими 3.1. Состояния процессов 3.2. Описание процессов 3.3. Управление процессами 3.4. Управление процессами в операционной системе UNIX SVR4 3.5. Резюме, ключевые термины и контрольные вопросы 3.6. Рекомендуемая литература 3.7. Задачи 3
ш рхитектура операционной системы должна удовлетворять опред Нн. /\ требованиям. Все многозадачные операционные системы использует ^0 ^ -^ цепцию процесса — начиная с однопользовательских операционных сь •ем, таких, как Windows 98, и заканчивая операционными системами д гейнфреймов, таких, как OS/390, которые способны поддерживать работу. Ыс Я [ользователей. Таким образом, основные требования, которым должны удовл ворять операционные системы, могут быть сформулированы с использо и юнятия процесса. i/ • Операционная система должна чередовать выполнение нескольких ц 0цег сов, чтобы повысить степень использования процессора при обеспечении п» зумного времени отклика. :?v • Операционная система должна распределять ресурсы между процессами соответствии с заданной стратегией (т.е. предоставляя определенным уак. циям или приложениям более высокий приоритет), избегая в то же; ремя взаимоблокировок.1 :Р~ ■ л. • От операционной системы может потребоваться поддержка обмена формацией между процессами, а также обеспечение возможности создания процессов пользователями. Обе эти возможности могут помочь в структурировании приложений. ^ Подробное изучение операционных систем мы начнем со знакомства с фед- гавлением процессов и управлением ими. Для начала рассмотрим возможные эстояния процессов, характеризующие их поведение; затем перейдем к рук- урам данных, которые нужны операционной системе для представления с стоя- ия и других характеристик процессов. И, наконец, будет рассмотрено управ те- ие процессами в операционной системе UNIX SVR4. Примечание. При описании процессов в большинстве случаев в этой главе кон- епцию виртуальной памяти можно игнорировать, но при рассмотрении не рых тециализированных вопросов уместно обратить на нее особое внимание. Хот# подобно виртуальная память обсуждается только в главе 8, "Виртуальная нам ть", раткий. обзор приведен в главе 2, "Обзор операционных систем". 4 Ш. СОСТОЯНИЯ ПРОЦЕССОВ * S ; : Основной задачей процессора является выполнение машинных команд, ьо- >рые находятся в основной памяти и составляют программу. В преды е гаве объяснялось, что с целью повышения эффективности и облегчения про с- i программирования процессор может одновременно выполнять несколько Ц - >амм, чередуя их во времени. :\ В главе 2, "Обзор операционных систем" упоминалось, что для каждой Я >аммы, которая должна быть выполнена, создается свой процесс, или задай i точки зрения процесса его работа состоит в выполнении определенного набо £ Взаимоблокировки рассматриваются в главе 6, "Взаимоблокировка и голодаНМ*: о сути, взаимоблокировка происходит тогда, когда каждый из двух процессов Зй* ывает ресурсы, которые нужны другому процессу. Каждый из этих двух процессов гт ждать освобождения нужных ему ресурсов до бесконечности. -fr.;. i4 Часть 2. Процесс Ъ з*анд; последовательность выполнения этих команд задается адресами, кото- *- заносятся в счетчик команд. Через некоторое время счетчик команд может ■Рисовать код других программ, которые являются частями других процессов, • ':*** точки зрения данной программы ее выполнение состоит из последовательно- V* вь1полнения ее команд. '■ *** Поведение процесса можно охарактеризовать, последовательно перечислив К полненные в ходе его работы команды. Такой перечень выполненных команд J цесса называется его следом (trace)2. Поведение процессора можно охаракте- 3 °изовать, показав, как чередуются следы различных процессов. U рассмотрим очень простой пример. На рис. 3.1 показано расположение в ямяти трех процессов. Чтобы упростить обсуждение, предположим, что вирту- вая памЯть не используется; таким образом, все три процесса представлены пограммами, которые полностью загружены в основную память. Кроме этих поограмм в памяти находится небольшая программа-диспетчер, выполняющая переключение с одного процесса на другой. В листинге 3.1 показаны следы трех пассматриваемых процессов на ранних стадиях их выполнения. Представлены первые 12 выполненных команд в процессах А и С; в процессе В выполнено четыре команды, и мы считаем, что эти команды включают в себя операцию ввода-вывода, завершения которой должен ожидать процесс. Адрес О 100 Основная память 5000 8000 12000 Диспетчер «• ПроцессА т •#,- ъ.*~щ Процесс В Процесс С Счетчик команд 8000 . 1 Рис. 3.1. Состояние системы в момент выполнения 13-го командного цикла (см. листинг 3.2) Иногда в русскоязычной, литературе используются термины траектория и Расса. — Прим. перев. Лава 3. Описание процессов и управление ими 145
[[истинг 3.1. Следы процессов, изображенных на рис. 3.1 'ц. 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 а) След процесса А 8000 8001 8002 8003 б) След процесса В 5000 - начальный адрес процесса 8000 - начальный адрес процесса В 12000 - начальный адрес процесса С 12000 12001 12002 12003 12004 12005 12006 12007 12008 12009 12010 12011 в) След процесса А Теперь рассмотрим эти следы с точки зрения процессора. В листан 3.2 показаны чередующиеся следы, получившиеся в результате выполнения п р ых 52 командных циклов (для удобства они пронумерованы). Предполож ',, что операционная система позволяет непрерывно выполнять не более шести командных циклов одного и того же процесса, после чего процесс прерывается это предотвращает монопольное использование всего процессорного времени, дним из процессов. Из листинга 3.2 видно, что после первых шести команд проц сса А следует перерыв, в течение которого выполняется некоторый код диспетч*$» , состоящий из шести команд, после чего управление передается процессу Щ Выполнив четыре команды, процесс В запрашивает операцию ввода-вывода доч- жен ожидать ее завершения. Поэтому процессор прекращает выполнять й оцесг Вис помощью диспетчера переходит к выполнению процесса С. После ч ред ного перерыва процессор возобновляет выполнение процесса А. По истече ии отведенного этому процессу времени процесс В все еще ожидает завершены операции ввода-вывода, поэтому диспетчер снова передает управление процес С ..л Листинг. 3.2. Составной след процессов, изображенных на рис. 3.1 1 2 3 4 5 6 7 8 5000 5001 5002 5003 5004 5005 100 101 Тайм- -аут 27 28 29 30 31 32 33 34 12004 12005 100 101 102 103 104 105 Тайм-аут !*.: ■if 3 Указанное количество команд, выполняемых при работе процессов и дис , я1 намного меньше, чем в действительности; в этом учебном примере такое неп е добно маленькое число используется для упрощения рассмотрения. * 146 Часть 2. Прои о И 12 13 14 15 16 п 18 19 20 21 22 23 24 25 26 103 104 105 8000 8001 8002 8003 100 101 102 103 104 105 12000 12001 12002 12003 Ввод-вывод 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 5006 5007 5008 5009 5010 5011 100 101 102 103 104 105 12006 12007 12008 12009 12010 12011 Тайм-аут Тайм-аут 100 - начальный адрес программы-диспетчера Заштрихованные области - выполнение команд диспетчера В первом столбце указаны номера командных циклов, во втором - адреса выполняемых команд Модель процесса с двумя состояниями Основной задачей операционной системы является управление выполнением процессов; в эту задачу входит определение схемы чередования процессов и выделения им ресурсов. Первый шаг, который следует предпринять при составлении программы, предназначенной для управления процессами, состоит в описании ожидаемого поведения процессов. Самую простую модель можно построить, исходя из того, что в любой момент времени процесс либо выполняется, либо не выполняется. Таким образом, процесс может быть в одном из двух состояний: выполняющийся или не выполняющийся (рис. 3.2,а). Создав новый процесс, операционная система вводит его систему в состоянии не выполняющегося. Созданный процесс, о существовании оторого известно операционной системе, ждет, пока он сможет быть запущен. я от времени выполняющиеся процессы будут прерываться, и та часть опе- онной системы> которая выполняет функции диспетчера, будет выбирать выполнения другой процесс. Выполняющийся перед этим процесс перейдет вьщ °СТОЯВия ВЫПОЛНЯЮщегося в состояние не выполняющийся, а в состояние лняющегося перейдет один из ожидающих процессов, тель ализиРУя ЭТУ простую модель, можно сделать некоторые выводы относимого r* архитектУРы операционной системы. Необходим способ, с помощью кото- дать Удет представлен каждый процесс, чтобы операционная система могла слеза ним. С каждым процессом нужно связать определенную информацию, в '** а 3. Описание процессов и управление ими 147
которую будет входить его текущее состояние и размещение в памяти. Н'в толняющиеся процессы следует организовать в какую-то очередь, где они я *али бы своего выполнения. Один из возможных вариантов предложен >ис. 3.2,6. Здесь имеется одна очередь, ее элементами являются указатели 1роцессы. Можно предложить и другую схему, в которой очередь состоит из энного списка блоков данных, где каждый блок представляет отдельный jecc; позже мы вернемся к исследованию этой реализации. я. о- Диспетчеризация Вход ЫЙСШняетсд полняется! Выход Пауза а) Диаграмма перехода состояний Очередь Вход Диспетчеризация ^ Процессор Выход Пауза 1% Л" Ч "Г > ■V б) Диафамма использования очереди %" Рис. 3.2. Модель процесса с двумя состояниями '-- V;- Поведение диспетчера можно описать следующим образом. Процесс, ота юторого прервана, переходит в очередь процессов, ожидающих выполнение; Ее- :и же процесс завершен, он выводится из системы. В любом случае для в от- :ения диспетчер выбирает из очереди следующий процесс. %; >оздание и завершение процессов Перед тем как мы предпримем попытку улучшения нашей простой МО "И* двумя состояниями, будет полезно обсудить создание и завершение проц сов: едь время жизни процесса ограничивается моментами его создания и зав Ш • :ия вне зависимости от модели поведения. ч, Создание процессов % Когда операционная система собирается добавить новый процесс к тем, ко1*>Р е же состоят на учете, она создает структуры данных, использующиеся при ии этим процессом (как описано в разделе 3.2), и размещает его адресное п гво в основной памяти. С помощью этих действий и создается новый процесс. К созданию процесса могут привести четыре события, перечисле абл. 3.1. В среде пакетной обработки процесс создается в ответ на поступле 48 ■Ч' .а е Часть 2. Про "с ■^ : ' яцяя; в интерактивной среде процесс создается при попытке нового пользователя ; «ойти в систему. В обоих случаях ответственность за создание нового процесса лежит операционной системе. Кроме того, операционная система может создавать про- с по требованию приложения. Например, если пользователь отправляет запрос на спечатку файла, операционная система может создать процесс, управляющий пе- тью- Затем процесс, производивший запрос, может продолжить свою работу, неза- сИМо от того, сколько времени понадобится для печати. Таблица 3.1. Причины создания процессов Н вое пакетное задание В операционную систему для обработки поступает управляющий поток пакетных заданий (обычно с ленты или с диска). Готовясь принять на обработку новое задание, операционная система считывает очередную последовательность команд управления заданиями Вход в систему в инте- В систему с терминала входит новый пользователь рактивном режиме Создание операционной Операционная система может создать процесс для выполпе- системой процесса, необ- ния некоторой функции, которая требуется для программы ходимого для работы ка- пользователя. При этом пользователь не должен ждать, пока ких-либо служб закончится ее выполнение (как в примере, в котором создавался процесс управления печатью) Порождение одного про- С целью структуризации программы или использования цесса другим возможностей параллельных вычислений программа может создавать другие процессы Традиционно операционная система создает все процессы незаметно для пользователя или приложения; такой способ принят во многих современных операционных системах. Однако иногда требуется, чтобы один процесс мог послужить причиной создания другого процесса. Например, процесс приложения может сгенерировать другой процесс, который будет получать данные от первого процесса и приводить их к виду, удобному для дальнейшего анализа. Новый процесс будет работать параллельно с приложением и время от времени активизироваться для получения новых данных. Такая организация может быть очень Полезна для структурирования приложений. В качестве другого примера можно Привести ситуацию, в которой процесс-сервер (например, сервер печати или файловый сервер) может генерировать новый процесс для каждого обрабатываемого им запроса. Создание операционной системой процесса по явному запросу Другого процесса называется порождением процесса (process spawning). Когда один процесс порождает другой, то порождающий процесс называется родительским, или предком (parent), а порождаемый процесс — дочерним, или потомком (child). Обычно "родственные" процессы обмениваются между собой информацией и взаимодействуют друг с другом. Организация такого взаимодействия является достаточно трудной задачей для программиста (эта тема рассматривается в главе 5, "Параллельные вычисления: взаи- °исключения и многозадачность")* Завершение процессов В табл. 3.2 перечислены типичные причины завершения процессов. В лю- й компьютерной системе должны быть средства, позволяющие определить, за- Чилось выполнение процесса или нет. Пакетное задание должно включать в ава 3. Описание процессов и управление ими 149
ебя команду типа Halt (останов) или какой-то явный вызов службы операцио i юй системы, приводящий к завершению процесса. В первом случае генериру т я прерывание для извещения операционной системы о завершении процес а [апример, в системе с разделением времени процесс пользователя должен бы ь авершен, когда пользователь выходит из системы или выключает терминал. а ерсональном компьютере или рабочей станции пользователь может выйти \й риложения (например, закрыть программу обработки текста или электрон' аблицу). Все эти действия в конечном счете приведут к тому, что будет вызва а лужба операционной системы, завершающая процесс. 'аблица 3.2. Причины завершения процессов бычное завершение [ревышение лимита гведенвого программе ремени ^достаточный объем амяти ыход за пределы ответной области памяти шибка защиты рифметическая ошибка элитнее ожидание шибка ввода-вывода еверная команда эманда с недоступны- а привилегиями правильное исполь- вание данных «ешательство опера- ра или операционной [стемы Процесс вызывает службу операционной системы, чтобы сообщить, что он завершил свою работу Я Общее время выполнения процесса превышает заданное пре дельное значение. Это время может измеряться нескольки способами. Одним из них является учет полного времени, ай траченного на выполнение ("по настенным часам"); при в '' полнении интерактивного процесса время можно отсчитыва ь с момента последнего ввода данных пользователем Для работы процесса требуется больше памяти, чем имеется, системе > Процесс пытается получить доступ к ячейке памяти, к которой у него нет прав доступа г Процесс пытается использовать недоступный для него ресурс или файл, или пытается сделать это недопустимым образом '' например, производит попытку записи в файл, открыты только для чтения <. Процесс пытается выполнить запрещенную арифметическую о рацию, например, деление на ноль, или пытается исполъзова число, превышающее возможности аппаратного обеспечения г Процесс ждет наступления определенного события дольше чем задано в параметрах системы .-v Во время ввода или вывода происходит ошибка. Например, удается найти нужный файл или выполнить чтение или пись за максимально возможное количество попыток (когда например, на магнитном носителе попался дефектный уч сток) или производится попытка выполнить недопустимую операцию (например, чтение с печатающего устройства) Процесс пытается выполнить несуществующую команд (часто это бывает, если процесс переходит в область данных пытается интерпретировать их как команду) Процесс пытается использовать команду, зарезервированну для операционной системы Т. Часть данных принадлежит не к тому типу или не инициалы зирована По какой-лнбо причине операционная система может завер* шить процесс (например, в случае взаимоблокировки) 50 Часть 2. Процесс " • ■ ■"» Окончание табл. 3J2 Завершение родитель- При завершении родительского процесса операционная система ского процесса может автоматически прекращать все его дочерние процессы Запрос со стороны ро- Обычно родительский процесс имеет право прекращать любой дительского процесса из своих дочерних процессов Кроме того, к завершению процессов могут привести и другие ошибки или условия отказа. В табл. 3.2 перечислены некоторые из наиболее часто возникающих условий.4 Наконец, в некоторых операционных системах процесс может быть завершен процессом, который его породил, а также при завершении самого родительского процесса. Модель с пятью состояниями Если бы все процессы всегда были готовы к выполнению, то очередь на рис. 3.2,6 могла бы работать вполне эффективно. Такая очередь работает по принципу обработки в порядке поступления, а процессор обслуживает имеющиеся в наличии процессы круговым (round-robin)5 методом (каждому процессу в очереди отводится определенный промежуток времени, по истечении которого процесс возвращается обратно в очередь, если он не был блокирован). Однако даже в таком простом примере, который был описан выше, подобная реализация не является адекватной: некоторые из не выполняющихся процессов готовы к выполнению, в то время как другие являются заблокированными и ждут окончания операции ввода-вывода. Таким образом, при наличии только одной очереди диспетчер не может просто выбрать для выполнения первый процесс из очереди. Перед этим он должен будет просмотреть весь список, отыскивая незабло- кированный процесс, который находится в очереди дольше других. Естественнее было бы разделить все не выполняющиеся процессы на два типа: готовые к выполнению и заблокированные. Такая схема показана на рис. 3.3. Здесь добавлены еще два состояния, которые окажутся полезными в дальнейшем. Опишем каждое из пяти состояний процессов, представленных на диаграмме. • Выполняющийся. Процесс, который выполняется в текущий момент времени. В настоящей главе предполагается, что на компьютере установлен только один процессор, поэтому в этом состоянии может находиться только один процесс. • Готовый к выполнению. Процесс, который может быть запущен, как только для этого представится возможность. • Блокированный. Процесс, который не может выполняться до тех пор, пока не произойдет некоторое событие, например завершение операции ввода-вывода. 4 Снисходительная операционная система в некоторых случаях может позволять пользователю восстановить работу процесса, в котором возникли условия отказа, не пР<?кращая его. Например, если пользователь запросил доступ к файлу, к которому у не- го нет доступа, операционная система может просто сообщить пользователю, что ему 0гпказано в доступе, предоставив процессу возможность продолжать свою работу. Иногда используется термин "карусельный метод". — Прим. перев. Глава 3. Описание процессов и управление ими 151
Новый. Только что созданный процесс, который еще не помещен " п онной системой в пул выполнимых процессов. Обычно это новый Р который еще не загружен в основную память. ; Це Завершающийся. Процесс, удаленный операционной системой из nv полнимых процессов. "* * Вь _«.- д „-*-- Диспетчеризация Sosm %всистемУ Швый ^ -*: 1 ' „• Освобождение V?* '.^гашению? т;лняющиися ■■'♦шаю Тайм-аут si*. Событие Ожидание события рованн- Ч .Pi/c. 3.3. Модель с пятью состояниями Состояния "новый" и "завершающийся" представляют собой полезны^ \кон- рукции для управления процессами. Первое из них соответствует про" ссу, торый был только что определен. Например, если новый пользователь пытает- войти в систему с разделением времени или в систему поступает новое кет- е задание, операционная система может определить новый процесс в дв эта- ■ I ч V . Во-первых, она выполняет всю необходимую рутинную работу: процесс^. 1ри- швается идентификатор, формируются все необходимые для управл ния оцессом таблицы. В этот период времени процесс находится в состоянии ово- Это означает, что операционная система выполнила необходимые для'с зда- я процесса действия, но еще не приготовилась к его запуску. Например,' пе- дионная система может иметь ограничения по количеству одновременна, вы- 1няющихся процессов. Такие ограничения устанавливаются, например, 4 обы снижать производительность системы (или не переполнять основную память). 5лицы управления новыми процессами с необходимой операционной си еме рормацией содержатся в основной памяти, однако самих процессов там;!,. и№ ', т.е. код программы, которую нужно выполнить, не загружен в пам , и шым, относящимся к этой программе, не выделено пространство. Отвечаю; ая :ому процессу программа остается во вторичной памяти (обычно это диск).:_ Выход процесса из системы также происходит в два этапа. Во-первых,, про- с переходит в состояние завершающегося при достижении точки естествен ого ершения, а также когда он останавливается из-за возникновения неустраю °1 дбки или когда его останавливает другой процесс, обладающий необходи ^* этого полномочиями. После этого момента процесс больше не может вы от ься. Операционная система временно сохраняет таблицы и другую инфо . & В рассматриваемой модели концепция виртуальной памяти во внимание не прин *. В системах, поддерживающих виртуальную память, при переходе процесса из сое нового в состояние готового к выполнению и код. и данные программы загружаю пуальную память. Краткое обсуждение виртуальной памяти можно найти в глй юр операционных систем", а более подробное — в главе 8, "Виртуальная память". ой МИ Часть 2. Пронес 1 яых связанную с этим заданием, так что вспомогательные программы могут по- ть все необходимые сведения о завершившемся процессе (например, эти дан- могут понадобиться программе, ведущей учет использования процессорного ,-, мени и других ресурсов). После того как эти программы извлекут всю необхо- 1\ю информацию, операционной системе больше не нужно хранить данные, ■ ^ чанные с процессом, и он полностью удаляется из системы. ; да рИс. 3.3 показаны типы событий, соответствующие каждому из возмож- переходов из одного состояния в другое. Возможны следующие переходы. Нулевое состояние —> Новый. Для выполнения программы создается новый процесс. Это событие может быть вызвано одной из причин, перечисленных в табл. 3.1. Новый —» Готовый. Операционная система переводит процесс из состояния нового в состояние готового к выполнению, когда она будет готова к обработке дополнительных процессов. В большинстве систем устанавливается ограничение на количество существующих процессов или на объем выделяемой для процессов виртуальной памяти. Таким образом предотвращается снижение производительности, которое может произойти, если будет загружено слишком много активных процессов. Готовый —> Выполняющийся. Когда наступает момент выбора нового процесса для запуска, операционная система выбирает один из готовых для выполнения процессов. Принцип этого выбора обсуждается в четвертой части книги. Выполняющийся —> Завершающийся. Если процесс сигнализирует об окончании своей работы или происходит его аварийное завершение, операционная система прекращает его выполнение. Выполняющийся —> Готовый. Этот переход чаще всего происходит из-за того, что процесс выполняется в течение максимального промежутка времени, отведенного для непрерывной работы одного процесса. Подобная стратегия планирования используется практически во всех многозадачных операционных системах. Такой переход возможен и по некоторым другим причинам, зависящим от конкретной операционной системы. Например, если операционная система назначает разным процессам различные приоритеты, то может случиться так, что процесс будет выгружен из-за появления процесса с более высоким приоритетом. Предположим, что выполняется процесс А, имеющий определенный приоритет, а процесс В, приоритет которого выше, блокирован. Когда операционная система обнаружит, что произошло событие, ожидаемое процессом В, она переведет этот процесс в состояние готовности, в результате чего процесс А может быть прерван и управление перейдет к процессу В. Говорят, что операционная система вытесняет (preempt) процесс А.7 Наконец, процесс сам по себе может отказаться от использования процессора. Выполняющийся —» Блокированный. Процесс переводится в заблокированное состояние, если для продолжения работы требуется наступление некоторого события. Посылаемый операционной системе запрос обычно имеет вид вызова 7 Вообще говоря, термин вытеснение означает, что процесс лишается некоторого Ресурса до того как он завершит свою работу с ним. В данном случае ресурсом являет- с* процессор - выполняющийся процесс мог бы продолжаться, но его выполнение преры- вяепгся из-за другого процесса. глава 3. Описание процессов и управление ими 153
какой-нибудь системной службы, т.е. вызова процедуры, являющейся ч ть^ кода операционной системы. Процесс может запросить ресурс (например, 1 или совместно используемую ячейку виртуальной памяти), который окажется временно недоступным, и потребуется подождать его освобождения. Кроме tiro, возможна ситуация, в которой для продолжения процесса требуется выдел. нить некоторое действие, например операцию ввода-вывода. Если процессы. мениваются информацией друг с другом, один из них может быть блокиро ' в состоянии ожидания ввода или сообщения от другого процесса. ; • Блокированный -» Готовый. Заблокированный процесс переходит в состояние готовности к выполнению в тот момент, когда происходит ожидае ое им событие. • Готовый —> Завершающийся. Чтобы не усложнять картину, этот перехо на диаграмме состояний не показан. В некоторых системах родительский процесс может в любой момент прервать выполнение дочернего процесса, роме того, дочерние процессы могут прекратиться при завершении родительского процесса. • Блокированный —> Завершающийся. См. комментарии к предыдущему пункту. '■ Возвратимся к нашему простому примеру. На рис. 3.4 показаны переходы дого из трех рассматриваемых процессов в различные состояния. На рис. 3.5,а ложен один из способов реализации порядка очередности. Имеется две очереди; редь готовых к выполнению процессов и очередь заблокированных процессов, дый процесс, поступающий в систему для обработки, помещается в очередь готовых к выполнению процессов. Когда операционной системе приходит время выбрать для выполнения другой процесс, она выбирает его из этой очереди. Если схема пр ри- тетов отсутствует, эта очередь может работать по принципу "первым вошел —■■, первым вышел". Когда выполнение процесса прерывается, он, в зависимости от я- тельств, может либо завершиться, либо попасть в одну из двух очередей (готовых к выполнению или блокированных процессов). И, наконец, после того как произо ет событие, все ожидающие его процессы из очереди заблокированных перемещаются в очередь готовых к выполнению процессов. д Д- че- Процесс А ^тШт^т Процесс В Процессе £> & - W^ ш*т» *'***&&? &MM:i Диспетчер Выполняющийся Готовый ?Ух£ Блокированный Рис. 3.4. Состояния процессов из листинга 3.2 I I I I I I I 1 l I l l l l I I I I I I l I I I I l I I I I I I I I I I I I I I I I I l I I I I 1 О 5 10 15 20 25 30 35 40 45 50 i .1 ■У 154 Часть 2. Проце сЫ Поступление процесса Наступление события Поступление процесса Наступление события 1 Наступление события 2 Наступление события л Очередь готовых процессов Диспетчеризация Процессор Освобождение Тайм-аут Очередь блокированных процессов Ожидание события а) Схема с одной очередью блокированных процессов Очередь готовых процессов Диспетчеризация Процессор Освобождение Тайм-аут Очередь процессов, ожидающих события 1 Ожидание события 1 Очередь процессов, ожидающих события 2 Ожидание события 2 Очередь процессов, ожидающих события л Ожидание события п б) Схема с несколькими очередями блокированных процессов Рис. 3.5. Модель, представленная на рис. 3.3, с использованием очередей Такая организация приводит к тому, что после любого события операционная система должна сканировать всю очередь блокированных процессов, отыскивая среди них те, которые ожидают именно этого события. В большой операционной системе в подобной очереди может пребывать несколько сотен или даже тысяч процессов. Поэтому эффективнее организовать несколько очередей, для каждого события — свою. Тогда при каком-то событии все процессы из соответствующей очереди можно будет перевести в очередь готовых к выполнению процессов (см. рис. 3.5,6). И последнее усовершенствование: если диспетчеризация осуществляется с использованием приоритетов, то было бы удобно организовать несколько очере- Яеи готовых к выполнению процессов. В такой схеме каждая очередь соответст- в°вала бы своему уровню приоритета. Тогда операционной системе легко было ljiaBa 3. Описание процессов и управление ими 155
ы определять готовый для выполнения процесс с наивысшим приоритетом, ^ эрый ждет своей очереди дольше всех остальных. \ Гриостановленные процессы f Необходимость свопинга ) Три основных состояния процессов, описанные в предыдущем разделе (гот» ы аполняющийся и блокированный), позволяют смоделировать поведение проц Со' получить представление о реализации операционной системы. Многие операций ые системы разработаны на основе только этих трех состояний. ^ Можно привести убедительные аргументы в пользу добавления в модель и п\ IX состояний. Чтобы понять, какие выгоды могут дать эти новые состояния, рас- дотрим систему, не использующую виртуальную память, в которой каждый; про- эсс перед выполнением нужно загрузить в основную память. Таким образом, все эоцессы, представленные на рис. 3.5,6, должны находиться в основной памяти; Теперь вспомним, что причиной разработки всех этих схем послужило олее едленное, по сравнению с вычислениями, выполнение операций ввода-вывода, при- щящее к простоям процессора в однозадачной системе. Однако организация оты соответствии со схемой, помещенной на рис. 3.5,6, полностью эту проблему не ре- ает. Конечно, при работе в соответствии с такой моделью в памяти находит?; не- солько процессов, и пока одни процессы ожидают окончания операций ~ вода- лвода, процессор может перейти к выполнению других процессов. Но процессор решает настолько быстрее выполнения операций ввода-вывода, что вскоре все нахо- шдиеся в памяти процессы оказываются в состоянии ожидания. Таким обр зом, хщессор может простаивать даже в многозадачной системе. | Что же делать? Можно увеличить емкость основной памяти, чтобы в ней эмещалось больше процессов. Но в таком подходе есть два недостатка. Во- грвых, это ведет к резкому повышению стоимости памяти системы в ере- юте на один бит. Во-вторых, аппетит программиста в использовании Д мя- i для своих программ возрастает пропорционально падению ее стоимости, iK что увеличение объема памяти приводит к увеличению размера процес- •в, а не к росту их числа. .;Д Другим решением проблемы является свопинг, который включает в сеоя фенос части процессов из основной памяти на диск. Если в основной па" яти :т ни одного готового к выполнению процесса, операционная система пере рент [ин из блокированных процессов на диск (осуществляет его свопинг), шм*£ шая о в очередь приостановленных процессов, которые временно извлечены з ос- >вной памяти. Затем операционная система загружает другой процесс из 0 iepe- щ t приостановленных, после чего продолжает его выполнение. л Тем не менее свопинг сам по себе является операцией ввода-вывода, по о^У ть риск ухудшить ситуацию, вместо того чтобы улучшить ее. Однако благо аря му что обмен информацией с диском обычно происходит быстрее прочих one T ода-вывода (например, запись-считывание с ленты или вывод на принтер), своп nir гце всего повышает производительность работы системы в целом. '■■■*. Если в модель поведения процессов ввести описанный свопинг, то, Яа:* •идется ввести и новое состояние — состояние приостановленного про есс ис. 3.6,а). Когда все процессы в основной памяти находятся в блокиррваН •м состоянии, операционная система может приостановить один из пр^ЯеС I >6 Часть 2. Провесы £■-■ *" переведя его в приостановленное состояние и сбросив на диск. Освобо- ' ,сргя в основной памяти пространство можно будет использовать для за- Лузки другого процесса. Диспетчеризация ,;^ * с! :£|овый -*&, Поступление процесса *рг Освобождение ■Ш; .^ 4Г л? тановка!^- «&s Приостановка Ютовый к X CL> С е- о ге 2 о о званный ■Ц/к -*^ Тайм-аут лняющии вершающийся _о° У а) С одним приостановленным состоянием i fioB 1ЫИ // <?£ > * " ""ось, Ч Активация Лтовый/ —' >ановленны- i готовый Приостановка Диспетчеризация4 Тайм-аут ' "^^ Освобождение - ^ющийс!5 X X а £ >- О га о га рованныи., новленны' Активация Приостановка з о # • С# * # ванны 'ЙйЮЩИ' б) С двумя приостановленными состояниями Рис 3.6. Диаграмма переходов с учетом приостановленных процессов После того как операционная система выгрузила один из процессов на диск, У Нее есть две возможности выбора процесса для загрузки в основную память: °«а может либо создать новый процесс, либо загрузить процесс, который был Постановлен перед этим. Может показаться, что лучше было бы загрузить для Лава 3. Описание процессов и управление ими 157
цп/д/сшимхш рамсе приостановленный процесс* что не приведет к увеличен iiq H„ грузки на систему. Однако это не совсем так. Все процессы перед тем как они были прюст новлены, находились в блокированном состоянии. Ясно, что возвращение в п мять блокированного процесса не даст никаких результатов, потому что п прежнему не готов к выполнению. Вспомним также, что каждый процесс п0и эстановленном состоянии блокирован в ожидании какого-то определенного! бы гия, и если это событие происходит, процесс перестает быть блокирова дожно продолжить его выполнение. '^ Это следует учесть при разработке операционной системы. Мы имеем д 0 (вумя независимыми ситуациями: ожидает ли процесс какого-либо события" (локирован он или нет), и выгружен ли процесс из основной памяти (т.е. п иос' •ановлен он или нет). Чтобы учесть 2x2 возможных комбинации, нужны че ыое [еречисленных ниже состояния. • Готовый. Процесс, который находится в основной памяти и готов к в пол- нению. % • Блокированный. Процесс, находящийся в основной памяти и ожид ни какого-то события. !:?.- ч^ • Блокированный/Приостановленный. Процесс, находящийся во вторим к»й памяти (на диске) и ожидающий какого-то события. '■'{ • Готовый/Приостановленный. Процесс, находящийся во вторичной па я и, но уже готовый к выполнению; для этого его нужно только загрузить'' с- новную память. &■ Перед тем как составлять диаграмму переходов состояний, в которой чн- ываются два новых приостановленных состояния, следует упомянуть еще но 5стоятельство. До сих пор мы не учитывали существование виртуальной памя- I', считалось, что процесс находится либо полностью в основной памяти,гтибо элностью вне ее. При наличии виртуальной памяти появляется возможность люлнять процесс, который загружен в основную память лишь частично» Ее та эоисходит обращение к отсутствующему в основной памяти адресу процесса, ■а часть процесса может быть загружена. Казалось бы, использование в tj- гьной памяти избавляет от необходимости явного свопинга, потому что ой гжный адрес любого процесса можно перенести в основную память или из с >мощью аппаратного обеспечения процессора, управляющего памятью. О '0. lk мы увидим в главе 8, "Виртуальная память", при наличии достаточно боль- ого количества активных процессов, которые полностью или частично ^°* [тся в основной памяти, производительность виртуальной памяти может, ока- ться недостаточной. Поэтому даже при наличии виртуальной памяти опер я' ной системе время от времени требуется явно и полностью выгружать юцессы из основной памяти ради повышения общей производительности. ,?' А теперь рассмотрим модель переходов состояний, представленную на рис. 3.6»^ актирными линиями показаны переходы, которые возможны, но не явл язательными). Среди новых переходов наиболее важными являются следующий • Блокированный -» Блокировавовъш/Приостановленный. Если к выполнению готов ни один процесс, то по крайней мере один блокированный процесс " гружается из памяти, чтобы освободить место для другого процесса, котор .. я '8 Часть 2. Процее является блокированным. Этот переход можно выполнять и при наличии готовых к выполнению процессов, если операционная система определит, что для выполняющегося в настоящее время процесса или процесса, управление к которому перейдет в ближайшее время, нужно увеличить объем основной памяти для обеспечения адекватной производительности. Блокированный/Приостановленный —* Готовый/Приостановленный. Процесс в состоянии блокированного приостановленного переходит в состояние готового к выполнению приостановленного процесса, если происходит событие которого ожидал этот процесс. Заметим, что для такого перехода операционная система должна иметь доступ к информации о состоянии приостановленных процессов. Готовый/Приостановленный —» Готовый. Когда в основной памяти нет готовых к выполнению процессов, операционной системе для продолжения вычислений требуется загрузить процесс в память. Может случиться и так, что у готового к выполнению приостановленного процесса окажется более высокий приоритет, чем у любого другого из готовых к выполнению процессов. В такой ситуации разработчик операционной системы может решить, что важнее обеспечить приоритет процесса , чем минимизировать свопинг. Готовый —» Готовый/Приостановленный. Обычно операционная система предпочитает приостанавливать не готовый, а заблокированный процесс, поскольку к выполнению готового процесса можно приступить немедленно, а блокированный процесс только зря занимает основную память, поскольку не может быть выполнен. Однако иногда оказывается, что единственный способ освободить достаточно большой блок основной памяти — это приостановить готовый к выполнению процесс. Операционная система может также вместо блокированного процесса с более высоким приоритетом приостановить готовый к выполнению процесс с более низким приоритетом, если блокированный процесс достаточно скоро будет готов к выполнению. Кроме того, заслуживают рассмотрения и другие переходы. Новый —> Готовый/Приостановленный и Новый —> Готовый. После создания нового процесса этот процесс может быть добавлен либо в очередь готовых к выполнению, либо в очередь готовых к выполнению приостановленных процессов. В любом из этих случаев операционная система должна создать таблицы Для управления процессом и выделить ему адресное пространство. Лучше выполнить эти действия на ранних этапах, чтобы иметь больший запас неблоки- рованных процессов. Однако если придерживаться этой стратегии, то в основной памяти может не хватить места для нового процесса. По этой причине предусмотрен переход нового процесса в состояние приостановленного готового к выполнению. С другой стороны, создание процесса в "последний момент" приводит к уменьшению непроизводительных затрат и позволяет операционной системе выполнять свои обязанности по созданию процессов даже тогда, когда она переполнена блокированными процессами. Блокированный/Приостановленный —> Блокированный. На первый взгляд может показаться, что учитывать такой переход бессмысленно. Зачем, в к°Нце концов, загружать в память процесс, который не готов к выполнению? Однако рассмотрим такой сценарий: завершился некоторый процесс, Ва 3. Описание процессов и управление ими 159
освободив при этом определенную часть основной памяти. В очереди -д бд кированных приостановленных процессов находится процесс, приоритет к торого выше, чем у любого процесса из очереди готовых к выполнен^ > fi приостановленных процессов. Кроме того, операционная система распо аг* ет аргументами в пользу того, что довольно скоро произойдет событие, ц0 торое снимет блокировку с этого высокоприоритетного процесса. При таки» обстоятельствах резонно отдать предпочтение блокированному процесс не ред готовыми к выполнению, загрузив в основную память именно его. ." • Выполняющийся —> Готовый/Приостановленный. Обычно выполняющийся процесс, у которого вышло отведенное ему время, переходит в состояние готового к выполнению. Однако при наличии процесса с более высоким тж. оритетом, который находился в очереди блокированных приостановленных процессов и только что был разблокирован, операционная система м жет отдать предпочтение именно ему. Чтобы освободить часть основной п яти она может перевести выполняющийся процесс непосредственно в состо ние готового к выполнению приостановленного процесса. '■' ■ Произвольное состояние —> Завершение. Обычно завершается выпод яю- щийся в настоящий момент процесс — это происходит либо из-за того! что он выполнен до конца, либо из-за ошибок при его работе. Однако в не ото- рых операционных системах процесс может завершаться создавшим его процессом или вместе с завершением родительского процесса. Такое ер- шение возможно при условии, что процессы из любого состояния могут переходить в состояние завершения. У Другие использования приостановки "■< До сих пор концепция временной остановки процесса ассоциировалась у нас ;го отсутствием в основной памяти. Процесс, который отсутствует в осно ной мяти, не может быть запущен немедленно, независимо от того, ожидает ли он кого-то события или нет. ,$ Однако концепцию приостановленного процесса можно обобщить. Он еде- м приостановленный процесс как такой, который удовлетворяет следую ич итериям. ^ I. Этот процесс не может быть запущен в данный момент. У I. Этот процесс может как ожидать какого-то события, так и не находи я в состоянии ожидания. Если он находится в состоянии ожидания, то бло "И- рующее событие не связано с условием приостановки, а наступление С бытия не означает, что процесс может быть выполнен. I. Процесс приостанавливается самостоятельно, операционной системой ъя родительским процессом. ■<■, I. Процесс не может выйти из состояния приостановленного до тех пор, ока не будет явно выведен из этого состояния приостановившим его агентом> В табл. 3.3 перечислены некоторые причины, по которым процессы могут ъгГЬ постановлены. Одной из ранее обсуждавшихся причин является необходим ть грузить процесс на диск, чтобы вместо него можно было загрузить готовый К &*' пнению процесс или просто ослабить нагрузку на виртуальную память, пред 'га* в каждому из оставшихся процессов дополнительную порцию основной па* тй* ю Часть 2. Проц сЫ гут быть и другие причины для того, чтобы приостановить процесс, х-штаютрши, пример, процесс, который используется для наблюдения за работой системы. Этот «тодесе может использоваться для фиксирования интенсивности использования раз- «чнЫХ ресурсов (процессора, памяти, каналов) и скорости выполнения в системе яьзовательских процессов. Если такой процесс выявит проблему (например, состояние взаимоблокировки, о котором рассказывается в главе 6, "Взаимоблокировка голодание"), он может приостановить процесс. Другим примером служат неполад- м в линии связи. В данной ситуации оператор может отдать операционной системе манду приостановить процесс, использующий эту линию, чтобы выполнить необходимые тесты и исправить ситуацию. Таблица 3.3. Причины, по которым процессы переходят в состояние приостановленных Свопинг Операционной системе нужно освободить пространство в основной памяти, чтобы загрузить готовый к выполнению процесс Другие причины, по- Операционная система может приостановить фоновый или слу- являющиеся у опера- жебный процесс, а также подозрительный процесс, послу жив- ционной системы ший вероятной причиной возникновения ошибок Запрос интерактивно- Пользователь может захотеть приостановить процесс, чтобы го пользователя приступить к отладке программы, или в связи с использованием некоторого ресурса Временной режим Процесс может выполняться периодически (например, про- выполнения грамма для учета использования ресурсов или работы системы); в промежутках между выполнением такой процесс может приостанавливаться Запрос родительского Родительскому процессу может понадобиться возможность при- процесса останавливать выполнение дочерних процессов для их проверки или модификации, а также для координации работы нескольких дочерних процессов Другие причины временной остановки процессов связаны с действиями интерактивного пользователя. Например, если пользователь заподозрил, что в программе есть дефект, он может приступить к отладке программы, приостановив ее выполнение. При этом пользователь может тестировать и модифицировать программу или данные, а затем возобновить ее выполнение. Другим примером является фоновый процесс, собирающий информацию о системе. Не исключено, что пользователь захочет иметь возможность включать и выключать этот процесс. Рассмотрение временного графика работы также может привести к решению 0 Целесообразности свопинга. Например, процесс, который должен периодически активизироваться с большим интервалом времени между активизациями и долго простаивает, имеет смысл выгружать из основной памяти на то время, в течение которого он не используется. Примером такого процесса может быть программа, ^ДУЩая учет использования ресурсов или активности пользователей. Наконец, родительский процесс может захотеть приостановить процесс, ко- °РЫЙ он породил. Например, пусть процесс А породил процесс В, чтобы прочить файл. Впоследствии при выполнении процесса В возникла ошибка чтения, °н сообщил об этом процессу А. Процесс А приостанавливает процесс В и пы- ается выяснить и устранить причину ошибки. Глава 3. Описание процессов и управление ими 161
jbo всех описанных выше случаях активизация приостановленного; пр сса происходит по запросу того агента; который перед этим выз Bd иную остановку. .#. ■• £>■*-.- "&: чгг^н^~£^»*д- - [.2._ ОПИСАНИЕ ПРОЦЕСС 1 ®* &£*- Операционная система управляет событиями, которые происходят в ко пью шой системе. Она планирует и координирует выполнение процессов, выделят ил» ;урсы и предоставляет по запросу системных и пользовательских программ * нов ;е сервисы. Мы можем представить себе операционную систему как некий/"' eva зм, управляющий тем, как процессы используют системные ресурсы. -*£ Эта концепция проиллюстрирована на рис. 3.7. Пусть в многозадачно ере имеется несколько процессов (Рь .... Р„), которые уже созданы и загруже ы в ртуальную память. Каждому процессу для его функционирования нужен ос- i к определенным системным ресурсам, в число которых входят проц cod гройства ввода-вывода и основная память. В ситуации, изображенной На ри- 1ке, процесс Рг находится в состоянии выполнения, т.е. в основной цдчяти шдится по крайней мере часть этого процесса. Кроме того, он осуществляет равление двумя устройствами ввода-вывода. Процесс Р2 тоже находится^ ос- зной памяти, но он блокирован, ожидая, пока освободится устройство в ода- вода, находящееся в распоряжении процесса Pi. Процесс Р„ выгружен, ос- зной памяти и, соответственно, приостановлен. Процессор Устройство ввода-вывода Устройство ввода-вывода Устройство ввода-вывода Основная память Рис. 3.7. Процессы и ресурсы в некоторый момент времени Ресурсы,' ■£» компьютер^ 1&L Далее в этой главе мы подробно рассмотрим, как выглядит управление ур- :и со стороны операционной системы с точки зрения процессов. А пока что зада- s. себе более фундаментальный вопрос: какая информация нужна операционной теме, чтобы управлять процессами и выделяемыми для них ресурсами? л фавляющие структуры операционной системы % л? Поскольку в задачи операционной системы входит управление процесс и я урсами, она должна располагать информацией о текущем состоянии кая? 0Г0 •Цесса и ресурса. Универсальный подход к предоставлению такой информ tf«* *ст: операционная система создает и поддерживает таблицы с информации п0 вдому объекту управления. Общее представление об этом можно получить sa овании рис. 3.8, на котором показаны четыре различных вида таблиц; . №~ живающихся операционной системой: для памяти, устройств ввода-вы Да* 2 Часть 2. Проц с ,-щ vr.mj.v-»/ •» л*,»*» дов и процессов. Хотя детали ь рмпод по сути, все операционные системы поддерживают информацию по этим ^»?ьсЯ ' тЫРеМ категориям Образ процесса Процесс 1 Первичные таблицы процессов Процесс 1 Процесс 2 Процесс 3 Образ процесса п Процесс п Процесс л Рис. 3.8. Общая структура управляющих таблиц операционной системы Таблицы памяти (memory tables) используются для того, чтобы следить за основной (реальной) и вторичной (виртуальной) памятью. Некоторая часть основной памяти резервируется для операционной системы, оставшаяся же — доступна для использования процессами. Процессы, которые находятся во вторичной памяти, используют некоторую разновидность виртуальной памяти либо простой механизм свопинга. Таблицы памяти должны включать такую информацию: • объем основной памяти, отведенной процессу; • объем вторичной памяти, отведенной процессу; • все атрибуты защиты блоков основной или виртуальной памяти, как, например, указание, какой из процессов имеет доступ к той или иной совместно используемой области памяти; • вся информация, необходимая для управления виртуальной памятью. Подробно эти информационные структуры, используемые для управления Памятью, рассматриваются в третьей части книги. Глава 3. Описание процессов и управление ими 163
лаолицы ввода-вывода и/и taDiesj пользуются операционной системой для управления устройствами ввода-вывода и каналами компьютерной сист мы В каждый момент времени устройство ввода-вывода может быть либо свобо «о либо отдано в распоряжение какому-то определенному процессу. Если выпо" цн[ ется операция ввода-вывода, операционная система должна иметь информацию 0 ее состоянии и о том, какие адреса основной памяти задействованы в этой' пе- рации в качестве источника вывода или места, куда передаются данные при вводе. Управление вводом-выводом рассматривается в главе 11, "Управлениет во дом-выводом и дисковое планирование". Ч Операционная система может также поддерживать таблицы файлов (Ш$ ta bles). В этих таблицах находится информация о существующих файлах, их щп. положении на магнитных носителях, текущем состоянии и других атриб ах Большая часть этой информации, если не вся, может поддерживаться_систе. ой управления файлами. В этом случае операционная система мало знает (или совсем ничего не знает) о файлах. В операционныхсистемах другого типа осно ная часть работы, связанной с управлением файлами, выполняется самой_опёрвци- онной системой. Эта тема обсуждается в главе 12, "Управление файлами". _}■ Наконец, операционная система должна поддерживать таблицы процес ов, чтобы иметь возможность управлять ими. В оставшейся части данного р ела рассматриваются требования к таблицам процессов (process tables). Перед тем как продолжить рассмотрение, сделаем два замечания. Во-первых, хотя на рис. 3.8 и показаны четыре разных вида ..таблиц, ясно, что все они должны ыть связаны между собой или иметь перекрестные ссылки. В конце концов,~уп явление памятью, устройствами ввода-вывода и файлами осуществляется для ого, чтобы могли выполняться процессы, поэтому в таблицах процессов должны цть явные или неявные ссылки на эти ресурсы. Например, доступ к файлам, ин р- мация о которых хранится в таблицах файлов, осуществляется через устрой тва ввода-вывода, и эти файлы или их части в определенные моменты времени б ут находиться в основной или виртуальной памяти. Сами таблицы должны ть доступны для операционной системы, поэтому место для них выделяется системой управления памятью. Во-вторых, какие сведения необходимы операционной системе для созда. ия этих таблиц? Конечно же, у нее должна быть информация по основной конфигурации системы, в которую входят сведения об объеме основной памяти, ко we- стве и виде устройств ввода-вывода, а также их идентификаторах и т.п. Т им образом, во время инициализации операционной системы она должна иметь ос- туп к определенным данным конфигурации, которые определяют основные параметры вычислительной среды. Эти данные могут создаваться как вне операционной системы с участием оператора, так и с помощью каких-то программ,, определяющих конфигурацию вычислительной системы. Структуры управления процессами Рассмотрим вопрос о том, какими сведениями должна располагать опер Ш1* онная система, чтобы она могла управлять процессом. Во-первых, она дол на знать, где находится этот процесс, а во-вторых, ей должны быть известны н ходимые для управления атрибуты процесса (такие, как его идентификатор,' с стояние и размещение в памяти). 164 Часть 2. Проц f/ Местоположение процесса & Перед тем как перейти к рассмотрению вопроса о размещении процесса или о атрибутах, зададим себе еще более фундаментальный вопрос: в чем заклю- ° тся физические проявления процесса? Как минимум, в процесс входит про- Ча мма или набор программ, которые нужно -Выполнить. С этими программами JP набор ячеек памяти, в которых хранятся локальные и глобальные пере- СВ ные и константы. Таким образом, процессу должен быть выделен такой объ- Мв памяти, в котором поместились бы программа и данные, принадлежащие 6 пессу. Кроме того, при работе программы обычно используется стек, с помо- ю которого реализуются вызовы процедур и передача параметров. Наконец, с дьШ процессом связано несколько атрибутов, которые используются опера- онной системой для управления этим процессом. Обычно такой набор атрибу- в называется управляющим блоком процесса (process control block).8 Множе- тво в которое входят программа, данные, стек и атрибуты, называется образом процесса (process image) (табл. 3.4). ^ Таблица 3.4. Типичные элементы образа процесса Данные пользователя Допускающая изменения часть пользовательского адресного пространства. Сюда могут входить данные программы, пользовательский стек и модифицируемый код Пользовательская Программа, которую нужно выполнить программа Системный стек С каждым процессом связаны один или несколько системных стеков. Стек используется для хранения параметров, адресов вызова процедур и системных служб Управляющий блок Данные, необходимые операционной системе для управления процесса процессом (см. табл. 3.6) Местонахождение образа процесса зависит от используемой схемы управления памятью (в простейшем случае образ процесса имеет вид непрерывного блока памяти, который расположен во вторичной памяти, обычно на диске). Чтобы операционная система могла управлять процессом, по крайней мере небольшая часть его образа должна находиться в основной памяти. Чтобы можно было запустить процесс, его образ необходимо полностью загрузить в основную (или в виртуальную) память. Таким образом, операционной системе нужно знать местонахождение каждого процесса на диске, а для тех процессов, которые загружены в основную память — их местонахождение в основной памяти. В главе 2, "Обзор операционных систем", мы рассматривали несколько более сложную модификацию этой схемы, использующуюся в системах CTSS, где при свопинге процесс может выгружаться из основной памяти только частично. При этом операционная система должна следить за тем, какая часть образов каждого из процессов осталась в основной памяти. В большинстве современных операционных систем используется схема Управления памятью, в которой образ процесса состоит из набора блоков, не °бязательно расположенных последовательно. В зависимости от используемой о Часто используются другие названия этой структуры данных — блок управяе- ия Задачеи. дескриптор процесса, дескриптор задачи. лава 3. Описание процессов и управление ими 165
^тЫ оми илоки могут оыть переменной длины (в этом случае они наз Ют ггментами), фиксированной длины (в этом случае они называются стран/ а, ли представлять собой комбинацию тех и других. Любая из этих схем поЭВоч г операционной системе загружать в память лишь часть процесса. Такив| к >м, в любой момент времени часть образа процесса может находиться в *'<;/*" эй памяти, в то время как остальная его часть остается во вторичной паиЯт°В оэтому таблицы процессов, поддерживаемые операционной системой, дол*** •держать сведения о местонахождении каждого сегмента и/или каждой с «*** ы всех образов процессов. •*- Структура сведений о расположении процессов, изображенная на рйе я R >ганизована следующим образом. Имеется первичная таблица процессов''* фой каждому процессу соответствует одна запись. Все записи должны^од"0 ать по крайней мере указатель на образ процесса. Если образ процессах стоТ i нескольких блоков, то эта информация либо непосредственно содержится^ ответствующей записи первичной таблицы, либо может быть получен* гт* >мощи ссылок на записи в таблицах памяти. Конечно же, это описание- оси щий характер; в каждой операционной системе используется собственны Т MeЧ5Г д организации информации о расположении процессов. % Атрибуты процессов ;-л Сложная многозадачная система должна располагать обширными сведения- i о каждом процессе. Как было сказано ранее, можно считать, что эта инфор- щия находится в управляющем блоке процесса. Различные системы орг 1зу- ? эту информацию по-разному; в конце настоящей и следующей глав приводит- несколько примеров такой организации. А пока что рассмотрим вопрос о том, формация какого типа может понадобиться операционной системе, не ' ста- вливаясь на схеме организации этой информации. % В табл. 3.5 перечислены типичные виды информации, требующейся 6 ера- онной системе для каждого процесса. Возможно, читателя несколько вит ьем требуемой информации, однако этот список будет выглядеть горазд убе- тельнее после более полного знакомства с функциями операционной системы. блица 3.5. Типичные элементы управляющего блока процесса Идентификация процессов f::t ентнфнкаторы гL * еловые идентификаторы, которые могут храниться в управляющем блоке процесс Идентификатор данного процесса Идентификатор родительского процесса i Идентификатор пользователя __ г — # В этом кратком обсуждении опущены некоторые детали. Например, е one И ой системе с использованием виртуальной памяти все образы активных проЦ с0в -.одятся во вторичной памяти. Когда в основную память загружается часть об а* не переносится туда, а копируется. Таким образом, во вторичной памяти ост н^71" копии всех сегментов и/или всех страниц. Однако если часть образа в основтф . п пи модифицируется, копил на диске становится устаревшей до тех пор, пока $м ная часть основной памяти не будет скопирована обратно на диск. #. 6 Часть 2. Проц сь1 . г% Продолжение таол. а.о Информация о состоянии процесса ■о гистры, доступные пользователю \ сТупный пользователю регистр — это регистр, к которому можно обратиться с помо- "'■'\ ю машинных команд, выполняющихся процессором. Обычно имеется от 8 до 32 та- t. ] регистров, хотя в некоторых реализациях RISC (процессоров с ограниченным набо- ; / К м команд) встречается свыше 100 регистров. Управляющие регистры и регистры состояния к процессоре имеется несколько разновидностей регистров, которые используются для правления работой процессора. К ним относятся следующие. j Счетчик команд. В этом регистре хранится адрес очередной извлекающейся команды. f Коды условия. Отражают результат выполнения последней арифметической или логической операции (например, знак, равенство нулю, наличие переноса, равенство, переполнение). , . • Информация о состоянии. Сюда входят флаги разрешения прерываний и информация о режиме выполнения. Указатели на стек/". '« / С каждым процессом связаны один или несколько системных стеков. В стеке хранятся параметры и адреса вызовов процедур и системных служб. Указатель стека указывает на его вершину. Управляющая информация процесса Информация по планированию и состоянию Эта информация нужна операционной системе для выполнения планирования и обычно включает следующее. • Состояние процесса. Определяет готовность планируемого процесса к выполнению (т.е. выполняющийся, готовый к выполнению, ожидающий какого-то события или приостановленный). • Приоритет. Одно или несколько полей могут использоваться для описания приоритета процесса. В некоторых системах могут требоваться несколько значений (такие, как приоритет по умолчанию, текущий приоритет, максимально возможный приоритет). • Информация, связанная с планированием. Эта информация зависит от используемого алгоритма планирования. В качестве примера можно привести такие показатели, как время ожидания или время, в течение которого процесс выполнялся при последнем запуске. • Информация о событиях. Идентификация события, наступление которого позволит продолжить выполнение процесса, находящегося в состоянии ожидания. Структурирование данных Процесс может быть связан с другими процессами посредством очереди, кольца или какой-либо другой структуры. Например, все процессы в состоянии ожидания, меющие один и тот же приоритет, могут находиться в одной очереди. Процессы огУт иметь родственные отношения (быть родительскими или дочерними по отно- ению друг к другу). Для поддержания этих структур управляющий блок процесса °жет содержать указатели на другие процессы. мен информацией между процессами р зличные флаги, сигналы и сообщения могут иметь отношение к обмену информацией ои*д^ ДвУмя независимыми процессами. Некоторая часть этой информации, или вся -~^_может храниться в управляющем блоке процесса. ав& 3. Описание процессов и управление ими 167
Окончание таб* 3^ темных утилит и служб. равление памятью ^ ' >т раздел может содержать указатели на таблицы сегментов и/или страниц, в кото : 1сывается распределение процесса в виртуальной памяти. "'.,; адение ресурсами и их использование '"■ »сь могут быть указаны ресурсы, которыми управляет процесс (например, перечень срытых файлов). Кроме того, в данный раздел могут быть включены сведения по ис- зии использования процессора и других ресурсов; эта информация может потрефоватъ- при планировании. ^ Информацию, которая находится в управляющем блоке процесса, ожно збить на три основные категории: ii\ • информация по идентификации процесса; ,:1 • информация по состоянию процесса; -|" • информация, используемая при управлении процессом. ~% Что касается идентификации процесса (process identification), то no i во :ех операционных системах каждому процессу присваивается числовой енти- 'икатор, который может быть просто индексом в первичной таблице про ессов эис. 3.8). В любом случае должно иметься некоторое отображение, позво/ яющее перационной системе найти по идентификатору процесса соответствующее ему аблицы. Идентификаторы могут использоваться в разных ситуациях. В^частно- ти, они используются для реализации перекрестных ссылок на таблицы роцес- ов из других таблиц, находящихся под управлением операционной ей темы. 1апример, таблицы памяти могут предоставлять информацию об основной па- ляти с указанием всех областей, выделенных каждому из процессов, ук " ывае- лому посредством его идентификатора. Аналогичные ссылки могут бы ь и в габлицах ввода-вывода или таблицах файлов. Если процессы обменив " я между собой информацией, их идентификаторы указывают операционной , гстеме участников такого обмена. При создании нового процесса идентификатор Ука' зывают родительский и дочерние процессы. ~-£ Кроме того, процессу может быть присвоен идентификатор полъзо ателя. который указывает, кто из пользователей отвечает за данное задание. Информация о состоянии процессора (processor state information) coctoi из содержимого его регистров. Во время выполнения процесса эта инфо aU" конечно же, находится в регистрах. Прерывая процесс, всю содержащуюЬя в Р* гистрах информацию необходимо сохранить, чтобы восстановить ее при; °30 новлении выполнения этого процесса. Характер и количество участвуют, хранении регистров зависит от устройства процессора. Обычно в набор JK? сТ*^ входят регистры, доступные пользователю, управляющие регистры и г состояния, а также указатели вершин стеков. Все они описаны в главе 1» '^° компьютерных систем". 1 Часть 2. Про* Следует заметить, что в процессорах любого вида имеется регистр или набор регистров, известных под названием "слово состояния программы" (program tatus word — PSW), в которых содержится информация о состоянии и кодах условий- Хорошим примером слова состояния процессора является регистр FFLAGS (показан на рис. 3.9 и описан в табл. 3.6), имеющийся в процессорах Pentium. Этот регистр используют все операционные системы, работающие на компьютерах Pentium. ID — флаг идентификации VIP — флаг ожидания виртуального прерывания VIF — флаг виртуального прерывания АС — флаг проверки выравнивания VM — флаг режима виртуального 8086 RF — флаг возобновления NT — флаг вложенной задачи I0PL — уровень привилегий ввода-вывода OF — флаг переполнения Рис. 3.9, Регистр EFLAGS процессора Pentium II DF — флаг направления IF — флаг разрешения прерываний TF—флаг ловушки SF — флаг знака ZF—флаг нуля AF — флаг вспомогательного переноса PF —флаг четности CF — флаг переноса v? Таблица 3.6. Биты регистра EFLAGS процессора Pentium Управляющие биты. Флаг проверки выравнивания (Alignment check — AC) Флаг устанавливается при адресации одинарного или двойного слова, не выровненного на границу слова или двойного слова Флаг идентификации (Identification flag — IF) Если процессор в состоянии устанавливать и сбрасывать этот флаг, то данный процессор поддерживает команду CPUID. При выполнении данной команды выдайся информация об изготовителе, серии И модели процессора ф*аг возобновления (Resume flag — RF) Дает возможность программисту отме- Биты режима работы Флаг вложенной задачи (Nested task flag — NT) Указывает на то, что текущее задание вложено в другое задание при работе в защищенном режиме Флаг режима виртуального 8086 (Virtual 8086 mode — VM) Позволяет программисту включать и выключать режим виртуального 8086 Флаг ожидания виртуального прерывания (Virtual interrupt pending — VIP) Используется в режиме виртуального 8086, чтобы указать, что одно или несколько прерываний ожидают об- -х---*- --^ служивания ^ЬЙИп1ЛаДОЧНЫе исключения- так что Флаг виртуального прерывания «ожет к П°СЛе отладочного исключения (Virtual interrupt flag _ VIF) т.ст оыть перезапущена без генерации В режиме виртуального 8086 используется вместо флага IF f Коды условий £ РеДеляет уровень привилегий ввода- Флаг коррекции, или вспомогательного **>»J^Aa выполняющегося процесса. переноса (Auxiliary carry flag — AF) ДРУгого исключения Q/fv еаь привилегий ввода-вывода /и Privilege level — IOPL) \ 3. Описание процессов и управление ими 169
Окончание та 7. ^ При установленном флаге (низкий уровень привилегий) при каждом доступе к устройствам ввода-вывода генерируется исключение iar направления (Direction flag — DF) Задает порядок изменения (увеличение или уменьшение) содержимого 16-битовых полурегистров SI и DI (для работы в 16- битовом режиме) или 32-битовых регистров ESI и EDI (для работы в 32-битовом режиме), использующихся в командах обработки строк ааг разрешения прерываний iterrupt enable flag — IF) Если этот флаг установлен, процессор реагирует на внешние прерывания iar ловушки (Trap flag — TF) Если флаг установлен, то после выполнения каждой команды генерируется прерывание. Этот режим используется для отладки Если данный флаг установлен, то ^ начает, что произошел перенос или?'заем единицы из одного полубайта в flpvroii при выполнении операций с 8-бито ычи арифметическими или логическими объ ектами с использованием регистра AL Флаг переноса (Carry flag — CF) ф Используется для индикации пе оса единицы в старший разряд или. йма единицы из этого разряда при ар фме тических операциях. Его содерзг мое также изменяется при некоторых/ операциях циклического сдвига % Флаг переполнения (Overflow flag — F) Указывает на переполнение результатов при сложении или вычитании _".*,.• Флаг четности (Parity flag — PF) ,-. ф Четность результата арифмет кой или логической операции. 1 указь! ает, что результат четный, а О— что. результат нечетный . у Флаг знака (Sign flag — SF) Указывает знак результата арифмети ческой или логической операции Флаг нуля (Zero flag — ZF) Указывает, равен ли нулю peaiy ьтат арифметической или логической one ции "..'I 'IjU' ' На рис. 3.10 предложена возможная структура образов процессов в\ црту- [ьной памяти. Каждый образ процесса состоит из управляющего блока оцес- ., стека пользователя, закрытого адресного пространства процесса и вс ДРУ" [х адресных пространств, которые данный процесс использует совместное ДРУ [ми процессами. На рисунке каждый образ процесса изображен в виде о _пасти гпрерывных адресов, но в реальной реализации это может быть не так; разме- ение образа процесса в памяти зависит от схемы управления памятью и от спо- >ба организации управляющих структур в операционной системе. Как видно из табл. 3.5, управляющий блок процесса может содержать в се ! структурную информацию, в которую входят указатели, позволяющие язЫ* 1ть между собой различные управляющие блоки процессов. Таким об азо. шсанные в предыдущем разделе очереди могут быть реализованы в вид свЯ 1нных списков, элементами которых являются управляющие блоки лроЦ с0 апример, схема очередности, показанная на рис. 3.5,а, может быть ре к.,*зоВ i в соответствии со схемой, изображенной на рис. 3.11. -Л Дгё* "1 70 Часть 2. Пр И сС Идентификация процесса Информация 0 состоянии процессора Управляющая информация процесса Пользовательский стек Пользовательское адресное пространство (программы, данные) Идентификация процесса Информация о состоянии процессора Управляющая информация процесса Пользовательский стек Пользовательское адресное пространство (программы, данные) •Совместно используемое J адресное пространство Идентификация процесса Информация о состоянии процессора Управляющая информация-процесса Пользовательский стек Пользовательское адресное пространство (программы, данные) Совместно используемое адресное пространство Совместно используемое адресное пространство \ Процесс 1 Процесс 2 ■ Процессл Рис. 3.10. Пользовательские процессы в виртуальной памятей Управляющий блок процесса Выполняющийся Готовый к выполнению Блокированный Рис. 3.11. Структуры списков процессов Управляющий "блок процесса ► ► .Лава 3. Описание процессов и управление ими 171
Роль управляющего блока процесса ^; Управляющий блок процесса — это самая важная структура данных Всеу имеющихся в операционной системе. В управляющий блок каждого проц Са входит вся необходимая операционной системе информация о нем. Инфор йция в этих блоках считывается и/или модифицируется почти каждым модулем one рационной системы, включая те, которые связаны с планированием, распределе. нием ресурсов, обработкой прерываний, а также осуществлением контроля ц анализа. Можно сказать, что состояние операционной системы задается совокуц- ностью управляющих блоков процессов. Рассмотрим в связи с этим один из аспектов архитектур операционных стем. В состав операционной системы входит ряд программ, которым нужен доступ к блокам управления процессами. Предоставить прямой доступ совсем не трудно -— каждому процессу присваивается свой уникальный идентификатор, который может ыть использован в качестве индекса в таблице указателей на управляющие бло процессов. Трудность состоит не в том, чтобы предоставить доступ, а в том, чтобь? »ес- печить защиту, и в связи с этим возникают две проблемы. $ • Ошибка в какой-нибудь подпрограмме (например, в обработчике п рыва- ний) может привести к повреждению управляющего блока процесса», в результате чего система потеряет возможность управлять данным проц , сом. • Изменение структуры или семантики управляющего блока процесс* ржет повлиять на ряд модулей операционной системы. >1f В качестве возможного способа решения этих проблем можно потре вать, чтобы выполнение всех действий с управляющими блоками осуществляло^ операционной системой только через программу-обработчик, единственной з чей которой будет защита управляющего блока процесса и которая в единол чном порядке отвечает за чтение информации из этих блоков и запись информ ии в них. Целесообразность использования такой программы определяется те. , насколько она повлияет на производительность системы, а также степенью еж ности остального программного обеспечения системы. ' ^ УПРАВЛЕНИЕ £.з. ;шравлениб:про с зййй Модели выполнения 7 Перед тем как обсудить метод, который операционная система испо; Уе для управления процессами, нужно разобраться, в чем состоит различие * * режимами работы процессора при выполнении кода операционной сист _ ы при выполнении кодов пользовательских программ. Большинство проце Р° поддерживают по крайней мере два режима работы. Определенные команды в полняются только в более привилегированном режиме. К ним относятся еР** ции считывания или внесения изменений в управляющие регистры (налр1 операции со словом состояния программы), команды ввода-вывода, а такЗК .. nmAn М О» ции считывания или внесения изменений в управляющие регистры (налр1 операции со словом состояния программы), команды ввода-вывода, а такЗК манды, связанные с управлением памятью. Кроме того, доступ к некотор w ластям памяти может быть получен только в более привилегированном ре И- ' Режим с меньшими привилегиями часто называют пользовательскк»ми5 ^ режимом, потому что обычно в этом режиме выполняются пользовате ьс 172 Часть 2. Про с 'программы. Режим с более высокими привилегиями называется системным ре- яятлом. (system mode), режимом управления (control mode) или режимом ядра /kernel mode). В последнем названии упоминается ядро, т.е. та часть операционной системы, которая выполняет важнейшие ее функции. В табл. 3.7 перечислены те из функций операционной системы, которые обычно возлагаются на ядро. Таблица 3.7. Типичные функции ядра операционной системы Управление процессами щ Создание и завершение процессов , Планирование и диспетчеризация процессов • Переключение процессов • Синхронизация и поддержка обмена информацией между процессами • Организация управляющих блоков процессов Управление памятью • Выделение адресного пространства процессам • Свопинг • Управление страницами и сегментами , Управление вводом-выводом J • Управление буферами • Выделение процессам каналов и устройств ввода-вывода Функции поддержки • Обработка прерываний • Учет использования ресурсов Текущий контроль системы • Нетрудно понять, зачем нужны два вышеуказанных режима. Необходимо защитить операционнукмсистему и ее основные таблицы, такие, как управляющие блоки процессов, рт воздействия пользовательских программ. Программы, работающие в режиме ядра, обладают полным контролем над процессором и всеми его командами и регистрами, а также имеют доступ ко всем ячейкам памяти. Такой уровень привилегий пользовательским программам не нужен, поэтому, исходя из соображений безопасности, лучше сделать его недоступным для пользовательских программ. В связи с этим возникают два вопроса: каким образом процессор может опреде- *»» в каком режиме должна выполняться данная программа, и как происходит реключение из одного режима в другой? Что касается ответа на первый вопрос, то ове состояния программы имеется бит, в котором указывается режим выполне- ■ При некоторых событиях происходит изменение этого бита. Например, если t^. 30ватель вызывает службу операционной системы, устанавливается режим ядра Че ЧН° ЭТО ПР°ИСХ°ДИТ в результате выполнения команд изменения режима). В ка- Зит Ве Примера приведем команду Change Mode (CHM), с помощью которой происходив Переключение Режима на машинах VAX. Когда пользователь вызывает службу ■ Рационной системы или когда в результате прерывания управление переходит к ' »Кл 6Дуре операционной системы, эта процедура выполняет команду СНМ, чтобы т-$ол ЧИТЬ 6олее привилегированный режим. Перед тем как вернуть управление \. °вательскому процессу, она снова выполняет эту команду переводя процессор W^Sa 3. Описание процессов и управление ими 173
J 'с* в режим с меньшими привилегиями. Если же команду СНМ попытается выпо 1Ть пользовательская программа, это приведет к передаче управления операционной" с. теме, и если такое изменение режима пользовательской программой не разреш 0, произойдет ошибка выполнения. Jy. Создание процессов В разделе 3.1 обсуждались события, влекущие за собой создание н х процессов. Ознакомившись со структурами данных, связанными с процес и, опишем вкратце этапы создания этих процессов. Если операционная система по какой-либо причине (см. табл. 3.1) при ла решение создатьНпрбцессТона может сделать это следующим образом. >; 1. Присвоить новому процессу уникальный идентификатор. На этом этапе в первичную таблицу процессов вносится новая запись. ^ 2. Выделить пространство для процесса. Сюда включаются все элементы аза процесса. Операционная система должна знать, сколько места нужно для пользовательского адресного пространства (для программ и данных) и для пол ва- тельского стека. Эти значения могут назначаться по умолчанию исходя, та процесса, или могут быть установлены на основе запроса пользователя m$i создании задания. Если процесс порождается другим процессом, родитед кий процесс может передать операционной системе необходимые величины, омес- тив их в запрос на создание процесса. Если вновь создающийся процесс 1ет использовать какую-то часть адресного пространства совместно с другими процессами, необходимо установить соответствующие связи. И, наконец, "но выделить место для управляющего блока процесса. 3. Инициализировать управляющий блок процесса. Информация о проц содержит его идентификатор, а также некоторые другие идентификаторй например идентификатор родительского процесса. Информация о состояний ipo- цессора обычно инициализируется нулевыми значениями, за исключ I км счетчика команд (который содержит точку входа в программу) и указа пей системного стека (задающие границы стека процесса). Инициализация . Р35" ляющей информации происходит на основе значений, установленных по, молчанию, с учетом атрибутов из запроса на создание процесса. Например, тоя- ние процесса обычно инициализируется значением "готов" или "готов и. и00" тановлен". Что касается приоритета, то по умолчанию он может - ыть установлен минимальным, если не поступил явный запрос на установку пее высокого приоритета. Поначалу процесс может не владеть никакими (типа устройств ввода-вывода или файлов), если не сделан явный запро^^ если эти ресурсы не были переданы по наследству от родительского проц ; • 4. Установить необходимые связи. Если операционная система, напр еР' поддерживает очередь планируемых заданий в виде списка со связя новый процесс необходимо поместить в список готовых или готовых пр"° тановленных процессов. j^- о. Создать или расширить другие структуры данных. Операционная СИ может, например, поддерживать для каждого процесса файл с учете, пользуемых ресурсов, который позже будет использован для оценки Ц водительности системы. 174 Часть 2. Про J Переключение процессов Казалось бы, функция переключения процессов проста и понятна. В какой- момент времени выполняющийся процесс прерывается и операционная сиеге~- переводит в состояние выполнения другой процесс, передавая ему управление- Однако здесь возникают некоторые вопросы, касающиеся архитектуры опе- оационной системы. Во-первых, какие события должны приводить к переключению процессов. Во-вторых, как установить различие между переключением режимов работы и переключением процессов. И наконец, что нужно делать операционной системе с различными структурами данных, находящимися под ее управлением, чтобы переключить процесс. Когда нужно переключать процессы Переключение процесса может произойти в любой момент, когда управление от выполняющегося прощесса^переходит к операционной системе. В табл. 3.8 перечислены возможные причины, по которым управление может перейти к операционной системе. Таблица 3.8. Механизмы прерывания процесса Механизм Причина Использует Прерывание Внешняя по отношению к вы- Отклик на внешнее асинхрон- полнению текущей команды ное событие Ловушка Связана с выполнением текущей Обработку ошибки или ис- команды ключительной ситуации Вызов супервизора Запрос приложения Вызов функции операционной системы Во-первых, рассмотрим системные прерывания. Фактически имеются системные прерывания двух видов. Первый вид — обычные прерывания, а второй — ловушки (trap). Прерывания первого вида происходят из-за событий определенного типа, не связанных с выполняющимся процессом и являющихся внешними по отношению к нему (таким событием может быть, например, завершение операции ввода-вывода). Ловушки связаны с.ошибкой или исключительной ситуацией, возникшей в результате выполнения_текущего процесса. В качестве примера-мЪж1гс^-пр^вёстй~ попытку получения незаконного доступа к файлу. При обычном прерывании управление передается обработчику прерываний, который осуществляет некоторые подготовительные действия, а затем — Функции операционной системы, отвечающей за прерывания данного вида. Приведем конкретные примеры прерываний. Прерывание таймера. Операционная система определяет, что текущий процесс выполняется в течение максимально разрешенного промежутка времени. Если это так, то данный процесс нужно переключить в состояние готовности и передать управление другому процессу. Прерывание вводя-вывода. Операционная система определяет, что именно произошло, и если это то событие, которого ожидают один или несколько процессов, операционная система переводит все соответствующие блокированные процессы в состояние готовности (соответственно, блокированные \ ^лава 3. Описание процессов и управление ими 175
приостановленные процессы она переводит в состояние готовых при т новленных процессов). Затем операционная система должна принять р© ние: возобновить выполнение текущего процесса или передать управлен готовому к выполнению процессу с более высоким приоритетом. $ • Ошибка отсутствия блока в памяти. Допустим, что процессор должен о ра. титься к слову виртуальной памяти, которое в настоящий момент отсу гт вует в основной памяти. При этом операционная система должна загру 1?ь в основную память блок (страницу или сегмент), в котором содержите ; ресованное слово. Сразу же после запроса на загрузку блока операциоя система может передать управление другому процессу, а процесс, для . должения выполнения которого нужно загрузить блок в основную п ь переходит в блокированное состояние. После загрузки нужного блока тот процесс переходит в состояние готовности. "?■. -I- ■ В случае возникновения ловушки (trap) операционная система определяет5 я ется ли ошибка или исключительная ситуация фатальной. Если это так, тр вы- лняющийся в данный момент процесс переходит в состояние завершающег , а равление переходит к другому процессу. В противном случае действия операцион- й системы будут зависеть от характера происшедшей ошибки, а также от конст- кции самой операционной системы. Может быть предпринята попытка вып нъ сстановительные процедуры или просто поставить пользователя в извести тъ о оисшедшей ошибке. Операционная система при этом может как выполнить" ере- ючение процессов, так и продолжить выполнение текущего процесса. <;. Наконец, операционная система может быть активизирована в результате' ьх- ва супервизора (supervisor call), который исходит от выполняемой програ, мы. шример, пусть в ходе работы пользовательского процесса нужно выполнить ко- лду, для которой требуется операция ввода-вывода, например открытие а. кой вызов приведет к тому, что управление перейдет к процедуре, являюще ich стью кода операционной системы. Вообще говоря, использование таких систе ных :зовов приводит к переходу процесса в блокированное состояние. ;*. Переключение режимов '* В главе 1, "Обзор компьютерных систем", нами рассматривалась целесооб- зность включения цикла прерывания в цикл команды. Напомним, что в оде кла прерывания процессор проверяет, не поступили ли какие-нибудь преры- ния, на наличие которых указывает сигнал прерывания. Если никаких пр ры- ний нет, процессор переходит к циклу выборки, извлекая из памяти оче еД' ю команду, входящую в текущую программу. Если же имеются необработав- te прерывания, то процессор выполняет следующие действия. .■;■ L. Сохраняет контекст текущей программы. /.. -■ Устанавливает в счетчике команд начальный адрес программы — обр . т" чика прерываний. £ I. Переключается из пользовательского режима в режим ядра, чтобы мо было выполнять привилегированные команды, содержащиеся в коде °" ботки прерывания. |- После этого процессор переходит к циклу выборки и выбирает первую ком программы обработки прерываний, обслуживающей данное прерывание. }_ '6 Часть 2. ПроЦ Может возникнуть вопрос: что входит в состав сохраняемого контекста? -Этот контекст должен содержать информацию, которая может быть изменена в цессе работы обработчика прерываний и которая необходима для возобновления выполнения прерванной программы. Таким образом, должна быть сохранена часть управляющего блока процесса с информацией о состоянии процессора. В нее входит содержимое счетчика команд и других регистров процессора, а также информация о стеках. Нужно ли сделать что-нибудь еще? Это зависит от дальнейших событий. Обычно обработчик прерываний является короткой программой, которая выполняет несколько базовых действий, связанных с прерыванием. Например, эта программа восстанавливает состояние флага, сигнализирующего о наличии прерываний. Она может послать подтверждение о получении прерывания тому элементу аппаратного обеспечения, который сгенерировал это прерывание (например, контроллеру ввода- вывода). Кроме того, эта программа может выполнить некоторые служебные действия, связанные с событием, сгенерировавшим прерывание. Например, если прерывание связано с вводом-выводом, обработчик прерываний проверит, не произошло ли ошибки при его выполнении. Если произошла ошибка, обрабртчик может послать сигнал процессу, первоначально выдавшему запрос на операцию ввода-вывода. Если прерывание сгенерировано таймером, программа обработки прерываний передаст управление диспетчеру. Диспетчер выполнит переключение процессора на обработку другого процесса, если промежуток времени, отведенный на выполнение текущего процесса, уже истек. Как же быть с остальной информацией, содержащейся в управляющем блоке процесса? Если вслед за данным прерыванием последует переключение на другой процесс, то нужно выполнить соответствующие действия по переключению. Однако в большинстве операционных систем прерывание не обязательно влечет за собой переключение процессов. По окончании работы обработчика прерываний возможно возобновление выполнения того процесса, который выполнялся и до прерывания. В некоторых случаях во время прерывания достаточно сохранить только информацию о состоянии процессора. После того как управление вновь возвратится к выполнявшейся перед прерыванием программе, нужно будет лишь восстановить эту информацию. Обычно функция сохранения и восстановления состояния процессора возлагается на аппаратное обеспечение. Изменение состояния процесса Понятно, что переключение режима работы процессора и переключение Роцессов — это не одно и то же.10 Переключение режима может происходить ез изменения состояния процесса, выполняющегося в данное время. В этом Учае сохранение контекста и его последующее восстановление не приведет к •яьщим накладным расходам. Однако если выполняющийся в текущий момент Мени процесс нужно перевести в другое состояние (состояние готовности, ;0 R , Че -° литературе по операционным системам часто встречается термин переклю- Ми к°нтекста (context switch). К сожалению, хотя в большинстве изданий этот тер- icjj сп°лъзуется для обозначения действия, которое в нашей книге называется пере- ■ **Чя UeM пРои-сссов> в других источниках он используется для обозначения переключе- ■ie r JMcUMa Р°боты процессора или даже переключения потоков (о котором пойдет речь %^ам УЮш>ей главе). Поэтому термин переключение контекста в данной книге во избе- i\ e его неоднозначного понимания не используется. . .»*?**- 3. Описание процессов и управление ими 177
1 .f м ированное и т.д.), то операционная система должна произвести в своей к грации определенные изменения. В случае переключения процессов дол ^ , выполнены следующие действия. Сохранение контекста процессора, включая содержимое счетчика кома д й других регистров. / Обновление управляющего блока выполняющегося в данное время про са. Сюда входит изменение состояния процесса на одно из следующих: (г то- вый, блокированный, готовый приостановленный или завершающийся. Кроме того, должно быть обновлено содержимое других полей с указавшем причины переключения процесса из состояния выполнения, а также $ сохранением информации по учету используемых ресурсов. Помещение управляющего блока данного процесса в соответствующую^ че- редь (очередь готовых к выполнению процессов; процессов, блокирова шх событием; очередь готовых приостановленных процессов). « Выбор следующего процесса для выполнения; эта тема исследуется щ1 ет- вертой части книги. *»■. Обновление управляющего блока выбранного процесса. Для этого про есса нужно установить состояние выполнения. •;','. Обновление структур данных по управлению памятью. Понадобится л i эта информация, зависит от того, каким образом выполняется преобраэо ание адресов (подробно эта тема рассматривается в третьей части книги). | Восстановление контекста процессора в состояние, в котором он наход 11ся, когда выбранный процесс был последний раз переключен из состояни выполнения. Это происходит путем загрузки содержимого программного чет чика и других регистров процессора. =4 Таким образом, переключение процесса, в которое входит переключен е его гояния, требует значительно больших усилий по сравнению с переключ шем :има работы процессора. .д шолнение кода операционной системы л' В главе 2, "Обзор операционных систем", были отмечены два заним **"ь" t факта, касающиеся операционных систем. ,^ Операционная система работает точно так же, как и обычная прогр ■ ма' т.е. она тоже является программой, которая выполняется процессором* Операционная система часто передает управление другим программам* во врат управления операционной системе зависит от процессора. ,; Если операционная система представляет собой обычный набор прогр >'м и она выполняется процессором точно так же, как и любая другая про I то является ли операционная система процессом? Если это так, to^kjL^ является управление этим процессом? Размышления над этими интерес [росами стали причиной появления различных подходов к разработке .Л Р шных систем. На рис. 3.12 проиллюстрированы подходы, реализован» i личных операционных системах. Часть 2. Про i Pi Р2 а • « Ядро а) Автономное ядро Pi Функции операционной системы Р2 Функции операционной системы ■ • * РП Рл Функции операционной системы Функции переключения процессов б) Функции операционной системы выполняются в пользовательских процессах Р1 Р2 OSi OS* Функции переключения процессов в) Функции операционной системы выполняются как отдельные процессы Рис. 3.12. Взаимосвязь между операционной системой и пользовательскими процессами Ядро вне процессов Один из трад^щ№ощдь££_пол^цов, который применялся во .многих ранних операционных системах, состоит в том, чтобы выполнять ядро операционной системы вне всяких процессов (рис. 3.12,а). При_таком подходе прерывание выполняющегося в" данное вре^я процесса или вызов управляющей программы приводит к сохранению контекста данного процесса и передаче управления ядру. иперационная система имеет свою собственную область памяти и свой собственный системный стек, который используется для управления вызовами процедур -- возвратами из них. Операционная система может выполнить все необходимые функции и восстановить контекст прерванного процесса, после чего выполнение ого процесса будет продолжено. После завершения сохранения контекста дан- Го процесса операционная система может также перейти к планированию и спетчеризации другого процесса. Случится это или нет — зависит от того, что <^_ енно послужило причиной прерывания, и от ряда других обстоятельств, i любом случае основным моментом такой схемы является_то, что концеп- 1п пР°Цесса рассматривается в ней лишь применительно к пользовательским L гРаммам. Код операционной системы выполняется как некий отдельный объ- S^ ' Работающий в привилегированном режиме. Ва 3. Описание процессов и управление ими 17»
Выполнение в составе пользовательских процессов ^, На небольших машинах (персональных компьютерах, рабочих ст Иях 1сто применяется альтернативный подход, при котором почти все прогрм ^ юрационной системы выполняются в контексте пользовательского ngo_e<^a. азработчики таких систем придерживаются той точки зрения, что опереди,,. 1Я система — это в основном набор процедур, которые вызываются дляпг ол. »ния различных функций пользовательского процесса. Этот подход проиллюст фован на рис. 3.12,6. Каждый процесс, принятый операционной систе й аа >работку, включает в себя не только блоки, изображенные на рис. ЗЛО'1 но и шасти кода, данных и стека программ ядра. & На рис. 3.13 показана типичная схема структуры образа процесса, при ятая такой стратегии. Для управления вызовом системных процедур, работаю^ их а »жиме ядра, и возврата из них используется отдельный стек ядра,.Код^ дая- ые операционной системы находятся в совместно используемом адресное про- гранстве и доступны для использования всеми пользовательскими процес^ ми. Идентификация процесса Информация о состоянии процессора Управляющая информация процесса Управляющий блок процесса Пользовательский стек Пользовательское адресное пространство (программы, данные) Стек ядра Совместно используемое адресное пространство Рис. 3.13. Образ процесса: код операционной системы выполняется в пользовательском пространстве .4 i 4< Iftfl Часть 2. Прои с "Г При прерывании, системном прерывании или вызове управляющей про- *ч яммы процессор переходит в режим ядра, а управление передается операцион- /{ ^ системе. Чтобы это произошло, сохраняется контекст процесса, и происхо- ( ит переключение режима с передачей управления процедуре операционной системы- Однако выполнение текущего пользовательского процесса продолжается. Таким образом, переключения процесса не происходит, переключается только ежим работы процессора в рамках одного и того же процесса. -^ Если операционная система по завершении своей задачи придет к заключению, |: что следует продолжить текущий процесс, то с переключением режима процессора в S ^едыдущее состояние возобновляется выполнение прерванной программы в рамках текущего процесса. Одно из основных преимуществ такого подхода состоит в следующем: если пользовательская программа прервалась, чтобы выполнить некоторую * процедуру операционной системы, а затем возобновила свою работу, нам удается из- I бежать двух излишних переключений процессов. Если же операционная система определит, что нужно переключить процесс, а не продолжать выполнение предыдущей программы, то управление переходит к процедуре, выполняющей переключение процессов. В зависимости от архитектуры операционной системы эта процедура может выполняться либо в составе текущего процесса, либо в составе некоторого другого процесса. В любом случае в какой-то момент текущий процесс нужно будет переключить, сняв его с выполнения, а в состояние выполнения перевести другой процесс. С точки зрения логики эту фазу удобнее всего рассматривать как нечто, происходящее вне всех процессов. В некотором отношении такая точка зрения на операционную систему яв- <. ляется довольно интересной. Выполняющийся процесс в определенный момент времени сам сохраняет информацию о своем состоянии, выбирает для выполне- ния другой процесс, находящийся в состоянии готовности, и передает ему управление. Причина того, что в такой ситуации не наступает хаос и произвол, заключается в том, что критичный код представляет собой не код пользовательской программы, а совместно используемый код операционной системы, выпол- няющийся в контексте процесса. В силу наличия пользовательского режима и $ режима ядра пользователь не может вмешиваться в работу системных процедур, хотя они и выполняются в среде пользовательского процесса. Это еще раз напоминает нам об отличиях концепций процесса и программы и о том, что между . ими нельзя ставить знак равенства. В ходе процесса могут выполняться и поль- овательские программы, и программы операционной системы; с другой сторо- ' ПР°граммы операционной системы, выполняемые в разных пользователь- ^ их процессах, являются идентичными. Операционная система на основе процессов * ^ ихе одним вариантом построения операционной системы, проиллюстрирован- '■ зке в РИС' ^■^■^,в' является ее реализация в виде набора системных процессов. Так ОДпм ак и ПРИ других подходах, программы, входящие в ядро, выполняются в ре- " ^е ггп^Ра' олнаКо в этом слу4^ основные функций-ядра организованы как отдель- *5ещн Цессы- Здесь также возможно наличие небольшого кода, который является ■«£ ,;— м по отношению^ ко всем процессам и осуществляет их переключение. ^ Ope-81*0** ПОДХОД облаДает рядом преимуществ. Его применение дисцйплиниру- 1*Ицй1й раммистов и способст^^ет_разр_аботке модульных операционных систем с -^ьными простыми^ межмодульными интерфёйсами7 кроме того, некото- °* Описание процессов и управление ими 181
е второстепенные функции операционных систем удобно реализовывать в 1Де цельных процессов. Например, ранее упоминалась управляющая прогр ' а торая ведет запись интенсивности использования различных ресурсов эоцессора, памяти, каналов) и скорости выполнения процессов в системе. По. ольку эта программа не обслуживает какой-то конкретный активный про есс а может вызываться только операционной системой. Как процесс эта про- амма может выполняться с определенным приоритетом и чередоваться с дру. ми программами под управлением диспетчера. И наконец, реализация о ера- юнной системы в виде набора процессов полезна в многопроцессорных и лво- компьютерных системах, в которых отдельные службы операционной сщ ^ >гут быть переданы для выполнения специально предназначенным прок, ссо- lm, что позволит повысить производительность системы. -fi Ы. УПРАВЛЕНИЕ ПРОЦЕССАМИ В ОПЕРАЦИОННОЙ СИСТЕМЕ UNIX $VR4 atf Операционная система UNIX System V использует простую, но облад щ\то [ирокими возможностями организацию процессов, за работой которой може сле- ить пользователь. UNIX работает в соответствии с моделью, изображенной на ис. 3.12,6, согласно которой большинство про^ам^Ьперадионной_х;истемы ыпо1:- яется в среде пользовательских процессов. Таким образом, в UNIX требую оба ежима — пользовательский режим и режим ядра. В операционной системе. UNIX ;спользуются две_ категории процессов: системные и пользовательские^ Системные гроцессы выполняют код операционной системы в режиме ядра.^о^ществляя раз- [ичные административные функции, такие, как выделение памяти или свопинг Процессов. Пользовательские процессы выполняют код пользовательских про амм, сак в пользовательском режиме, а код операционной системы — в режиме ядра. 1ользовательский процесс переключается в режим ядра при вызове, .мной рункции, генерации исключения или при обработке прерывания. •;;; Состояния процессов ) Всего в операционной системе UNIX распознается девять состояний П оцес- сов, перечисленных в табл. 3.9; соответствующая диаграмма переходов остоя- ний показана на рис. 3.14 (в ее основе — рисунок из [ВАСН86]). Этот р сунок похож на рис. 3.6; нужно только принять во внимание, что спящие состояния в системе UNIX соответствуют блокированным состояниям. Кратко перечисли основные различия между диаграммами. •?' • Для отражения того факта, что процесс может выполняться как в по п а тельском режиме, так и в режиме ядра, в диаграмме имеется два сое н1 выполняющихся процессов. '-?<t • Состояния вытесненных и загруженных в память и готовых к выпо Hl ^ процессов отличаются друг от друга. По сути эти два состояния поч °»* наковы (на что указывает соединяющая их пунктирная линия). Раз7*11 ^ же делается, чтобы подчеркнуть, каким именно образом процесс 'Я05* быть прерван в пользу другого. Если процесс выполняется_в _режимв а результате вызова диспетчера, прерывания по таймеру или преры 11Я Часть 2. П И60 команде ввода-вывода), рано или поздно наступает момент, когда ядро завершает свою работу и готово возвратить управление пользовательской программе. В это время ядро может принять решение передать управление процессу с более высоким приоритетом, чем у выполнявшегося до этого. В таком случае текущий процесс переходцт в состояние вытесненного, но с точки зрения диспетчеризации эти процессы одинаковы. Процесс, прерванный в пользу "другого, и находящийся в состоянии готовности к выполнению, находятся в одной очереди. Таблица 3.9. Состояния процессов в UNIX / Выполняющийся пользовательский Выполняющийся в пользовательском режиме с Выполняющийся ядра Выполняющийся в режиме ядра - Готовый к выполнению, загруженный Готов к выполнению, как только ядро решит передать ему управление Спящий, загруженный Не может выполняться, пока не произойдет некоторое событие; процесс находится в основной памяти (блокированное состояние) Готовый к выполнению, выгруженный Процесс готов к выполнению, но прежде чем ядро сможет спланировать его запуск, процесс свопинга должен загрузить этот процесс в основную память / Спящий, выгруженный Процесс ожидает некоторого события; он выгружен из основной памяти (блокированное состояние) 7 Вытесненный В момент переключения процессора из режима ядра в пользовательский режим ядро решает передать управление другому процессу Ь Созданный Процесс только что создан и еще не готов к выполнению '■•) Зомби Самого процесса больше не существует, но записи о нем остались с тем, чтобы ими мог вос- . пользоваться родительский процесс Такое вытеснение процесса может произойти только в момент, лер^ключе- ния режима~в1ыпт^н^тгя^йз~р"ёжима ядра в пальзовательск11Й_ режиж^Цри^вы- ^лнении процесса в "режиме ядра_он не можетЗыть вытеснен, поэтому операци- нная система UNIX не приспособлена для работы в режиме реального времени. суждение требований к системам, выполняющим обработку запросов в реаль- м времени, можно найти в главе 10, "Многопроцессорное планирование и пла- иРование реального времени". ^ есть два процесса, которых нет нив каких других операционных емах. Процесс 0 — это спёциальньйТЪроцесс, который создается при загруз- rpv СТемы- В сущности, он предопределён как структура данных, которая за- ■ Тогл авТся ВМесте с системой. Этот процесс является процессом свопинга. Кроме ~; ujj^ ' пР°Цесс 0 порождает процесс 1, который называется инициализирующим *сек, ССОм (iRit process). Этот процесс является родительским по отношению ко **Йе СТальным. Когда в систему входит новый интерактивный пользователь, "'. •/~—~ -° пРоцесс 1 создает новый процесс для этого пользователя. Далее пользо- Г ^ ^ ^ 3. Описание процессов и управление ими 183
ьский процесс может создавать ветвящиеся дочерние процессы. Таким. о- , каждое приложение может состоять из ряда взаимосвязанных процессе Создание процесса - i V-" -3. Выполнение в пользовательско режиме йтесненн# Созданны ■,PV>V Э? . няющийся:. вательский Возврат Памяти достаточно Памяти недостат ' (при наличии.. V системы сво, '") Вытеснение .,*&&* ■ _ ^полнении^ Выполнение 'Щ^л^ Выгрузка Загрузка Вызов системы, прерывание Прерывание, возврат из прерывания флняющиШ Выход Переход в спящее состояние Пробуждение ПОД и ■ с •мби'-v '^- -С: '"зОтящийЛ ";■; ■ '.'уженный' Выгрузка 'щи Рис. 3.14. Диаграмма переходов состояний процессов в системе UNIX - и исание процессов V В операционной системе UNIX процессы представлены довольно слоЖ***0Й 'ктурами данных, которые предоставляют операционной системе всю н ^ ^ ую для управления и диспетчеризации процессов информацию. В тас> -^ ведены элементы образа процесса, разделенные на три части: контекс| вельского уровня, контекст регистров и контекст системного уровня.у лица 3.10. Образ процесса в UNIX &' Контекст пользовательского уровня Выполняемые машинные команды программы Данные, доступные программе этого процесса ьзовательский Содержит аргументы, локальные переменные и указатели У ций, выполняющихся в пользовательском режиме * :т процесса ные процесса 4 Часть 2. П f Совместно используемая память Окончание табл. 3.10 Область памяти, используемая совместно с другими процессами; применяется для обмена информацией между процессами Счетчик команд Регистр состояния процессора Указатель стека Регистры общего назначения Запись таблицы процессов Пользовательская область Таблица областей процесса Контекст регистров Адрес очередной команды, которая будет выполняться; она может находиться как в пользовательском пространстве, так и в пространстве ядра Содержит данные по состоянию аппаратного обеспечения в момент передачи управления; содержимое и формат этих данных зависят от конкретного аппаратного обеспечения Указывает положение вершины стека ядра (или пользовательского стека, в зависимости от режима работы процессора) Зависят от используемого аппаратного обеспечения Стек ядра Контекст системного уровня Определяет состояние процесса; эта информация всегда доступна операционной системе Информация по управлению процессом, необходимая только в контексте данного процесса Задает отображение виртуальных адресов в физические; содержит также поле полномочий, в котором указывается тип доступа, на который процесс имеет право: только для чтения, для чтения и записи или для записи и выполнения Содержит кадр стека процедур ядра при работе процесса в режиме ядра В контекст пользовательского уровня (user-level context) входят основные элементы пользовательских программ; он может генерироваться непосредственно из скомпилированных объектных файлов. Каждая пользовательская программа разделена на две части, одна из которых размещается в текстовой области, а другая — в области данных. Текстовая область предназначена только для чтения; в ней хранятся команды пользовательских программ. Во время выполнения процессор использует пользовательский стек для вызовов и возвратов из процедур, а также для передачи параметров. Совместно используемая область памяти — это область данных, доступ к которой одновременно предоставляется различным процессам. Хотя в системе име- ется только одна физическая копия совместно используемой области памяти, при использовании виртуальной памяти эта область находится в адресном пространстве айсДого процесса, который ее использует. Когда процесс не выполняется, соответствующая информация по состоянию Р°Цессора хранится в области контекста регистров (register context), и а контексте системного уровня (system-level context) находится остальная формация, которая нужна операционной системе для управления процессом, информация состоит из статической части фиксированного размера, который Че ется неизменным на протяжении всего времени жизни процесса, и динами- ^ i Части, размер которой меняется. Одним из компонентов статической час- зад Ляется запись таблицы процессов, которая фактически является частью ЧЬ1 процессов, поддерживаемой операционной системой, в которой каждо- Р°Цессу соответствует одна запись. Запись таблицы процессов содержит ин- 5а 3. Описание процессов и управление ими 185
i огшаиию по управлению процессом, доступную ядру в любой момент време и. гяким образом, в системе виртуальной памяти все записи таблицы процессор*. .пянно остаются в основной памяти. В табл. 3.11 перечислены компоненты;,а. ;Ги таблицы процессов. Пользовательская область содержит дополнительн ю "поавяяющую информацию, которая нужна ядру при работе в контексте этого процесса; эта информация используется также при загрузке и выгрузке стр иц провеса из основной памяти. В табл. 3.12 приведено содержимое этой табли ы. Таблица 3.11. Элемент таблицы процессов в системе UNIX .г ^ Состояние процесса Указатели Размер процесса Идентификаторы пользователя Идентификаторы процесса Дескриптор событий Приоритет Сигнал Таймеры Р-связь Статус памяти ти- Текущее состояние процесса .-.-.," Пользовательская область и область памяти процесса (текст,, н- ные, стек) .: Дает возможность операционной системе определить, сколько памяти потребуется процессу Реальный идентификатор пользователя (real user ГО) указывает, кто из пользователей несет ответственность за выполняющийся процесс. Фактический идентификатор пользователя (effective user ID) может использоваться процессом для предоставления вре сн- ных привилегий, связанных с определенной программой; на ре- мя выполнения этой программы в составе процесса последи использует фактический идентификатор пользователя .J" Идентификатор данного и родительского процессов. Эти ид фикаторы присваиваются процессу в состоянии создания ■;'. Используется, когда процесс находится в спящем состоян наступлением события процесс переходит в состояние готовн Используется при планировании процессов $ Перечисляет отправленные, но еще не обработанные сигналь^ Включают время выполнения процесса, использование рее ядром, а также пользовательские таймеры для отправки сиг в определенное время >? Указатель на следующий элемент в очереди готовых к выполнению процессов (используется, когда процесс находится в с ' тоя- нии готовности) "">■ Указывает, находится ли образ процесса в основной памяти нти выгружен из нее. Если процесс загружен в память, в этой, лоте также указывается, можно ли его выгрузить или он в ,р ° блокирован в основной памяти л и гов юв Таблица 3.12. Пользовательская область UNIX Указатель таблицы процессов Идентификаторы пользователя Таймеры Массив обработчиков сигналов Указывает запись, соответствующую области пользователя ... Реальный и фактический идентификаторы пользователя. Исп >чь" зуются для определения пользовательских привилегий .--j Записывают время, затраченное на выполнение данного и еР них процессов в пользовательском режиме и в режиме ядра^ Указывает, как будет реагировать процесс на каждый из п типов сигналов, заданных в системе (выходить из системы* ,тИ рировать сигнал, выполнять заданную пользователем функцй*^^- 186 Часть 2. П , Окончание табл. 3.12 У раВляющий Указывает, с какого терминала был запущен процесс (если этот терминал терминал существует) Попе ошибок Содержит записи об ошибках, произошедших во время системного вызова Возвращаемое Содержит результат выполнения системных вызовов значение Параметры Задает объем передаваемых данных, адрес массива данных в ввода-вывода пользовательском пространстве, а также смещения в файлах при вводе-вы воде файловые Текущий и корневой каталоги описывают файловую систему параметры процесса Таблица дескрипто- Содержит записи об открытых файлах ров файлов пользователя Граничные поля Ограничивают размер процесса и размер файла, который он может записать Поля режимов Установки режима доступа к создаваемым процессом файлам доступа Различия между записью таблицы процессов и пользовательской областью отражают тот факт, что ядро системы UNIX всегда выполняется в контексте какого-нибудь процесса. Большую часть времени ядро работает с контекстом текущего процесса, однако иногда ядру нужен доступ к информации и о других процессах, например при работе планировщика. Третьей статической частью, входящей в контекст системного уровня, является таблица областей процесса, которая используется системой управления памятью. И, наконец, стек ядра — это динамическая часть контекста системного уровня. Этот стек используется при выполнении процесса в режиме ядра и содержит информацию, которую нужно сохранять и восстанавливать во время вызовов процедур и прерываний. Управление процессами В операционной системе UNIX процессы создаются с помощью вызова системной функции ядра под названием fork(). При вызове этой функции процес- °м операционная система выполняет следующие действия [ВАСН86]. * Выделяет в таблице процессов место для нового процесса. • Назначает этому процессу уникальный идентификатор. Создает копию образа родительского процесса, за исключением совместно используемых областей памяти. величивает показания счетчиков всех файлов, принадлежащих родительскому процессу, что отражает тот факт, что новый процесс также владеет этими файлами. %. ' азначает процессу состояние готовности к выполнению. А • ®* Вп ■ - озвРащает родительскому процессу идентификатор дочернего процесса, а '% ^°ЧеРнему процессу — значение О. Г ": t 3* Описание процессов и управление ими 187
Все перечисленные выше действия выполняются в рамках родитель*:* го цесса в режиме ядра. После того как ядро закончит выполнение этих Ик. щй, оно может перейти к выполнению одного из следующих действий как СТй программы диспетчера. 1. Оставаясь в рамках родительского процесса, переключить процессор в Дочь- зовательский режим; процесс будет продолжен с той команды, которая че_ дует после вызова функции fork (). 2. Передать управление дочернему процессу. Дочерний процесс начинаем выполняться с того же места кода, что и родительский: с точки возврата п пе вызова функции fork (). 1?: 3. Передать управление другому процессу. При этом и родительский и кр. ний процессы переходят в состояние готовности к выполнению. Возможно, такой метод создания процессов трудно изобразить нагл дно потому что и родительский и дочерний процессы в момент создания выпо я ют один и тот же проход по коду. Различаются они возвращаемым фун ней fork () значением: если оно равно нулю, то это дочерний процесс. Таким разом, можно выполнить команду ветвления, которая приведет к выполнен ю до черней программы или продолжению выполнения основной ветви. ';lv ./У 3.5. РЕЗЮМЕ^КЛЮЧЕВЫЕ ТЕРМИНЫ ,„„. И КОНТРОЛЬНЫЕ ВОПРОСЫ , t Фундаментальным строительным блоком современных операционных систем является процесс. Основная функция операционной системы состоит в создании, управлении и завершении процессов. Операционная система должна следить за тем, чтобы каждому активному процессу выделялось время для выполнения на процессоре, координировать деятельность процессов, разрешать конфликтные ситуации и выделять процессам системные ресурсы. Чтобы операционная система имела возможность управлять процессами, она поддерживает описание каждого процесса или образ процесса. В образ проц ^ »4^ дит адресное пространство, в котором этот процесс выполняется, и управляю ^ блок процесса. В управляющем блоке содержится вся информация, которая Уе^ ся операционной системе для управления процессом, включая его текущее ние, выделенные ресурсы, приоритет и другие необходимые данные. ,-»-• Во время своего существования процесс может переходить из одйо о стояния в другое. Наиболее важными из всех состояний являются состой w ^ товности, состояние выполняющегося процесса и блокированное состояв • ^ товый к выполнению процесс — это процесс, который не выполняется в ^ момент, но его выполнение может начаться сразу же, как только операДИ. i ^ система передаст ему управление. Выполняющийся процесс — это процесс. ^ торый в настоящее время выполняется процессором. В многопроцессорно ^ теме в этом состоянии может находиться сразу несколько процессов. Бл ь ^ ванный процесс — это такой, который ожидает наступления какого-то сор например завершения операции ввода-вывода. Выполнение процессов время от времени прерывается. Прерываял ^ ступает либо вследствие какого-то внешнего по отношению к процесс с 18g Часть 2. П u c тйя, которое распознается процессором, либо вследствие вызова управляю Шей программы операционной системы. В любом из этих случаев происходит переключение процессора в другой режим работы и передача управления подпрограмме операционной системы. После выполнения своих функций операционная система может продолжить выполнение прерванного процесса или переключиться на выполнение другого процесса. Ключевые термины Вытеснение Дочерний процесс Завершение процесса Задание Ловушка Образ процесса Переключение процессов Переключение режимов Пользовательский режим Прерывание Привилегированный режим Процесс Режим ядра Родительский процесс Свопинг Системный режим След Слово состояния программы Состояние блокирования Состояние выполнения Состояние готовности Состояние нового процесса Состояние приостановленности Управляющий блок процесса Контрольные вопросы 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. 3.9. 3.10. з.п. 3.12. 3.13. 3.14. Что такое след процесса? В результате каких событий создаются процессы? Дайте краткое описание каждого состояния, фигурирующего в модели обработки процессов, представленной на рис. 3.3. Что такое вытеснение процесса ? Что такое свопинг и когда он применяется? Зачем на рис. 3.6,6 представлены два блокированных состояния? . Перечислите четыре характерных признака приостановленных процессов. . Для каких объектов операционная система поддерживает таблицы с управляющей информацией? Перечислите три общие категории информации в управляющем блоке процесса. Зачем нужны два режима работы процессора (пользовательский режим и режим ядра)? Какие действия выполняет операционная система при создании нового процесса? "ем отличаются обычное прерывание и ловушка? Приведите три примера прерываний. Нем отличаются переключение режима работы процессора и переключение процессов? г d- Описание процессов и управление ими 189
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА -f. а? ■ Материал этой главы изложен в учебниках, приведенных в разделе■% LHHe управления процессами в операционной системе UNIX можно наД а D94] и [GRAY97]. В [NEHM75] обсуждаются состояния процессов и пршаи- операционной системы, использующиеся при диспетчеризации процессов. D94 Goodheart В., Сох J. The Magic Garden Explained: The Internals of UN X System V Release 4. — Englewood Cliffs, NJ: Prentice Hall. 1994. lY97 Gray J. Interprocess Communication in UNIX: The Nooks and CrannJ s. — Upper Saddle River, NJ: Prentice Hall, 1997. ,#- IM75 Nehmer J. Dispatcher Primitives for the Construction of Operating Syetem Kernels. — Acta Informatica, vol. 5, 1975. |:^; 'ГЗАДАЧИ" ~" 7Л ' % ¥■ -л Назовите пять основных функций операционной системы при управлении процессами; обоснуйте в общих чертах их необходимость. В [PINK89] определены такие состояния процессов: выполняющийся, готовый к выполнению, блокированный и приостановленный. Процесс находится в блокированном состоянии, если он ожидает разрешения использовать какой-то ресурс; процесс является приостановленным, если он ждет, пока освободится ресурс, запрос на использование которого он уже отправил. Во многих -операционных системах эти два состояния объединяются в одно, и называются блокированным состоянием. В этом случае определение приостановленно о состояния совпадает с тем, которое использовалось в данной главе. Сравните преимущества использования этих двух наборов состояний. t Нарисуйте диаграмму с использованием очередей для модели с семью состояниями, изображенной на рис. 3.6,6. В качестве основы возьмите диагра му представленную на рис. 3.5,6. Рассмотрим диаграмму переходов состояний, изображенную на рис. 3 6,6"- Предположим, что для операционной системы пришло время nepeit чатъ процесс. Пусть у нас имеются процессы как в состоянии готовности, так и готовые к выполнению приостановленные. Кроме того, по крайней мере один из готовых к выполнению приостановленных процессов имеет более высокий приоритет по сравнению с приоритетом любого процесса в состоянии готовности. Можно действовать в соответствии с одной из двух следующих стратег ш- 1. Всегда выбирать процесс в состоянии готовности, чтобы свести свопинг минимуму. '** 2. Всегда отдавать предпочтение процессу с более высоким приоритете t Я же если для этого приходится выполнять свопинг, который не являе необходимым. ; Предложите промежуточную стратегию, в которой была бы предпринята пытка сбалансировать концепции приоритета и производительности. В табл. 3.13 приведены состояния процессов, использующиеся в операди. системе VAX/VMS. а. Сможете ли вы найти оправдание наличию такого большого количест а личных состояний ожидания? Часть 2. Про б. Почему нет резидентных и приостановленных версий таких состояний, как ожидание загрузки страницы в основную память, ожидание разрешения конфликта доступа к странице, ожидание общего события, ожидание свободной страницы и ожидание ресурса. в. Изобразите диаграмму переходов состояний и укажите на ней действие или событие, которое приводит к каждому из изображенных переходов. Таблица 3.13. Состояния процессов в операционной системе VAX/VMS Выполняющееся Выполнимое (резидентное) Выполнимое (выгруженное) Состояние ожидания загрузки страницы Состояние ожидания разрешения конфликта доступа к странице Состояние ожидания общего события Состояние ожидания свободной страницы Состояние сна (резидентное) Состояние сна (выгруженное) Ожидание локального события (резидентное) Ожидание локального события (выгруженное) Приостановленное (Резидентное) Приостановленное Сгруженное) Задание ресурса Выполняющийся процесс Готовый к выполнению процесс, находящийся в основной памяти Готовый к выполнению процесс, выгруженный из основной памяти Процесс обратился к странице, которая отсутствует в основной памяти, и должен ждать, пока она будет считана Процесс обратился к совместно используемой странице, загрузку которой уже ожидает другой процесс, или к персональной странице, для которой как раз выполняется чтение или запись Ожидание переключения совместно используемого флага событий (флаги событий — это однобитовые механизмы передачи сигналов от одного процесса другому) Процесс ожидает, пока ко множеству выделенных ему и находящихся в основной памяти страниц (рабочему множеству процесса) будет добавлена свободная страница основной памяти Процесс переводит сам себя в состояние ожидания Процесс в состоянии сна выгружается из основной памяти Процесс находится в основной памяти и ожидает наступления локального события (обычно этим событием является завершение ввода-вывода) Процесс в ожидании локального события выгружен из основной памяти Процесс, переведенный другим процессом в состояние ожидания Приостановленный процесс выгружается из основной памяти Процесс, ожидающий, пока ему будет предоставлен какой-то системный ресурс kg - Описание процессов и управление ими 191
ГЛАВА Потоки, симметричная многопроцессорная обработка и микроядра 4.1. Процессы и потоки 4.2. Симметричная многопроцессорная обработка 4.3. Микроядра 4.4. Потоки и SMP в Windows 2000 4.5. Управление потоками и SMP в Solaris 4.6. Управление процессами и потоками в Linux 4.7. Резюме, ключевые термины и контрольные вопросы 4.8. Рекомендуемая литература 4.9. Задачи 4
этой главе изучаются концепции современных операционных систем^ вя- J занные с управлением процессами. Мы узнаем, что концепция процессов на J самом деле сложнее и тоньше, чем можно себе представить исходя из магерйа_ предшествующих глав. По сути, эта концепция объединяет в себе две отдель е. «нциально независимые концепции, одна из которых имеет отношение к ч е. о ресурсами, а другая — к выполнению процессов. В некоторых операционных темах это различие привело к появлению конструкции, известной под наз * Ием гок (thread). После рассмотрения потоков мы обратимся к изучению симм ^ и,. i многопроцессорности (symmetric multiprocessing — SMP). В системе с неек 1ь_ «и процессорами операционная система должна выполнять одновременное пд . 1ание выполнения на разных процессорах нескольких процессов. И наконец, мь, [акомим читателя с концепцией микроядра (microkernel), которое является эф- стивным средством структурирования операционной системы для упрар: над щессами и решения других задач. -Ц. Л. ПРОЦЕССЫ И ПОТОКИ ' ' ■« ' U До сих пор концепцию процесса можно было охарактеризовать вумя раметрами. „■'* ■ Владение ресурсами (resource ownership). Процесс включает вирту ьное адресное пространство, в котором содержится образ процесса, и время от времени может владеть такими ресурсами, как основная память, каналы и устройства ввода-вывода, или файлы, или же получать контроль над н сии. Операционная система выполняет защитные функции, предотвращая неже- тательные взаимодействия процессов на почве владения ресурсами. •$ ► Планирование/выполнение (scheduling/execution). Выполнение процесса осуществляется путем выполнения кода одной или нескольких прогр.мч; при этом выполнение процесса может чередоваться с выполнением Др гих процессов. Таким образом, процесс имеет такие параметры, как состо ние (выполняющийся процесс, готовый к выполнению процесс и т.д.) в;'1 -еку- щий приоритет, в соответствии с которым операционная система ос\ ". ств- ляет его планирование и диспетчеризацию. -\1|| В большинстве операционных систем эти две характеристики явл, тся щностью процесса. Однако, немного подумав, читатель может убедиться; что и являются независимыми, и что операционная система может рассма ать : отдельно друг от друга. В некоторых операционных системах (в особенв тя в давно разработанных) так и происходит. Чтобы различать две приведу Hbte ime характеристики, единицу диспетчеризации обычно называют потоком iread) или облегченным процессом (lightweight process), а единицу вл н*я сурсами — процессом (process) или заданием (task).1 1 Увы, последовательность в использовании терминологии не выдерживаете ■_ ^ такой степени. В операционной системе OS/390. предназначенной для мейнф ^ Ш. концепции адресного пространства и задания примерно соответствуют- ,. 1ям процесса и потока, описанным в этом разделе. Кроме того, термин Упр®^ • юцесс (lightweight process) используется в трех значениях: (1) он эквивалент* 1ну поток (thread). (2) обозначает поток особого вида, известный как поток ■ ядра (kernel-level thread) или (3) (в операционной системе Solaris) элемент» ающий потоки на уровне пользователя в потоки на уровне ядра. 96 Часть 2. Пр °Г ту!яогопоточность Многопоточностью (multithreading) называется способность операционной системы поддерживать в рамках одного процесса выполнение нескольких потоков. Традиционный подход, при котором каждый процесс представляет собой единый поток 0ыполнения, называется однопоточным подходом. Две левые части рис. 4.1 иллюстрируют однопоточные подходы. MS DOS является примером операционной системы, способной поддерживать не более одного однопоточного пользовательского процесса. Другие операционные системы, такие, как разнообразные разновидности UNIX, поддерживают процессы множества пользователей, но в каждом из этих процессов может содержаться только один поток. В правой половине рис. 4.1 представлены многопоточные подходы. Примером системы, в которой один процесс может расщепляться на несколько потоков, является среда выполнения Java. В этом разделе нас будет интересовать использование нескольких процессов, каждый из которых поддерживает выполнение нескольких потоков. Подобный подход принят в таких операционных системах, как OS/2, Windows 2000 (W2K), Linux, Solaris, Mach, и ряде других. В этом разделе приведено общее описание многопоточного режима, а в последующих разделах будут подробно рассмотрены подходы, использующиеся в операционных системах W2K, Solaris и Linux. ? Один процесс, один поток ЕЕ Г Несколько процессов, по одному потоку в процессе ■ 1 Ж 1 Один процесс, несколько потоков ж ш Несколько процессов, несколько потоков в процессе V-. \ Выполнение машинных команд Рис. 4.1. Потоки и процессы [ANDE97] цРеДел МНОГОПОТОЧНОЙ среде процесс определяется как структурная единица рас- аааы ения РесУРСов, а также структурная единица защиты. С процессами свя- следующие элементы. иРтуальное адресное пространство, в котором содержится образ процесса. \ ейЩ111ЦеННЫЙ ДОСТуп к процессорам, другим процессам (при обмене информаци- Между ними), файлам и ресурсам ввода-вывода (устройствам и каналам). . а 4. Потоки, симметричная многопроцессорная обработка... 197
j рамках процесса могут находиться один или несколько потоков, каждый?- горых обладает следующими характеристиками. >' :остояние выполнения потока (выполняющийся, готовый к выполнению : I Т.Д.)- :- ^храненный контекст не выполняющегося потока; один из способов рассмотрения потока — считать его независимым счетчиком команд, работаю-. ним в рамках процесса. "J Цтек выполнения. ■.; # Статическая память, выделяемая потоку для локальных переменных. Цоступ к памяти и ресурсам процесса, которому этот поток принадлежит;'1 этот доступ разделяется всеми потоками данного процесса. /?. На рис. 4.2 пр_одемонстрировано различие между потоками и процессами с точ^. ения управления последними. В однопоточной модели процесса в его представ- • входит управляющий блок этого процесса и пользовательское адресное про*-г' ство, а также стеки ядра и пользователя, с помощью которых осуществляются зы процедур и возвраты из них при выполнении процесса. Когда выполнение зсса прерывается, содержимое регистров процессора сохраняется в памяти. В"? шоточной среде с каждым процессом тоже связаны управляющий блок и ад-* >е пространство, но теперь для каждого потока создаются свои отдельные стеки* ;же свой управляющий блок, в котором содержатся значения регистров, прц* jt и другая информация о состоянии потока. ■Л Однопоточная модель процессе Блок управления процессом Адресное ространство ользователя »» Блок управления процессом •Z чк£ гг% Адресное пространство пользователя Многопоточная модель процесса Поток Поток ПОТОК; Управляющий блок потока Стек пользователя Стек ядра Управляющий блок потока Стек пользователя Стек ядра Управляющий блок потока Стек пользователя Стек ядра %■'■ 4.2. Однопоточная и многопоточная модели процесса й Таким образом, все потоки процесса разделяют между собой состояние и ресур* ►того процесса. Они находятся в одном и том же адресном пространстве и имею уп к одним и тем же данным. Если один поток изменяет в памяти какие-то даЯг Часть 2. Процесс ные, то другие потоки во время своего доступа к этим данным имеют возможность отследить эти изменения. Если один поток открывает файл с правом чтения, другие потоки данного процесса тоже могут читать из этого файла. Перечислим основные преимущества использования потоков с точки зрения производительности. 1. Создание нового потока в уже существующем процессе занимает намного меньше времени, чем создание совершенно нового процесса. Исследования, проведенные разработчиками операционной системы Mach, показали, что скорость создания процессов по сравнению с такой же скоростью в UNIX- совместимых приложениях, в которых не используются потоки, возрастает в 10 раз [TEVA87]. 2. Поток можно завершить намного быстрее, чем процесс. 3. Переключение потоков в рамках одного и того же процесса происходит намного быстрее. 4. При использовании потоков повышается эффективность обмена информацией между двумя выполняющимися программами. В большинстве операционных систем обмен между независимыми процессами происходит с участием ядра, в функции которого входит обеспечение защиты и механизма, необходимого для осуществления обмена. Однако благодаря тому, что различные потоки одного и того же процесса используют одну и ту же область памяти и одни и те же файлы, они могут обмениваться информацией без участия ядра. Итак, если приложение или функцию нужно реализовать в виде набора взаимосвязанных модулей, намного эффективнее реализовать ее в виде набора потоков, чем в виде набора отдельных процессов. Примером приложения, в котором можно удачно применить потоки, является файловый сервер. При получении каждого нового файлового запроса программа управления файлами может порождать новый поток. Из-за того, что серверу приходится обрабатывать очень большое количество запросов, за короткий промежуток времени будут создаваться и удаляться множество потоков. Если такая серверная программа работает на многопроцессорной машине, то на разных процессорах в рамках одного процесса могут одновременно выполняться несколько потоков. Кроме того, из-за того, что процессы или потоки файлового сервера должны совместно использовать данные из файлов, а следовательно, координировать свои действия, рациональнее использовать потоки и общую область памяти, а не процессы и обмен сообщениями. Потоковая конструкция процесса полезна и на однопроцессорных машинах. Она помогает упростить структуру программы, выполняющей несколько логически различных функций. В [LETW38] приводится четыре следующих примера использования потоков в однопользовательской многозадачной системе. • Работа в приоритетном и фоновом режимах. В качестве примера можно привести программу электронных таблиц, в которой один из потоков может отвечать за отображение меню и считывать ввод пользователя, а другой — выполнять команды пользователя и обновлять таблицу. Такая схема часто увеличивает воспринимаемую пользователем скорость работы приложения, Глава 4. Потоки, симметричная многопроцессорная обработка... 199
позволяя пользователю начать ввод следующей команды еще до завер ^ выполнения предыдущей. ,!;" . с" • Асинхронная обработка. Элементы асинхронности в программе можно -щ, вать в виде потоков. Например, в качестве меры предосторожности на' -«гучаг отключения электричества можно сделать так, чтобы текстовый редактор каж дую минуту сбрасывал на диск содержимое буфера оперативного залом Ще го устройства. Можно создать поток, единственной задачей которого будет соз дание резервной копии и который будет планировать свою работу неп дст_ венно с помощью операционной системы. Это позволит обойтись без помещения в основную программу замысловатого кода, обеспечивающего проверку |блю- дения временного графика или координацию ввода и вывода. * г • Скорость выполнения. Многопоточный процесс может производить.--,вычисления с одной порцией данных, одновременно считывая с устройства.' вода- вывода следующую порцию. В многопроцессорной системе несколько потоков одного и того же процесса могут выполняться одновременно. 'Щ • Модульная структура программы. Программы, осуществляющие р знооб- разные действия или выполняющие множество вводов из различных источников и выводов в разные места назначения, легче разрабатывать jg ре&чи- зовывать с помощью потоков. ,.;-;" Планирование и диспетчеризация осуществляются на основе потоков? таким образом, большая часть информации о состоянии процесса, имеющей отн шение к его выполнению, поддерживается в структурах данных на уровне потоков. Однако есть несколько действий, которые затрагивают все потоки процесса; * которые операционная система должна поддерживать именно на этом уров е. Если процесс приостанавливается, то при этом предполагается, что его адрейя е пространство будет выгружено из основной памяти. Поскольку все потоки опесса используют одно и то же адресное пространство, все они должны одной менно перейти в состояние приостановленных. Соответственно прекращение оцесса приводит к прекращению всех составляющих его потоков. щ Функциональность потоков ^ Потоки, подобно процессам, характеризуются состояниями вьШО нениЯ| кроме того, они могут быть синхронизированы друг с другом. Рассмотгр *м п очереди эти два аспекта. ^С Состояния потоков 3 Основными состояниями потоков, как и процессов, являются: состоя выполнения потока, состояние готовности и состояние блокировки. Воо,ше воря, состояние приостановки нет смысла связывать с потоками, потому^ то та ее кие состояния логичнее рассматривать на уровне процессов. В частное процесс приостанавливается, обязательно приостанавливаются все его\ оТ потому что все они совместно используют адресное пространство этого прР еС С изменением состояния потоков связаны такие четыре основных [ANDE97]. 5 • Порождение. Обычно во время создания нового процесса вместе с ,.ИМ дается поток этого процесса. Далее, в рамках одного и того же , Р° 200 Часть 2. П °це i один поток может породить другой поток, определив его указатель команд и аргументы. Новый поток создается со своим собственным контекстом регистров и стековым пространством, после чего он помещается в очередь готовых к выполнению потоков. • Блокирование. Если потоку нужно подождать, пока не наступит некоторое событие, он блокируется (при этом сохраняется содержимое его пользовательских регистров, счетчика команд, а также указатели стеков). После этого процессор может перейти к выполнению другого готового потока. • Разблокирование^ Когда наступает событие, ожидание которого блокировало поток, последний переходит в состояние готовности. • Завершение. После завершения потока его контекст регистров и стеки удаляются. Важно понять, должно ли блокирование потока обязательно приводить к блокированию всего процесса. Другими словами, могут ли выполняться какие-нибудь готовые к выполнению потоки процесса, если один из его потоков блокирован? Ясно, что если блокировка одного из потоков будет приводить к блокировке всего процесса, то это существенно уменьшит гибкость и эффективность потоков. Мы еще вернемся к обсуждению этого вопроса при сравнении потоков на пользовательском уровне и потоков на уровне ядра, а пока что рассмотрим выигрыш в производительности при использовании потоков, которые не блокируют весь процесс. На рис. 4.3 (из [KLEI96]) показана программа, выполняющая два вызова удаленных процедур (remote procedure call — RPC)2 на двух разных узлах, чтобы получить результат после их совместного выполнения. В однопоточной программе результаты получаются последовательно, поэтому программа должна ожидать, пока от каждого сервера по очереди будет получен ответ. Переписав программу так, чтобы для каждого вызова Удаленной процедуры она использовала отдельный поток, можно получить существенный выигрыш в скорости. Заметим, что если такая программа ра- отает на однопроцессорной машине, то запросы будут генерироваться последовательно; результаты тоже будут получены последовательно, однако программа будет ожидать двух ответов одновременно. 2 гп°Рые мЫЗ°в удаленной процедуры — это технология, при которой две программы, ко- "*ь,° сиц°гУт выполняться на Разных машинах, взаимодействуют между собой с помо- ^аг°Щая ™аксиса и семантики вызовов и возвратов из процедур. Обе программы, вызы ^*шЧне £Ызываемая- ведут себя так, как будто они выполняются на одной и той же *° Схемс Ь130вЫ Удаленных процедур часто применяются в приложениях, работающих &:ппеЛНЛиеНт/сервер- ПодРобнее вызовы удаленных процедур обсуждаются в главе 13. Ч^ деленные системы". 1У 4. Потоки, симметричная многопроцессорная обработка... 201
позволяя пользователю начать ввод следующей команды еще до завер н выполнения предыдущей. £ я • Асинхронная обработка. Элементы асинхронности в программе можно р* 7il3n вать в виде потоков. Например, в качестве меры предосторожности на' ' отключения электричества можно сделать так, чтобы текстовый редактор к •. дую минуту сбрасывал на диск содержимое буфера оперативного запомин щ го устройства. Можно создать поток, единственной задачей которого буд " ^ дание резервной копии и который будет планировать свою работу неп Дст венно с помощью операционной системы. Это позволит обойтись без помещения в основную программу замысловатого кода, обеспечивающего проверку, облю дения временного графика или координацию ввода и вывода. ■■ • Скорость выполнения. Многопоточный процесс может производить вычисления с одной порцией данных, одновременно считывая с устройства ввода- вывода следующую порцию. В многопроцессорной системе несколь "*' потоков одного и того же процесса могут выполняться одновременно. £ • Модульная структура программы. Программы, осуществляющие р знооб- разные действия или выполняющие множество вводов из различных источников и выводов в разные места назначения, легче разрабатывать реали- зовывать с помощью потоков. ■> Планирование и диспетчеризация осуществляются на основе потоко таким образом, большая часть информации о состоянии процесса, имеющей отношение к его выполнению, поддерживается в структурах данных на уровне потоков. Однако есть несколько действий, которые затрагивают все потоки процессу кото рые операционная система должна поддерживать именно на этом уров i Если процесс приостанавливается, то при этом предполагается, что его адреСЦое пространство будет выгружено из основной памяти. Поскольку все потоки роцесса используют одно и то же адресное пространство, все они должны одно» менно перейти в состояние приостановленных. Соответственно прекращение процесса приводит к прекращению всех составляющих его потоков. ' i Функциональность потоков $& Потоки, подобно процессам, характеризуются состояниями выпо ненн°' кроме того, они могут быть синхронизированы друг с другом. Рассмо им п очереди эти два аспекта. • ^ Состояния потоков %. Основными состояниями потоков, как и процессов, являются: ; тоЯ выполнения потока, состояние готовности и состояние блокировки. ВоО Ше воря, состояние приостановки нет смысла связывать с потоками, потоНУ чТ кие состояния логичнее рассматривать на уровне процессов. В частное *• процесс приостанавливается, обязательно приостанавливаются все его|го потому что все они совместно используют адресное пространство этого Я С изменением состояния потоков связаны такие четыре основных; [ANDE97]. .:f • Порождение. Обычно во время создания нового процесса вместе *»?. дается поток этого процесса. Далее, в рамках одного и того же Р° .с S ИМ С < 200 Часть 2. ц один поток может породить другой поток, определив его указатель команд и аргументы. Новый поток создается со своим собственным контекстом регистров и стековым пространством, после чего он помещается в очередь готовых к выполнению потоков. , Блокирование. Если потоку нужно подождать, пока не наступит некоторое событие, он блокируется (при этом сохраняется содержимое его пользовательских регистров, счетчика команд, а также указатели стеков). После этого процессор может перейти к выполнению другого готового потока. s Разблокирование. Когда наступает событие, ожидание которого блокировало поток, последний переходит в состояние готовности. ■ Завершение. После завершения потока его контекст регистров и стеки удаляются. Важно понять, должно ли блокирование потока обязательно приводить к блокированию всего процесса. Другими словами, могут ли выполняться какие-нибудь готовые к выполнению потоки процесса, если один из его потоков блокирован? Ясно, что если блокировка одного из потоков будет приводить к блокировке всего процесса, то это существенно уменьшит гибкость и эффективность потоков. Мы еще вернемся к обсуждению этого вопроса при сравнении потоков на пользовательском уровне и потоков на уровне ядра, а пока что рассмотрим выигрыш в производительности при использовании потоков, которые не блокируют весь процесс. На рис. 4.3 (из [KLEI96]) показана программа, выполняющая два вызова удаленных процедур (remote procedure call — RPC)2 на двух разных узлах, чтобы получить результат после их совместного выполнения. В однопоточной программе результаты получаются последовательно, поэтому программа должна ожидать, пока от каждого сервера по очереди будет получен ответ. Переписав программу так, чтобы для каждого вызова Удаленной процедуры она использовала отдельный поток, можно получить существенный выигрыш в скорости. Заметим, что если такая программа работает на однопроцессорной машине, то запросы будут генерироваться последовательно; результаты тоже будут получены последовательно, однако программа будет ожидать двух ответов одновременно. Вызов удаленной процедуры — это технология, при которой две программы, ко- *ц#> м<>гут выполняться на разных чашинах, взаимодействуют между собой с помо- ^ синтаксиса и семантики вызовов и возвратов из процедур. Обе программы вызы- "а^ ^ал и вызываемая, ведут себя так, как будто они выполняются на одной и той же ^ "не. Вызовы удаленных процедур часто применяются в приложениях, работающих ра*еме к-1иент/сервер. Подробнее вызовы удаленных процедур обсуждаются в главе 13, Спределенные системы". ■<.. t&fia 4. Потоки, симметричная многопроцессорная обработка... 201 т.
Время Запрос на удаленный вызов процедуры Процесс 1 Запрос на удаленный вызов процедуры А ////////J^///////jLA Сервер)—•* >ч—♦^CepeepJ а) Удаленный вызов процедуры с использованием одного потока М ■й* I Запрос на удаленный вызов процедуры Поток А (процесс 1) Поток В (процесс!) / ,,/////SM Запрос на удаленный вызов процедуры б) Удаленный вызов процедуры с использованием потока для каждого сервера (в однопроцессорной системе) \J//A Блокирован, ожидает ответа на удаленный вызов процедуры 1\ЧЛО! Блокирован, ожидает когда освободится процессор, который занят потоком В & Ч % Ъ 1 Выполняется Рис. 4.3. Удаленный вызов процедуры (RPC). в котором используются потоп^ В однопроцессорных системах многозадачность позволяет чеф довить «личные потоки нескольких процессов. В примере, показанном на о ^ >едуются три потока, принадлежащие двум процессам. Передача у в я от одного процесса другому происходит либо тогда, когда бло^..1',отве. полняющийся поток, либо когда заканчивается интервал времен^ шый для его выполнения.3 | 3 В этом примере поток С начинает выполняться, после того как ока т в * В этом примере поток С начинает выполнить^*. ««*..«= — --- усА в тервал времени, отведенный потоку А. несмотря на то что поток В нал v, d(jflH оянии готовности. Выбор между потоками В и С - это вопрос планирован., ма исследуется в четвертой части книги. ^ оиегС )2 Часть 2. Время Запрос на ввод-вывод Завершение обработки запроса Поток А (процесс 1) Поток В (процесс 1) Поток С (процесс 2) Окончание кванта времени / / Создание процесса ЬООСХ Блокирован 3 Готов Окончание кванта времени Выполняется Рис. 4.4. Пример многопоточности в однопроцессорной системе Синхронизация потоков Все потоки процесса используют одно и то же адресное пространство, как и другие ресурсы, например открытые файлы. Любое изменение какого-нибудь ресурса одним из потоков процесса оказывает влияние на другие потоки этого же процесса. Поэтому действия различных потоков необходимо синхронизировать, чтобы они не мешали друг другу или чтобы не повредили структуры данных. Например, если каждый из двух потоков будет пытаться добавить свой элемент в двунаправленный список, может быть потерян один из элементов (или нарушена целостность списка). При рассмотрении синхронизации потоков возникают те же вопросы и используются те же методы, что и при синхронизации процессов. Эти вопросы и методы обсуждаются в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность", и главе 6, "Взаимоблокировка и голодание". Пример: Adobe PageMaker Рассмотрим использование потоков на примере приложения Adobe PageMaker, работающего под управлением операционной системы Linux. Программа a£eMaker является настольным издательским средством, предназначенным для 3Дания и форматирования документов. Для оптимизации скорости отклика г^./0 приложения была выбрана потоковая структура, показанная на рис. 4.5 ^ ^Ри потока активны всегда — поток, отвечающий за обработку собы- > поток, обновляющий экран, и служебный поток. 3 Операции, на которые требуется много времени (печать, импорт данных и 6л ВКа^' вып°лняются в служебном потоке программы PageMaker, чтобы не ййй 1*Эовать этими операциями возможность обработки поступающих сообще- ■:^^j" этом же потоке происходит большая часть инициализации программы, 'pq °зв°ляет избежать простоя, который мог бы возникнуть при создании ново- РарКУМеНТа ИЛИ откРытии Уже существующего. Отдельный поток служит для °тки сообщений о новых событиях. Г 4. Потоки, симметричная многопроцессорная обработка... 203
<£*, -■£* I г* , -Л ■-.\ч Рис. 4.5. Потоковая структура программы Adobe PageMaker Синхронизация служебного потока и потока обработки событий явчяется непростой задачей. Пользователь может продолжать набирать текст или р ботать с мышью, активизируя тем самым поток обработки событий, в то время как служебный поток будет все еще занят. При возникновении подобного кон тикта PageMaker фильтрует сообщения и воспринимает только основные из ix, такие, как запрос на изменение размера окна. '\-У$ О завершении выполнения задания свидетельствует сообщение, по дающее из служебного потока. Пока это сообщение не будет получено, возмо ности пользователя в программе PageMaker ограничены. Об этом свидетельс ет отключение пунктов меню и специальный вид курсора. Пользователь может активизировать окна других приложений; когда курсор перемещается в другое окно, он приобретает вид, соответствующий приложению этого окна. Для обновления экрана используется отдельный поток, что вызв о следующими причинами. 1. В программе PageMaker количество объектов на странице не ограничено, и поэтому обработка запроса на обновление экрана может оказаться весьма длительной. 2. Использование отдельного потока позволяет пользователю в любой.., омент остановить вывод изображения на экран. При такой методике, например, может немедленно выполняться команда изменения масштаба. и программа должна была сначала закончить вывод страницы в ста М м штабе, а затем полностью вывести ее в новом масштабе, это резко yd1 ло бы время ее отклика. Возможна также динамическая прокрутка, т.е. обновление экрана при ретаскивании пользователем ползунка прокрутки. Поток обработки собмт* слеживает положение ползунка и перерисовывает размещенные вдоль по е нейки (которые перерисовываются очень быстро, позволяя пользователю °р тироваться в текущем положении документа). В это время поток об» вл экрана постоянно пытается перерисовать смещающуюся страницу, о ж изменение ее положения. .?*" 0р Реализация динамического обновления экрана без использования. ° привела бы к перегрузке приложения, так как ему приходилось бы ср£ *? 204 Часть 2. one ■й% 3&т:ъ свои действия в разных частях кода с помощью обмена сообщениями. Мно- г0поточность позволяет более естественно реализовать код, в котором предполагается параллельное выполнение различных действий. Потоки на пользовательском уровне и на уровне ядра Обычно выделяют две общие категории потоков: потоки на уровне пользователя (user-level threads — ULT) и потоки на уровне ядра (kernel-level threads — KLT). Потоки второго типа в литературе иногда называются потоками, поддерживаемыми ядром, или облегченными процессами. Потоки на уровне пользователя В программе, полностью состоящей из ULT-потоков, все действия по управлению потоками выполняются самим приложением; ядро, по сути, и не подозревает о существовании потоков. На рис. 4.6,а проиллюстрирован подход, при котором используются только потоки на уровне пользователя. Чтобы приложение было многопоточным, его следует создавать с применением специальной библиотеки, представляющей собой пакет программ для работы с потоками на уровне ядра. Такая библиотека для работы с потоками содержит код, с помощью которого можно создавать и удалять потоки, производить обмен сообщениями и данными между потоками, планировать их выполнение, а также сохранять и восстанавливать их контекст. { \ \ библиотека потоков 6 \ ( I Пользовательское пространство Пространство ядра а) Пользовательский уровень Пользовательское пространство Пространство ядра I иблиотека потоков Пользовательское пространство б)Уровень ядра Ф © в) Использование обоих уровней Пространство ядра ( Поток на пользовательском уровне vD Поток на уровне ядра \^J Процесс Рис. 4.6. Потоки на пользовательском уровне и на уровне ядра его Умолчанию приложение в начале своей работы состоит из одного потока и "... с Ь1Полнение начинается как выполнение этого потока. Такое приложение вместе ^ «дроТаВЛЯЮЩИМ его потоком размещается в едином процессе, который управляется '^Ый М Полняющееся приложение в любой момент времени может породить но- * £оад Поток' который будет выполняться в пределах того же процесса. Новый поток ^Нк л^ С пом°Щью вызова специальной подпрограммы из библиотеки, предназна- Для работы с потоками. Управление к этой подпрограмме переходит в ре- Г" v 4. Потоки, симметричная многопроцессорная обработка... 205
тате вызова процедуры. Библиотека потоков создает структуру данных дд Но потока, а потом передает управление одному из готовых к выполнению по; к юго процесса, руководствуясь некоторым алгоритмом планирования. г [вление переходит к библиотечной подпрограмме, контекст текущего потока оэ- шется, а когда управление возвращается к потоку, его контекст восстанавливает Этот контекст в основном состоит из содержимого пользовательских регнс в чика команд и указателей стека. *\ Все описанные в предыдущих абзацах события происходят в пользовд ib_ л пространстве в рамках одного процесса. Ядро не подозревает об этойцт я- >ности. Оно продолжает осуществлять планирование процесса как ого эго и приписывать ему единое состояние выполнения (состояние готовности ■ояние выполняющегося процесса, состояние блокировки и т.д.). Пр - ен- ниже примеры должны прояснить взаимосвязь между планированием, пото- и планированием процессов. Предположим, что выполняется поток , вхожий в процесс В (см. рис. 4.7). Состояния этого процесса и составляющие его эков на пользовательском уровне показаны на рис. 4.7,а. Впоследств -\ мо- ■ произойти одно из следующих событий. '^ Приложение, в котором выполняется поток 2, может произвести системный вызов, например запрос ввода-вывода, который блокирует процесс Bs; результате этого вызова управление перейдет к ядру. Ядро вызывает п ц ду- ру ввода-вывода, переводит процесс В в состояние блокировки и пе дает управление другому процессу. Тем временем поток 2 процесса В все еще на- t-i '■- ходится в состоянии выполнения в соответствии со структурой да ных, поддерживаемой библиотекой потоков. Важно отметить, что поток 21 е выполняется в том смысле, что он работает с процессором; однако библ тека потоков воспринимает его как выполняющийся. Соответствующие д^ ам- мы состояний показаны на рис. 4.7,6. -.$ . В результате прерывания по таймеру управление может перейти к ядр •; ядро определяет, что интервал времени, отведенный выполняющемуся! в Дан~ ный момент процессу В, истек. Ядро переводит процесс В в состоя ие готовности и передает управление другому процессу. В это время, ©Опасно структуре данных, которая поддерживается библиотекой потоков, поток I процесса В по-прежнему будет находиться в состоянии выполнена . Соответствующие диаграммы состояний показаны на рис. 4.7,е. / . Поток 2 достигает точки выполнения, когда ему требуется, чтобы поток процесса В выполнил некоторое действие. Он переходит в заблокированное состояние, а поток 1 — из состояния готовности в состояние выпо нени Сам процесс остается в состоянии выполнения. Соответствующие Д агРа мы состояний показаны на рис. 4.7,г. - * "А"" >6 Часть 2. П 01
В случаях 1 и 2 (см. рис. 4.7,6 и в) при возврате управления процессу В во зобновляется выполнение потока 2. Заметим также, что процесс, в которо в полняется код из библиотеки потоков, может быть прерван либо из-за того ч закончится отведенный ему интервал времени, либо из-за наличия проц Са с более высоким приоритетом. Когда возобновится выполнение прерваяногогпро. цесса, оно продолжится работой процедуры из библиотеки потоков, котор За_ вершит переключение потоков и передаст управление новому потоку процесса. Использование потоков на пользовательском уровне обладает некото ыми преимуществами перед использованием потоков на уровне ядра. К этим" преимуществам относятся следующие. 1. Переключение потоков не включает в себя переход в режим ядра, так как структуры данных по управлению потоками находятся в адресной^ пространстве одного и того же процесса. Поэтому для управления потоками процессу не нужно переключаться в режим ядра. Благодаря этому стоя- тельству удается избежать накладных расходов, связанных с двумя переключениями режимов (пользовательского режима в режим ядра и обр тно). 2. Планирование производится в зависимости от специфики приложения Для одних приложений может лучше подойти простой алгоритм планиро ания по круговому алгоритму, а для других — алгоритм планирования, основан ный на использовании приоритета. Алгоритм планирования может,, одои- раться для конкретного приложения, причем это не повлияет на ал. ритм планирования, заложенный в операционной системе. ^ 3. Использование потоков на пользовательском уровне применимо для^юбой операционной системы. Для их поддержки в ядро системы не потребуется вносить никаких изменений. Библиотека потоков представляет собой: набор утилит, работающих на уровне приложения и совместно используем, х всеми приложениями. Использование потоков на пользовательском уровне обладает двумя я нымя недостатками по сравнению с использованием потоков на уровне ядра. 1. В типичной операционной системе многие системные вызовы являю ^ б10' кирующими. Когда в потоке, работающем на пользовательском уров , выполняется системный вызов, блокируется не только данный поток, Я» * все потоки того процесса, к которому он относится. ■ ^ 2. В стратегии с наличием потоков только на пользовательском уровне пр ° ние не может воспользоваться преимуществами многопроцессорной с «те так как ядро закрепляет за каждым процессом только один процессор. Р37^ несколько потоков одного и того же процесса не могут выполняться о о Р^ менно. В сущности, у нас получается многозадачность на уровне прило я* рамках одного процесса. Несмотря на то, что даже такая многозадачн ть жет привести к значительному увеличению скорости работы приложени , • ются приложения, которые работали бы гораздо лучше, если бы Р0^1 части их кода могли выполняться одновременно. *-■ и Я1 Эти две проблемы разрешимы. Например, их можно преодолеть, с . сать приложение не в виде нескольких потоков, а в виде нескольких про е Однако при таком подходе основные преимущества потоков сводятся на еТ* °^e Часть 2.П не ясдое переключение становится не переключением потоков, а переключением процессов, что приведет к значительно большим накладным затратам. Другим методом преодоления проблемы блокирования является использование преобразования блокирующего системного вызова в неблокирующий. Например, вместо непосредственного вызова системной процедуры ввода-вывода поток вызывает подпрограмму-оболочку, которая производит ввод-вывод на уровне приложения. В этой программе содержится код, который проверяет, занято ли устройство ввода-вывода. Если оно занято, поток передает управление другому потоку (что происходит с помощью библиотеки потоков). Когда наш поток вновь получает управление, он повторно осуществляет проверку занятости устройства ввода-вывода. Потоки на уровне ядра В программе, работа которой полностью основана на потоках, работающих на уровне ядра, все действия по управлению потоками выполняются ядром. В области приложений отсутствует код, предназначенный для управления потоками. Вместо него используется интерфейс прикладного программирования (application programming interface — API) средств ядра, управляющих потоками. Примерами такого подхода являются операционные системы OS/2, Linux и W2K. На рис. 4.6,6 проиллюстрирована стратегия использования потоков на уровне ядра. Любое приложение при этом можно запрограммировать как многопоточное; все потоки приложения поддерживаются в рамках единого процесса. Ядро поддерживает информацию контекста процесса как единого целого, а также контекстов каждого отдельного потока процесса. Планирование выполняется ядром исходя из состояния потоков. С помощью такого подхода удается избавиться от двух упомянутых ранее основных недостатков потоков пользовательского уровня. Во-первых, ядро может одновременно осуществлять планирование работы нескольких потоков одного и того же процесса на нескольких процессорах. Во-вторых, при блокировке одного из потоков процесса ядро может выбрать для выполнения другой поток этого же процесса. Еще одним преимуществом такого подхода является то, что сами процедуры ядра могут быть многопоточными. Основным недостатком подхода с использованием потоков на уровне яд- по сравнению с использованием потоков на пользовательском уровне яв- тся то, что для передачи управления от одного потока другому в рамках ого и того же процесса приходится переключаться в режим ядра. Резуль- исследований, проведенных на однопроцессорной машине VAX под таб Лением UNIX-подобной операционной системы, представленные в Вал ' ■ Иллюстрируют различие между этими двумя подходами. Сравни- porlo _J*PeMH ВЫп°лнения таких двух задач, как (1) нулевое ветвление (Null Чесся/ Врел1я* затраченное на создание, планирование и выполнение пробила °ТОКа* состояиДего только из нулевой процедуры (измеряются только ййе Ные Расходы, связанные с ветвлением процесса/потока), и (2) ожтлда- ■■ й°г0 п Нала (Signal-Wait) — время, затраченное на передачу сигнала от од- 4t^t«flaifOUeCca'/noTOKa ДРУгомУ процессу/потоку, находящемуся в состоянии ^тобы fiH ^Накладные расходы на синхронизацию двух процессов/потоков). ;Ц?о&е ЫЛ° легче сравнивать полученные значения, заметим, что вызов "«Чет РЫ На машине VAX* используемой в этом исследовании, длится 7 us, ^ ное прерывание — 17 us. Мы видим, что различие во времени вы- I- "%. ■ :£- Потоки, симметричная мультипроцессорная обработка... 209
A ,лнения потоков на уровне ядра и потоков на пользовательском уровне б е чем на порядок превосходит по величине различие во времени выщ> н 1Я потоков на уровне ядра и процессов. |блица 4.1. Время задержек потоков (\is) [ANDE92] Ж '/г Операция Потоки на Потоки на уровне Процессы* пользовательском уровне ядра & /левое ветвление 34 948 11300- кидаяие сигнала 37 441 184° Таким образом, создается впечатление, что как применение многопоточно- ■и на уровне ядра дает выигрыш по сравнению с процессами, так и мнртопо- »чность на пользовательском уровне дает выигрыш по сравнению с многопоточ- зстью на пользовательском уровне. Однако на деле возможность этого додолни- !Льного выигрыша зависит от характера приложений. Если для болып ства зреключений потоков приложения необходим доступ к ядру, то схема с" отожми на пользовательском уровне может работать не намного лучше, чем с ема с этоками на уровне ядра. >* у» Комбинированные подходы ?$ В некоторых операционных системах применяется комбинирована, по- жов обоих видов (рис. 4.6,в). Ярким примером такого подхода може сту- :ить операционная система Solaris. В комбинированных системах соз ание отоков выполняется в пользовательском пространстве, там же, где % код ланирования и синхронизации потоков в приложениях. Несколько потоков а пользовательском уровне, входящих в состав приложения, отображ ются такое же или меньшее число потоков на уровне ядра. Программист ожет зменять число потоков на уровне ядра, подбирая его таким, которое озво- яет достичь наилучших результатов. X При комбинированном подходе несколько потоков одного и те. же риложения могут выполняться одновременно на нескольких процессе ах, а локирующие системные вызовы не приводят к блокировке всего про; есса. [ри надлежащей реализации такой подход будет сочетать в себе превГ. уще- тва подходов, в которых применяются только потоки на пользовате ском ровне или только потоки на уровне ядра, сводя недостатки каждого и этих :одходов к минимуму. IV 1|ругие схемы .|j Как уже упоминалось, понятия единицы распределения ресурсов _, п^ [ирования традиционно отождествляются с понятием процесса. В тако №пции поддерживается однозначное соответствие между потоками и ПР0^ ами. В последнее время наблюдается интерес к использованию неско ь^ штоков в одном процессе, когда выполняется соотношение многие-к-о. ^ )днако возможны и другие комбинации, а именно соответствие иеск0?*^ ютоков нескольким процессам и соответствие одного потока неско ь^ фоцессам. Примеры применения каждой из упомянутых комбинаций^ Р ч* - (ятся в табл. 4.2. ЛО Часть 2. Про 1** Таблица 4.2. Соотношение между потоками и процессами Потоки:процессы Описание Примеры систем 1:1 Каждый поток реализован в виде отдельного про- Традиционные цесса со своим собственным адресным простран- реализации ством и со своими ресурсами системы UNIX М:1 Для процесса задается адресное пространство и ди- OS/2, намическое владение ресурсами. В рамках этого Windows NT, процесса могут быть созданы несколько потоков Solaris. Linux, OS/390, MACH 1:M Поток может переходить из среды одного процес- Ra (Clouds), са в среду другого процесса. Это облегчает пере- Emerald нос потоков из одной системы в другую M:N Сочетает в себе подходы, основанные на соотно- TRIX шениях М:1 и 1:М Соответствие нескольких потоков нескольким процессам Идея реализации соответствия нескольких процессов нескольким потокам была исследована в экспериментальной операционной системе TRIX [SIEB83, WARD80]. В данной операционной системе используются понятия домена и потока. Домен — это статический объект, состоящий из адресного пространства и портов, через которые можно отправлять и получать сообщения. Поток — это единая выполняемая ветвь, обладающая стеком выполнения и характеризующаяся состоянием процессора, а также информацией по планированию. Как и в других указанных ранее многопоточных подходах, в рамках одного домена могут выполняться несколько потоков. При этом удается получить уже описанное повышение эффективности работы. Кроме того, имеется возможность осуществлять деятельность одного и того же пользователя или приложения в нескольких доменах. В этом случае имеется поток, который может переходить из одного домена в другой. По-видимому, использование одного и того же потока в разных доменах продиктовано желанием предоставить программисту средства структурирования. Например, рассмотрим программу, в которой используется подпрограмма ввода- вывода. В многозадачной среде, в которой пользователю позволено создавать процессы, основная программа может сгенерировать новый процесс для управления вводом-выводом, а затем продолжить свою работу. Однако если для даль- шего вьшолнения основной программы необходимы результаты операции вода-вывода, то она должна ждать, пока не закончится работа подпрограммы °Да-вывода. Подобное приложение можно осуществить такими способами. - Реализовать всю программу в виде единого процесса. Такой прямолинейный подход является вполне обоснованным. Недостатки этого подхода связаны с Управлением памятью. Эффективно организованный как единое целое процесс может занимать в памяти много места, в то время как для подпро- гРаммы ввода-вывода требуется относительно небольшое адресное простран- ство. Из-за того что подпрограмма ввода-вывода выполняется в адресном Ространстве более объемной программы, во время выполнения ввода- - вЬ1вода весь процесс должен оставаться в основной памяти, либо операция \ в°Да-вывода будет выполняться с применением свопинга. То же происхо- *9*ь 4. Потоки, симметричная мультипроцессорная обработка... 211
дит и в случае, когда и основная программа, и подпрограмма ввода-вывол реализованы в виде двух потоков в одном адресном пространстве. ^ Основная программа и подпрограмма ввода-вывода реализуются в виде двух отдельных процессов. Это приводит к накладным затратам, возникаю м в результате создания подчиненного процесса. Если ввод-вывод производится достаточно часто, то необходимо будет либо оставить такой подчин нный процесс активным на все время работы основного процесса, что связано с затратами на управление ресурсами, либо часто создавать и завершать про. цесс с подпрограммой, что приведет к снижению эффективности. :f Реализовать действия основной программы и подпрограммы ввода-выво&а как единый поток. Однако для основной программы следует создать свое адресное пространство (свой домен), а для подпрограммы ввода-вывода — свое. Таким образом, поток в ходе выполнения программы будет переходить из одного адресного пространства к другому. Операционная система может управлять тими двумя адресными пространствами независимо, не затрачивая никаких до олни- тельных ресурсов на создание процесса. Более того, адресное пространство, используемое подпрограммой ввода-вывода, может использоваться совместно с другими простыми подпрограммами ввода-вывода. } Опыт разработчиков операционной системы TRIX свидетельствует о том, третий вариант заслуживает внимания и для некоторых приложений ожет *аться самым эффективным. j Соответствие одного потока нескольким процессам ; В области распределенных операционных систем (разрабатываемых для авления распределенными компьютерными системами) представляет нтерес цепция потока как основного элемента, способного переходить из одного ад- ного пространства в другое.1 Заслуживают упоминания операционная система ads и, в особенности, ее ядро, известное под названием Ra [DASG92]. В каче- ; другого примера можно привести систему Emerald [STEE95]. В операционной системе Clouds поток является единицей активности с точ- зрения пользователя. Процесс имеет вид виртуального адресного прос ранст- z относящимся к нему управляющим блоком. После создания поток нйч шает юлнение в рамках процесса. Потоки могут переходить из одного адресно^ >странства в другое и даже выходить за рамки машины (т.е. перехо и и3 юго компьютера в другой). При переходе потока в другое место он дол ев ие- : с собой определенную информацию — такую, как управляющий терм ша- •бальные параметры и сведения по его планированию (например, приоритет). Подход, применяющийся в операционной системе Clouds, является э ФеЬ" *ным способом изоляции пользователя и программиста от деталей р сП ед 1Ной среды. Деятельность пользователя может ограничиваться одним потоко ;еремещение этого потока из одной машины в другую может быть обуслО е нкционированием операционной системы, руководствующейся такими 1ьствами, как необходимость доступа к удаленным ресурсам или выр е загрузки машин. ■то ! 1 В последние годы активно исследуется тема перехода процессов и поток ю адресного пространства в другое (миграция). Эта тема рассматр ^ we 14. "Управление распределенными процессами". W-» 12 Часть 2. П л 4.2. СИММЕТРИЧНАЯ МНОГОПРОЦЕССОРНАЯ ОБРАБОТКА -assesses* _э Традиционно компьютер рассматривается как машина, предназначенная для выполнения последовательных действий. В большинстве языков программирования алгоритм задается в виде последовательных инструкций; при работе программы процессор выполняет машинные команды последовательно, одну за другой. Каждая команда представляется в виде последовательности операций (выборка команды, выборка операндов, выполнение операции, сохранение результатов). Такая точка зрения на компьютер никогда не соответствовала действительности полностью. На уровне микроопераций одновременно генерируются несколько управляющих сигналов. Уже давно применяется конвейерная обработка команд, позволяющая выполнять одновременно по крайней мере операции выборки и выполнения. Оба приведенных примера являются образцами параллельного выполнения функций. По мере развития компьютерных технологий и уменьшения стоимости аппаратного обеспечения разработчики компьютеров находили все больше возможностей реализации параллелизма. Обычно это делалось для повышения производительности, а в некоторых случаях — для повышения надежности. В данной книге исследуются два наиболее популярных подхода обеспечения одновременной работы процессоров в многопроцессорных системах: симметричная многопроцессорность (symmetric multiprocessor — SMP) и кластеры. Симметричная многопроцессорная обработка описана в этом разделе, а кластеры — в шестой части. Архитектура SMP Рассмотрим, каким образом архитектура SMP соотносится с общей категорией параллельных процессоров. Общепринятым методом классификации таких систем по-прежнему является систематика, в которой выделяются системы с параллельными процессорами, впервые введенная Флинном (Flynn) [FLYN72]. Флинн предложил ввести следующие классы компьютерных систем. • Архитектура с одним потоком команд и одним потоком данных (Single Instruction Single Data — SISD). На одном процессоре выполняется один поток команд; операции выполняются над данными, которые хранятся в единой области памяти. Архитектура с одним потоком команд и многими потоками данных (Single Instruction Multiple Data — SIMD). С каждым из обрабатываемых элементов связаны хранящиеся в памяти данные, и каждая команда выполняет действия с различными наборами данных, относящимися к разным процессам. Под эту категорию подпадают векторный и матричный процессоры. Архитектура со многими потоками команд и одним потоком данных (Multiple Instruction Single Data — MISD). Последовательность данных передается набору процессоров, каждый из которых выполняет свою последо- ательность команд. Такая структура еще не была реализована. Рхитектура со многими потоками команд и многими потоками данных {Multiple Instruction Multiple Data — MIMD). Несколько процессоров одно- ^ 4. Потоки, симметричная мультипроцессорная обработка... 213
и временно выполняют различные последовательности команд с разд Bfc наборами данных. ..-■$■ В схеме MIMD процессоры являются универсальными, потому что они лжт. [меть возможность обрабатывать все команды, необходимые для соответстйуфц,- среобразования данных. Дальнейшая классификация систем с архитектурой гд*тч гожет производиться в соответствии с тем, как в них осуществляется обмен д ш между процессорами (рис. 4.8). Если каждому процессору выделяется отд \ьНа^ бласть памяти, то каждый обрабатывающий элемент является самостоя щ. юмпьютером. Они обмениваются между собой информацией либо через специ дь» :аналы, либо через какие-то сетевые устройства. Такие системы известны под назва [ием кластеры (clusters) или мультикомпьютеры. Если процессоры совместно цс. юльзуют общую память, то каждый из них имеет доступ к программам и д юторые там хранятся. Процессоры могут обмениваться информацией череаи 1ять. Такие системы известны под названием многопроцессорных систем с гамятью (shared-memory multiprocessor). ■Г Параллельный процессор Архитектура с одним потоком команд и многими потоками данных Архитектура с многими потоками команд и многими потоками данных ■и- па- Щей Совместно используемая память (сильносвязанные системы) Распределенная памяти *' (свободно связанные системы). i -w Выделение основных и подчиненных процессоров Симметричная мультипроцессорность Кластеры Рис. 4.8. Архитектуры систем с параллельными процессорами v> л ОМ. вы- ься Одна из общих классификаций многопроцессорных систем основана^ :ак процессы распределяются между процессорами. Два главных подходи- .еление основных и подчиненных процессоров и симметричная многопроп, сор ;ая обработка. В архитектуре с ведущим и ведомыми процес 0Ра muster/slave architecture) ядро операционной системы всегда выполняв пециально выделенном процессоре. На других процессорах могут выпол . олько пользовательские программы и, возможно, утилиты операционной.^110 [ы. Ведущий процессор отвечает за планирование процессов или потоков. ^ ыполняющемуся на ведомом процессоре процессу или потоку понадоби я ой-нибудь системный сервис (например, вызов процедуры ввода-выво а)» олжен будет послать запрос основному процессору, а затем ждать, пока. Рв :ая программа не закончит свою работу. Такой подход довольно прост, й-Д * еализации достаточно немного усовершенствовать операционную систеМУ п азначенную для однопроцессорных многозадачных систем. Разрешен^ ой' • л» 114 Часть 2. U цеС кТОВ упрощается, благодаря тому что всей памятью и всеми ресурсами ввода- в0да управляет один процессор. Этот подход имеет ряд недостатков. Сбой в работе основного процессора влечет за собой отказ всей системы. Основной процессор может тормозить работу всей системы, так как только на нем должны производиться все действия по планированию и управлению процессами. В симметричной многопроцессорной системе (symmetric multiprocessor) яд- может выполняться на любом процессоре; как правило, каждый процессор гам планирует свою работу, извлекая имеющийся в наличии процесс или поток из накопителя. Ядро может быть выполнено в виде многих процессов или многих потоков; при этом разные его части способны работать параллельно. Симметричный подход несколько усложняет архитектуру операционной системы. Нужно принять меры предосторожности, чтобы два процессора не выбрали один и тот же процесс или чтобы процесс каким-нибудь образом не выпал из очереди. Необходимо применять специальные методы для разрешения запросов одного и того же ресурса различными процессами и синхронизации запросов. Симметричные мультипроцессоры и кластеры имеют сложную архитектуру. Для их разработки нужно решать вопросы, связанные с физической организацией, структурами взаимосвязей, обменом ино^ормацией между процессорами, архитектурой операционной системы и обеспечением прикладными программами. Обсуждая такие системы в данном разделе и далее, в главе 13, "Распределенные вычисления, архитектура клиент/сервер и кластеры", мы затрагиваем в основном вопросы архитектуры операционных систем. Однако и здесь, и позже мы вскользь коснемся вопросов аппаратного устройства таких компьютерных систем. Организация симметричной многопроцессорной системы На рис. 4.9 проиллюстрирована общая архитектура симметричной многопроцессорной системы. В ней имеется несколько процессоров, каждый из которых содержит свой собственный управляющий модуль, арифметико-логическое Устройство и свои регистры. Каждый из процессоров имеет доступ к общей основной памяти и устройствам ввода-вывода. Этот доступ осуществляется с помощью некоторого механизма взаимодействия; традиционно в роли такого меха- йизма выступает общая шина. Процессоры могут обмениваться между собой информацией посредством общей памяти (т.е. с помощью сообщений и информации состоянии, хранящихся в общем адресном пространстве). Кроме того, процее- Pbi могут иметь возможность непосредственного обмена сигналами. Память за- СТУК> имеет организацию, позволяющую осуществлять одновременный множенный доступ к ее отдельным блокам. Как правило, в современных машинах процессоры имеют по крайней мере Уровень собственного кэша. Его использование вносит новые аспекты в рас- Рение архитектуры операционных систем. Поскольку в каждом локальном Ни хРанится образ какой-то части основной памяти, то в результате измене- ti Л°Ва в °Дном кэше соответствующее слово в другом кэше может оказаться РЫ* Ым" Чтобы предотвратить такую ситуацию, все процессоры, в кэше кото- * СоДержится данное слово, должны быть извещены о необходимости измерз, а 4. Потоки, симметричная мультипроцессорная обработка... 215
ить его. Эта проблема известна как проблема когерентности кэшей и отно итг корее к аппаратному обеспечению, чем к операционной системе. Процессор Кэш Процессор Кэш Процессор Кэш J* Основная память Подсистема ввода-вывода Рис. 4.9. Архитектура симметричной многопроцессорной системы Ч ■:1 - ) f'A ■:■.-. * ■tf ■ &* 1рхитектура многопроцессорных операционных систем &*■■ Операционная система, предназначенная для симметричной многойроцес- »рной системы, управляет процессорами и другими ресурсами компьютера та- дм образом, чтобы с точки зрения пользователя многопроцессорная система лглядела так же, как и многозадачная однопроцессорная. Пользователь может •здавать приложения с использованием нескольких процессов или нескольким >токов в процессах, не заботясь о том, какое количество процессоров будет дос 'пно — один или несколько. Таким образом, многопроцессорная операционная сстема должна выполнять все функции многозадачной системы, а также обла 1ть дополнительными возможностями по распределению вычислени сред юцессоров. В число особенностей архитектуры такой операционной си :одят следующие. • Одновременные параллельные процессы или потоки. Чтобы несколько Р личных процессов могли одновременно выполнять один и тот же код яДР он должен быть реентерабельным. При выполнении несколькими проц с рами одного и того же кода ядра (или разных его частей) необходима °^йй низация управления таблицами и управляющими структурами ядра» чт° избежать взаимоблокировок или неправильного выполнения операций. Описание аппаратной реализации схем когерентных кэшей предсто •TALOO]. 16 Часть 2. П т Планирование. Планирование может выполняться на любом из процессоров, поэтому необходимо предусмотреть механизм, позволяющий избежать конфликтов. При использовании многопоточности на уровне ядра несколько потоков одного и того же процесса могут выполняться на разных процессорах. Планирование в многопроцессорных системах рассматривается в главе 10, "Многопроцессорное планирование и планирование реального времени". • Синхронизация. В ситуации, когда несколько активных процессов имеют возможность доступа к совместным адресным пространствам или ресурсам ввода- вывода, необходимо позаботиться об их эффективной синхронизации. Синхронизация — это средство, обеспечивающее реализацию взаимоисключений и упорядочение событий. Общепринятым механизмом синхронизации в многопроцессорных операционных системах являются блокировки, описанные в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность". • Управление памятью. Система управления памятью в многопроцессорной системе должна быть способна разрешать все проблемы, возникающие в однопроцессорных машинах, а кроме того, операционная система должна уметь использовать возможности, предоставляемые аппаратным обеспечением, например многопортовую память. Механизмы страничной организации памяти разных процессоров должны быть скоординированы, чтобы обеспечить согласованность работы в ситуации, когда несколько процессоров используют одну и ту же страницу или один и тот же сегмент и принимают решение по вопросу замещения страниц. • Надежность и отказоустойчивость. При отказе одного из процессоров операционная система должна обеспечить продолжение корректной работы системы. Планировщик операционной системы (как и другие ее части) должен получить информацию о потере одного из процессоров и соответствующим образом перестроить свои управляющие таблицы. Поскольку при описании архитектуры многопроцессорной операционной системы, как правило, рассматриваются те же вопросы (с добавлением некоторых других), что и при описании устройства однопроцессорной операционной системы, мы Не будем останавливаться на многопроцессорных операционных системах отдельно, вместо этого по ходу изложения материала книги будем обращаться к вопросам, яв- ■ляющдшся специфичными для многопроцессорных систем. %3. МИКРОЯДРА :■„■ .. .1^ ■'"« в *~ I s^m ш^т *&.. .^»л АШ** ^Л&ъ ^шт^^М В последнее время большое внимание уделяется концепции микроядер, кроядро представляет собой остов операционной системы, служащий основой Других ее модулей. Термин не имеет точного определения, и многие вопроси ' °ТНося1циеся к микроядрам, различные группы разработчиков операционных «j еМ тРактУют по-разному. В число этих вопросов входят такие: насколько 4 До 1М Должно быть ядро, чтобы его можно было назвать микроядром; как \ uD Ны быть разработаны драйверы устройств, чтобы достичь максимальной -' ацп ЗВодительности при абстрагировании их функциональности от особенностей 1 ( **йрг Ратного обеспечения; как следует выполнять не относящиеся к ядру опера- -| в пространстве ядра или в пользовательском пространстве, и другие. w^fc 4. Потоки, симметричная мультипроцессорная обработка... 217 . i.-
Подход с использованием микроядра приобрел популярность после его ц зования в операционной системе Mach. Теоретически такой подход обеспеч! сокую степень гибкости и модульности Другим примером удачного испо этого подхода стала операционная система Windows 2000, которая прете широкую популярность. Микроядро операционной системы Windows 2000 о несколькими компактными подсистемами, что облегчает его реализацию на ных платформах. Некоторые другие программные продукты также реал па», -ьзованием микроядра. В ближайшем будущем этот подход, по-видимо к встречаться в большинстве операционных систем, разрабатываемых для п"' ных компьютеров, рабочих станций и серверов. Архитектура микроядра На структуру ранних операционных систем, разработанных в сред не годов, обращалось мало внимания. Ни у кого не было опыта в разрабо д вительно больших программных систем, а проблемы взаимозависимост i a модействия сильно недооценивались. В подобных монолитных опера wo системах (monolithic operating systems) почти все процедуры могли з одна другую. Такое отсутствие структуры было несовместимо с рас i операционных систем. Первая версия операционной системы OS/360 бы а г на коллективом программистов из 5000 человек за пять лет и содержа la миллиона строк кода. Разработанная несколько позже операционная- и Multics содержала уже 20 миллионов строк. Как отмечалось в разделе' 3 разработки программного обеспечения такого масштаба требуется испо методы модульного программирования. В частности, были разработаны. « я операционные системы (layered operating systems)3 (рис. 4.10,а) с иерар ич организацией функций, взаимодействие в которых возможно толькд м функциями, находящимися на соседних уровнях. При "многослойном^ все уровни или большинство из них выполняются в режиме ядра. -"/ "Слоистый" подход тоже не лишен своих проблем. Каждый слой"-о определенными функциональными возможностями, и значительные измен одного из уровней могут иметь различное влияние (которое трудно п bi - на код в смежных слоях (как верхнем, так и нижнем). Поэтому довольно тр реализовать согласованные версии операционной системы, имеющие на нес ко функций больше или меньше, чем в базовой версии. Многочисленные модействия между соседними уровнями усложняют обеспечение безопас ос Суть философии, лежащей в основе использования микроядра, за# *°ч в том, что в ядре должны быть только самые важные функции опер Дц0 системы. Работа служб и приложений, не являющихся критическими, сне на работе микроядра, но выполняются они в пользовательском режиме. I* разделение на то, что находится внутри микроядра, и то, что выносит 3 пределы, зависит от архитектуры системы; общая тенденция такова, что - F службы, которые традиционно входили в операционную систему, тепер в> во внешние подсистемы, взаимодействующие с ядром и друг с другом. нИ 3 Как обычно, терминология в этой области непоследовательна. Терми О литная операционная система часто обозначаются операционные системы дб х для которых в данной книге употребляются названия монолитные и слоистые. : 218 Часть 2. П *' 1*а яйверы устройств, файловые системы, менеджер виртуальной памяти, Травления окнами и службы безопасности. Пользователи Файловая система Обмен информацией между процессами Управление вводом-выводом и устройствами Виртуальная память Управление элементарными процессами Аппаратное обеспечение Я >s S О -о го Ж СО (U О О. ГО 1« £5 /71 о с с л У ж и в а е м ы й • • • ///У д Р а й в е Р ы у с т р ф а й л о в ы й с е с е р в е Р П Р о ц е в и Р т у а л ь н а я п / о й с т в в е Р с с о в Ййфоядро- Аппаратное обеспечение а м я т а) Многослойное ядро б) Микроядро Рис. 4.10. Архитектура ядра i В архитектуре с микроядром традиционное вертикальное расположение уров- ааменяется горизонтальным (рис. 4.10,6). Внешние по отношению к микроядру ^компоненты операционной системы реализуются как обслуживающие процессы. Между собой они взаимодействуют как равноправные партнеры; обычно взаимодей- .Сгвие реализуется с помощью обмена сообщениями, которые передаются через мик- РЗДдро. Таким образом, ядро выступает в роли посредника: оно подтверждает правильность сообщений, передает их от одного компонента другому и предоставляет Доступ к аппаратному обеспечению. Кроме того, микроядро выполняет защитные Функции: оно не пропускает сообщение, если такой обмен не разрешен. ч> Например, если приложению нужно открыть файл, оно отправляет сообще- **« серверу файловой системы. Если ему нужно создать процесс или поток, оно управляет сообщение серверу процессов. Каждый из серверов может отправлять :*°°бЩения другим серверам и обращаться к элементарным функциям микрояд- te, • Так в одном компьютере реализуется архитектура типа клиент/сервер. достоинства архитектуры с микроядром ^1 литературе отмечаются некоторые общие достоинства использования '• г р°яДРа (см. [F1NK97, LIED96a, WAYN94a]). В их число входят следующее: А ДИн°образные интерфейсы; -. Расцц*Ряемость; ~ * ^бкость; еРеносимость; W /Потоки, симметричная мультипроцессорная обработка... 219
'|| *<■ if'^ • надежность; ГГ v • поддержка распределенных систем; ^1 ^ • поддержка объектно-ориентированных операционных систем. Щ Использование микроядра предполагает единообразный интерфейс (uniform in »rface) запросов, генерируемых процессами. Процессам не нужно различать с •-*> ы, выполняющиеся на уровне ядра и на пользовательском уровне, потому ч до-. уп ко всем этим службам осуществляется только с помощью передачи сообщен С появлением новых аппаратных устройств или методов программиро юбую операционную систему неизбежно нужно будет пополнять новыми с Йства- и. Архитектура с применением микроядра способствует расширяв 0-тк xtensibility) операционных систем, позволяя добавлять в них новые серв сы а нсже обеспечивать множественные сервисы в одной и той же функционал * о§. астй. Например, можно реализовать несколько различных способов оргаыкГ ии эанения файлов на дисках. Далее, вместо того чтобы помещать все эти файловые ;рвисы в ядро, каждый способ организации хранения можно реализовать в иде эоцесса на пользовательском уровне. Таким образом, из всего разнообразия серви- >в пользователь может выбрать тот, который подходит ему больше других. При до- шлении нового свойства в операционную систему с архитектурой микроядра доста- >чно добавить или модифицировать лишь некоторые из серверов. Влияние новых 1И измененных серверов распространяется на ограниченное подмножество системы; юме того, после модификации не нужно будет строить новое ядро. С расширяемостью архитектуры микроядра тесно связано такое ее свойство iK гибкость (flexibility). В операционную систему можно не только добавлять йо ые ойства, но и удалять из нее те, которыми она обладает. Иногда это нужно^.' ы >лучить более компактную и эффективную версию. Операционная система; с •ядром не обязательно является маленькой. На самом деле ее структура прИС «а к добавлению разнообразных возможностей. Однако не для всех компдн в :стемы нужно, чтобы они обладали, например, высоким уровнем безопасности «и особностью к распределенным вычислениям. Если свойства, предъявляющие зна- гтельные требования к объему памяти, будут необязательными, базовый ро "кт [ожет привлечь более широкий круг пользователей. •? Почти полная монополия компании Intel на многие комплектующие ком юте в вряд ли будет существовать бесконечно. Таким образом, привлекательным сво вом операционной системы становится ее переносимость (portability). В ар тектз с микроядром специально предназначенный для конкретного процессора код» крайней мере большая его часть, находится в микроядре. Поэтому изменения, к рые потребуются для переноса системы на новый процессор, сводятся к *>- имеют тенденцию к размещению в отдельных логических группах. ••, . Чем большим объемом обладает программный продукт, тем труднее.?. - tTb ть надежность его работы. Хотя модульность и помогает повысить наде -. liability) работы системы, архитектура с микроядром дает еще более ЬЩ * ie преимущества. Маленькое микроядро можно тщательно протестирф •пользование в нем небольшого количества интерфейсов прикладного пр&, грования повышает шансы на то, что сервисы операционной системы» Р ющие вне ядра, будут реализованы с помощью качественного кода. СисТ Мн ограммист имеет в своем распоряжении ограниченное количество инте ограниченные способы организации взаимодействия, поэтому он не смоэк цательно повлиять на другие системные компоненты. 10 Часть 2. П ..., % Мпкроядро способствует поддержке распределенных систем (distributed rsteitfs), к которым относятся кластеры, управляемые распределенными опера- ((| ионными системами. Сообщение, которое пересылается от обслуживаемого | о11есса обслуживающему, должно содержать в себе идентификатор запраши- ' аемого сервиса. Если распределенная система (т.е. кластер) сконфигурирована так, ЧТО все пР°Цессы и сервисы в ней обладают уникальными идентификатора- ми то, в сущности, на уровне микроядра образуется единый образ системы. Процесс может отправлять сообщение, не зная, на какой именно машине находится сервис, к которому он обращается. К этому вопросу мы еще вернемся, обедая в шестой части книги распределенные системы. Архитектура с микроядром хорошо работает в среде объектно- ориентированных операционных систем (object-oriented operating system). Объектно-ориентированный подход способствует более строгой разработке микроядра и модульных расширений операционной системы. Поэтому многие разработчики прилагают усилия для перехода к объектно-ориентированному конструированию [WAYN94b]. Одним из многообещающих подходов, в котором сочетаются архитектура с микроядром и принципы объектно-ориентированных операционных систем, является подход с использованием компонентов [MESS96]. Компоненты — это объекты с четко заданными интерфейсами, которые могут соединяться между собой, образуя программы по принципу строительных блоков. Во всех взаимодействиях между компонентами используются их интерфейсы. Разработчики других систем, таких, как Windows 2000, не полагаются целиком и полностью на объектно-ориентированные методы, однако при разработке микроядра они широко применяют объектно-ориентированные принципы. Производительность микроядра Одним из часто упоминаемых потенциальных недостатков микроядер является их низкая производительность. Создание сообщения и отправка его через микроядро с последующим получением и декодированием ответа занимает больше времени, чем непосредственный вызов сервиса. Однако при этом в действие вступают и другие факторы, поэтому трудно делать выводы о масштабах потери производительности и о том, есть ли она вообще. Многое зависит от размеров и функциональных возможностей микроядра. В lUED96a] подытожены результаты некоторых исследований, свидетельствующие значительной потере производительности в так называемых микроядрах перво- поколения. От этих потерь не удается избавиться, несмотря на усилия, на- Р вленные на оптимизацию кода микроядра. В попытке решить проблему раз- отчики Увеличивали микроядро, снова включая в операционную систему ЮтгТИЧеСКИе сеРвеРы и Драйверы. Основными примерами такого подхода явля- я операционные системы Mach и Chorus. Избирательное увеличение функ- альности микроядра приводит к снижению количества переключений меж- ЙЬ1 льзовательским режимом и режимом ядра, а также переключений адресной Пространств процессов. Хотя такой подход и снижает потери ДИон 0ДИтельности, это происходит за счет сильных сторон архитектуры опера- и системы с микроядром: минимальных интерфейсов, гибкости и т.п. Ч^ець УГо{* П°ДХ°Д состоит в том, чтобы сделать микроядро не больше, а еще \адл 6' [LIED96b] приводятся данные о том, что в микроядре, обладающем жащей архитектурой, удается избежать потерь производительности и на- «* 4. Потоки, симметричная мультипроцессорная обработка... 221 i *
i Цу с этим повысить его гибкость и надежность. Чтобы вы имели предел Л е о размерах микроядер, заметим, что типичное микроядро первого поколели :топт из 300 Кбайт кода и содержит в себе до 140 интерфейсов системныевы job. Примером маленького микроядра второго поколения является ядро-ОПе ционной системы L4 [HART97, LIED95], которое состоит из 12 Кбайт кода и хержит в себе 7 интерфейсов системных вызовов. Опыт работы с такими сйс памп показывает, что они являются не менее, а иногда даже более, эффектив [ми, чем такие мощные системы, как UNIX. | рхитектура микроядер |? Из-за того что различные микроядра обладают разными возможное? ми ц змером, невозможно четко сформулировать правила, определяющие- фуг нкцнй. предоставляемых микроядром, и его структуру. Чтобы дать пре тав- кие об архитектуре микроядра, в этом разделе представлен минимальны на- р его функций и сервисов. ';*? В микроядро должны входить те функции, которые непосредственно зависят от паратного обеспечения, а также те, которые нужны для поддержки серверов и иложений, работающих в пользовательском режиме. Эти функции относятся к щим категориям функций низкоуровневого управления памятью, межпроцес гаго алмодействия, а также управления вводом-выводом pi прерываниями. ..'■"Ф :'¥' Низкоуровневое управление памятью '% Чтобы в микроядре можно было реализовать защиту на уровне процессов, нем должен обеспечиваться контроль над аппаратной концепцией ад|>& ого юстранства. Если микроядро будет отвечать за отображение каждой рту- [ьной страницы в физический страничный блок, то блок управления намяло, включая систему защиты адресного пространства одного процесса от pv- го, а также алгоритм замены страниц и другие логические схемы страничной >ганизации памяти, можно реализовать вне ядра. Например, вынесенный за >еделы ядра модуль виртуальной памяти принимает решение, когда загру* ать страницу в память и какую из тех страниц, которые уже содержатся в 1мяти, следует заменить. Микроядро отображает ссылки на эти страницы в нзические адреса основной памяти. Впервые идея о том, что системы страничной организации памяти н управ" :ния виртуальной памятью можно вынести за пределы ядра, появилась^ в сте внешней системой страничной организации операционной системы 'ас" rOUN87]. Принцип работы этой системы поясняется на рис. 4.11. Когд# от0К эиложения обращается к странице, которая отсутствует в основной fe тП? >зникает прерывание из-за отсутствия страницы, и управление перехват етС !фом. После этого ядро отправляет системе страничной организации с котором указывается запрашиваемая страница. Система страничной ор и ии может принять решение загрузить данную страницу и выделить ДЛЯ т0 граничный блок. Система страничной организации и ядро должны вза, , гвовать между собой, чтобы логические операции, которые происходят "■й""' ста- ястеме, отображались в физическую память. Как только нужная стран Д вт доступна, система страничной организации отправляет приложению^ . ие о том, что оно может продолжить работу. "7^. 22 Часть 2. Про & * 91 Приложение Ошибка из-за отсутствия страницы «ЫмШнШШмйОй Система страничной организации памяти Возобновление работы Вызов функции для работы с адресным пространством Михрэядро 4 Рис. 4.11. Обработка прерывания из-за отсутствия страницы Такая технология позволяет внешнему по отношению к ядру процессу отображать файлы и базы данных в пользовательские адресные пространства без участия ядра. Вне ядра можно реализовать специализированные стратегии разделения памяти. В [LIED95] предлагается оставить в микроядре набор, состоящий всего из трех операций, которые способны поддерживать внешние системы страничной организации памяти и управления внешней памятью. В этот набор входят следующие операции. • Предоставление (grant). Владелец адресного пространства (процесс) может предоставлять некоторые свои страницы другому процессу. Ядро удаляет эти страницы из адресного пространства первого процесса и передает их второму процессу. • Отображение (тар). Процесс может отображать любые свои страницы в адресное пространство другого процесса, после чего оба процесса будут иметь доступ к этим страницам. При этом создается общая область памяти, совместно используемая двумя процессами. Ядро не меняет информацию о принадлежности первоначальному процессу-владельцу, но при этом выполняет отображение, предоставляющее другому процессу доступ к этим страницам. • Восстановление (flush). Процесс может восстановить любые страницы, предоставленные другим процессам или отображенные в их адресное пространство. Вначале ядро определяет всю физическую память как единое адресное пространство, которым управляет основной системный процесс. При создании но- ых процессов страницы первоначального общего адресного пространства могут еРедаваться или отображаться в эти новые процессы. Такая схема позволяет Дновременно поддерживать несколько схем организации виртуальной памяти. Взаимодействие между процессами Основной формой взаимодействия между процессами или потоками в опе- ч онной системе с микроядром являются сообщения. Сообщение включает в а Заголовок' в котоР°м указаны идентификаторы процесса-отправителя и Дав адреСата' а также тело с пересылаемыми данными, указателем на блок Ctl х Или некоторыми управляющими сведениями о процессе. Обычно можно Up ь' ЧТо взаимодействие между процессами основано на относящихся к этим Для Сам портах. Порт — это, по сути, очередь сообщений, предназначенных у^а ПреДеЛ€ННого пРоп-есса- С портом связан список возможностей, в котором ано, с какими процессами данный процесс может обмениваться информаци- ^^ 4. Потоки, симметричная мультиггроцессорная обработка... 223
й. Процесс может разрешать доступ к себе, отправляя ядру сообщение, ».: -0Tq ом указывается новая возможность порта. ^, Здесь уместно сделать одно замечание по поводу передачи сообщений" Если цресные пространства двух процессов не перекрываются, то передача соо ения г одного процесса другому включает в себя копирование одной области ng ^ другую. Таким образом, скорость такой передачи сообщения ограничена. : 0р0. гью работы памяти, которая несравнимо меньше, чем скорость процессору rj^ гому в современных исследованиях наблюдается интерес к межпроцессному заимодействию, основанному на потоках, и к таким схемам разделения па яти ак многократное отображение страниц (в которых одна и та же страниц а ис- ользуется многими процессами). Ь' Управление вводом-выводом и прерываниями щ' В архитектуре микроядра имеется возможность обрабатывать аппаратные рерывания подобно сообщениям, а также включить в адресное пространство орты ввода-вывода. Такое микроядро может распознавать прерывания^ о не брабатывает их. Вместо этого оно генерирует сообщение процессу, фун юни- ующему на пользовательском уровне и связанному с данным прерывани м. Таим образом, когда прерывание разрешено, с ним сопоставляется про ее на :ользовательском уровне, и такое отображение поддерживается ядром. П обра- ование прерываний в сообщения должно выполняться микроядром, оды sJ ядро :е принимает участия в обработке аппаратно-зависимых прерываний. .'/*? В [LIED96a] предлагается рассматривать аппаратное обеспечение как набор [отоков, которые обладают уникальными идентификаторами и отправл т со- бщения (содержащие только идентификатор данного потока) соответству щим [рограммным потокам в пользовательском пространстве. Поток-получате ь вы- [сняет, является ли данное сообщение прерыванием, а также опредеД т вид того прерывания. Общая структура такого кода, выполняющегося на п зова- ельском уровне, имеет следующий вид: -*i Iriver thread; do ^ waitFor (msg,sender) ; ^*" if (sender == обрабатываемое_прерывание ) ч- t Л чтение/запись в порты ввода-вывода; ^; сброс аппаратного прерывания '"% } г else . . . -V. fhile (true) ; "-К- ^шотокйш^вмршшшшжгооо Процессы в операционной системе Windows 2000 (W2K) организо гтобы обеспечить поддержку различных операционных сред. Процессы* [ичных средах отличаются по ряду параметров, включая следующие: -Ч • именование процессов; - ,.;' • возможность поддержки потоков в процессах; .;>„ таь. способ представления процессов; <v J24 Часть 2. П о • способ защиты ресурсов процессов; , механизмы, использующиеся для обмена информацией между процессами и для их синхронизации; • взаимосвязь процессов друг с другом. Соответственно структуры и сервисы процессов, присущие операционной системе W2K и предоставляемые ее ядром, сравнительно просты и имеют общее назначение. Это позволяет каждой подсистеме эмулировать соответствующие функции и структуру. К важным характеристикам процессов в операционной системе W2K можно отнести следующие: • в W2K процессы реализованы как объекты; • в исполняемом процессе могут содержаться один или несколько потоков; • в объекты-процессы и объекты-потоки встроены возможности синхронизации. На рис. 4.12 проиллюстрирован способ взаимосвязи между процессом и ресурсом, которым этот процесс управляет или который он использует. В целях безопасности каждому процессу присваивается признак доступа, который называется первичным признаком процесса. При входе пользователя в систему W2K создает признак доступа, в который входит идентификатор безопасности пользователя. Каждый процесс, который создается данным пользователем или запускается от его имени, обладает копией этого признака. Указанный признак используется операционной системой W2K, чтобы подтвердить возможность доступа пользователя к защищенным объектам или возможность выполнения специальных функций в системе и в защищенных объектах. Признак доступа управляет возможностью изменения процессом своих собственных атрибутов. Дескриптор1 Дескриптор2 ДескрипторЗ Ри, ■12. Процессы и их ресурсы в операционной системе Windows 2000 [CUST93] а 4. Потоки, симметричная мультипроцессорная обработка... 225
J. С процессами связан и ряд блоков, в которых определяется виртуальное « :сное пространство, закрепленное в данный момент за процессом. Процесс эжет напрямую изменять эти структуры; в этом он зависит от менеджера ви гальной памяти, предоставляющего сервис для выделения памяти проц уш Наконец, в состав процесса входит таблица объектов, которая уп авляе местными процессу объектами. Для каждого потока, входящего в этот ц цо- иеется один дескриптор. На рис. 4.12 показан один поток, но их мож быть ного. Кроме того, процесс имеет доступ к файловым объектам и к радд; лам эторые задают раздел совместно используемой памяти. -*; (бъекты процессов и потоков | Объектно-ориентированная структура операционной системы W2K егча- г разработку подсистемы для работы с процессами. Разработчики W2| вос- эльзовались двумя типами связанных с процессами объектов: процессами и по- жами. Процесс — это объект, соответствующий заданию или прило ению ользователя, который владеет своими собственными ресурсами, так i, как амять и открытые файлы. Поток — это диспетчеризуемая единица работы, ко- эрая выполняется последовательно и является прерываемой, что поз отяет роцессору переключиться на выполнение другого потока. Щ Каждый процесс в операционной системе W2K представлен объек м, об- щя структура которого показана на рис. 4.13,а. Каждый процесс опре еляется екоторым числом атрибутов и может предоставлять определенные сервисы, ко- орые он выполняет после получения соответствующего сообщения-запроса, единственный способ вызвать такой сервис — отправка сообщения процессу, ко- орый его предоставляет. При создании нового процесса операционная <: стема У2К использует класс или тип объектов, определенный как шаблон цесса ля генерации новых экземпляров объектов. Во время создания объекте, го ат- ибутам присваиваются конкретные значения. В табл. 4.3 приводится \ раткое писание каждого атрибута процессов. '&, 'аблкца 4.3. Атрибуты процесса в операционной системе Windows 2000 [дентификатор процесса Уникальное значение, идентифицирующее процесс В; операционной системе % Дескриптор защиты Описывает, кто создал объект, кто обладает правом' тупа к нему или может им пользоваться и кто определи пгрява доступа к объекту ;йЬ >азовый приоритет Базовый приоритет выполнения потока, принадл ^шеГ0 процессу :х' Ipoueccop по умолчанию Заданный по умолчанию набор процессоров, на кото , в°3 можно выполнение потоков процесса -t Своты Максимальное количество страничной и прочей си v M памяти, объем в страничном файле и процессорно^■"■ Р доступные данному процессу '-'s *ремя выполнения Суммарное время, затраченное на выполнение всех ^ ° процесса ;; •четчики ввода-вывода Переменные, в которые заносятся сведения о количеств? операций ввода-вывода, выполненных потоками процесса ^ 226 Часть 2. П оцес" I i'i Окончание табл. 4.3 ^^тчики операций ' ^ту^^ъно^ памятью Порты иск лючений/отладки Статус выхода Переменные, в которые заносятся сведения о количестве и типе операций с виртуальной памятью, выполненных потоками процесса Каналы обмена информацией между процессами, в которые диспетчер процессов должен отправить сообщение при возникновении исключительной ситуации из-за одного из потоков процесса Причина завершения процесса Тип объекта Атрибуты тела объекта Процесс Идентификатор процесса Дескриптор защиты Базовый приоритет Родственность процессоров по умолчанию Квоты Время выполнения Счетчики ввода-вывода Счетчики операций с виртуальной памятью Порты исключения/отладки Статус выхода Создание процесса Открытие процесса Информация по запросу процесса Информация по наладке процесса Текущий процесс Прекращение процесса а) Объект-процесс Тип объекта Атрибуты тела объекта Сервисы Поток Идентификатор потока Контекст потока Динамический приоритет Базовый приоритет Родственность процессоров по потоку Время выполнения потока Статус извещения Счетчик приостановок Маркер режима анонимного воплощения Порт завершения Статус выхода потока Создание потока Открытие потока Информация по запросу потока Информация по наладке потока Текущий поток Завершение потока Получение контекста Set context Приостановка Возобновление Извещение потока Проверка извещения потока Порт регистрации завершения б) Объект-поток Рис. 4.13. Объе кты процессов и потоков в операционной системе Windows 2000 В операционной системе W2K процесс перед выполнением должен содер- ать хотя бы один поток, который затем может создавать другие потоки. В мно- яроцессорной системе несколько потоков одного и того же процесса могут вы- сняться параллельно. На рис. 4.13,6 изображена структура объекта потока, а • п 4"^ опРеДелены его атрибуты. Заметим, что некоторые атрибуты потока Добны атрибутам процесса. Значения таких атрибутов потока извлекаются из чений соответствующих атрибутов процесса. Например, в многопроцессорной ,.1! ел1е сродные потоку процессоры — это множество процессоров, на которых Sjj ет выполняться данный поток; это множество совпадает с множеством про- °Ров, сродных процессу, или является его подмножеством. ^4. Потоки, симметричная мультипроцессорная обработка... 227
Таблица 4.4. Атрибуты потока в операционной системе Windows 2000 Идентификатор потока Контекст потока Динамический приоритет Базовый приоритет Процессоры потока Время выполнения потока Статус оповещения Счетчик приостановок Признак имперсонации Порт завершения Статус выхода потока Уникальное значение, идентифицирующее поток, кйгда вызывает сервис оц Набор значений регистров и другие данные, которыГ и _ ределяется состояние выполнения потока :ф. Приоритет выполнения потока в данный момент вре еаи Нижний предел динамического приоритета потока *г ■'<*, Множество процессоров, на которых может выполнят поток. Это множество является подмножеством процессе, ров, сродных процессу потока, или совпадает с ним с . Совокупное время, затраченное на выполнение п: ока пользовательском режиме и в режиме ядра __% Флаг, который указывает, следует ли потоку вьхйолнять асинхронный вызов процедуры и В нем указывается, сколько раз выполнение потока- было приостановлено без последующего возобновления "$& Временный признак доступа, позволяющий потоку*, nor нять операции от имени другого процесса (используется подсистемами) <v* Канал обмена информацией между процессами, не, который диспетчер процессов должен отправить сообщение при завершении потока (используется подсистемами) %■ Причина завершения потока ■?■ '%■■ Заметим, что одним из атрибутов процесса является его контексте, Содержащаяся в контексте информация позволяет операционной системе приостанавливать и возобновлять потоки. Более того, приостановив поток и изме в его контекст, можно изменить его поведение. и* Многопоточность й Операционная система W2K поддерживает параллельное выполнение процессов, потому что потоки различных процессов могут выполнять*?, одно временно. Более того, нескольким потокам одного и того же процве ^ мог быть выделены различные процессоры, и эти потоки также Moryf; в поЛ" няться одновременно. Параллелизм достигается в многопоточном про'цес без накладных расходов на использование нескольких процессов. Шт.0 И ° ного и того же процесса могут обмениваться между собой информации „ мощью общего адресного пространства и имеют доступ к совместные?: ресУР сам процесса. Потоки, принадлежащие^разным процессам, могут обм ся между собой информацией ~ с помощью об~щей _ области i установленной" для: этих двух процессов. ?*Г' Объектно-ориентированный многопоточный процесс является эффект средством реализации серверных приложений. Например, один обслуж г процесс может обслуживать несколько клиентов. Каждый запрос клиенте "Р дит к созданию в сервере нового потока. 228 Часть 2. ц '" Состояния потоков noTOK^j_c^5^jfn^^onep_aimoHHofi системе. W2K»JMQЖ£x_нaxoдитьcя в ^здном ; йя шести-слслхьщшй (см. рис. 4.14). Перечислим эти состояния. ф Готовый к выполнению. Поток, который может быть направлен на выполнение. Диспетчер микроядра отслеживает все готовые к выполнению потоки и осуществляет их планирование в соответствии с приоритетом. • Резервный. Поток, который будет запущен следующим на данном процессоре. Поток находится в этом состоянии до тех пор, пока процессор не освободится. Если приоритет резервного потока достаточно высок, то он может вытеснить выполняющийся в данный момент поток. В противном случае резервный поток ждет, пока не произойдет блокировка выполняющегося потока или пока не истечет выделенный ему промежуток времени. • Выполняющийся. Как только микроядро переключит поток или процесс, резервный поток перейдет в состояние выполнения и будет пребывать в этом состоянии до тех пор, пока не произойдет одно из следующих событий: поток будет вытеснен, закончится отведенный ему интервал времени, поток будет блокирован или завершен. В первых двух случаях поток снова переходит в состояние готовности. • Ожидающий. Поток входит в состояние ожидания, если (1) он блокирован 1 каким-то событием (например, операцией ввода-вывода), (2) он добровольно ждет синхронизации или (3) среда подсистемы предписывает потоку, чтобы он сам себя приостановил. После того как условия ожидания будут удовле- \ творены, поток переходит в состояние готовности, если все его ресурсы будут доступны. • Переходный. Поток переходит в это состояние, если он готов к выполнению, но ресурсы недоступны (например, страницы стека потока могут находиться на диске). После того как необходимые ресурсы станут доступны, процесс переходит в состояние готовности. • Завершающийся. Завершение потока может быть инициировано самим потоком, другим потоком или может произойти вместе с завершением родительского процесса. После завершения необходимых операций освобождения ресурсов и т.п. поток удаляется из системы (или может быть сохранен исполнительной системой для дальнейшей повторной инициализации). 4. Потоки, симметричная мультипроцессорная обработка... 229
Неработоспособный Рис. 4.14. Состояния потоков в операционной системе Windows 2000 Д Поддержка подсистем операционной системы ^ Средства общего назначения для работы с процессами и потоками должны поддерживать структуры процессов и потоков, соответствующие различным кпи- ентам операционной системы. В обязанности каждой подсистемы входит споль- зование функций обработки процессов и потоков операционной системы W2K для эмуляции функций обработки процессов и потоков соответствующей подсистемы операционной системы. Система управления процессами и потоками довольно сложна; здесь мы приводим лишь ее краткий обзор. Процесс создается по запросу приложения операционной системы, который поступает в соответствующую защищенную подсистему. Подсистема, в свою очередь, отправляет запрос на создание процесса исполнительной системе о еради- онной системы W2K, которая создает объект-процесс и возвращает под истеме его дескриптор. Создавая процесс, операционная система W2K автоматически поток не создает (в отличие от OS/2 и Win32, где создание нового процесса всегда сопровождается созданием потока). Поэтому подсистемы повторно решаются к менеджеру процессов операционной системы W2K, чтобы создать пото нового процесса и получить его дескриптор. Затем соответствующая инфор an о потоке и процессе возвращается приложению. В 16-битовых системах Windo и POSIX потоки не поддерживаются. Чтобы новый процесс мог быть активиз рован, операционная система W2K создает его поток для подсистем этих on P ционных систем, но возвращает приложению только информацию о Не Тот факт, что процесс приложения реализуется с помощью потока, для ЯР0 жения остается незамеченным. Если новый процесс создается подсистемой Win32 или подсистемой держки OS/2, он наследует многие атрибуты создавшего его процесса. ^ssrfrt). среде операционной системы W2K процесс создается непрямым образом. 230 Часть 2. П>цеСС сС клиентского приложения генерирует запрос на создание процесса в адрес оответствующей подсистемы; процесс подсистемы, в свою очередь, отправляет апрос на создание процесса исполнительной системе W2K. Так как новый просе должен наследовать характеристики процесса-клиента, а не обслуживающе- процесса, подсистема W2K имеет возможность указывать родительский процесс нового процесса. Следоватечьно, новый процесс наследует признак доступа, квоты, базовый приоритет и принятое по умолчанию сродство процессоров родительского процесса. Поддержка симметричной многопроцессорной обработки Операционная система W2K поддерживает симметричную многопроцессорную конфигурацию аппаратного обеспечения. Потоки любого процесса, включая потоки исполнительной системы, могут выполняться на любом процессоре. При условии отсутствия ограничений на сродство процессоров микроядро выделяет готовому к выполнению потоку процессор, который освобождается первым. При этом гарантируется, что ни один процессор не будет простаивать или выполнять поток с более низким приоритетом, если готов к выполнению процесс с более высоким приоритетом. Несколько потоков одного и того же процесса могут одновременно выполняться на нескольких процессорах. Выделяя потоку процессор, микроядро по умолчанию придерживается мягкой стратегии сродства процессоров: диспетчер пытается выделить готовому к выполнению потоку тот же процессор, на котором этот поток выполнялся прошлый раз. Это способствует рациональному использованию данных, оставшихся в кэшах процессора после предыдущего выполнения процесса. Приложение может ограничить круг возможного выбора доступных потоку процессоров, сузив его до одного фиксированного процессора (жесткое сродство). .5. УПРАВЛЕНИЕ ПОТОКАМИ И SMP » а В SOLARIS iN АЙ ■Шъ£?тп*. *•* г) В операционной системе Solaris реализован необычный многоуровневый ё подход к управлению потоками, способствующий значительной гибкости исполь- к аования процессорных ресурсов. ? Многопоточная архитектура i; en опеРационной системе Solaris используются четыре отдельные концепции, ? вязанные с потоками. щ Процесс. Это обычный процесс UNIX, который включает в себя пользова- j тельское адресное пространство, стек и управляющий блок процесса. *г 6 0токи на пользовательском уровне. Эти потоки реализуются с помощью ;: лиотеки потоков в адресном пространстве процесса; они невидимы для - ПеРационной системы. Потоки на пользовательском уровне играют роль интерфейса для параллелизма приложений. 'к- * Об % легченные процессы. Облегченный процесс (lightweight process — LWP) _ ожно рассматривать как отображение между потоками на пользователь- Ч V^ 4. Потоки, симметричная мультипроцессорная обработка... 231
ском уровне и потоками ядра. Каждый из облегченных процессов пр ер живает один или несколько потоков на пользовательском уровне и о * ра_ жает их в один поток ядра. Планирование облегченных процессов про 3во- дится ядром независимо. В многопроцессорной системе облегченные ц Uec. сы могут выполняться параллельно на нескольких процессорах. ■tfs Потоки ядра. Эти потоки являются фундаментальными элементами; '*щ ни- рование и выполнение каждого из них может осуществляться на одно Из системных процессоров. На рис. 4.15 проиллюстрирована взаимосвязь между этими четырьмя » мен. тами. Заметим, что каждому облегченному процессу всегда соответствует один поток ядра. Облегченный процесс видим для приложения в рамках процесса. Такща; образом, структуры данных облегченного процесса существуют в рамках адресного пространства соответствующего им процесса. В то же время каждый облегче процесс связан с единственным диспетчеризуемым потоком ядра, а структуры данных этого потока ядра поддерживаются в адресном пространстве ядра. Процесс 1 Процесс 2 Процесс 3 Процесс 4 Пользователь \ \ \ \ \ \ \ Процесс 5 * ПИ Ядро Аппаратное обеспечение S Поток на пользовательском уровне (£) Поток на уровне ядра © Облегченный процесс j-jfj ПР°Ц Рис. 4.15. Пример многопоточной архитектуры операционной системы Solans В нашем примере процесс 1 состоит из одного потока на пользова л ^ уровне, связанного с одним облегченным процессом. Таким образом, в*"юЛ дрй ся один поток, что соответствует процессу в традиционной системе UN • ^^ ложение использует такую структуру процесса, если для него не нужен Д ** ^ лизм. Процесс 2 соответствует стратегии, в которой применяются только п^ ^ на пользовательском уровне. Все эти потоки поддерживаются одним поГО*^оН $» ра, поэтому в каждый момент времени может выполняться только один о ^ пользовательском уровне. Такая структура полезна тогда, когда пр ^^ лучше всего программировать с применением параллелизма, но не Я п^ при этом параллельное выполнение нескольких потоков. В процессе а» йл 232 Часть 2 Ш>°ие яесколько потоков, которым соответствует меньшее количество облегченных процессов. Вообще говоря, в операционной системе Solaris потоки на пользовательском уровне можно отображать в такое же или меньшее количество облегченных процессов. Это позволяет приложению указывать степень параллелизма на уровне ядра, которая будет поддерживаться для данного процесса. В процессе 4 реализовано взаимно однозначное соответствие между потоками и облегченными процессами. В такой структуре параллелизм на уровне ядра является полностью видимым для приложения. В процессе 5 демонстрируется комбинированный подход. В нем несколько потоков на пользовательском уровне отображаются в несколько облегченных процессов, и вместе с этим один облегченный процесс закреплен за одним потоком на пользовательском уровне. На рисунке отсутствует изображение потоков ядра, не имеющих связи с облегченными процессами. Эти потоки создаются, запускаются и удаляются ядром для выполнения с их помощью определенных системных функций. Реализация системных функций с помощью потоков ядра вместо процессов ядра снижает накладные расходы по переключению в ядре (переключение потоков требует меньше ресурсов, чем переключение процессов). Мотивация Совместное использование потоков на пользовательском уровне и на уровне ядра дает возможность программисту выбрать вариант параллелизма, который будет наиболее эффективным для данного приложения и подойдет для него больше других. В некоторых программах используется логический параллелизм, который позволяет упростить и структурировать код, но для которого не нужен аппарат- вый параллелизм. Например, приложение со многими окнами, из которых только одно является активным, можно эффективно реализовать в виде набора потоков на пользовательском уровне, которым отвечает один облегченный процесс. Преимущество использования для таких приложений только потоков на пользовательском уровне заключается в их эффективности. Потоки на пользовательском уровне можно создавать, уничтожать, блокировать, активизировать и т.д. без участия ядра. Если бы ядру было известно о каждом потоке на пользовательском уровне, оно должно было бы размещать структуры данных для каждого потока, а также выполнять переключение потоков. Как мы видели в табл. 4.1, Ри переключении потоков на уровне ядра потребляется больше ресурсов, чем Ри переключении потоков на пользовательском уровне. Если в приложение входят потоки, которые могут быть блокированы, на- Ример, при выполнении ввода-вывода, то заманчиво использовать несколько егченных процессов, поддерживающих такое же или большее количество по- 0в на пользовательском уровне. Чтобы в рамках этого же процесса могли вы- б Няться и другие потоки, не нужно никакого вмешательства приложения или его Иотеки потоков. Если один из потоков процесса будет блокирован, другие °токи могут выполняться в оставшихся облегченных процессах. 0т Некоторых приложениях эффективным является взаимно однозначное йо ние потоков на уровне ядра и облегченных процессов. Например, мож- ;**вй ализовать такое параллельное вычисление элементов массива, чтобы эле- ь*» стоящие в разных строках, вычислялись в разных потоках. Если каждо- V 4. Потоки, симметричная мультипроцессорная обработка,.. 233
м nv потоку на пользовательском уровне соответствует свой облегченный ( PUecc, -о переключать потоки при вычислениях не потребуется. Для некоторых приложений подходит смешанное использование потоков юстоянно связанных с облегченными процессами, и несвязанных потоке» (Пр1| itom несколько облегченных процессов совместно используются нескольку, ц По гоками). Например, при реализации прикладной системы реального в еменц 1рограммист может захотеть, чтобы одни потоки обладали приоритетов мас- птабе всей системы и планировались в реальном времени, а другие — выпочНя. 1и функции в фоновом режиме и могли совместно использовать один чи небольшое количество облегченных процессов. ;]"" Структура процессов ■■ ■ ■$ На рис. 4.16 приводится общее сравнение структуры процессов в трйдици- энной операционной системе UNIX со структурой процессов в операционной системе Solaris. В типичных реализациях UNIX в структуру процесса входя такие составляющие: идентификатор процесса, идентификаторы пользователя, блица диспетчеризации сигналов; дескрипторы файлов, схема распределения мяти, структура состояния процессора. В операционной системе Solaris эта. азовая структура остается, но в ней блок состояния процессора заменен списком структур, в котором для каждого облегченного процесса имеется свой блок данных. Структура процесса в операционной системе UNIX Идентификатор процесса Идентификаторы пользователя Таблица диспетчеризации сигналов Дескрипторы файлов { Схема распределения памяти 11оиооитет Каота сигналов Регистры СТЕК ■ • • Состояние процессора Структура процесса (,*.; в операционной системе Solaris 2.x £ Идентификатор процесса > 'V Идентификаторы пользователя - т с 1аолица диспетчеризации сигналов Дескрипторы файлов Г Схема «определения памяти - Облегченный процесс 1 Облегченный процесс 1 Идентификатор облегченного процесса Приоритет Карта сигналов Регистры СТЕК Идентификатор облегченного процесса Приоритет Карта сигналов Регистры СТЕК Рис. 4.16. Структура процесса в UNIX и в Solans 2.x [LEWI96] £ 234 Часть 2. П Це В структуру данных облегченного процесса входят такие элементы: т идентификатор облегченного процесса; i приоритет данного облегченного процесса (и, следовательно, потока ядра, который его поддерживает); • маска сигналов, предоставляющая ядру информацию о том, какие сигналы могут быть восприняты процессом; • сохраненные значения регистров пользовательского уровня (когда облегченный процесс не выполняется); • стек ядра данного облегченного процесса, в который входят аргументы системного вызова, результаты и коды ошибок каждого уровня; • данные по использованию ресурсов и профилированию; • указатель на соответствующий поток ядра; • указатель на структуру процесса. Выполнение потоков На рис. 4.17 показана облегченная схема состояний выполнения потоков на пользовательском уровне и облегченных процессов. Выполнением потоков на пользовательском уровне управляет библиотека потоков. Рассмотрим сначала несвязанные состояния, т.е. состояния, которые совместно используют несколько облегченных процессов. Несвязанный поток может находиться в одном из четырех состояний: работоспособный, активный, ожидания или остановленный. Если поток на пользовательском уровне находится в активном состоянии, он закрепляется за облегченным процессом и выполняется до тех пор, пока выполняется лежащий в его основе поток ядра. Поток на пользовательском уровне может выйти из активного состояния по нескольким причинам. Рассмотрим активный поток Т1 на пользовательском уровне. Возможны такие события. • Синхронизация. Чтобы скоординировать свои действия с другими потоками, поток Т1 вызывает один из примитивов, которые обсуждаются в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность", а сам переходит в состояние ожидания. После выполнения условия синхронизации поток Т1 переходит в работоспособное состояние. Приостановка. Любой из потоков (включая поток Т1) может стать причиной приостановки потока Т1 и его перехода в состояние остановки. Поток Ч остается в этом состоянии, пока другой поток не сгенерирует запрос на продолжение его выполнения, который и переводит остановленный поток в Работоспособное состояние. ьхтеснение. Активный поток (Т1 или какой-то другой) выполняет некоторое Действие, благодаря которому становится работоспособным другой поток (Т2) с лер высоким приоритетом. Если Т1 является активным потоком с наиболее зким приоритетом, он вытесняется и переходит в состояние готовности, а по- F2 закрепляется за освободившимся облегченным процессом. -ч тУпка. Если поток Т1 выполняет библиотечную команду thr_yield(), _ анировщик потоков этой библиотеки проверяет есть ли другой работо- ,„ч **• Потоки, симметричная мультипроцессорная обработка... 235
Ч1 р способный поток (Т2) с тем же приоритетом. Если такой поток есть 'tj п реходит в работоспособное состояние, а поток Т2 закрепляется за свобл дившимся облегченным процессом. В противном случае продолжает быцоп няться поток Т1. Остановка ^Работоспособный? Потоки на пользовательской- уровне Пробуждение Вытеснение т. /Остановленный^^" '*!^ Остановка Остановка ^Ожидающий' Диспетчеризация ugf "*%, Оцепенение ■Активный .-^^ ■*:. 1 ^ ■**& "^*Ч "^ ^ Временной срез или вытеснение Диспетчеризация П0ЛНЯЮЩИ1 г .-а тоспособный' * *.* . '.. i".$f ■3S>- Остановка Остановленный Блокирующий системный вызов Пробуждение Облегченные процессы ч ированньф Продолжение Остановка^ Рис. 4.17. Состояния потоков и облегченных процессов в Solans Во всех перечисленных выше случаях при выходе потока Т1 из актив состояния библиотека потоков выбирает другой несвязанный поток в работе собном состоянии и запускает его на освободившемся облегченном процессе. На рис. 4.17 показана также диаграмма состояний облегченных проц с • ^ диаграмму можно рассматривать как детализацию активного состояния поток пользовательском уровне, так как несвязанному потоку облегченный проц с чается только тогда, когда он находится в активном состоянии. Диаграмма с 236 Часть 2. Ц он t ялй облегченного процесса почти не требует пояснений. Активный поток выполняет. я лишь тогда, когда его облегченный процесс находится в состоянии выполнение Если активный поток делает блокируюидий системный вызов, его облегченный про* иесс переходит в состояние блокировки. Однако на пользовательском уровне этот пф *ок остается связанным с данным облегченным процессом до тех пор, пока библио;;.,. -£Ка потоков оставляет его в активном состоянии. Взаимосвязь связанных потоков с облегченными процессами несколько другая- Например, если связанный поток на пользовательском уровне переходит в состояние ожидания наступления синхронизирующего события, его облегченный процесс тоже должен перестать выполняться. \ Прерывания в роли потоков В большинстве операционных систем приняты две основные формы асинхрон- - ной деятельности: процессы и прерывания. Процессы (или потоки) взаимодействуют друг с другом и управляют использованием совместных структур данных с помощью различных примитивов, обеспечивающих взаимоисключения (когда в каждый момент времени только один процесс может выполнять определенный код или осуществлять доступ к определенным данным) и синхронизирующих их выполнение. Прерывания синхронизируются путем их предотвращения на некоторое время. В операционной системе Solaris эти две концепции объединяются в одной модели потоков * ядра: прерывания в такой модели преобразуются в потоки ядра. Эти преобразования выполняются для сокращения накладных расходов. Обработчики прерываний часто манипулируют данными, которые используются совместно с остальной частью ядра. Поэтому во время работы процедуры ядра, ■« осуществляющей доступ к этим данным, прерывания должны быть заблокирова- ■ ны, даже если большинство прерываний не оказывают влияния на эти данные. k Обычно для этого приходится повышать уровень приоритета прерываний, чтобы блокировать прерывания на время выполнения подпрограммы. После заверше- i ния подпрограммы уровень приоритета понижается. Все эти операции отнимают время. В многопроцессорной системе проблема усиливается. Ядро должно защищать большее количество объектов, и ему может понадобиться блокировать пре- ч Рывания на всех процессорах. *,; Решение, принятое в операционной системе Solaris, выглядит так. *• Для обработки прерываний в системе Solaris используются потоки ядра. Как и любой другой поток ядра, поток прерывания обладает своим собст- ^ венным идентификатором, приоритетом, контекстом и стеком. • Ядро управляет доступом к структурам данных и синхронизирует потоки пре- | Рываний с помощью примитивов взаимоисключений (рассматривающихся в * главе 5, "Параллельные вычисления: взаимоисключения и многозадачность"). аким образом, для обработки прерываний используются обычные методы синхронизации потоков. стокам прерываний присваиваются более высокие приоритеты, чем всем |f дРУгим типам потоков ядра. . V'fcw Ли происходит прерывание, оно передается определенному процессору, а ', е НЯ1°Щийся на этом процессоре поток закрепляется. Закрепленный поток ^ет перейти на другой процессор; его контекст сохраняется, и процесс Г -| , Ч '4. Потоки, симметричная мультипроцессорная обработка... 237
f- останавливается до тех пор, пока не будет обработано прерывание. После ч> процессор приступает к выполнению потока прерывания. В наличии Гда ется запас деактивированных потоков прерываний, так что новый поток, -о3. ать не нужно. Затем исполняется поток, в котором происходит обр от^ рывания. Если программе обработки понадобится доступ к структуре д ы орая каким-то образом заблокирована и используется другим потоком, ц т к рывания должен ждать. Поток прерывания может быть вытеснен только дру. потоком прерывания с более высоким приоритетом. Опыт использования потоков прерываний в операционной системе Solaris сви- ;льствует о том, что такой подход обеспечивает производительность, пре ходя- о производительность традиционных методов обработки прерываний [KLEI95]. 6. УПРАВЛЕНИЕ ПРОЦЕССАМИ И ПОТОКАМИ В LINUX TSU' ZX £Ж5 2G&"*' % юцессы в Linux В операционной системе Linux процесс, или задание, представляется ц ук- ой данных task_struct. Linux поддерживает таблицу task, предсТа 7яю- о собой линейный вектор указателей на каждую определенную в данный мо- т структуру данных task_struct. В этой структуре данных информация эита на следующие категории. '|Г7 Состояние. Состояние выполнения процесса (выполняющийся, готовый к выполнению, приостановленный, остановленный, зомби). ц Информация по планированию. Информация, которая нужна операционной системе Linux для планирования процессов. Процесс может быть обычным или выполняющимся в реальном времени; кроме того, он обладает некоторьШ .приоритетом. Процессы, выполняющиеся в реальном времени, планирую № обычных процессов; в каждой из категорий можно использовать относит^ ные приоритеты. Счетчик ведет отсчет времени, отведенного процессу. %-i Идентификаторы. Каждый процесс обладает своим собственным идент |фй- катором, а также идентификаторами пользователя и группы. Иденти i к - тор группы используется для того, чтобы назначить группе пользе 1Я права доступа к ресурсам. -^ Обмен информацией между процессами. В операционной системе Linux и пользуется такой же механизм межпроцессного взаимодействия, как и в оп рационной системе UNIX SVR4, описанной в главе 6, "Взаимоблокировка голодание". v Связи. Каждый процесс содержит в себе связи с параллельными еМУ ПР0 цессами, с родственными ему процессами (с которыми он имеет общий Р дительский процесс) и связи со всеми своими дочерними процессами.' Время и таймеры. Сюда входит время создания процесса, а также кол* ^ ство процессорного времени, затраченного на данный процесс. С проДеС ' также могут быть связаны интервальные таймеры (один или несколь Интервальный таймер задается в процессе с помощью системного , ыз° I S Часть 2. П U сС после истечения периода таймера процессу отправляется соответствующий сигнал. Таймер может быть создан для одноразового или периодического использования. ф файловая система. Содержит в себе указатели на все файлы, открытые данным процессом. • Виртуальная память. Определяет отведенную данному процессу виртуальную память. • Контекст, зависящий от процессора. Информация по регистрам и стеку, составляющая контекст данного процесса. На рис. 4.18 показаны состояния выполнения процесса. • Выполняющийся. Это состояние отвечает на самом деле двум состояниям: текущий процесс либо выполняется, либо готов к выполнению. • Прерываемый. Это состояние блокировки, в котором процесс ожидает наступления события, например, завершения операции ввода-вывода, освобождения ресурса или сигнала от другого процесса. • Непрерываемый. Это состояние блокировки другого рода. Его отличие от предыдущего состоит в том, что в непрерываемом состоянии процесс непосредственно ожидает выполнения какого-то аппаратного условия, поэтому он не воспринимает никаких сигналов. • Остановленный. Процесс был остановлен и может быть продолжен только при соответствующем воздействии другого процесса. Например, процесс, который находится в состоянии отладки, может перейти в состояние остановки. • Зомби. Процесс был прекращен, но по какой-то причине его структура остается в таблице процессов. Потоки в Linux В операционной системе Linux новый процесс создается путем копирования атрибутов текущего процесса. Новый процесс может быть клонирован (cloned); при этом такие ресурсы, как файлы, обработчики сигналов и виртуальная память, используются совместно. Если два процесса пользуются одной и той же иртуальной памятью, они функционируют как потоки в рамках одного и того е процесса. Однако для потоков структуры данных отдельно не задаются. Таим образом, в операционной системе Linux потоки и процессы не различаются. «V. адй 4. Потоки, симметричная мультипроцессорная обработка... 239
Сигнал ! • t jf %> Сигнал Выполняющееся ^ состояние ?i '- Завершение Готовый I Планирование ';гёаяняющиР ft" ываемый .Замбии Рис. 4.18. Модель процессов и потоков Linux 5v-i'^apsp; -яязтъ- \Ж> 4' 4.7. РЕЗЮМЕ, КЛЮЧЕВЬЖТЕРМЙНЫ и контрольные вопросы■■■*• ж Л ьсасл оьйя хЛЧ WU* rfrsftfg -r;«rS £-*f В некоторых операционных системах различаются понятия процесса и потока; первый из них имеет отношение к владению ресурсами, а второй — к выполнению программы. Такой подход может привести к повышению эффективности программы и удобен при составлении кода. В многопоточной системе в рамках одного процесса есть возможность задавать несколько потоков. Для этого мо но использовать либо потоки на пользовательском уровне, либо потоки на уровне ядра- Потоки на пользовательском уровне остаются невидимыми для операционной системы, они создаются и управляются библиотекой потоков, которая выполняется ^ пользовательском пространстве процесса. Потоки на пользовательском очень эффективны, так как при их переключении не нужно переключать работы процессора. Однако в одном процессе в каждый момент времени ° выполняться только один поток на пользовательском уровне. Если один такой ток будет заблокирован, это приведет к блокированию всего процесса. Пото уровне ядра — это потоки, которые управляются ядром. Благодаря тому, что кие потоки распознаются ядром, в многопроцессорной системе могут парал,Л выполняться несколько потоков одного и того же процесса, а блокирование по не приводит к блокированию всего процесса. Однако для переключения потоков уровне ядра нужно переключать режим работы процессора. " вне жим т 240 Часть 2. П есС Симметричная многопроцессорная обработка — это такой метод организации многопроцессорной системы, при котором каждый процесс или поток (в том числе и процесс ядра) может выполняться на любом процессоре. В связи с использованием симметричной многопроцессорной архитектуры, обеспечивающей при равных условиях более высокую производительность по сравнению с однопроцессорной системой, возникают новые аспекты архитектуры операционных систем. В последние годы большой интерес вызывает разработка операционных систем с микроядром. В чистом виде операционная система с микроядром основана на очень маленьком микроядре, которое работает в режиме ядра и выполняет только самые важные и существенные функции операционной системы. Другие ее функции реализованы так, что они выполняются в пользовательском режиме, применяя микроядро только для важнейших сервисов. Дизайн с использованием микроядра способствует гибкой и модульной реализации; однако при этом встают вопросы производительности. Ключевые термины Задание Облегченный процесс Процесс Микроядро Поток Симметричная многопро- Многопоточность Поток на пользователь- цессорная обработка Монолитная ском уровне операционная система Поток на уровне ядра Контрольные вопросы 4.1. В табл. 3.5 перечислены типичные элементы, встречающиеся в управляющем блоке процесса операционной системы, в которой не используются потоки. Какие из них следует отнести к управляющему блоку потока, а какие — к управляющему блоку процесса в многопоточной системе? 4.2. Перечислите причины, по которым переключение потоков обходится дешевле, чем переключение процессов. 4.3. Назовите две различные и потенциально независимые характеристики, содержащиеся в понятии процесса. 4.4. Приведите четыре общих примера использования потоков в однопользовательской многопроцессорной системе. 4.5. Какие ресурсы обычно совместно используются всеми потоками процесса? 4-6. Перечислите три преимущества потоков на пользовательском уровне над потоками на уровне ядра. 4-7■ Приведите два недостатка потоков на пользовательском уровне по сравнению с потоками на уровне ядра. Дайте краткое описание различных архитектур, приведенных на рис. 4.8. ■у- Перечислите основные особенности архитектуры операционной системы Для многопроцессорной машины. • Приведите примеры сервисов и функций, встречающихся в типичной монолитной операционной системе, которые в операционной системе с мик- . * Роядром могли бы быть реализованы в виде внешних подсистем. J? 4. Потоки, симметричная мультипроцессорная обработка..- 241
11 Назовите семь потенциальных преимуществ архитектуры операционной-. " темы с микроядром по сравнению с монолитной операционной системой.; с- --:$ 12 Объясните, в чем заключаются потенциальные недостатки операцио системы с микроядром, связанные с ее производительностью. .13. Назовите три функции, которые, скорее всего, будут включены д операционную систему с самым малым микроядром. 14. Назовите основную форму обмена информацией между процессами в one рационной системе с микроядром. е в [.8. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА «Ч»*..- -х- В [LEWI96] и [KLEI96] представлены обзоры концепций потока и обсужде- :е стратегий программирования. В первом издании больше внимания уделяется исанию концепций, а во втором — программированию, но и в том и в другом ада изложена достаточно хорошо. В [РНАМ96] представлены средства " ты с токами в операционной системе Windows NT, которые, по сути, идед^ чны ответствующим средствам операционной системы Windows 2000. / В [MUKH96] приводится обсуждение вопросов, связанных с архите рой «рационных систем для многопроцессорных машин. В [СНАР97] соде ггся [ть статей, в которых идет речь о современных направлениях развития t ого- юцессорных операционных систем. Интересное обсуждение принципов" рхи- ктуры микроядра можно найти в [LIED95] и [LIED96]; во втором издании [имание фокусируется на вопросах производительности. %| ШАР97 Chapin S., Maccabe A., eds. Multiprocessor Operating Systems: Harnessing the Power. — Special issue of IEEE Concurrency. April-June 1997. 5XEI96 Kleiraan S., Shah D., Smallders B. Programming with Threads. - Upper Saddle River, NJ: Prentice Hall, 1996. «„„tire LEWI96 Lewis В., Berg D. Threads Primer. - Upper Saddle River, NJ. Prentice Hall, 1996. * . ACM LIED95 Liedtke J. On u-Kernel Construction. - Proceedings of the Fifteenth ль Symposium on Operation Systems Principles, December 1995. LIED96 Liedtke J. Toward Real Microkernels. — Communications of the ww. tember 1996. „ , __ *,.__« __ In MUKH96Mukherjee В., Karsten S. Operating Systems for Parallel Machines. ? Parallel Computers: Theory and Practice. Ed. by T. Casavant, P. TytKik ш Plasil. - Los Alamitos, CA: IEEE Computer Society Press, 1996. PHAM96 Pham Т.. Garg P. Multithreaded Programming with Windows Nl. Saddle River, NJ: Prentice Hall, 1996. . ^ t_ ^_ _ ^ ^_^-^ 4.4. 4,9. ЗАДАЧИ :Щ7Ш$~1 ^•* .1. Отмечено, что использование нескольких потоков в одном и том же U обладает следующими преимуществами: (1) создание нового потока У^ сГ ществующем процессе требует меньших непроизводительных затра , ^^ дание нового процесса, и (2) упрощается обмен информацией между_ т одного процесса. Входит ли в число преимуществ использования по* ио Часть 2. П оП же то, что переключение потоков одного процесса требует меньших затрат, чем переключение потоков разных процессов? При сравнении потоков на пользовательском уровне и потоков на уровне ядра упоминалось, что недостаток потоков на пользовательском уровне состоит в том, что выполнение системного вызова блокирует не только вызвавший поток, но и все остальные потоки данного процесса. Почему так происходит? То, что в других операционных системах воплощено в концепции процесса, в операционной системе OS/2 разделено на три составляющих: сессия, процессы и потоки. Сессия является набором одного или нескольких процессов, имеющих связь с интерфейсом пользователя (клавиатурой, дисплеем, мышью). Сессия представляет собой интерактивное пользовательское приложение, в роли которого может выступать текстовый редактор или электронная таблица. Эта концепция позволяет пользователю персонального компьютера запускать несколько приложений, открывая в каждом из них одно или несколько окон. Операционная система должна следить за тем, какое из окон, а следовательно, какая из сессий является активной. В зависимости от этого ввод, поступающий с клавиатуры и мыши, направляется в ту или иную сессию. В любой момент времени одна сессия обрабатывается на переднем плане, тогда как остальные сессии находятся в фоновом режиме. Все, что вводится с помощью клавиатуры и мыши, направляется в процесс, сессия которого в соответствии с состоянием приложений находится в приоритетном режиме. Когда сессия находится на переднем плане, процесс, выводящий видеосигнал, пересылает его непосредственно в видеобуфер и, соответственно, на экран пользователя. При переходе сессии в фоновый режим содержимое физического видеобуфера сохраняется в логическом видеобуфере. Если какой-нибудь из потоков любого процесса, относящегося к сессии в фоновом режиме, производит вывод на экран, этот вывод направляется в соответствующий логический видеобуфер. Когда сессия возвращается на передний план, происходит обновление экрана, отражающее текущее содержимое логического видеобуфера этой сессии. Исключив сессии и связав интерфейс пользователя (клавиатуру, мышь, экран) с процессами, можно свести количество концепций, имеющих отношение к процессу, к двум. Таким образом, в каждый момент времени на переднем плане будет находиться один процесс. В целях структурирования процессы можно разделить на потоки. а. Какие преимущества теряются при таком подходе? б. Если такая модификация будет реализована, как следует осуществлять назначение ресурсов (памяти, файлов и т.д.) — на уровне процесса или на уровне потока? Рассмотрим среду, в которой осуществляется взаимно однозначное отображение между потоками на пользовательском уровне и потоками на уровне ядра. В такой системе один или несколько потоков одного и того же процесса могут производить блокирующие системные вызовы, в то время как другие будут продолжать выполняться. Объясните, почему на однопроцессорной машине в такой системе многопроцессорные программы могут выполняться быстрее, чем и* однопоточные двойники. Ьсли процесс завершается, но какие-то его потоки все еще выполняются, то будут ли они выполняться и далее? Структурирование операционной системы OS/390, предназначенной для мейн- Фреймов, основано на концепциях адресного пространства и задания. В других операционных системах адресное пространство, грубо говоря, соответствует приложению и более или менее соответствует процессу. В рамках одного и того Же адресного пространства можно одновременно создавать и выполнять не- 4. Потоки, симметпичняя mv АК>
сколько заданий, что приближенно соответствует концепции многопоточн Для управления этими заданиями создается ряд структур данных, двеj^ торых являются основными. Независимо от того, является ли данное ад ^ пространство выполняющимся или нет, в соответствующем управляют^ дЛо ке адресного пространства (address space control block — ASCB) содержите необходимая операционной системе OS/390 информация. В ее состав; Чод текущий приоритет, размер выделенной данному адресному пространству г* альной и виртуальной памяти, количество готовых к выполнению заданий в адресном пространстве, а также сведения о том, является ли каждое з этих заданий выгруженным из памяти или нет. В управляющем блоке задания (t \ control block — ТСВ) отражается выполнение пользовательской программы. В нем содержится информация, необходимая для управления заданием в пределах адресного пространства, включая информацию о статусе процессора, указатели на входящие в состав задания программы и состояние выполнения задания. Блоки ASCB являются глобальными структурами, поддерживаемыми в системной памяти, а блоки ТСВ — локальными структурами, каждая из которых поддерживается в своем адресном пространстве. В чем состоит преимущество разделения управляющей информации на глобальную и локальную части? К многопроцессорной системе с 8 процессорами подключены 20 лентопротяэк ных устройств. В систему поступает большое количество заданий, причем ка ждое из них для завершения требует максимум 4 лентопротяжных устрр ства. Предположим, что каждое задание начинает выполняться с требованием только трех устройств; четвертое ему потребуется только через достаточно продолжительный срок, причем будет использоваться очень недолго. Предположи* также, что источник заданий бесконечен. , . .$* а. Допустим, что планировщик операционной системы не запускает зад е до тех пор, пока не становятся доступными четыре устройства. В начале рабо ты задания за ним закрепляются четыре устройства, которые освобб ают ся только по завершении задания. Чему равно максимальное количество за даний, которые могут одновременно выполняться в такой системе? Чему равно минимальное и максимальное количество лентопротяжных уст ойств. которые могут оказаться простаивающими при такой стратегии? \& б. Предложите альтернативную стратегию для повышения степени иезтоль30* вания лентопротяжных устройств, которая в то же время позволЯ т избежать взаимоблокировок. Чему равно максимальное количество одно$ремен но выполняющихся заданий? Какой величиной ограничено количество простаивающих лентопротяжных устройств? 1$ В описании состояний потоков на пользовательском уровне в операционной системе Solaris говорилось о том, что поток пользовательского уровня* мо" ет уступить управление другому потоку с таким же приоритетом. Возможна л ситуация, когда в системе находится готовый к выполнению поток с боцее вы соким приоритетом, и, следовательно, выполняющийся поток уступит -■ п а ление потоку с таким же или более высоким приоритетом? ■■%>_ Часть 2. ПрбП ГЛАВА Параллельные вычисления: взаимоисключения и многозадачность 5.1. Принципы параллельных вычислений 5.2. Взаимоисключения: программный подход 5.3. Взаимоисключения: аппаратная поддержка 5.4. Семафоры 5.5. Мониторы 5.6. Передача сообщений 5.7. Задача читателей/писателей 5.8. Резюме, ключевые термины и контрольные вопросы 5.9. Рекомендуемая литература 5.10. Задачи 5
э сновные вопросы, на которых сосредотачивается внимание разработчик операционных систем, связаны с управлением процессами и потоками. • Многозадачность: управление множеством процессов в однопроцессорн системе. • Многопроцессорность: управление множеством процессов в многопроцессорной системе. • распределенные вычисления: управление множеством процессов, рыпол няемых в распределенной вычислительной системе с множеством компьютеров. Основным примером таких систем являются широко распроетр ем- ные в последнее время кластеры. ;. ■ Фундаментальной концепцией этой области, да и разработки операционных тстем в целом, является концепция параллельных вычислений (concurrency). араллельность охватывает множество вопросов разработки, включая вопросы Змена информацией между процессами, разделения ресурсов, синхронизацию аботы процессов и распределение процессорного времени между разя* ыми роцессами. Вы увидите, что эти вопросы возникают не только в многрпроцес- >рной или распределенной вычислительной среде, но и в случае многозадачных 1стем на базе одного процессора. ; Параллельность проявляется в трех различных контекстах. ■! • Множественные приложения: многозадачность разработана для того, чтобы позволить динамически разделять процессорное время между рядом активных приложений. j1 • Структурность приложений: в качестве развития парадигмы модульной разработки и структурного программирования некоторые приложений могут быть разработаны как множество параллельно работающих процессов. • Структура операционной системы: преимущества структурного программирования доступны не только прикладным, но и системным программистам, и, как вы знаете, операционные системы также зачастую реализуются в виде набора процессов или потоков. Г В силу важности данного вопроса ему посвящены четыре главы даяяо J шги. В настоящей и следующей главах рассматривается параллельность в кон- ксте многопроцессорности и многозадачности; в главах 13, "Распределенные -гчисления, архитектура клиент/сервер и кластеры", и 14, "Управление определенными процессами", изложены вопросы параллельных вычислении в штексте распределенных вычислений. Хотя оставшаяся часть книги охватыва различные важные темы разработки операционных систем, параллель е выселения играют главную роль при рассмотрении этих тем. ., Данная глава начинается с введения в концепции параллельных ВЬ| .йсЛ 1й и параллельного выполнения ряда процессов1. Вы узнаете, что осЯО Н ебованием поддержки параллельных процессов является возможность -с п Для простоты мы говорим о параллельном выполнении процессов; е с ^ 'льноети в ряде систем фундаментальной единицей параллельности являете ее, а поток. Ш Часть 2. Прруг к i ft еН1.£Я взаимоисключений, т.е. возможность обеспечить работу только одного р0цесса с остановкой выполнения всех остальных. В следующем разделе будут рассмотрены различные подходы к обеспечению взаимоисключений. Все они являются программными решениями и требуют использования технологии, известной как пережидание занятости (busy waiting). Затем мы остановимся на некоторых аппаратных механизмах, способных обеспечить поддержку взаимоисключений, а также решениях, которые не используют пережидание занятости и ]ушгут поддерживаться операционной системой или компиляторами. Мы рассмотрим три подхода: семафоры, мониторы и передачу сообщений. Для иллюстрации концепций и сравнения представленных в этой главе подходов используются две классические задачи. Сперва мы познакомимся с задачей производителей/потребителей, а затем — с задачей читателей/писателей. Наше изучение параллельных вычислений продолжится в главе 6, "Взаимоблокировка и голодание", и обсуждение механизмов параллельности рассматриваемых нами операционных систем мы отложим до ее конца. Г5.1. ПРИНЦИПЫ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ В однопроцессорной многозадачной системе процессы чередуются для создания иллюзии одновременного выполнения (см. рис. 2.12,а). Несмотря на то что при этом не достигается реальная параллельная работа процессов и, более того, имеются определенные накладные расходы, связанные с переключением между процессами, такое чередующееся выполнение обеспечивает немалые выгоды с точки зрения эффективности и структуризации программ. В многопроцессорных системах возможно не только чередование процессов, но и их перекрытие (см. рис. 2.12,6). На первый взгляд может показаться, что чередование и перекрытие представляют собой принципиально отличающиеся режимы работы и, соответственно, при этом возникают различные проблемы. Однако в действительности обе технологии, которые можно рассматривать как примеры параллельных вычислений, порождают одинаковые проблемы. В однопроцессорных системах проблемы вытекают из основных характеристик многозадачных систем: невозможно предсказать относительную скорость выполнения процессов. Она зависит от других процессов, способа обработки прерываний операционной системой и стратегий планирования операционной систе- ы- При этом возникают следующие трудности. ■ Разделение глобальных ресурсов чревато опасностями. Например, если два пРоцесса используют одну глобальную переменную и оба выполняют чтение и запись этой переменной, то критическим оказывается порядок чтения и записи этой переменной разными процессами. Пример такой проблемы приведен в следующем подразделе. перационной системе трудно управлять распределением ресурсов опти- альным образом. Например, процесс А может затребовать и получить кон- Роль над некоторым каналом ввода-вывода, после чего временно приоста- вить работу. Нежелательно, чтобы операционная система при этом бло- "Ровала канал и не давала другим процессам возможности использовать V. , ^ ¥■ ^" Параллельные вычисления: взаимоисключения... 247
. '■*> его — такая политика может привести к возникновению условий в ^Q блокировки, описываемых в главе 6, "Взаимоблокировка и голодание"»' 3. Становится очень трудно обнаружить программную ошибку, поскольку обычно результат работы программы перестает быть детерминированным и воспроизводимым (см., например, [LEBL87, CARR89]). Все описанные трудности имеются в наличии и в многопроцессорной СТе_ е, поскольку и в этом случае относительная скорость выполнения процессов епредсказуема. Многопроцессорная система, кроме того, должна быть в с"' ?оя- ии разрешить проблемы, возникающие вследствие одновременного выпол" ения ескольких процессов. Однако в основе своей эти проблемы те же, что и в одно- роцессорной системе. Окончательно ясно это станет в процессе работы с мате- иалом данной главы. Тростой пример Рассмотрим следующую процедуру: roid echo () chin = getchar{); chout = chin; putchar(chout); Она демонстрирует основные элементы отображения вводимых символов. Входной символ, получаемый с клавиатуры, сохраняется в переменной cha, ; по- :ле этого значение переменной chin присваивается переменной chout и^выводится на экран. Данная процедура может неоднократно вызываться любым процессом для получения ввода пользователя и отображения его на экране. "*ф Теперь представим, что у нас имеется однопроцессорная многозадачная система, поддерживающая единственного пользователя. Пользователь може* переходить от одного приложения к другому; при этом все приложения исп "„ ьзмот одну и ту же клавиатуру и экран. Поскольку рассматриваемая нами npou^vpa нужна всем приложениям, имеет смысл сделать ее разделяемой процедурой, загружаемой в часть памяти, глобальную для всех приложений (таким о разом- имеется только одна копия процедуры, и тем самым экономится память).^ Разделение основной памяти между процессами способствует эффек пзно и тесному взаимодействию процессов. Однако такое разделение может цривест к проблемам. Рассмотрим последовательность событий. 1. Процесс Р1 вызывает процедуру echo и прерывается немедленно по\ ып нении функции getchar. В этот момент последний введенный симв л * хранен в переменной chin. ,-' 2. Активируется процесс Р2, который вызывает процедуру echo. Эта oU pa выполняется до конца; при этом считывается с клавиатуры и выво;* на экран очередной символ у. >; 3. Продолжается выполнение процесса Р1. Однако к этому моменту з 1аЧ х в переменной chin перезаписано — теперь эта переменная содерзКиТ чение у, которое присваивается переменной chout и выводится на з Ра Часть 2. П о Таким образом, первый введенный символ благополучно теряется, зато второй -чзывается выведенным на экран дважды. Проблема заключается в разделяемой бальной переменной chin, к которой обращаются несколько процессов; если один птюцесс изменяет глобальную переменную и затем прерывается, другой может успеть вменить ее значение, перед тем как первый процесс им воспользуется. Предположим теперь, что выполнять процедуру одновременно процессы не могут. В таком пучае описанная ранее последовательность действий выглядит иначе. jr Процесс Р1 вызывает процедуру echo и прерывается немедленно по выполнении функции getchar. В этот момент последний введенный символ х сохранен в переменной chin. 2. Активируется процесс Р2, который вызывает процедуру echo. Однако, поскольку приостановленный процесс Р1 находится в процедуре echo, P2 блокируется от входа в данную процедуру. Следовательно, выполнение Р2 приостанавливается до тех пор, пока процедура echo не окажется свободной. 3. В некоторый более поздний момент продолжается выполнение процесса Р1, который завершает выполнение процедуры echo, выводя на экран верный символ — х. 4. После того как Р1 покидает echo, блокировка Р2 удаляется и позже, при возобновлении работы процесса Р2, им успешно выполняется процедура echo- Урок, который следует извлечь из данного примера, заключается в том, что разделяемые глобальные переменные (как и другие разделяемые глобальные ресурсы) нуждаются в защите, и единственный способ сделать это состоит в управлении кодом, осуществляющим доступ к этим переменным. Если мы добьемся того, что в определенный момент времени только один процесс сможет входить в процедуру echo и она обязательно будет полностью зыполнена вошедшим в нее процессом до того, как станет возможно выполнение ее другим процессом, то мы будем застрахованы от возникновения рассматриваемой ошибки. Каким образом этого добиться — основной вопрос данной главы. Мы предполагали, что имеем дело с однопроцессорной многозадачной операционной системой. Пример продемонстрировал, что проблема может возникнуть даже в этом случае. В многопроцессорной системе возникает та же проблема защиты разделяемых ресурсов, которая имеет аналогичное решение. Сперва предположим, что Механизм управления доступом к разделяемой глобальной переменной отсутствует. *■ Одновременно выполняются процессы Р1 и Р2 — каждый на своем процессоре. Оба процесса вызывают процедуру echo. • Происходят следующие события (события в одной строке происходят параллельно): Процесс Р1 Процесс Р2 in = getchar(); chout = chin; chnm-"- ь- " Putchar(chout); h°Ut " Chln; in = getchar(}; chout = chin; • putchar(chout); Г »&- ** 5- Параллельные вычисления: вэаимоисключен™
результате символ, введенный в процессе Р1, теряется до того, как <i дет 2H на экран, и обоими процессами выводится символ, считанный пррцес_ 2. Теперь добавим в систему механизм, гарантирующий, что в процедур- в любой момент времени может находиться только один процесс. В том ? последовательность событий становится такой. щ >дновременно выполняются процессы Р1 и Р2 — каждый на своем процес- оре. Процесс Р1 вызывает процедуру echo. J то время как процесс Р1 находится в процедуре echo, эту же процедуру Въг- ывает процесс Р2. Однако, поскольку процесс Р1 находится в процедуре сг неважно, выполняется ли в этот момент процесс Р1 или приостановлен), Р2 шокируется от входа в данную процедуру. Следовательно, выполнение Р2 при- >станавливается до тех пор, пока процедура echo не окажется свободной. 3 некоторый более поздний момент времени выполнение процессом Р1 р0- л,едуры echo завершается, после чего немедленно продолжается выполне ие iponecca P2 и им успешно выполняется процедура echo. t В однопроцессорной системе причина возникновения проблемы заключается в что прерывание может остановить выполнение процесса в произвольном- есте. эгопроцессорной системе условия работы те же, но проблема может возникнуть за того, что два выполняющихся одновременно процесса могут в один мент ;ни обратиться к одной глобальной переменной. Однако решение проблем, оогос 1 одно и то же: управление доступом к разделяемым ресурсам. 1 с, -I 1стие операционной системы £. Можно перечислить следующие вопросы конструирования и управления ационных систем, возникающие из-за наличия параллельных вычислении. ■А* Операционная система должна быть способна отслеживать различные активные процессы. Это осуществляется при помощи управляющих блоков процессов, как описано в главе 4, "Потоки, симметричная мультипроце сорная обработка и микроядра". Операционная система должна распределять и освобождать различ е р - сурсы для каждого активного процесса, в том числе следующие. ;?. • Процессорное время: это функция планирования, рассматриваемая^ час ти 4, "Планирование". /л • Память: большинство операционных систем используют схему в ной памяти. Этот вопрос рассматривается в части 3, "Память". • Файлы: обсуждаются в главе 12, "Управление файлами". 4.^ • Устройства ввода-вывода: обсуждаются в главе 11, "Управление в; ° выводом и дисковое планирование". ?"' Операционная система должна защищать данные и физические ресурс ждого процесса от непреднамеренного воздействия других процессе , включает использование технологий, применяющихся для работы с п& тью, файлами и устройствами ввода-вывода. Обсуждение вопросов #** можно найти в главе 15, "Безопасность". f О Часть 2. Пр не л Результат работы процесса не должен зависеть от скорости его выполнения по отношению к другим параллельно выполняющимся процессам. Этому вопросу посвящена данная глава. Чтобы лучше понять вопросы независимости работы процессов от относительной скорости выполнения, рассмотрим сначала способы взаимодействия процессов. Взаимодействие процессов Способы взаимодействия процессов можно классифицировать по степени осведомленности одного процесса о существовании другого. В табл. 5.1 перечислены три возможные степени осведомленности. • Процессы не осведомлены о наличии друг друга. Это независимые процессы, не предназначенные для совместной работы. Наилучшим примером такой ситуации может служить многозадачность множества независимых процессов. Это могут быть пакетные задания, интерактивные сессии или смесь тех и других. Хотя эти процессы и не работают совместно, операционная система должна решать вопросы конкурентного использования ресурсов. Например, два независимых приложения могут затребовать доступ к одному и тому же диску или к принтеру. Операционная система должна регулировать такие обращения. • Процессы косвенно осведомлены о наличии друг друга. Эти процессы не обязательно должны быть осведомлены о наличии друг друга с точностью до идентификатора процесса, однако они разделяют доступ к некоторому объекту, например буферу ввода-вывода. Такие процессы демонстрируют сотрудничество при разделении общего объекта. • Процессы непосредственно осведомлены о наличии друг друга. Такие процессы способны общаться один с другим с использованием идентификаторов процессов и изначально созданы для совместной работы. Эти процессы также демонстрируют сотрудничество при работе. Условия работы процессов не всегда можно определить так ясно и четко, Ка« указано в табл. 5.1; более того, некоторые процессы одновременно проявляют способность и к конкуренции, и к сотрудничеству. Тем не менее рассмотрим приведенный список и определим участие операционной системы в перечисленных в нем ситуациях. J^XHna 5.1. Взаимодействие процессов Степень и •-Л^З^ленности Взаимосвязь Влияние одного процесса на другой Потенциальные проблемы *°*!лен ,Цессы не осве- ы ДРУГ о друге Конкуренция Результат работы одного процесса не зависит от действий других Возможно влияние одного процесса на время работы другого Взаимоисключения Взаимобл окиров к и (возобновляемые ресурсы) Голодание V а 5- Параллельные вычисления: взаимоисключения... 251
■V Окончание rri юцессы косвенно 5едомлены о начни ДРУГ ДРУга Сотрудничество с использованием разделения юцессы непосред- зенно осведомле- t о наличии друг vra Сотрудничество с использованием связи Результат работы одного процесса может зависеть от информации, полученной от других Возможно влияние одного процесса на время работы другого Результат работы одного процесса может зависеть от информа- ции, полученной от других Возможно влияние одного процесса на время работы другого • Взаимоисюпо^ • Взаимоблока (возобновляв' ресурсы) - А • Голодание У' т • Связь данные Взаимоблой (расходуемое ресурсы) % Голодание L. 01 1 Конкуренция процессов в борьбе за ресурсы При необходимости использовать один и тот же ресурс параллельные ггро- !ссы вступают в конфликт друг с другом. В чистом виде ситуацию можно опить следующим образом. В процессе работы два или более процесса нуждаются доступе к некоторому ресурсу. Каждый из процессов не подозревает он шчлг тальных и не подвергается никакому воздействию с их стороны. Отсюда след ', что каждый процесс не должен изменять состояние любого ресурса, с кото- jm он работает. Примерами таких ресурсов могут быть устройства в "> а- лвода, память, процессорное время и часы. Между конкурирующими процессами не происходит никакого обмена ин эрмацией. Однако выполнение одного процесса может повлиять на повед ни энкурирующего процесса. В частности, если два процесса желают пол и»ь >ступ к одному ресурсу, то операционная система выделит этот ресурс дном J процессов, в то время как второй процесс вынужден будет ожидать зав пя работы с ресурсом первого. Таким образом, скорость работы процесс , )му отказано в немедленном доступе к ресурсу, уменьшается. В пред& гучае блокированный процесс может никогда не получить доступ к гсдовательно, никогда не сможет успешно завершиться. Ф В случае конкуренции процессов мы сталкиваемся с тремя пробл*^ ервая их них — необходимость взаимных исключений (mutual exel } г редположим, что два или большее количество процессов требуют доступ. ° ому неразделяемому ресурсу, такому, как принтер. При выполнении к. роцесс посылает команды в устройство ввода-вывода, получает информй, по состоянии, посылает и/или получает данные. Мы будем говорить о та&, /рее как о критическом ресурсе, а о части программы, которая его ис г, — как о критическом разделе (critical section) программы. Крайне , гобы в критическом разделе в любой момент времени могла находиться^,, цна программа. Мы не можем полагаться на то, что операционная слете Р ознает ситуацию и выполнит это условие, поскольку полные требования • урсу могут оказаться не очевидными. Например, во время печати файла ш ото- но V » м 52 Часть 2. При тся, чтобы отдельный процесс имел полный контроль над принтером, иначе на fivMare можно получить чередование строк двух файлов. Осуществление взаимных исключений создает две дополнительные проблемы- Одна из них — взаимная блокировка (deadlock). Рассмотрим, например, два оцеСса — Р1 и Р2, и два ресурса — R1 и R2. Предположим, что каждому про- teccv Для выполнения части своих функций требуется доступ к обоим ресурсам. Тогда возможно возникновение следующей ситуации: операционная система выделяет ресурс R1 процессу Р2, а ресурс R2 — процессу Р1. В результате каждый процесс ожидает получения одного из двух ресурсов; при этом ни один из них не освобождает уже имеющийся у него ресурс, ожидая получения второго ресурса для выполнения функций, требующих наличия двух ресурсов. В результате процессы оказываются взаимно заблокированы. Последняя проблема — голодание. Предположим, что у нас имеются три процесса (PI, P2, РЗ), каждому из которых периодически требуется доступ к ресурсу R. Представим ситуацию, в которой Р1 обладает ресурсом, а Р2 и РЗ приостановлены в ожидании освобождения ресурса. После выхода Р1 из критического раздела доступ к ресурсу будет получен одним из процессов Р2 и РЗ. Пусть операционная система предоставила доступ к ресурсу R процессу РЗ. Пока он работает с ресурсом, доступ к ресурсу вновь требуется процессу Р1. В результате по освобождении ресурса процессом РЗ может оказаться, что операционная система вновь предоставила доступ к ресурсу процессу Р1; тем временем процессу РЗ вновь требуется доступ к ресурсу R. Таким образом, теоретически возможна ситуация, в которой процесс Р2 никогда не получит доступа к требуемому ему ресурсу, несмотря на то что никакой взаимной блокировки в этом случае нет. Управление конкуренцией неизбежно приводит к участию операционной системы в этом процессе, поскольку именно она распределяет ресурсы. Кроме того, процессам необходима возможность запрашивать взаимоисключение, такое, как блокировка ресурса перед его использованием. Любое решение этого вопроса требует поддержки операционной системы, например, такой, как обеспечение возможности блокировки. В листинге 5.1 показан абстрактный механизм взаимоисключений. Конструкция parbegin(Pl, Р2,..., Рп) означает приостановку выполнения основной программы, запуск параллельного выполнения процедур Р1,Р2,...,Рл и ожидание их завершения. По завершении всех запущенных процедур основная программа продолжает свою работу. В листинге 5.1 параллельно выполняются п пРоцессов. Каждый процесс включает (1) критический раздел, работающий с неко- рым ресурсом, идентификатором которого является целое число, и (2) остальную сть процедуры, в которой нет обращения к ресурсу. Для обеспечения взаимоис- *очения имеются две функции: entercritical и exitcritical. Каждая из них имает в качестве аргумента имя ресурса, являющегося предметом конкурен- ■ Любой процесс, который пытается войти в критический раздел в то время, нем находится другой процесс, будет приостановлен. ций ам остается только рассмотреть механизм, обеспечивающий работу функ- » _, *-t6rcritical и exitcritical. Однако пока что мы отложим этот вопрос удим к рассмотрению других случаев взаимодействия процессов. ^"*"---^J^**-1- Взаимные исключения /* Пп c°nst0l,paMMa взаимоисключений */ п = /* количество процессов */ г. v л 5 гт !&•§ " 11аРаллельные вычисления: взаимоисключения... 253
void PUnt i) t while(true) { entercritical (i) ; /+ Критический раздеп */; exitcritical{i); ..t,'- /* Остальная часть процедуры */; "% } sr '■t*t void main() f parbegin{P(R1)/P(R;) , . . - ,P(R.) ) ) ; } -:Ч 1.4*' '■и Сотрудничество с использованием разделения Случай сотрудничества с использованием разделения охватывает процессы взаимодействующие с другими процессами без наличия явной информации о них. Например, несколько процессов могут обращаться к разделяемым переменным или к совместно используемым файлам или базам данных. Процессы могут использовать и обновлять разделяемые данные без обращения к другим процессам, но с учетом того, что последние также могут обращаться к тем же энным. Таким образом, процессы должны сотрудничать, для того чтобы гаравГ 1ровать корректную работу с совместно используемыми данными. Механизм упр пения доступом должен гарантировать целостность совместно используемых данных Поскольку данные хранятся в ресурсах (устройствах, памяти), в этом сту- чае также наличествуют проблемы взаимоблокировок, взаимоисключения и голодания. Единственное отличие заключается в том, что доступ к данньШ может осуществляться в двух режимах — чтения и записи, и взаимоисключающими должны быть только операции записи. .^ Однако в данном случае вносится новое требование — согласованности данных. В качестве простейшего примера рассмотрим бухгалтерское ^приложение, в котором могут обновляться различные данные. Предположим, что два элемента данных, а и Ь, должны быть связаны соотношением а. ^ Ь, так что любая программа, изменяющая одно значение, обязана изменив i ДРУ гое, с тем чтобы это соотношение продолжало выполняться. Теперь .рассмотрим следующие два процесса: ,ч P1 : ч'Г а = а + 1; ^ о = ь + 1; У' Р2: % b = 2 * Ь; '7? а = 2 * а; ?* Если изначально состояние данных согласованно, то каждый процеС отдельности не нарушает согласованности данных. Но что если при яаР лельном вычислении будет выполнена такая последовательность де сТВ' которая соблюдает условия взаимоисключений при работе с каждым 1С' том данных (а и Ь): ->• i 254 Часть 2. П он* •£■ г. В и. ■i г. а = а + 1 * b = 2 * b ; b = b + 1 a - 2 * a тдосле выполнения этой последовательности действий условие а = b стано- тСя неверным. Например, если изначально а = b = 1, то по завершении вы- яслений о. = 4 и Ь = 3. Проблема решается путем объявления критическим разлом каждой из последовательностей инструкций. Таким образом, значение концепции критических разделов не уменьшается в случае сотрудничества с использованием разделения. Здесь также могут использоваться рассмотренные нами ранее (см. листинг 5.1) абстрактные функции entercritical и exitcritical. В данном случае аргументами этих функций могут быть переменные, файлы или любые другие разделяемые объекты. Более того, если критические разделы используются для обеспечения целостности данных, то выступающего в роли аргумента функции определенного ресурса или определенной переменной может и не существовать. В таком случае мы можем рассматривать аргумент как идентификатор, разделяемый между параллельными процессами и определяющий критический раздел кода, который должен быть защищен взаимным исключением. Сотрудничество с использованием связи В рассмотренных нами случаях каждый процесс имел собственное изолированное окружение, не включающее в себя другие процессы. Взаимодействие между процессами было сугубо косвенным, и в обоих случаях наблюдалось совместное использование. В случае конкуренции процессы совместно использовали ресурсы, не имея информации о существовании друг друга; в случае сотрудничества процессы, не будучи осведомлены явно о наличии других процессов, тем не менее принимают меры к поддержанию целостности данных. При сотрудничестве с использованием связи различные процессы принимают участие в общей работе, которая и объединяет их. Связь обеспечивает возможность синхронизации, ■ли координации, различных действий процессов. Обычно можно считать, что связь состоит из сообщений определенного вида' Примитивы для отправки и получения сообщений могут быть предоставлены зыком программирования или ядром операционной системы. Поскольку в процессе передачи сообщений не происходит какого-либо местного использования ресурсов, в этом случае сотрудничества взаимо- лючения не требуются (хотя проблемы взаимоблокировок и голодания осев ТСЯ актУальны)- В качестве примера взаимоблокировки можно привести со рЦИго' ПРИ которой каждый из двух процессов заблокирован ожиданием дую ия от ДРУгого процесса. Голодание можно проиллюстрировать сле- Щим примером. Рассмотрим три процесса: Р1, Р2 и РЗ. Процесс Р1 мно- таю пытается связаться с процессами Р2 и РЗ, а те, в свою очередь, пы- ***сс Я связаться с процессом Р1. Может возникнуть ситуация, когда про- **бл И ^2 постоянно связываются друг с другом, а процесс РЗ остается •*°ск КИрованным> ожидая связи с процессом Р1. Это не взаимоблокировка, льку процесс Р1 при этом остается активен. ^5. Параллельные вычисления: взаимоисключения... 255
'* Требования к взаимным исключениям ;' Любая возможность обеспечения поддержки взаимных исключений до R соответствовать следующим требованиям. ? 1. Взаимоисключения должны осуществляться в принудительном поряди ъ любой момент времени из всех процессов, имеющих критический здел для одного и того же ресурса или разделяемого объекта, в этом разд 0_ жет находиться лишь только один процесс. -vjt 2. Процесс, завершающий работу в некритическом разделе, не должен я^ на другие процессы. .$ 3. Не должна возникать ситуация бесконечного ожидания доступа к кри е. скому разделу (т.е. не должны появляться взаимоблокировки и голода^ е). 4. Когда в критическом разделе нет ни одного процесса, любой процесс, «з просивший возможность входа в него, должен немедленно ее получить. »>''."" 5. Не делается никаких предположений о количестве процессов или их, носите л ьных скоростях работы. У 6. Процесс остается в критическом разделе только в течение ограниче ного времени. ^ Имеется ряд способов удовлетворения перечисленным условиям. Одн м из них является передача ответственности за соответствие требованиям } . ому процессу, который должен выполняться параллельно. Таким образом, и цесс, независимо от того, является ли он системной программой или прилозк^ *ем, должен координировать свои действия с другими процессами для работй,. взаимоисключений без поддержки со стороны языка программирования или\;о ера- ционной системы. Мы можем говорить о таком подходе как о программ . Щ Хотя этот подход чреват большими накладными расходами и возможными ОТ токами, чрезвычайно полезно рассмотреть его для лучшего пои мания сложностей, связанных с параллельными вычислениями. Этот вопрос бу ё рассмотрен в разделе 5.2. Другой подход, рассматриваемый в разделе 5.3, вкл чае" использование машинных команд специального назначения. Достоинству _ того подхода заключается в снижении накладных расходов, но такой подход ■'_; Ше- случае проблему не решает. Еще один подход заключается в предоставлен. оП" ределенного уровня поддержки со стороны операционной системы ИЛИ* зыка программирования. Наиболее важные части такого подхода к решению Й б1е мы взаимоисключений рассматриваются в разделах 5.4-5.6. ' f 5.2. ВЗАИМОИСКЛЮЧЕНИЯ: ЩОГРА^ I )■ у ?ПОДХОД- - ' .' "-"'***' Программный подход может быть реализован для параллельных проде которые выполняются как в однопроцессорной, так и в много процессорно теме с разделяемой основной памятью. Обычно такие подходы предпол элементарные взаимоисключения на уровне доступа к памяти ([LAMP91J также задачу 5.10) — т.е. одновременный доступ (чтение и/или запись) к о и той же ячейке основной памяти упорядочивается при помощи некото ото 256 Часть 2. П "■г* х&низма (при этом порядок предоставления доступа не определяется порядком обращения процессов за доступом к памяти). Никакой иной поддержки со стороны аппаратного обеспечения, операционной системы или языка программирования не предполагается. Алгоритм Деккера Дейкстра в [DIJK65] приводит алгоритм для взаимных исключений для двух процессов, предложенный голландским математиком Деккером (Dekker). Следуя Дейкстре, мы разработаем этот алгоритм постадийно. Главное преимущество такого подхода — в демонстрации множества узких мест и возможных ошибок при создании параллельно работающих программ. Первая попытка Как упоминалось ранее, любая попытка взаимного исключения должна опираться на некий фундаментальный механизм исключений аппаратного обеспечения. Наиболее общим механизмом может служить ограничение, согласно которому к некоторой ячейке памяти в определенный момент времени может осуществляться только одно обращение. Воспользовавшись этим ограничением, зарезервируем глобальную ячейку памяти, которую назовем turn. Процесс (РО или Р1), который намерен выполнить критический раздел, сначала проверяет содержимое ячейки памяти turn. Если значение turn равно номеру процесса, то процесс может войти в критический раздел; в противном случае он должен ждать, постоянно опрашивая значение turn до тех пор, пока оно не позволит процессу войти в критический раздел. Такая процедура известна как пережидание занятости (busy waiting), поскольку процесс вынужден, по сути, не делать ничего полезного до тех пор, пока не получит разрешение на вход в критический раздел. Более того, он постоянно опрашивает значение переменной и тем самым потребляет процессорное время. После того как процесс, получивший право на вход в критический раздел, выходит из него по завершении работы, он должен обновить значение turn, присвоив ему номер другого процесса. Говоря формально, имеется глобальная переменная int turn = 0; На рис. 5.1,а показана программа для двух процессов. Это решение гаран- РУет корректную работу взаимоисключения, однако имеет два недостатка. Во- Рвых, при входе в критический раздел процессы должны строго чередоваться; ** самым скорость работы диктуется более медленным из двух процессов. Если 10л еССУ ^ в*од в критический раздел требуется раз в час, а процессору Р1 — раз в час, то темп работы Р1 будет таким же, как и у процесса РО. Во- Ппп гоРазД° более серьезная ситуация возникает в случае сбоя одного из fi сов — при этом второй процесс оказывается заблокирован (при этом не- °« происходит ли сбой процесса в критическом разделе или нет). Пр ПИСаННая К0НСТРУКДИЯ представляет собой сопрограмму (coroutine). Co- Ут> Ммы разрабатываются таким образом, чтобы быть способными передавать 'Дол Ление ДРУГ Другу. Однако хотя эта технология структурирования и весьма ' ид а Для отдельно взятого процесса, для поддержки параллельных вычисле- °к* не подходит. ^.* 5. Параллельные вычисления: взаимоисключения... 257
/* Процесс О */ while (turn != 0) /* Ничего не делаем */; /* Критический раздел */; turn = 1; /* Процесс 1 */ "" \ while (turn != 1) =/л /* Ничего не делаем */;$■ /* Критический раздел */; _* turn = 0; J. A а) Первая попытка /* Процесс 0 */ /* Процесс 1 */ while (flagll]) /* Ничего не делаем */; flag[0] = true; /* Критический раздел */; flaa[0] = false; б) Вторая попытка /* Процесс 0 */ flag[0] = truer- while (flagll]) /* Ничего не делаем */; /* Критический раздел */; flag[0] = falser- while (flag[0J) :■ /* Ничего не делаем */'Ка flagll] = true; " \w /* Критический раздел */; 4 ■ flagll] = false; A ■fi /* Процесс 1 */ %• ■:Ъг. flagll] - true; -^ while (flag[0И /* Ничего не делаем */#? /* Критический раздел */; --,,.. flagll] = false; **V в) Третья попытка /* Процесс О */ /* Процесс 1 */ tlag[0] = true; while (flagll]) { flag[0] = false; /* Задержка */ flag 10] = true; } /* Критический раздел */; flagtO] = false; • (г) Четвертая попытка Рис. 5.1. Попытки взаимных исключений flagll] = truer- while (flaglO]) { flagll] = false; /* Задержка */ flagll] = true; /* Критический раздел */; flagll] - false; ■-«■ J . Uk. 258 Часть 2. П « Вторая попытка Проблема при первой попытке заключается в том, что в ней хранилось имя р0цесса, который имел право входа в критический раздел, в то время как в действительности нам требуется информация об обоих процессах. По сути, каждый процесс должен иметь собственный ключ к критическому разделу, так что если паже произойдет сбой одного процесса, второй все равно сможет получить доступ к критическому разделу. Для удовлетворения этого условия определен логический вектор flag, в котором flagtO] соответствует процессу РО, a flagll] — процессу pi. Каждый процесс может ознакомиться с флагом другого процесса, но не может его изменить. Когда процессу требуется войти в критический раздел, он периодически проверяет состояние флага другого процесса до тех пор, пока тот не примет значение false, указывающее, что другой процесс покинул критический раздел. Процесс немедленно устанавливает значение своего собственного флага равным true и входит в критический раздел. По выходе из критического раздела процесс сбрасывает свой флаг, присваивая ему значение true. Теперь разделяемые переменные выглядят следующим образом: enum boolean { false = 0, true = 1; }; boolean flag[2] = { false, false }; Этот алгоритм показан на рис. 5.1,6. Теперь если произойдет сбой одного из процессов вне критического раздела (включая код установки значения флага), то второй процесс заблокирован не будет. Этот второй процесс в таком случае сможет входить в критический раздел всякий раз, как только это потребуется, поскольку флаг другого процесса всегда будет иметь значение false. Однако если сбой произойдет в критическом разделе (или перед входом в критический раздел, но после установки значения флага равным true), то другой процесс окажется навсегда заблокированным. Описанное решение, по сути, оказывается еще хуже предложенного ранее, поскольку даже не гарантирует взаимного исключения. Рассмотрим такую последовательность действий: Р0 выполняет инструкцию while и находит, что значение flag [1] равно false; PI выполняет инструкцию while и находит, что значение f lag[0] равно false; Р0 устанавливает значение flag [0] равным true и входит в критический раздел; Р1 Устанавливает значение flag[l] равным true и входит в критический раздел. Поскольку после этого оба процесса одновременно оказываются в критиче- Ком разделе, программа некорректна. Проблема заключается в том, что преданное решение не является независимым от относительной скорости выполнил процессов. Третья попытка Пи 0ск°льку процесс может изменить свое состояние после того, как другой чесе ознакомится с ним, но до того, как этот другой процесс войдет в кри- ■чческмй уд пи раздел, вторая попытка также оказалась неудачной. Возможно, нам йл%, Ся Вьшравить ситуацию внесением в код небольшого изменения, показан- *ОГо на рИс. 5.1,в. ак и ранее, если происходит сбой одного процесса в критическом разделе, в« код установки значения флага, то второй процесс окажется заблокиро- Гл ' ,.:а &. Параллельные вычисления: взаимоисключения... 259
шм (и соответственно, если сбой произойдет вне критического разд ла тл юй процесс блокирован не будет). "■; Далее проверим гарантированность взаимоисключения, проследив nD :ом РО. После того как процесс РО установит flag[0] равным true., Pi сет войти в критический раздел до тех пор, пока туда не войдет и.затем ве инет его процесс РО. Может оказаться так, что процесс Р1 уже находится в тическом разделе в тот момент, когда РО устанавливает свой флаг. В этом *ае процесс РО будет заблокирован инструкцией while до тех пор, пока Pi He инет критический раздел. Аналогичные действия происходят при рассмотре- : процесса Р1. / Тем самым гарантируется взаимное исключение; однако третья попытка ождает еще одну проблему. Если оба процесса установят значения флагов ными true до того, как один из них выполнит инструкцию while, то каж- i из процессов будет считать, что другой находится в критическом ра еле, и самым осуществится взаимоблокировка. *- .Л Четвертая попытка "*■ В третьей попытке установка процессом флага состояния выполнялась без та информации о состоянии другого процесса. Взаимоблокировка возникала той причине, что каждый процесс мог добиваться своих прав на вход в кри- [еский раздел и отсутствовала возможность отступить назад из имеющегося южения. Можно попытаться исправить ситуацию, делая процесс более тупчивыми": каждый процесс, устанавливая свой флаг равным trues, -казы- :т о своем желании войти в критический раздел, но готов отложить свой вход, "упая другому процессу, как показано на рис. 5.1,г. Это уже совсем близко к корректному решению, хотя все еще и еверно. Ешмоисключение гарантируется (в чем можно убедиться, применяя те же рас кдения, что и при третьей попытке), однако рассмотрим возможную последо- гельность событий: V ■ устанавливает значение flag[0] равным true; устанавливает значение flag[l] равным true; - ■£ проверяет f lag [ 1 ]; \ проверяет flag [ 0 ]; :-'& i устанавливает значение flag[0] равным false; \ устанавливает значение flag[l] равным false; Й*" I устанавливает значение flag[0] равным true; 'Щ . устанавливает значение flagfl] равным true. %: Эту последовательность можно продолжать до бесконечности — и и од процессов до бесконечности так и не сможет войти в критический разде- ■ 'рого говоря, это не взаимоблокировка, так как любое изменение относите |й скорости двух процессов разорвет замкнутый круг и позволит одном} юцессов войти в критический раздел. Назовем такую ситуацию неусхри1* (аимоблокировкой (livelock). Вспомним, что обычная взаимоблокировка ocv вляется, когда несколько процессов желают войти в критический р* с-51» i одному из них это не удается. В случае неустойчивой взаимоблокирО Kl M ествует приводящая к успеху последовательность действий, но, вмес с ^q Часть 2. оке? возможна и такая (такие), при которой ни один из процессов не сможет войти в критический раздел. Хотя описанный сценарий маловероятен и вряд ли такая последовательность продлится сколь-нибудь долго, тем не менее теоретически такая возможность имеется. Поэтому мы вынуждены отвергнуть как неудачную и чет- вертую попытку. Правильное решение У нас должна быть возможность следить за состоянием обоих процессов, что обеспечивается массивом flag. Но, как показала четвертая попытка, этого недостаточно. Мы должны навязать определенный порядок действий двум процессам, чтобы избежать проблемы "взаимной вежливости", с которой только что столкнулись. С этой целью можно использовать переменную turn из первой попытки. В нашем случае эта переменная указывает, какой из процессов имеет право на вход в критический раздел. Мы можем описать это решение следующим образом. Когда процесс РО намерен войти в критический раздел, он устанавливает свой флаг равным true, а затем проверяет состояние флага процесса Р1. Если он равен false, РО может немедленно входить в критический раздел; в противном случае РО обращается к переменной turn. Если turn = 0, это означает, что сейчас — очередь процесса РО на вход в критический раздел, и РО периодически проверяет состояние флага процесса Р1. Этот процесс, в свою очередь, в некоторый момент времени обнаруживает, что сейчас не его очередь для входа в критический раздел, и устанавливает свой флаг равным false, давая возможность процессу РО войти в критический раздел. После того как РО выйдет из критического раздела, он установит свой флаг равным false для освобождения критического раздела и присвоит переменной turn значение 1 для передачи прав на вход в критический раздел процессу Р1. Алгоритм Деккера приведен в листинге 5.2; его доказательство оставляется читателю в качестве упражнения (см. задачу 5.6). Листинг 5.2. Алгоритм Деккера boolean flag[2]; з-nt turn; void P0 () while(true) i flag [0J = true; while(flag[1]) if (turn == 1) { flag[0] = false; while(turn == 1) /* Ничего не делать */; flag[0] = true; } /* Критический раздел */• ;'». - turn = 1; \ flag[0] = false; /* Остальной код */; Гл к 5« Параллельные вычисления: взаимоисключения... 261
<й dPli) V, while (true) £ flag[l] = true; % while(flag[0]) ^ if (turn == 0) -'it { X flag[l] = false; while(turn == 0) /* Ничего не делать */; ;', flag[l] = true; ,ft } "I /* Критический раздел */; turn = 0; flag[l] = false; 'л /* Остальной код */; "V .d main () ■*>? flag[0] = false; -'* flagtl] = false; *:j> turn = 1; .*£," parbegin(P0,Pl); ■£'* >^ кгоритм Петерсона *f Алгоритм Деккера решает задачу взаимных исключений, но достаточно >жным путем, корректность которого не так легко доказать. Петерсоя iterson) предложил простое и элегантное решение [РЕТЕ81]. Как и ра ее, гло- гьная переменная flag указывает положение каждого процесса по отношению взаимоисключению, а глобальная переменная turn разрешает конфликты современности. Алгоритм представлен в листинге 5.3. гстинг 5.3. Алгоритм Петерсона для двух процессов --:* olean flag[2]; i t turn; .£'■* id P0() M ■Ы while(true) •#,, flagtO] = true; \£ turn = 1; /4 while (flag11] && turn == 1) *>■ /* Ничего не делать */; ';; . /* Критический раздел */; !.v- flag[0] = false; /* Остальной код */; } I 52 Часть 2 Р°де } void FK { while(true) { flagfl] = true; turr = 0; while(flag[0] && turn == 0) /* Ничего не делать */; /* Критический раздел */; flag[l] = false; /* Остальной код */; } } void main() { flagfO] = false; flag[l] = false; parbegin(P0,P1); } Выполнение условий взаимоисключения легко показать. Рассмотрим процесс Р0. После того как flag[0] установлен им равным true, P1 войти в критический раздел не может. Если же Р1 уже находится в критическом разделе, то flag[l] = true и для РО вход в критический раздел заблокирован. Однако взаимная блокировка в данном алгоритме предотвращена. Предположим, что РО заблокирован в своем цикле while. Это означает, что flag[l] равен true, a turn == 1. РО может войти в критический раздел, когда либо flag[l] становится равным false, либо turn становится равным 0. Рассмотрим три исчерпывающих случая. 1. Р1 не намерен входить в критический раздел. Такой случай невозможен, поскольку при этом выполнялось бы условие flagfl] = false. 2. PI ожидает вход в критический раздел. Такой случай также невозможен, поскольку если turn = 1, то Р1 способен войти в критический раздел. 3. Р1 циклически использует критический раздел, монополизировав доступ к нему. Этого не может произойти, поскольку Р1 вынужден перед каждой попыткой входа в критический раздел дать такую возможность процессу Р0, устанавливая значение turn равным 0 Следовательно, у нас имеется простое решение проблемы взаимных исклю- нии для двух процессов. Впрочем, алгоритм Петерсона легко обобщается на с*Учай п процессов [HOFR90]. •3. ВЗАИМОИСКЛЮЧЕНИЯ: АППАРАТНАЯ >4 1; ПОДДЕРЖКА' .. 'Щ тключение прерываний j^ логда в машине имеется лишь один процессор, параллельные процессы не мо- .. еРекрываться, а способны только чередоваться. Кроме того, процесс будет про- Г ^5. Параллельные вычисления: взаимоисключения.*. 263
.** асатъся до тех пор, пока не будет вызван сервис операционной системы или; 0к цесс не будет прерван. Следовательно, для того чтобы гарантировать вз Но^ лючение, достаточно защитить процесс от прерывания. Эта возможность мо ет ь обеспечена в форме примитивов, определенных системным ядром для ,_° а и >ешения прерываний. Процесс в таком случае может обеспечить взаимоис юче- следующим образом (сравните с листингом 5.1): **># le (true) 3 гщ /* Запрет прерываний */; -М'^ /* Критический раздел */; /* Разрешение прерываний */; /* Остальной код */; у.. Поскольку критический раздел не может быть прерван, выполнение взаи- гсключения гарантируется. Однако цена такого подхода высока. Эффектив- ть работы может заметно снизиться, поскольку при этом ограничена врзмож- ть процессора по чередованию программ. Другая проблема заключается в г, что такой подход не будет работать в многопроцессорной архитектуре. Если шслительная система включает несколько процессоров, то вполне возможно >бычно так и бывает), что одновременно выполняются несколько проц ссов. В м случае запрет прерываний не гарантирует выполнения взаимоисключений. социальные машинные команды В многопроцессорной конфигурации несколько процессоров разделяют д л к цей основной памяти. В этом случае отсутствует отношение ведущий/ведомый ister/slave) — процессоры работают независимо, "на равных", и не имеется меха- 1ма прерывания, на котором могли бы основываться взаимоисключения.1*^ На уровне аппаратного обеспечения, как уже упоминалось, обращение к ?йке памяти исключает любые другие обращения к той же ячейке. Ос овыва- » на этом принципе, разработчики процессоров предлагают ряд машин ьгх ко- нд, которые за один цикл выборки команды атомарно выполняют я ячей- i памяти два действия, такие, как чтение и запись, или чтение и проверка 1чения. Поскольку эти действия выполняются в одном цикле, на них яе в со- •янии повлиять никакие другие инструкции. ft В этом разделе мы рассмотрим две из наиболее часто реализуемых ия уьШ»* >стальными инструкциями вы можете познакомиться в [RAYN86] и [STONP3])- Инструкция проверки и установки значения Инструкцию проверки и установки значения можно определить след> 1м образом: olean testset(int i) ~£ -it if (i == 0) ;f { v; i = 1; -%• return true; -^»T else * { t »4 Часть 2. П рп return false; } } Инструкция проверяет значение своего аргумента i. Если его значение равно 0, функция заменяет его на 1 и возвращает true. В противном случае значение переменной не изменяется и возвращается значение false. Функция teStset выполняется атомарно, т.е. ее выполнение не может быть прервано. Листинг 5.4. Аппаратная поддержка взаимных исключений *■ й°льзо8анСТИНГе 5"4>а Показан ЯР0™*™ взаимных исключений, основанный на ис- :?5я вулев ОПИсаниой инструкции. Разделяемая переменная bolt инициализирует- ым значением. Только процесс, который может войти в критический раздел, У t a 5. Параллельные вычисления: взаимоисключения... 265 /* а) Инструкция проверки и установки */ const int n = /* Количество процессов */; int bolt; void P(int i) ( while(true) I < I while(!testset(bolt)) /* Ничего не делать */; /* Критический раздел */; ' bolt = 0; /* Остальная часть кода */ , ' I void main() { bolt = 0; parbegin(P(l),P(2), . . .,P{n) ); ' t > ь '■' I /* б) Инструкция обмена */ ' '«. const int n = /* Количество процессов */; 1 int bolt; (i void P(int i) ; int keyi; while(true) 1 ( < keyi = l; while(keyi !=0) r: exchange (keyi, bolt); /* Критический раздел */; '„V exchange (keyi, bolt); mil /* Остальная часть кода */ Hi ^ y°idmain() bolt = 0; Parbegin(P(l),p(2),...,P(n)); 1 fei J ,"■
аз с". находит, что значение переменной bolt — 0. Все остальные процессы при цыт*. входа в критический раздел переходят в режим ожидания. Выйдя из критическо * раздела, процесс переустанавливает значение переменной bolt равным 0, п е ч один и только один процесс из множества ожидающих входа в критический азл получает требуемый ему доступ. Выбор этого процесса зависит от того, какому процессов удалось выполнить инструкцию test set первым. Инструкция обмена Инструкция обмена может быть определена следующим образом: void exchange(int register, int memory) { int temp; '••', temp = memory; -',K- memory = register; ~t" register = temp; ^ } f Инструкция обменивает содержимое регистра и ячейки памяти. В процессе ее выполнения доступ к ячейке памяти для всех остальных процессов блокируе -я. В листинге 5.4,6 показан протокол взаимного исключения, основанный на использовании этой инструкции. Разделяемая переменная bol t инициал гзиру- ется нулевым значением. У каждого процесса имеется локальная переменная key, инициализированная значением 1. В критический раздел может войти только один процесс, который обнаруживает, что значение bolt равно 0. Этот процесс запрещает вход в критический раздел всем другим процессам п ем ус тановки значения bolt, равным 1. По окончании работы в критическом азделе процесс вновь сбрасывает значение bolt в 0, тем самым позволяя друга у процессу войти в критический раздел. >, Заметим, что при использовании рассмотренного алгоритма всегда ^выполняется следующее соотношение: -К. bolt + ^key, =п Ч Если bolt = 0, то в критическом разделе нет ни одного процесса* *и bolt— 1, то в критическом разделе находится ровно один процесс, а енно тот, переменная key которого имеет нулевое значение. : ■*$' , Свойства подхода, основанного на использовании машинны инструкций *$, Подход, основанный на использовании специальной машинной инстр. ИцП для осуществления взаимных исключений, имеет ряд преимуществ. % • Он применим к любому количеству процессов при наличии как одно , >т " и нескольких процессоров, разделяющих основную память. ^' • Этот подход очень прост, а потому легко проверяем. *?£ • Он может использоваться для поддержки множества критических J e' лов; каждый из них может быть определен при помощи своей соб efl' ной переменной. ' \| Однако у такого подхода имеются и серьезные недостатки. Й 266 Часть 2. Про Используется пережидание занятости. Следовательно, в то время как процесс находится в ожидании доступа к критическому разделу, он продолжает потреблять процессорное время. Возможно голодание. Если процесс покидает критический раздел, а входа в него ожидают несколько других процессов, то выбор ожидающего процесса произволен. Следовательно, может оказаться, что какой-то из процессов будет ожидать входа в критический раздел бесконечно. • Возможна взаимоблокировка. Рассмотрим следующий сценарий в однопроцессорной системе. Процесс Р1 выполняет специальную инструкцию (т.е. testset или exchange) и входит в критический раздел. После этого процесс Р1 прерывается процессом Р2 с более высоким приоритетом. Если Р2 попытается обратиться к тому же ресурсу, что и Р1, ему будет отказано в доступе в соответствии с механизмом взаимоисключений, и он войдет в цикл пережидания занятости. Однако в силу того что процесс Р1 имеет более низкий приоритет, он не получит возможности продолжить работу, так как в наличии имеется активный процесс с высоким приоритетом. Из-за наличия недостатков как в случае использования программных, так и аппаратных решений нам следует рассмотреть и другие механизмы обеспечения взаимоблокировок. Ж СЕМАФОРЫ^ '"^'*'l::JtY'v'* С. -..."-я-"*» ^.i'Sf'» к ж 2**»- Теперь мы вернемся к механизмам операционных систем и языков программирования, обеспечивающим параллельные вычисления. Этот раздел мы начнем с рассмотрения семафоров; следующие разделы будут посвящены мониторам и передаче сообщений. Первой большой работой, посвященной вопросам параллельных вычислений, стала монография Дейкстры [DIJK65], который рассматривал разработку операционной системы как построение множества сотрудничающих последовательных процессов и создание эффективных и надежных механизмов поддержки этого сотрудничества. Эти же механизмы легко применяются и пользовательскими процессами — если процессор и операционная система Делают их общедоступными. Фундаментальный принцип заключается в том, что два или большее количество процессов могут сотрудничать посредством простых сигналов, так что в определенном месте процесс может приостановить работу до тех пор, пока не дождется со- тветствующего сигаала. Требования кооперации любой степени сложности могут ть Удовлетворены соответствующей структурой сигналов. Для сигнализации пользуются специальные переменные, называющиеся семафорами. Для передачи гнала через семафор s процесс выполняет примитив signal (s) а для получения ала— примитив wait(s). В последнем случае процесс приостанавливается до °Pi пока не осуществится передача соответствующего сигнала.2 ц€ Достижения желаемого эффекта мы можем рассматривать семафор как енную, имеющую целое значение, над которой определены три операции. г 1*Ю. р сгпапгъе Дейкстры и многих других источниках вместо wait используется бук- ^* вместо signal — V; это первые буквы голландских слов проверка (proberen) и синение (verhogen). J1 5. Параллельные вычисления: взаимоисключения... 267
1. Семафор может быть инициализирован неотрицательным значением; 2. Операция wait уменьшает значение семафора. Если это значение cV ся отрицательным, процесс, выполняющий операцию wait, блокир Тся Т~ 3. Операция signal увеличивает значение семафора. Если это значен** ложительно, то заблокированный операцией wait процесс деблокиру г ° Не имеется никаких иных способов получения информации о значе афора или изменения его значения, кроме перечисленных. °е~ В листинге 5.5 приведено более формальное определение примитивов ш эров. Предполагается, что примитивы wait и signal атомарны, т.е. они не v гт быть прерваны, и каждая из подпрограмм может рассматриваться как ли шаг. Более ограниченная версия семафора, известная как бинар ^ эр, представлена в листинге 5.6. Бинарный семафор может принимать точьк [ачения О или 1. В принципе реализация бинарного семафора должна быть 6о ;е простой задачей; можно также показать, что все задачи, решаемые с приме- ;нием обычных семафоров, могут быть решены и с использованием лишь би- 1рных семафоров (см. задачу 5.13). нстинг 5.5. Определение семафорных примитивов :ruct semaphore { int count; queueType queue; •id wait(semaphore s) s.count--; if (s.count < 0) { Поместить процесс в s.queue Заблокировать процесс } id signal(semaphore s) s.count++; if (s.count <= 0) { Удалить процесс P из S.queue Поместить процесс Р в список активных } ■•t& -С [стинг 5.6. Определение примитивов бинарного семафора •-NR ruct binary_semaphore { ■% enum { zero, one } value; queueType queue; id waitB(binary_semaphore s) 1l 8 Часть 2. П "eC &*; $ if (s.value === 1) f s.value = 0; ',- else { Поместить процесс в s.queue Заблокировать процесс } void signalB(binary_semaphore s) if (s.queue.is_empty()) s.value =1; else { Удалить процесс Р из S.queue Поместить процесс Р в список активных } } Для хранения процессов, ожидающих как обычные, так и бинарные семафоры, используется очередь. При этом возникает вопрос о порядке извлечения процессов из данной очереди. Наиболее корректный способ — использование принципа "первым вошел — первым вышел" (first-in-first-out — FIFO). При этом первым из очереди освобождается процесс, который был заблокирован дольше других. Семафор, использующий данный метод, называется сильным семафором (strong semaphore). Семафор, порядок извлечения процессов из очереди которого не определен, называется слабым семафором (weak semaphore). На рис. 5.2 (из [DENN84]) приведен пример работы сильного семафора. Здесь процессы А, В и С зависят от результатов работы процесса D. Изначально работает процесс А (Ф); процессы В, С и D находятся в списке активных процессов, ожидая своей очереди. Значение семафора равно li это указывает на то, что один из результатов работы процесса D имеется в наличии. Когда процесс А выполняет инструкцию wait, он тут же получает разрешение на дальнейшую работу и вновь становится в очередь на выполне- ние в списке активных процессов. Затем приступает к работе процесс В (©), который в конечном счете также выполняет инструкцию wait, в результате Чего процесс приостанавливается, давая возможность приступить к работе процессу D (®). Когда процесс D завершает работу над получением нового Результата, он выполняет инструкцию signal, которая позволяет процессу В еРейти из списка приостановленных процессов в список активных (©). Роцесс D присоединяется к списку активных процессов, и к выполнению риступает процесс С (©), но тут же приостанавливается при выполнении СтРУкции wait. Точно так же приостанавливается и выполнение процессов Ка Давая возможность процессу D приступить к работе (<U). После того Полу чается новый результат процесса D, им выполняется инструкция с А' которая и переводит процесс С из списка приостановленных в спи- вок Ктивных. Последующие циклы выполнения процесса D переведут в спи- активных процессы А и В. 4 ГС ^ 5. Параллельные вычисления: взаимоисключения... 269
о Процессор •«- s-1 к & Список приостановленных процессов Семафор /Т\ Процессор Список готовых к выполнению процессов В s = 0 Список приостановленных процессов Семафор /Т\ Процессор Список готовых к выполнению процессов I В s=-1 Список приостановленных процессов Семафор *?\ Процессор Список готовых к выполнению процессов Список приостановленных процессов Семафор ТЧ Процессор Список готовых к выполнению процессов Список приостановленных процессов Семафор Процессор Список готовых к выполнению процессов Список приостановленных процессов Семафор fi\ Процессор Список готовых к выполнению процессов В | А й LZ «=-8 4 } Список готовых к выполнению процессов i- " .& ' f-k^ г*'Л ' 1. ъ * м*. 1 » ■ • —► D s = 0" ] - —#-""'?-- В- A G. ' \* "„ ► С s = 0 D В А ■ D < 1 *- \ \в |/Uc | в=-з л ► ?-|,-»,| ;4Н Ц Л « -—■111 Ш '"% Список приостановленных процессов Семафор Рис. 5.2. Пример работы механизма семафоров ';?• Часть 2. П он В следующем подразделе рассматривается алгоритм взаимоисключений ястинг 5.7), использование сильного семафора в котором гарантирует невоз- ожность голодания, но слабый семафор такой гарантии не дает. Далее мы бутя считать, что работают сильные семафоры, поскольку они более удобны и бычно именно этот вид семафоров используется операционной системой. Взаимные исключения В листинге 5.7 показано простое решение задачи взаимоисключений с использованием семафора s (сравните с листингом 5.1). Пусть у нас имеется п процессов, идентифицируемых массивом P(i). В каждом из процессов перед входом в критический раздел выполняется вызов wait(s). Если значение s становится отрицательным, процесс приостанавливается. Если же значение равно 1, оно уменьшается до нуля и процесс немедленно входит в критический раздел; поскольку s больше не является положительным, ни один другой процесс не может войти в критический раздел. Листинг 5.7. Взаимоисключения с использованием семафоров /* Программа взаимного исключения */ const int n = /* Количество процессов */; semaphore s = 1; void P(int i) { while(true) { wait(s); /* Критический раздел */; signal(s); /* Остальной код */; } } void rttainf) i parbegin(P(l),P(2),...,P(n)); } и Семафор инициализируется значением 1. Следовательно, первый процесс, вьтолняющий инструкцию wait, сможет немедленно попасть в критический Раздел, устанавливая при этом значение семафора равным 0. Любой другой просе при попытке войти в критический раздел обнаружит, что он занят. Соответ- венно, произойдет блокировка процесса, а значение семафора будет уменьшено "1- Пытаться войти в критический раздел может любое количество процессов; Дая неуспешная попытка уменьшает значение семафора. После того как Цесс, вошедший в критический раздел первым, покидает его, s увеличивается' °№н из заблокированных процессов (если таковые имеются) удаляется из иной с семафором очереди и активизируется. Таким образом, как только Ddo ровщ-Ик операционной системы предоставит ему возможность выполнения, ■ н ее тут же сможет войти в критический раздел. *Сов а *Шс" ^"^ показана возможная последовательность действий трех процес- %., Ри использовании технологии взаимоисключений, представленной в лис- I л * к ;а о. Параллельные вычисления: взаимоисключения... 271
\ re 5.7- В этом примере три процесса (А, В, С) обращаются к раздели Mosiv /рсу, защищенному семафором lock. Процесс А выполняет wait (loo ; по льку в этот момент семафор имеет значение 1, процесс А может неме снн0 ти в критический раздел и значение семафора становится равным 0.^ ^а а одится в критическом разделе, и В, и С выполняют операцию wait, после че- в заблокированном состоянии ожидают доступности критического р дела да процесс А покидает критический раздел и выполняет операцию nal(lock), процесс В (являющийся первым в очереди) получает воз\юэк- гь войти в критический раздел. ,'■'. 1оск I I Критический раздел Обычное выполнение '•V ■ 4>/ -л # Обычный код может выполни процессами параллельно; -j t критические разделы — ^*' только по очереди ^ ■ ''3''! у; - "-tr • *' л. ■м ?uc. 5.3. Доступ процессов к разделяемым данным, защищенным семафором [ВА ^ Программа, приведенная в листинге 5.7, может так же хорошо работ ь и случае, когда одновременно в критическом разделе находятся несК ь дессов. Для этого достаточно инициализировать семафор соответств , шИ гением. Следовательно, в любой момент времени значение s. count интерПР гется следующим образом. ■." s. count > 0: значение s. count определяет количество процессов, к'Ьтор ^ могут выполнить wait (s) без приостановки процесса (подразумевается, промежуточные вызовы signal (s) отсутствуют). "' что \ Часть 2. Пр сС # б. count < 0: абсолютное значение s.count определяет количество приостановленных процессов в очереди s .queue. Задача производителя/потребителя Сейчас мы рассмотрим одну из общих задач параллельных вычислений — задачу производителя/потребителя. Вот ее обобщенная формулировка. Имеются один или несколько производителей, генерирующих данные некоторого типа (записи, символы и т.п.) и помещающих их в буфер, а также единственный потребитель, который извлекает помещенные в буфер элементы по одному. Требуется защитить систему от перекрытия операций с буфером, т.е. обеспечить, чтобы одновременно получить доступ к буферу мог только один процесс (производитель или потребитель). Мы рассмотрим несколько решений этой задачи, с тем чтобы проиллюстрировать как мощь семафоров, так и встречающиеся при их использовании ловушки. Для начала предположим что буфер бесконечен и представляет собой линейный массив элементов. Говоря абстрактно, мы можем определить функции производителя и потребителя следующим образом: */ /* Потребитель */ while(true) /* Производитель while(true) 1 { /* Производство элемента v */ b[in] = v; in++ ; } } while (in <= out) /* Бездействие w = b[out]; OUt++; /* Потребление w*/ /; На рис. 5.4 показана структура буфера Ь. Производитель может генерировать данные и сохранять их в буфере со своей индивидуальной скоростью. Всякий раз при сохранении увеличивается индекс in. Потребитель поступает аналогично, с тем отличием, что он не должен считывать данные из пустого буфера. Следовательно, перед выполнением считывания он должен убедиться, что производитель обогнал его (in > out) b[l] b[2] b[3] b[4] b[5] out in Примечание. Занятая часть буфера заштрихована Рис. 5.4. Бесконечный буфер задачи производи тел ь/ потреби тел ь Пощ ^ов -ЛЪ1таемся реализовать нашу систему с использованием бинарных семафо- листинге 5.8 приведена первая попытка реализации. Вместо работы с ин- s, и Щ и out мы можем просто отслеживать количество элементов в буфере Лп 5- Параллельные вычисления: взаимоисключения... 273
средством целой переменной n = in - out. Для осуществления вз •ключения используется семафор s; семафор delay применяется для ож >требителя при пустом буфере. и - t истинг 5.8. [Неверное] решение задачи производитель/потребитель с использованием бинарных семафоров ■< НОГо it n; Lnary_semaphore s = 1; Lnary_semaphore delay = 0; Did producer() while(true) { produce(); waitB(s) ; append(); n++; if (n == 1) signalB(delay); signalB(s); } oid consumer() v. % vC waitB(delay); while(true) { waitB(s); take(); n—; signalB(s) ; consume(); if (n == 0) waitB(delay); } ■J -ft-/ Л. 4 oid main() n = 0; parbegin(producer,consumer); t Решение представляется достаточно простым и очевидным. Произвд ите ^ южет добавлять данные в буфер в любой момент времени. Перед доба л н »н выполняет waitB (s), а после добавления — signalB (s), чтобы пре т ^ ить обращение к буферу других производителей или потребителя на всевр ' •перации добавления данных в буфер. Кроме того, при работе в критячесь ^ >азделе производитель увеличивает значение п. Если п = 1, то перед эти». обав- [ением данных в буфер он был пуст, так что производитель вьШ 1 ^ ^ signalB (delay), чтобы сообщить об этом потребителю. Потребитель наЧ «а >жидания производства первого элемента, используя вызов waitB (dela. • -ем потребитель получает данные из буфера и уменьшает значение п . сВ^ критическом разделе. Если производители опережают потребителя (дост то >аспространенная ситуация), то потребитель будет редко блокирован се Ф° J74 Часть 2. П U delay» поскольку п обычно положительно. Следовательно, благополучно работают и производитель, и потребитель. Тем не менее в предложенной программе имеется один изъян. Когда потребитель исчерпывает буфер, он должен сбросить семафор delay с помощью инструкции if (n — 0) waitB (delay) ;, чтобы дождаться размещения данных в буфере производителем. Рассмотрим сценарий, приведенный в табл. 5.2. В стро- ке 14 потребитель не выполняет операцию waitB. Он действительно исчерпал буфер и установил п равным О в строке 8, но до проверки значения п в строке 14 оНо было изменено производителем. В результате signalB не соответствует предшествующему waitB. Значение п, равное -1 в строке 20, означает, что потребитель пытается извлечь из буфера несуществующий элемент. Простое перемещение проверки в критический раздел потребителя недопустимо, так как может привести к взаимоблокировке (например, после строки 8). Решение проблемы заключается во введении вспомогательной переменной, значение которой присваивается в критическом разделе и используется вне его, как показано в листинге 5.9. Внимательно рассмотрев приведенный код, вы убедитесь в отсутствии возможных взаимоблокировок. Таблица 5.2. Возможный сценарий работы программы из листинга 5.8 Производитель Потребитель п 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 waitB(s) п++ if (n==l) signalB(delayjL signalB (s) waitB(delay) waitB(s) '■ri-—"" signalB(s) waitB(s) {:■ n++ |if (n==i) signalB<delay> signalB(sJ if (n==0) waitB(delay) waitB(s) signalB(s) if (n==0) waitB(delay) waitB(s) Soa %t. ,11—— signalB(s) 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -1 -1 delay 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 лаи - • Параллельные вычисления: взаимоисключения.. 275
истинг 5.9. Верное решение задачи производитель/потребитель с использованием бинарных семафоров it n; _nary_semaphore s = 1; Lnary~semaphore delay = 0; jid producer () 3id consumer() } oid main() n = 0; parbegin(producer,consumer); . :■■ 4 while (true) *; { *: produce () ; $y waitВ(s); V- append (); V n++; "v-.^ if (n == 1) signalB (delay) ; f,< signalB(s) ; ,?f } *'■ '4 •' int m; /* Локальная переменная */ waitB(delay); while(true) { waitB(s); take(); n—; m = n; -j signalB (s) ; -i* consume () ; ".'■ if (m == 0) waitB(delay); X Несколько более простое решение (приведенное в листинге олучить при использовании обобщенных семафоров (именуемых т е афорами со счетчиками). Переменная п в этом случае является сен °Р0' ' s значение остается равным количеству элементов в буфере. Предц ° еперь, что при переписывании этой программы произошла ошибка, с * ации signal (s) и signal (n) оказались взаимозамененными. Это^. °" ^ ривести к тому, что операция signal (n) будет выполняться в критн сь азделе производителя без прерывания потребителя или другого про зВ еля. Повлияет ли это на выполнение программы? Нет, поскольку потр ель в любом случае должен ожидать установки обоих семафоров перед олжением работы. ,76 Часть 2. Л листинг 5.10. Решение задачи производитель/потребитель с использованием семафоров semaphore n = 0; semaphore s = 1; void producer() { while(true) 1 produce(); wait (s); append(); signal(s); signal(n); } } void consumer() { while(true) { wait(n); wait(s) ; take() ; signal(s) ; consume(); } } void main() { parbegin(producer, consumer); } Теперь предположим, что взаимозаменены операции wait(n) и wait(s). Это приведет к фатальным последствиям. Если пользователь войдет в критический раздел, когда буфер пуст (п.count = 0), то ни один производитель не { сможет добавить данные в буфер и система окажется в состоянии взаимной бло- \ кировки. Это хороший пример тонкости работы с семафорами и сложности кор- ;; Ректной разработки параллельно работающих процессов. А теперь добавим к нашей задаче новое, достаточно реалистичное огра- '. ВД1Чение — конечность буфера. Буфер рассматривается нами как циклическое ' Ранилище (см. рис. 5.5), при работе с которым значения указателей долж- вьлражаться по модулю размера буфера. При этом выполняются следую- I *чие условия. ц Блокировка: Деблокирование: ' зводитель: вставка в полный буфер Потребитель: удаление элемента из I Потреб буфера j итель: удаление из пустого буфера Производитель: вставка элемента в буфер Глав ■5- Пар аллельные вычисления: взаимоисключения... 277
Ml] b[2] b[3] b[4] b[5] b[n] T out T in a) S* &' bti] b[2] b[3] d[4] b[5] b[n] i l in out 6) Рис. 5.5. Конечный циклический буфер для задачи производитель/ потребитель Л« ■ •я. ■У Функции производителя и потребителя при этом могут быть запис_ ы сле- ующим образом (переменные in и out инициализированы значением 0)г* роизводителъ: hile(true) /* Производство элемента v*/; while,( (in+1) %n == out) /* Бездействие */; b[in] = v; in = (in+1) % n; Потребитель: while(true) { while(in == out) /* Бездействие */; w = b[out]; out = (out+1) % n; /* Потребление элемента w */; } ft J'. ■i. A В листинге 5.11 приведено решение с использованием обобщенных1 с ма<ро- ов. Для отслеживания пустого места в буфере в программу добавлен се офор е" [истинг 5.11. Решение задачи производитель/потребитель ?■■■ с ограниченным буфером onst int sizeofbuffer = /* Размер буфера */; emaphore s = 1; emaphore n = 0; emaphore e = sizeofbuffer; oid producer() while(true) { produce(); wait(e) ; wait(s) ; append(); signal(s), t !78 Часть 2. Р°це ■-•* signal(n); } void consumer{) while(true) { wait(n) ; wait (s); take (J ; signal(s) ; signal(e) ; consume(); } } void main() { parbegin(producer, consumer), } Реализация семафоров Как упоминалось ранее, главное условие корректности работы семафоров заключается в требовании атомарности операций wait и signal. Один из очевидных путей выполнения этого условия состоит в реализации семафоров в аппаратном или микропрограммном обеспечении. Если этот путь недоступен, применяются различные программные подходы. Суть проблемы заключается в реализации взаимных исключений: в определенный момент времени работать с семафором посредством операций wait или signal может только один процесс. Следовательно, подойдет любая из рассматривавшихся программных схем, такая, как алгоритмы Деккера или Петерсона; но это может привести к определенным накладным расходам. Можно также использовать одну из схем поддержки взаимоисключений на аппаратном уровне. Так, в листинге 5.12.,а показано, как можно использовать инструкцию проверки и установки значения. В эт°й реализации, как и в листинге 5.7, семафор представляет собой структуру; °Днако теперь он включает новый целый компонент s. flag. Конечно, при таком «особе реализации семафоров неизбежно пережидание занятости, но поскольку ерации wait и signal относительно небольшие, время ожидания минимально. В однопроцессорной системе можно воспользоваться запретом прерываний время выполнения операций wait и signal, как предложено в листин- п " ^,0"- Повторимся еще раз — малое время ожидания занятости этих опера- означает целесообразность применения предложенного подхода. *—,^___нго.12. Две возможные реализации семафоров /* ^■**ait f **НстРУК1Р*я проверки и установки * / ■г» IS) > >Л. ;. while (test set (s. flag)) '> /* Бездействие */; -, ?-COUnt ; \ r (s.count < 0) Г*а*а б. Параллельные вычисления: взаимоисключения... 279
■* i;j: ■I .? .5 Л .7 Поместить этот процесс в s. queue .-^ Заблокировать процесс и установить '>* s. fJag равным О } else s.flag =0; . anal (si "'*!? while(testset(s.flag)) $ /* Бездействие */; s.count++; if (s.count <= 0) { Удалить процесс P из s.queue Поместить P в список активных процессов } s.flag = 0; : б) Запрет прерываний */ lit (s) Запретить прерывания; s.count—; if (з.count < 0) { Поместить этот процесс в s.queue Заблокиоовать процесс } else Ра зрешить прерыв а ния; Lgnal(s) Запретить прерывания; s.count++; if (s.count <= 0) { Удалить процесс Р из s.queue Поместить Р в список активных процессов } Разрешить прерывания; ■ с и •i г U ►адача о павикмахерикии * й п адача о парикмахерской В качестве другого примера использования семафоров для реали ^ ^ аллельных вычислений рассмотрим простую задачу о парикмахерско '^^ ример весьма поучителен, так как задача, возникающая при попытке ."*• urn 3 Я признателен профессору Ральфу Хильцеру (Ralph Hilzer) из ун ^ imama Калифорния в Чико за предоставление этой задачи. % ►80 , Часть 2.6П оцеС чить простой доступ в парикмахерскую, сродни тем, которые возникают в реальных операционных системах. В нашей парикмахерской три кресла, три парикмахера, зал ожидания, в ротором четыре клиента могут разместиться на диване а остальные — стоя (см. рис 5.6). Правила пожарной безопасности ограничивают общее количество клиентов внутри помещения 20 людьми. В нашем примере мы предполагаем, что всего мастерская должна обслужить 50 клиентов. Вход Парикмахерские кресла □ □ □ Касса \ \ Место для ожидания стоя Диван Выход Рис. 5.6. Парикмахерская Клиент не может войти в парикмахерскую, если она полностью заполнена другими клиентами. Оказавшись внутри, клиент либо присаживается на диван, либо стоит, если последний занят. Когда парикмахер освобождается, к нему отправляется наиболее долго ожидающий клиент с дивана; если имеются стоящие клиенты, то тот из них, кто ожидает дольше других, присаживается на диван. По окончании стрижки принять плату может любой парикмахер, но так как кассир в Парикмахерской лишь один, плата принимается в один момент времени только от одного клиента. Рабочее время парикмахера разделяется на стрижку, принятие оплаты от клиента и сон в своем кресле в ожидании очередного клиента. Неполное решение задачи о парикмахерской В листинге 5.13 показана реализация парикмахерской с использованием ^Мафоров; предполагается, что все очереди семафоров обрабатываются по принципу первым вошел — первым вышел". В листинге для экономии места функ- и Расположены в два столбца. Основное тело программы активизирует процессы 50 клиентов, трех парикам еров и одного кассира. Рассмотрим теперь назначение различных синхронизующих операторов. «Местимость парикмахерской и дивана. Вместимость парикмахерской и Дивана управляется семафорами max_capacity и sofa, соответственно. v Каждый раз при попытке клиента войти в парикмахерскую значение сема- ,.. Фора max_capacity уменьшается на 1; когда клиент покидает парикмахер- ^а 5. Параллельные вычисления: взаимоисключения... 281
скую, оно увеличивается. Если парикмахерская заполнена, то проц <к ента приостанавливается функцией wait(max_capacity). Аналогично об рабатывается и попытка присесть на диван. .л- " Емкость парикмахерских кресел. В наличии имеются три парикмдх^1кИх кресла, и следует обеспечить их корректное использование. СемасЬо barber chair гарантирует одновременное обслуживание не более трех кти ентов, так чтобы один клиент не оказался на коленях у другого. Клиент ве поднимется с дивана до тех пор, пока не окажется свободным хотя бм одно кресло (вызов wait (barberchair)), а каждый парикмахер сообгд т том, что его кресло освободилось (вызов signal (barber_chair)). Сцр ед, ливый доступ к парикмахерским креслам гарантируется организации Че_ редей семафоров: клиент, который первым блокирован в очереди, п ьщ же и приглашается на стрижку. Заметим, что если в процедуре клиента вызов wait (barber_chair) разместить после signal (sofa), то кажды&'кти- ент будет только присаживаться на диван, после чего немедленно аки- вать и занимать стартовую позицию у кресла, создавая излишнюю т л кот- ню и мешая работать парикмахеру. ■% Размещение клиента в кресле. Семафор cust ready обеспечивает о ъем спящего парикмахера, сообщая ему о новом клиенте. Без этого сем ора парикмахер никогда не отдыхал бы и приступал к стрижке немедле но после того, как очередной клиент покинет кресло. При отсутствии клй йта в этот момент парикмахер стриг бы воздух. ■% Удержание клиента в кресле. Если уж клиент оказался в кресле, ой доч- жен отсидеть там до окончания стрижки, о чем просигнализирует мафор finished. , Ограничение количества клиентов в креслах. Семафор barber_chair предназначен для ограничения количества клиентов в креслах — их не должно быть более трех. Однако одного семафора barber_chair для этого недостаточно. Клиент, который не получит процессорное время непосредственно после того, как парикмахер сообщит о завершении работы над его прической' (вьыов signal (finished)), останется в кресле (например, впав в транс шп? глубоко задумавшись о задаче о парикмахерской), в то время как в этом же к -ле 05 дет стараться устроиться новый клиент. Для решения данной задачи йслочьзу- ется семафор leave b chair, который не позволяет парикмахеру пр пасчть — — "># нового клиента до тех пор, пока предыдущий не покинет кресло. % Оплата стрижки. Естественно, с деньгами надо быть особенно осторО *ы Кассир должен быть уверен, что каждый клиент, покидая парикмаЯ к> сперва расплатится, а каждый клиент, оплатив стрижку, должен получу че Это достигается передачей денег кассиру из рук в руки — каждый клиент, кинув кресло, оплачивает услуги парикмахера, после чего дает знать ^о° э " кассиру (вызов signal (payment)) и дожидается получения кассового •* (вызов wait (receipt)). Кассир осуществляет прием платежей, ожидая с п"Я о платеже, принимая деньги, а затем сообщая об этом. Здесь следует и таР ся избежать ряда программных ошибок. Если вызов signal (payment 1; * т няется непосредственно перед вызовом pay (), то клиент может оказа! я " рванным в этот момент, и кассир будет пытаться принять не переданное Д •А ги. Еще более серьезная ошибка происходит при обмене строк signal (payment) и wait (receipt). Это может привести к взаимоблокировке всех клиентов и кассира их операциями wait. Координация действий кассира и парикмахера. В целях экономии средств парикмахерская не нанимает отдельного кассира. Это действие выполняет парикмахер, когда не стрижет клиента. Для того чтобы обеспечить выполнение парикмахером в один момент времени только одной функции, используется семафор coord. Назначение каждого семафора программы указано в табл. 5.3. Листинг 5.13. Неполное решение задачи о парикмахерской semaphore max_capacity = 20; semaphore sofa = 4; semaphore barber_chair = 3; semaphore coord = 3; semaphore cust_ready = 0, leave__b_chair = 0, receipt = 0; void customer() { wait(max_capacity); enter_shop(); wait(sofa); sit_on_sofa(); wait(barber_chair); get_up_from_sofa(); signal(sofa); sit_in_barber__chair () ; signal(cut_ready); wait(finished); leave_barber_chair(); signal(leave_b_chair); pay(); signal(payment); wait(receipt); exit_shop(); signal(max_capacity); finished = 0, payment = 0, void barber() { while(true) { } wait(cust_ready); wait(coord); cut_hair(); signal(coord); signal(finished); wait(leave_b_chair); signal(barber_chair); } void cashier() { while(true) { wait(payment); wait(coord); accept_pay(); signal(coord); signal(receipt); ]°^ main () Parbegin(custome r, ... [50 раз]...,customer, barber,barber,barber,cashier); £-. А б. Параллельные вычисления: *. взаимоисключения...
шца 5.3. Назначение семафоров в листинге 5.13 1фор Операция wait Операция signal ,:^ capacity Клиент ожидает возможности Клиент, покидающий парикмад р. войти в парикмахерскую скую, сигнализирует об этом=Чх, и- дающему входа -,- й t Клиент ожидает возможности Клиент, встающий с дивана, с сесть на диван лизирует об этом ожидающему/: оз- можности сесть на диван *•£■. • •>\ >er__chair Клиент ожидает пустое кресло Парикмахер сигнализирует,, ят кресло свободно .Щ* . read Парикмахер ожидает, пока кли- Клиент сигнализирует парикм .е- ент сядет в кресло ру, что он уже сел в кресло Щ --'' Ч .shed Клиент ожидает окончания Парикмахер сигнализирует вдиен- стрижки ту, что стрижка окончена V 'e_b_chair Парикмахер ожидает, пока кли- Клиент сигнализирует парикмахеру ент покинет кресло о том, что он встал с кресла т lent Кассир ожидает оплаты услуг Клиент сигнализирует кассиру о клиентом том, что он оплатил стрижку t, ;ipt Клиент ожидает кассовый чек Кассир сигнализирует о том, что оплата принята rd Ожидание освобождения парик- Сигнал об освобождении парикмахера для стрижки или для вы- махера пол нения обязанностей кассира **% тч Процесс кассира можно устранить, внеся функцию оплаты в процедуру па- махера. Каждый парикмахер будет последовательно стричь и пр имать гу. Однако при наличии одного кассового аппарата необходимо ограничить уп к функции acceptpayO одним парикмахером в каждый момент; реме- Этого можно добиться, рассматривая функцию как критический раздал и ог- IB ее соответствующим семафором. ге Полное решение задачи о парикмахерской Д Несмотря на приложенные усилия (см. листинг 5.13), у нас остались опре- ;нные сложности. Решение одной из проблем содержится в оставшейся части >аздела, а решение остальных останется читателю в качестве упражнении задачу 5.19). '1 В листинге 5.13 отражена проблема, которая может привести к неК0рРеКТ' работе с клиентами. Предположим, что в настоящий момент в пари* ахе" t креслах сидят три клиента. Они, скорее всего, заблокированы вызова* t (finished) и в соответствии с организацией очереди будут деблокирован м порядке, в котором они садились в кресла. Но что если один из пар! еров очень быстро работает (или один из клиентов лысый)? Получ , я шя, когда одного клиента будут вытаскивать из кресла и заставлять плать «законченную прическу, в то время как другого, полностью постриэй ян энта будут держать в кресле силой. :, Эта проблема решается добавлением новых семафоров, как показано в л я "•е 5.14. Мы присваиваем каждому пользователю номер (как если ы ЯР *е в парикмахерскую каждый клиент получал номерок). Семафор u г- .:# I Часть 2. П 1 обеспечивает защиту доступа к глобальной переменной count, гарантируя уникальность номера каждого клиента. Семафор finished превратился в массив из 50 семафоров. Когда клиент садится в кресло, он выполняет инструкцию wait( finished fcustnr] ), ожидая свой собственный семафор. По окончании стрижки парикмахер выполняет инструкцию signal (finished[b_cust] ), отпуская из кресла того клиента, которого он стриг. Нам остается рассмотреть, каким образом парикмахер узнает номер клиента. Клиент помещает свой номер в очередь enqueue 1 непосредственно перед тем, как сообщить парикмахеру о готовности при помощи семафора cust ready. Когда парикмахер готов стричь клиента, dequeue 1 (b_cust) удаляет номер клиента из очереди и помещает его в локальную переменную парикмахера b cust. Листинг 5.14. Полное решение задачи о парикмахерской semaphore max_capacity = 20; semaphore sofa = 4; semaphore barber_chair = 3, coord semaphore mutexl = 1, mutex2 semaphore cust_ready = 0, leave_b_chair payment = 0, receipt semaphore finished[50] = {0}; 3; 1; 0, 0; void customer() { int custnr; wait(max_capacity); enter_shop(); wait(mutexl); count++,- custnr = count; signal(mutexl); wait(sofa); sit_on__sofa() ; wait(barber_chair); get__up_f rom_sof a {) ; signal(sofa); sit_in_barber_chair(); wait(mutex2); enqueuel(custnr); signal(cut_ready); signal(mutex2); wait(finished[custnr]) ; leave_barber_chair(); signal(leave b chair); Pay(); signal(payment); w*it{receipt); exit_shop(); } signal(max_capacity) ; £".j°icl main() void barber() { int b_cust; while(true) { wait(cust_ready); wait(mutex2); dequeue1(b_cust); signal(mutex2); wait(coord); cut_hair(); signal(coord); signal(finished[b_cust] ) ; wait(leave_b_chair); signal(barber_chair); } } void cashier() { while(true) { wait(payment); wait(coord); accept_pay() ; signal(coord); signal(receipt); } ^йа 5. Параллельные вычисления: взаимоисключения... 285
parbegin(customer,...[50 раз]...,customer, barber,barber,barber,cashier); .5. МОНИТОРЫ "■ ' ^„.ъЩ Семафоры обеспечивают достаточно мощный и гибкий инструмент 'Для ОСу :ствления взаимных исключений и координации процессов. Однако,' как вы цели в листинге 5.8, создать корректно работающую программу с использова- ем семафоров не всегда легко. Сложность заключается в том, что 6церащщ it и signal могут быть разбросаны по всей программе, и не всегда ожно азу отследить их воздействие на контролируемые ими семафоры. Монитор представляет собой конструкцию языка программирования, кото- я обеспечивает функциональность, эквивалентную функциональности семафо- в, но легче управляется. Впервые формальное определение концепции монито- в было дано в [HOAR74]. Мониторы реализованы во множестве языков про- аммирования, включая такие, как Concurrent Pascal, Pascal-Plus, Modula-2, >dula-3 и Java. Мониторы также реализуются как программные библиотеки, о позволяет использовать мониторы, блокирующие любые объекты. В астно- н, например, для связанного списка можно заблокировать все связанные спи и одной блокировкой, либо иметь отдельные блокировки для каждого списка, юзможно — и для каждого элемента списка. Ч* Рассмотрение мониторов мы начнем с версии Хоара (Ноаге). д ' ■ } Мониторы с сигналами ч Монитор представляет собой программный модуль, состоящий из нициа- :зирующей последовательности, одной или нескольких процедур и локальных иных. Основными характеристиками монитора являются такие. 1. Локальные переменные монитора доступны только его процедурам; внешние процедуры доступа к локальным данным монитора не имеют. 2. Процесс входит в монитор путем вызова одной из его процедур. 3. В мониторе в определенный момент времени может выполняться толььо один процесс; любой другой процесс, вызвавший монитор, будет фиоста- новлен в ожидании доступности монитора. 1 Первые две характеристики сразу заставляют нас вспомнить о объект объектно-ориентированном программировании. Фактически ь квитированные операционные системы или языки программирования могут е ализовать монитор как объект со специальными характеристиками. .» _ Соблюдение условия выполнения только одного процесса в опред ен )мент времени позволяет монитору обеспечить взаимоисключения. Д,а&В&е 1тора доступны в этот момент только одному процессу, следовательно пъ совместно используемые структуры данных можно, просто поместив ' шитор. Если данные в мониторе представляют некий ресурс, то мони Р кивает взаимоисключение при обращении к ресурсу. Для широкого применения в параллельных вычислениях МО иТ° 1лжны включать инструменты синхронизации. Предположим, напр * 36 - Часть 2. П чТо процесс использует монитор и, находясь в мониторе, должен быть приостановлен до выполнения некоторого условия. При этом нам требуется некий механизм, который не только приостанавливает процесс, но и освобождает монитор, позволяя войти в него другому процессу. Позже, когда условие окажется выполненным, а монитор доступным, приостановленный процесс сможет продолжить свою работу с того места, где он был приостановлен. Монитор поддерживает синхронизацию при помощи переменных условия, располагающихся (и доступных) только в мониторе. Работать с этими переменными могут две функции. • cwait(c): приостанавливает выполнение вызывающего процесса по условию с. Монитор при этом доступен для использования другим процессом. • csignal(c): возобновляет выполнение некоторого процесса, приостановленного вызовом cwait с тем же условием. Если имеется несколько таких процессов, выбирается один из них; если таких процессов нет, функция не делает ничего. Обратите внимание на то, что операции wait/signal монитора отличаются от соответствующих операций семафора. Если процесс в мониторе передает сигнал, но при этом нет ни одного ожидающего его процесса, то сигнал просто теряется. На рис. 5.7 показана структура монитора. Хотя процесс может войти в монитор посредством вызова любой его процедуры, мы все же будем рассматривать монитор как имеющий единственную точку входа, которая позволяет обеспечить наличие в мониторе не более одного процесса в любой момент времени. Другие процессы, которые пытаются войти в монитор, присоединяются к очереди процессов, приостановленных в ожидании доступности монитора. После того как процесс вошел в монитор, он может временно приостановиться, выполнив вызов cwait (x); после этого процесс помещается в очередь процессов, ожидающих повторного входа в монитор при выполнении условия. Если процесс, выполняющийся в мониторе, обнаруживает изменение переменной условия х, он выполняет операцию csignal(x), которая сообщает об обнаруженном изменении соответствующей очереди. В качестве примера использования монитора вернемся к задаче производись/потребитель с ограниченным буфером. В листинге 5.15 показано решение адачи с использованием монитора. Модуль монитора boundedbuf fer управляет фером, использующимся для хранения и получения символов. Монитор вклю- Две переменные условий: notfull истинно, если в буфере имеется место Кп „МинимУм Для одного символа, a no tempt у — если в буфере имеется по Раиней мере один символ. г*. *>• Параллельные вычисления: взаимоисключения... 287
Область ожидания Вход I Очередь входящих процессов I МОНИТОР qlo Условиес! Локальные данные cwait(cl) п **"?»,'-*5-Л< Переменные условий а Процедура 1 Условие сп cwait (en) "Срочная" очередь Процедура к сsignal П Код инициализации -Apr Выход Т ■* * ■"V- ■Л- f •fX( ,-^« f Г1 ■"* ;s& > "it. */ •<.:$* Puc. 5.7. Структура монитора [истинг 5.15. Решение задачи производитель/потребитель с ограниченны** уфером с использованием монитора onitor boundedbuffer; har buffer[N]; nt nextin, nextout; nt count; nt notfull, notempty; /* Синхронизация oid append(char x) if (count == N) /* Место для N элементов /* Указатели буфера *' • ^ /* Количество элементов в буфере */ ,^\ф. % 1'> V gg Часть 2. оиессь1 cwait(notfull); buffer[nextin] = x; nextin = (nextin+1)%N; count++; csignal(notempty); /* Буфер заполнен / /* /* } Добавляем элемент в буфер */ Возобновление работы потребителя */ void take(char x) if (count == 0) cwait(notempty); x = buffer[nextout]; nextout = (nextout+1)%N; /* Буфер пуст } { count—; csignal (notfull) ,- nextin = 0; nextout = 0; count =0; /* /* /* /* Удаляем элемент из буфера */ Возобновляем работу производителей */ Тело монитора Изначально буфер пуст */ */ void producer() { char х; while(true) { produce(x) ; append(x); } } void consumer() { char x; while(true) { take(x); consume(x); } } v°id main() Parbegin(producer,consumer); По Р°изв°Дитель может добавить символы в буфер только из монитора при Щи процедуры append; прямого доступа к буферу у него нет. Сначала провес ПровеРяет условие notfull, чтобы выяснить, имеется ли в буфере пустое *oft сли ег° нет, процесс приостанавливается, и в монитор может войти дру- Иц Р°Цесс (производитель или потребитель). Позже, когда буфер оказывается *Эбн НеН Не Д0 кони<а' приостановленный процесс извлекается из очереди и во- ляет свою работу. После того как процесс поместит символ в буфер, он ^ 6« Параллельные вычисления: взаимоисключения... 289
-нализирует о выполнении условия notempty, что разблокирует прод п гбителя (если последний был приостановлен). *"s Этот пример иллюстрирует разделение ответственности при работе с монц эом и при использовании семафоров. Монитор автоматически обеспечивает шмоисключение: одновременное обращение производителя и потребителя r реру невозможно. Однако программист должен корректно разместить нутрц нитора примитивы cwait и csignal, для того чтобы предотвратить рфзмеще- е элемента в заполненном буфере или выборку из пустого буфера. В. чучае пользования семафоров ответственность как за синхронизацию, так и за взаи- исключения полностью лежит на программисте. Обратите внимание, что в листинге 5.15 процесс покидает монитор немед. нно после выполнения функции csignal. Если вызов csignal осуществляется в конце процедуры, то, по предложению Хоара, вызвавший эту функцию оцесс приостанавливается, для того чтобы освободить монитор для' ругого оцесса, помещается в очередь и остается там до тех пор, пока монитор" новь освободится. Процесс можно поместить во входную очередь монитора 'ц сте с угими процессами, еще не вошедшими в монитор. Однако поскольку ссчат- ваемый процесс уже частично выполнил свою задачу в мониторе, име&р ысл ть этому процессу приоритет перед только входящими в монитор, для ис- льзовать дополнительную, "срочную" очередь (см. рис. 5.7). Заметим, дто один использующих мониторы языков, а именно Concurrent Pascal, требует^чтобы [зов csignal был последней операцией процедуры монитора. ..^"' Если выполнения условия х не ожидает ни один процесс, вызов csign 1 выполняет никаких действий. А- Как при работе с семафорами, так и с мониторами очень легко до стить шбку в функции синхронизации. Например, если опустить любой из в зовов ignal в мониторе, то процесс, попавший в соответствующую очередь, нет- там навсегда. Преимущество мониторов по сравнению с семафорам^ том, о все синхронизирующие функции заключены в мониторе. Таким . азом, ■оверить корректность синхронизации и отловить возможные ошибки # . эыва- ся проще при использовании мониторов, чем при использовании сёц А >Р0В- >оме того, при правильно разработанном мониторе доступ к защищен» im P6* рсам корректен независимо от запрашивающего процесса; при испол в вии ; семафоров доступ к ресурсу корректен только в том случае, если п|» ильн зработаны все процессы, обращающиеся к ресурсу. д [ониторы с оповещением и широковещанием -f Определение мониторов, данное Хоаром [HOAR74], требует, чтобы ? ,у?* ] ли очередь ожидания выполнения условия не пуста, при выполнений nKl [бо процессом операции csignal для этого условия был немедленно. ,.п юцесс, находящийся в указанной очереди. Таким образом, выполнивШ_«» ° ь цию csignal процесс должен либо немедленно выйти из монитора, Jn| р постановленным '* У такого подхода имеется два недостатка. -£• .p. e 1. Если выполнивший операцию csignal процесс не завершил свое>прео ние в мониторе, то требуются два дополнительных переключения П **е t одно для приостановки данного процесса и второе для возобновл * работы, когда монитор станет доступен. <f* ЭО Часть 2; XI )0Ue 2. Планировщик процессов, связанный с сигналом, должен быть идеально надежен. При выполнении csignal процесс из соответствующей очереди должен быть немедленно активизирован, причем планировщик должен гарантировать, что до активизации никакой другой процесс не войдет в монитор (в противном случае условие, в соответствии с которым активизируется процесс, может успеть измениться). Так, например, в листинге 5.15, когда выполняется csignal (noterapty), процесс из очереди nonempty должен быть активизирован до того, как новый потребитель войдет в монитор. Вот и другой пример: сбой процесса производителя может произойти непосредственно после того, как он добавит символ к пустому буферу, так что операция csignal не будет выполнена. В результате процессы в очереди notempty окажутся навечно заблокированными. Лэмпсон (Lampson) и Ределл (Redell) разработали другое определение монитора для языка Mesa [LAMP80]. Их подход позволяет преодолевать описанные проблемы, а кроме того, предоставляет ряд полезных расширений концепции мониторов. Структура монитора Mesa использована и в языке программирования Modula-3 [NELS91]. В языке программирования Mesa примитив csignal заменен примитивом cnotify, который интерпретируется следующим образом. Когда процесс, выполняющийся в мониторе, вызывает cnotify (х), об этом оповещается очередь условия х, но выполнение вызвавшего cnotify процесса продолжается. Результат оповещения состоит в том, что процесс в начале очереди условия возобновит свою работу в ближайшем будущем, когда монитор окажется свободным. Однако поскольку нет гарантии, что некий другой процесс не войдет в монитор до упомянутого ожидающего процесса, при возобновлении работы наш процесс должен еще раз проверить, выполнено ли условие. В случае использования такого подхода процедуры монитора boundedbuffer будут иметь следующий вид (листинг 5.16). Листинг 5.16. Код монитора boundedbuf fer void append{char x) while(count == N) cwait(notfull); /* Буфер заполнен */ buffer[nextin] = x; nextin = (nextin+l)%N; count++; /* Добавляем элемент в буфер */ } cnotify(notempty); /* Уведомляем потребителя */ v°icl take (char x) { while(count == 0) cwait(notempty); /* Буфер пуст buffer[nextout]; £extout = (nextout+l)%N; ■>'■ cnofT' /'* Удаляем элемент из буфера */ 'J lfY(notfull); /* Уведомляем производителя */ Г. л 5- Параллельные вычисления: взаимоисключения... 291
'X Инструкции if заменены циклами while; таким образом, будет выползрсять- как минимум одно лишнее вычисление переменной условия. Однако в\ то^ гчае отсутствуют лишние переключения процессов и не имеется ограничений момент запуска ожидающего процесса после вызова cnotify. J Одной из полезных особенностей такого рода мониторов может быть/свя- iHoe с каждым примитивом условия cnotify предельное время ожид Ия юцесс, который прождал уведомления в течение предельного времени,- поме- 1ется в список активных независимо от того, было уведомление о выполи ии повия или нет. При активизации процесс проверяет, выполнено ли условие, и in да, то продолжает свою работу. Такая возможность предотвращает 0еско- чное голодание процесса в случае, когда другие процессы сбоят перед уведоу- нием о выполнении условия. jf. При использовании правила, согласно которому происходит уведомление,.пресса, а не его насильственная активизация, в систему команд можно вклю «митив cbroadcast, который вызывает активизацию всех ожидающих ирод сов. о может быть удобно в ситуациях, когда процесс не осведомлен о количес ожи- ющих процессов. Предположим, например, что в программе производи- ль/потребитель функции append и take могут работать с символьными блоками ■ременной длины. В этом случае, когда производитель добавляет в буфер блок сим- >лов, он не обязан знать, сколько символов готов потребить каждый из ожидающих юцессов. Он просто выполняет инструкцию cbroadcast, и все ожидающие процес- з. получают уведомление о том, что они могут попытаться получить свою долю 1мволов из буфера. ." f Кроме того, широковещательное сообщение может использоваться в том случае, эгда процесс не в состоянии точно определить, какой именно процесс из ожидаю- [их должен быть активизирован. Хорошим примером такой ситуации может слу- :ить диспетчер памяти. Допустим, у нас имеется j байт свободной памяти, и неко* эрый процесс освобождает дополнительно k байт. Диспетчеру не известно, какой менно из ожидающих процессов сможет работать с k+j байт свободной памяти; сле- овательно, он должен использовать вызов cbroadcast, и все ожидающие цессы ами проверят, достаточно ли им освободившейся памяти. '* Преимуществом монитора Лэмпсона-Ределла по сравнению с моя ором [оара является его меньшая подверженность ошибкам. При подходе Лэмпсона- 'еделла, поскольку каждая процедура после получения сигнала проверяет перегенную монитора с использованием цикла while, процесс может послать невер- юе уведомление или широковещательное сообщение, и это не приведет шибье [рограмме, получившей сигнал (попросту убедившись, что ее зря активизирова [И, программа вновь перейдет в состояние ожидания). . .._,-j aj, Другим достоинством монитора Лэмпсона-Ределла является то, что: он сп юоствует использованию модульного подхода при создании программ. " . ше условий при использовании этого типа монитора не требует измени яя в системы сигналов, так как каждый процесс сам проверяет выполнение т ггвующих условий при активизации. ' ~ ; "4К« ■> ■■■- "-"■"■ 5.6ШВДДЩ& СООБЩИШЬ V При взаимодействии процессов между собой должны УДО"?"*. до** фундаментальных требования: синхронизации и коммуникации. Процес Часть 2?Х&°*!СГ 292 ........ :: • - ■ ■ ™и*в^^. л йЬ1 быть синхронизированы, с тем чтобы обеспечить выполнение взаимных исключений; сотрудничающие процессы должны иметь возможность обмениваться информацией. Одним из подходов к обеспечению обеих указанных функций является передача сообщений. Важным достоинством передачи сообщений является ее пригодность для реализации как в одно- и многопроцессорных системах с разделяемой памятью, так и в распределенных системах. Системы передачи сообщений могут быть различных типов; в этом разделе мы обратимся только к наиболее общим возможностям и свойствам таких систем. Обычно функции передачи сообщений представлены в виде пары примитивов send (получатель, сообщение) receive[отправитель, сообщение) Это — минимальный набор операций, требующийся процессам для работы с системами передачи сообщений. Процесс посылает информацию в виде сообщения другому процессу, определенному как получатель, вызовом send. Получает информацию процесс при помощи выполнения примитива receive, которому указывает отправителя сообщения. При разработке систем передачи сообщений следует решить ряд вопросов, которые перечислены в табл. 5.4. В оставшейся части данного раздела мы вкратце коснемся каждого из этих вопросов. Таблица 5.4. Характеристики систем передачи сообщений Синхронизация Формат Отправление Содержимое Блокирующее Длина Неблокирующее Фиксированная Получение Переменная Блокирующее Неблокирующее Проверка наличия Адресация Принцип работы очереди Прямая FIFO Отправление Приоритетная Получение Неявное Явное Косвенная Статическая Динамическая Владение -' ^нхронизация ■ Передача сообщения между двумя процессами предполагает наличие опре- ttt енно^ степени их синхронизации: получатель не в состоянии получить сооб- £ч>^ Ие Д° тех пор, пока оно не послано другим процессом. Кроме того, мы долж- ■ Че °ПРеделить» что происходит после того, как процесс вызывает примитивы /.. Пс! Или receive# Л^ва 5. Параллельные вычисления: взаимоисключения... 293
I; Сначала рассмотрим примитив send. При его выполнении имеют 1Можности: либо посылающий сообщение процесс блокируется, либо';- Df) икает работу. Аналогично — две возможности и у процесса, выполняющего нмитив receive. ,.-«^ L. Если сообщение было предварительно отправлено, то процесс получает- го и продолжает работу. ■ ^ I. Если сообщения, ожидающего получение, нет, то: ^ а) либо процесс блокируется до тех пор, пока сообщение не будет полу но- б) либо процесс продолжает выполнение, отказываясь от дальнейших-попыток получить его. -tfi. Таким образом, и отправитель, и получатель могут быть блокируемыми или блокируемыми. Обычно встречаются три комбинации (хотя в реальных^. 1сте- IX реализуются, как правило, только одна или две). ""'"т:л.% • Блокирующее отправление, блокирующее получение. И отправитель* и получатель блокируются до тех пор, пока сообщение не будет доставлено по назначению. Такую ситуацию иногда называют рандеву (rendezvous . Эта комбинация обеспечивает тесную синхронизацию процессов. • Неблокирующее отправление, блокирующее получение. Хотя отправитель и может продолжать работу, получатель блокируется до получения с бше- ния. Эта комбинация, пожалуй, встречается чаще всего. Она „ позволяет процессу посылать одно или несколько сообщений различным получателям с максимальной быстротой. Процесс, который должен получить сообщение перед тем, как приступить к выполнению каких-то действий, будет; абто- кирован, пока не получит необходимое сообщение. Примером тако рода системы может быть серверный процесс, существующий для предос автения сервисов или ресурсов другим процессам. ;4 • Неблокирующее отправление, неблокирующее получение. Не блокируется ни один из процессов. $ Неблокирующий примитив send наиболее естественен для множества,. &ч с использованием параллельных вычислений. Например, если он используется тя запроса на выполнение операции вывода (скажем, на принтер), то данный м0* жет быть отправлен в виде сообщения, после чего работа процесса продолжится- Потенциальная опасность неблокирующего отправления сообщений состоит в том, ^ возможна ситуация, когда некоторая ошибка приведет к непрерывной гене м * с0* общений. Поскольку блокировка не предусмотрена, эти сообщения могут щи * ь потреблению значительной части системных ресурсов, в том числе процессорное времени и памяти, нанеся вред другим процессам и самой операционной с сте; Кроме того, при таком подходе на программиста возлагается задача отел успешной доставки сообщения адресату (процесс-получатель должен, в свою о. послать ответ с подтверждением получения сообщения). г| В случае использования примитива received для большинства зада^ ственной представляется блокирующая технология. Вообще говоря, проц просивший информацию, нуждается в ней для продолжения работы. Kqh если сообщение теряется (что не такая уж редкость в распределенных си или происходит сбой процесса перед отправкой сообщения, то пр 9€*А Часть 2.;Про* получатель может оказаться навсегда заблокированным. Решить эту проблему можно с помощью неблокирующего примитива receive; однако у этого вариан- та имеется свое слабое место: если сообщение послано после того, как процесс выполнил соответствующую операцию receive, то оно оказывается потерянным- Еще один возможный подход к решению проблемы заключается в том, чтобы позволить процессу перед тем, как выполнять receive, проверить, не имеется ли ожидающего получения сообщения, а также позволить процессу указывать несколько отправителей в примитиве receive. Последнее решение особенно удобно, если процесс ожидает сообщения из нескольких источников и мо- жет продолжать работу при получении любого из них. Адресация Ясно, что совершенно необходимо иметь возможность определения в примитиве send процесса — получателя сообщения. Аналогично, большинство реализаций позволяют получателю указать, сообщение от какого отправителя должно быть принято. Различные схемы определения процессов в примитивах send и receipt разделяются на две категории: прямую (direct) и косвенную (indirect) адресацию. При прямой адресации примитив send включает идентификатор процесса-получателя. Когда применяется примитив receive, можно пойти двумя путями. Первый путь состоит в требовании явного указания процесса-отправителя, т.е. процесс должен знать заранее, от какого именно процесса он ожидает сообщение. Такой путь достаточно эффективен, если параллельные процессы сотрудничают. Однако во многих случаях невозможно предсказать, какой процесс будет отправителем ожидаемого сообщения (в качестве примера можно привести процесс сервера печати, который принимает сообщения — запросы на печать от любого другого процесса). Для таких приложений более эффективным будет подход с использованием неявной адресации. В этом случае параметр отправитель получает значение, возвращаемое после выполнения операции получения сообщения. Еще одним распространенным подходом является косвенная адресация. Она предполагает, что сообщения посылаются не прямо от отправителя получателю, а отправляются в совместно используемую структуру данных, состоящую из очередей для временного хранения сообщений (такие очереди обычно именуют поч- выми ящиками (mailbox)). Таким образом, для связи между двумя процессами Дин из них посылает сообщение в соответствующий почтовый ящик, из которого заберет второй процесс. Эффективность косвенной адресации, в первую очередь, заключается в гибкости ользования сообщений. При такой схеме работы с сообщениями отношения меж- отправителем и получателем могут быть любыми — "один к одному", "один ко g^^ x™ , многие к одному" или "многие ко многим". Отношение "один к одному" ечивает закрытую связь, установленную между двумя процессами, изолируя их Лез °Действие от постороннего вмешательства. Отношение "многие к одному" повой ^И взаим°Действии клиент/сервер — один процесс при этом представляет со- I ***сто РВер' обслУживающий множество клиентов. В таком случае о почтовом ящике З^ссы орят как ° порте (см. рис. 5.8). Отношение "один ко многим" обеспечивает ^°beij КУ °Т одного процесса множеству получателей, позволяя осуществить широ- ^ательное сообщение множеству процессов. -■* «• Параллельные вычисления: взаимоисключения... 295
Получатель ■с f l'.f.s * Puc. 5.8. Косвенная связь между процессами ,,<■ Связь процессов с почтовыми ящиками может быть как статической, так и [инамической. Порты чаще всего статически связаны с определенными процес- ами — т.е. порт создается и назначается процессу навсегда. То же наблюдается [ в случае использования отношения "один к одному" — закрытые каналы свя- и, как правило, также определяются статически, раз и навсегда. *''» При наличии множества отправителей их связи с почтовым ящиком мог>т 1существляться динамически, с использованием для этой цели примитивов типа :onnect и disconnect. •'**' С косвенной адресацией тесно связан вопрос владения почтовым я-Щиьом. лучае использования порта он, как правило, создается процессом-пол aTeie финадлежит ему. Таким образом, при уничтожении процесса порт тлйже }*° южается. При использовании обобщенного почтового ящика операционная с 'ема может предложить специальный сервис по созданию почтовых Я ikob. сие ящики могут рассматриваться как такие, которые принадлежат создав ■• - ix процессу (и, соответственно, уничтожаться при завершении работы,.про** шбо операционной системе (в этом случае для уничтожения почтового требуется поступление явной команды). * Формат сообщения Формат сообщения зависит от преследуемых целей и от того, р.°° iH ас** :истема передачи сообщений на одном компьютере или в распределе ,° ^ ле. В ряде операционных систем разработчики предпочитают короткие с 296 Част* , Р°ц * г *■ It: яйЯ фиксированной длины, что позволяет минимизировать обработку и умень- пить расходы памяти на их хранение. При передаче больших объемов данных 0нй могут размещаться в файле, а само сообщение — просто содержать ссылку & этот файл. Однако более гибкий подход позволяет использовать сообщения переменной длины. На рис. 5.9 показан формат типичного сообщения операционной системы, которая поддерживает сообщения переменной длины. Сообщение разделено на дБе части: заголовок, содержащий информацию о сообщении и тело с собственно ^держанием сообщения. Заголовок может включать идентификаторы отправителя и получателя сообщения, поля длины и типа сообщения. В заголовке, кроме того, может находиться дополнительная управляющая информация, например указатель, позволяющий объединить создаваемые сообщения в связанный список, или номер, позволяющий упорядочить передаваемые сообщения. Заголовок Тип сообщения Идентификатор получателя Идентификатор отправителя Длина сообщения Управляющая информация Тело Содержание сообщения Рис. 5.9. Обобщенный формат сообщения Принцип работы очереди Простейший принцип работы очереди — "первым вошел — первым вышел", но он может оказаться неадекватным, если некоторые сообщения будут более срочные, чем другие. В этом случае очередь должна учитывать приоритет сообщений, основы- Ваясь либо на типе сообщения, либо на непосредственном указании приоритета от- пРавителем. Можно также позволить получателю просматривать всю очередь сообщений и выбирать, какое письмо должно быть получено следующим. взаимные исключения листинге 5.17 показан один из способов реализации взаимных исключе- с использованием системы передачи сообщений (сравните с листингами 5.1, и 5.7). В данной программе предполагается использование блокирующего -ive и неблокирующего send. Множество параллельно выполняющихся to Сов совместно используют почтовый ящик mutex как для отправки сообщи Так и ^ля их ПОЛУче1ЛИЯ- Почтовый ящик после инициализации содер- ^ еДинственное сообщение с пустым содержимым. Процесс, намеревающийся *^й в критический раздел, сначала пытается получить сообщение. Если почто- яЩик пуст, процесс блокируется. Как только процесс получает сообщение, 7* 5. Параллельные вычисления: взаимоисключения... 297
гт же выполняет критический раздел и затем отсылает сообщение обрат о в эвый ящик. Таким образом, сообщение работает в качестве переходя ^ а, передающегося от процесса к процессу. j^ мнг 5.17. Реализация взаимных исключений с использованием сообщен и t int n ~ /* Количество процессов */; P{int n) ■a». message msg; while(true) { receive(mutex,msg); /* Критический раздел */; send(mutex,msg); /* Остальной код */; } s «г 1 1 ma in() create_mailbox(mutex); send(mutex,null); parbegin(P(l),P(2),...,P(n)); 4 -.'$? гинг 5.18. Решение задачи производитель /потребитель с ограниченным буфером с использованием сообщении 5t int capacity = /* Емкость буфера */; null = /* Пустое сообщение */; i; i producer() message pmsg; while(true) { receive(mayproduce,pmsg); pmsg = produce{); send(maуconsume,pmsg); } d consumer() 1 ft message cmsg; while(true) { receive(mayconsume,cmsg); consume(cmsg); send(mayproduce,null); } d main() create_mailbox(mayproduce); create mailbox(mayconsume); В Часть 2. П « c' 4 for(int i = 1; i <= capacity; i++) send(mayproduce,.null); parbegin(producer,consumer); } В рассмотренном решении предполагается, что если операция receive выполняется параллельно более чем одним процессом, то: • если имеется сообщение, оно передается только одному из процессов, а остальные процессы блокируются; • если очередь сообщений пуста, блокируются все процессы; когда в очереди появляется сообщение, его получает только один из заблокированных процессов. Это предположение выполняется практически для всех средств передачи сообщений. В качестве другого примера использования сообщений в листинге 5.18 приведено решение задачи производитель/потребитель с ограниченным буфером. Эту задачу можно решить способом, аналогичным приведенному в листинге 5.11, если воспользоваться реализацией взаимоисключений на базе сообщений. Однако в программе из листинга 5.18 используется другая возможность сообщений — а именно передача данных в дополнение к сигналам. В программе используются два почтовых ящика. Когда производитель генерирует данные, он посылает их в качестве сообщения в почтовый ящик mayconsume. Пока в этом почтовом ящике имеется хотя бы одно письмо, потребитель может получать данные — следовательно, почтовый ящик mayconsume служит буфером, данные в котором организованы в виде очереди сообщений. "Емкость" этого буфера определяется глобальной переменной capacity. Почтовый ящик mayproduce изначально заполнен пустыми сообщениями в количестве, равном емкости буфера. Количество сообщений в этом почтовом ящике уменьшается при каждом поступлении новых данных и увеличивается при их использовании. Такой подход достаточно гибкий — он может работать с любым количеством производителей и потребителей; главное, чтобы они имели доступ к обоим почтовым ящикам. Более того, система производителей и потребителей может быть распределенной, когда все производители и почтовый ящик mayproduce находятся на одной машине, а потребители и почтовый ящик mayconsume — на другой. J-7. ЗАДАЧА ЧИТАТЕЛЕЙ/ПИСАТЕЛЕЙ Чг /Чкй При разработке синхронизации и параллельных вычислений зачастую полезно зать имеющуюся у вас задачу с уже известными и получить возможность прове- **Тъ применимость вашего решения к известной задаче. В литературе довольно час- встречается рассмотрение таких "эталонных" задач, представляющих собой при- 1?ь* часто возникающих перед разработчиком проблем. С одной из них — задачей е ЗВод-ителя/потребителя — мы уже встречались; в этом разделе мы рассмотрим °ДНу классическую задачу — читателей/писателей. 0 ипРеделить ее можно следующим образом. Имеются данные, совместно ис- Вой ^емьге рядом процессов. Данные могут находиться в файле, в блоке основ- $^ ал*яти или даже в регистрах процессора. Имеется несколько процессов, ко- щ е только читают эти данные (читатели), и несколько других, которые толь- . а 5, Параллельные вычисления: взаимоисключения... 299
I -I'f ■< вписывают данные (писатели). При этом должны удовлетворяться следуй : условия. ,.*£ Любое число читателей могут одновременно читать файл. ,;>-* Записывать информацию в файл в определенный момент времени"может только один писатель. Лл Когда писатель записывает данные в файл, ни один читатель не моясет его читать. Перед тем как приступить к работе, разделим эту задачу на две: обычную 1чу взаимоисключений и задачу производителя/потребителя. В задаче чита- зй/писателей читатели не записывают данные, а писатели их не читают. Бо- общей является ситуация, когда каждый процесс может как читать, так и ать данные (и которая включает рассматриваемую задачу как частные сту- ). В таком случае мы можем объявить любую часть процесса, которая обра- :тся к данным, критическим разделом и использовать простейшее решение на ове взаимоисключений. Причина, по которой мы рассматриваем частный чай более общей задачи, заключается в том, что общее решение значительно едляет работу, в то время как для частного случая имеется гораздо более эф- :тивное решение. Представим себе библиотечный каталог, в котором читатели ут искать нужную им литературу, а один или несколько работников библио- и могут этот каталог обновлять. При общем решении читатели будут нынуж- ы входить в каталог по одному, что, конечно, приведет к неоправданным за- жкам и очередям. Кроме того, работники библиотеки при внесении измене- i не должны мешать друг другу! а также не должны допускать читателей к ным в момент их изменения, чтобы предотвратить получение читателем не- товерной информации. ,.^ Можно ли рассматривать задачу производителя/потребителя как частный слу- . задачи читателей/писателей с единственным писателем (производитель) дин- енным читателем (потребитель)? Оказывается, нет. Производитель — на росто атель. Он должен считывать значение указателя очереди, чтобы определясь куда дует вносить очередную порцию информации, и выяснять, не заполнен ли фер- алогично и потребитель является не просто читателем, так как он изменя т зна- ие указателя очереди, указывая, что элемент удален из буфера. ,'г Теперь мы рассмотрим два решения поставленной задачи. $ ■&Г эиоритетное чтение В листинге 5.19 приведено решение задачи с использованием семафо Д1Я >ианта, в котором имеются один читатель и один писатель (решение к °У" изменений, если имеется много читателей и писателей). Процесс,.ДН, ;нь прост. Для обеспечения взаимного исключения используется :се Ф°- гт. Когда один писатель записывает данные, ни другие писатели, ни ч. ^(_ те могут получить к ним доступ. Процесс читателя также использует се Ф° эт для обеспечения взаимоисключений. Однако чтобы обеспечить возмо но ювременной работы многих читателей, состояние семафора проверяет ToJIt, гатель, входящий в критический раздел, в котором нет других читателей, в критическом разделе уже находится хоть один читатель, то другой «"ат дступает к работе, не ожидая семафора wsem. Для отслеживания ко? чеС О Часть 2. П одессЫ читателей в критическом разделе используется глобальная переменная readcountt а для гарантии корректного ее обновления — семафор х. Листинг 5.19. Решение задачи читателей/писателей с использованием семафоров (приоритетное чтение) int readcount; semaphore х = 1, wsem = 1; void reader{) { while(true) { wait(x); readcount++; if (readcount==l) wait(wsem); signal(x); READUNITO ■ wait(x) ; readcount—; if (readcount==0) signal(wsem); signal(x); } } void writer() { while(true) { wait(wsem); WRITEUNIT(); signal(wsem); } > void main() readcount = 0; parbegin(reader, writer); Приоритетная запись о предыдущем решении приоритетной операцией являлось чтение данных. с и олин читатель получил доступ к данным, то возможна ситуация, когда пи- ПокЛЬ В течение Д°лгого времени не получит возможности внести изменения — хотя бы один из читателей будет находиться в критическом разделе. 1цег ЛИстинге 5.20 показано решение, обеспечивающее выполнение следующий УСЛовИя: ни ОДИн читатель не сможет обратиться к данным, если хотя бы ЛМе ПИСатель объявил о своем намерении произвести запись. Для этого к fcv, Щимся в программе семафорам и переменным процесса писателя добавле- , ** Следующие. у ,|вда 5. Параллельные вычисления: взаимоисключения... 301
семафор rsem, запрещающий вход читателей, если хотя бы один пи Те^ объявил о намерении произвести запись; -,s переменная writecount, обеспечивающая корректность установки знач и» rsem; семафор у, гарантирующий корректность изменения переменной writecdynt. стинг 5.20. Решение задачи читателей/писателей с использованием Д семафоров (приоритетная запись) .,„ -f : readcount, writecount; naphore х = 1, у=1, z=l, rsem = 1, wsem = 1; .d reader () while(true) { wait(z) ; wait(rsem) ; wait(x) ; readcount++; if (readcount==l) wait(wsem); signal(x) ; signal(rsem); signal(z); READUNIT(); wait(x); readcount--; if (readcount==0) signal(wsem); signal(x); I 3*- ... 1 *tf 4. % d writer{) while(true) { wait(y); writecount++; if (writecount==l) wait(rsem); signal(y); wait(wsem); WRITEUNIT(); signal(wsem); wait(y); writecount—; if (writecount==0) signal(rsem); signal(y); } f v. ■ V ..• Часть 2. П ou vDid main() { ) readcount = writecount = 0; parbegin(reader, writer); В процессе читателя требуется один дополнительный семафор. На основании семафора rsem нельзя создавать длинную очередь, иначе сквозь нее не смогут "прорваться" писатели. Для осуществления ограничения, когда семафор rsem приостанавливает только один процесс чтения, служит семафор z, блокирующий остальных читателей. В табл. 5.5 приведены возможные ситуации в данной системе. Таблица 5.5. Состояния очередей процессов в программе из листинга 5.20 В системе имеются только читатели В системе имеются только писатели В системе имеются как читатели, так и писатели; первым выполняется чтение В системе имеются как читатели, так и писатели; первой выполняется запись Устанавливается wsem Очередей нет Устанавливаются wsem и rsem Очередь писателей на wsem wsem устанавливается читателем rsem устанавливается писателем Все писатели становятся в очередь на wsem Один читатель становится в очередь на rsem Остальные читатели становятся в очередь на z •wsem устанавливается писателем rsem устанавливается писателем Все писатели становятся в очередь на wsem Один читатель становится в очередь на rsem Остальные читатели становятся в очередь на z В листинге 5.21 приведено еще одно решение задачи с приоритетной записью, реализованное с использованием системы передачи сообщений. В этом случае имеется управляющий процесс с правом доступа к совместно используемым Данным. Прочие процессы запрашивают право доступа к данным, посылая сообщение управляющему процессу. Запрашивающий процесс получает право досту- а посредством ответного сообщения "ОК", а после завершения работы сообщает этом специальным сообщением finished. У управляющего процесса имеются Ри почтовых ящика, по одному для каждого типа получаемых им сообщений. стинг 5.21. Решение задачи читателей/писателей с использованием системы передачи сообщений void reader(int i) message rmsg; while(true) rmsg = i; ав& 5. Параллельные вычисления: взаимоисключения.. 303
send(readrequest,rmsg); receive(rabox[i],rmsg); RE^DUNITO ; rmsg = i; send(finished,rmsg); d writer(int j) message rmsg; while(true) { rmsg ~ i; send(writerequest,rmsg); receive(mbox[j],rmsg); WRITEUNITO ; rmsg = i; send(finished,rmsg); } d controller() while(true) { if (count > 0) { if (!empty(finished)) { receive(finished,msg); count++; } else if (!empty(writerequest)) { receive(writerequest,msg); writer_id = msg.id; count = count - 100; } else if (!empty(readrequest)) { receive(readrequest,msg); count--; send(msg.id,"OK") ; } } if (count == 0) { send(writer_id,"OK") ; receive(finished,msg) ; count = 100; } while(count < 0) { receive(finished,msg); t count++- } } Первыми управляющий процесс обслужит запросы на запись, давая таким б разом приоритет операции записи; кроме того, управляющий процесс обеспечивает выполнение взаимоисключений, для чего используется переменная count, инициализируемая неким числом, которое заведомо больше максимально возможного количества читателей. В нашем примере использовано значение 100. Действия управляющего процесса можно описать следующим образом. • Если count>0, значит, ожидающих писателей нет; активные читатели могут как присутствовать, так и отсутствовать. Управляющий процесс обслуживает сначала все сообщения типа finished, а затем запросы от писателей и читателей. • Если count=0, это означает, что у нас имеется только запрос на запись. Управляющий процесс дает писателю "добро" на выполнение своих действий и ожидает от него сообщения о завершении работы. • Если count<0, значит, писатель сделал запрос и ожидает завершения работы всех активных читателей, так что управляющий процесс при этом принимает только сообщения о завершении работы читателей. Щ8. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫЩ Ш и контрольные вопросы ШШ& ?; Центральными вопросами современных операционных систем являются многозадачность, многопроцессорность и распределенные вычисления. Фундаментальным понятием этих тем (как и технологий разработки операционных систем в целом) являются параллельные вычисления. При параллельном выполнении нескольких задач (не важно, реальном ли параллельном выполнении на разных процессорах или виртуальном в однопроцессорной системе) перед разработчиком возникают вопросы раз- Решения конфликтов и сотрудничества процессов. Параллельно выполняющиеся процессы могут взаимодействовать друг с другом Различными путями. Процессы, не осведомленные о наличии других процессов, мо- ГУТ» тем не менее, участвовать в конкурентной борьбе за использование ресурсов, например за процессорное время или порты ввода-вывода. Процессы могут быть кос- о осведомлены о наличии других процессов при совместном использовании объ- > таких, как блок основной памяти или файл. И, наконец, процессы могут быть ^ДФмлены о наличии других процессов непосредственно и сотрудничать с ними ц °бмена информацией. Ключевыми вопросами при таком взаимодействии про- ^ становятся взаимные исключения и взаимоблокировки. ^ заимное исключение представляет собой выполнение условия, при котором из Щка СТВа паРаллельно выполняющихся процессов одновременно получить доступ к Врем ^°М^ РесУРсУ или выполнить определенную функцию в определенный момент ФгГьр И Может только один из них. Технология взаимоисключений может приме- Для разрешения конфликтов, таких, как конкуренция за использование ре- .., 4- * 5. Параллельные вычисления: взаимоисключения... 305
«* сов, и для синхронизации сотрудничающих процессов. Примером последнему Q г служить модель производителя/потребителя, в которой один процесс пом * ^^ ные в буфер, а другой (или несколько процессов) извлекает их оттуда. ";щ' Разработан ряд алгоритмов для обеспечения взаимных исключений,, ц-' g известным из которых является алгоритм Деккера. Недостатки програир«н0. подхода — высокие накладные расходы процессорного времени и риск '-j- j_ ких ошибок. ДругохЧ подход к решению задачи взаимоисключений сост^3 т в сользовании специализированных машинных команд. Этот подход нескр" ц0 [жает накладные расходы, однако все равно имеет низкую эффективно* в зи с использованием технологии пережидания занятости. '4^. Еще один подход к решению задачи поддержки взаимных исключение со- ит в обеспечении специализированных возможностей в операционной cekjt^ e. иболее широко распространенными технологиями являются семафоры &. ic. ia передачи сообщений. Семафоры используются для передачи сигналов" эк- процессами и могут быть легко применены для решения задачи вааимЬ ic- очений. Сообщения, кроме обеспечения взаимоисключений, являются к- шым средством связи между процессами. / *' 1ючевые термины нарный семафор Монитор Пережидание занято I экирующие операции Неблокирующие операции Семафор ;v|; шмоблокировка Параллельные вычисления Сильный семафор . ^ шмоисключение Параллельные процессы Слабый семафор „^ юдание Передача сообщений Сопрограммы f- энтрольные вопросы .щ 5.1. Перечислите основные проблемы, связанные с концепцией параллель ых вычислений. •■£, 5.2. Каковы три различных контекста, в которых проявляются параллел ные вычисления? Ц 5.3. Каковы основные требования к выполнению параллельных процессов; 5.4. Перечислите три степени осведомленности процесса о наличии?Д гпх процессов и вкратце опишите их. ^к 5.5. В чем основное различие между конкурирующими и сотрудничаю ™и процессами? ^ 5.6. Перечислите основные проблемы, связанные с конкуренцией процессов, вкратце опишите их. 5.7. Перечислите требования к взаимоисключениям. ~ ■*$ 5.8. Какие операции могут выполняться над семафорами? 5.9. В чем различие между бинарными и обобщенными семафорами? ■£. .10. В чем различие между сильными и слабыми семафорами? '*'*,'_ .11. Что такое монитор? ' Ж .12. В чем состоит различие между блокирующими и неблокирующими_&..._ циями в системе передачи сообщений? .13. Какие условия обычно связаны с задачей читателей/писателей? К> Часть 2. П' «я |б.9. РЕКрМЕНду|ЩАЯ;ЛиТ^^ ~ В [BEN82] обсуждаются вопросы, связанные с параллельными вычислениями, взаимными исключениями, семафорами и другими темами. Более формальное рассмотрение темы, включая знакомство с распределенными системами, можно найти в [BEN90]. [AXF088] — еще одна работа по данной тематике, содержащая большое количество реальных задач и их решений. Множество применяемых при работе с параллельными вычислениями алгоритмов, включающих как программный, так и аппаратный подходы, содержится в [RAYN86]. [HOAR85] представляет собой классическую работу, в которой представлен формальный подход к определению последовательных процессов и параллельных вычислений. Несколько растянутое формальное рассмотрение взаимоисключений имеется в [LAMP86]. Практическую помощь в понимании проблем параллельных вычислений окажет работа [RUDO90], так же как и хорошо организованная работа [ВАСОЭ8]. [BIRR89] представляет собой отличное практическое введение в программирование с использованием параллельных вычислений. Познакомиться с мониторами поможет [BUHR95], а в работе [KANG98] проведен поучительный анализ 12 различных стратегий планирования применительно к задаче читателей/писателей. AXF088 Axford T. Concurrent Programming: Fundamental Techniques for Real- : Time and Parallel Software Design. — New York: Wiley, 1988. BAC098 Bacon J. Concurrent Systems. — Reading, MA: Addison-Wesley, 1998. BEN82 Ben-Ari M. Principles of Concurrent Programming. — Englewood Cliffs, j NJ: Prentice Hall, 1982. BEN90 Ben-Ari M. Principles of Concurrent and Distributed Programming. — ■; Englewood Cliffs, NJ: Prentice Hall, 1990. BIRR89 Birrell A. An Introduction to Programming with Threads. — SRC Research , Report 35, Compaq Systems Research Center, Palo Alto, CA, January 1989. '' Available at http: //www. research.digital.com/SRC. BUHR95 Buhr P., Fortier M. Monitor Classification. — ACM Computing Surveys, ] March 1995. HOAR85 Hoare С Communicating Sequential Processes. — Englewood Cliffs, NJ: ! . Prentice Hall, 1985. KANG98 Kang S., Lee J. Analysis and Solution of Non-Preemptive Policies for LAx?^eduling Readers and Writers. — Operating Systems Review, July 1998. {гН*?86 Lamport L. The Mutual Exclusion Problem. — Journal of the ACM, April 1986. AYN86 Raynal M. Algorithms for Mutual Exclusion. — Cambridge, MA: MIT Press. 1986. i-. U^°90 Rudolph B. Self-Assessment Procedure XXI: Concurrency. — Communica- '. \_ПоП8 0f the ACM, May 1990. tg-10. ЗАДАЧИ K»V- ф,4и№<гн ГТ\ -STS**" trt*| тъ&ь^г^.^л&г. .„ ~M.J-.~d& •1. rr it; ' Роц-ессы и потоки представляют мощный инструмент структурирования при %\ реализации существенно более сложных, чем простые последовательные, про- Д П>£Шм. цель даыного упражнения — введение сопрограмм и сравнение их с ( пР°Цессами. Рассмотрим простую задачу из [CONW63]. iffia 5. Параллельные вычисления: взаимоисключения... 307
Прочесть 80-столбцовую перфокарту и вывести ее в виде 125-си воль строк; при этом после каждой перфокарты следует добавить пробел, а1 каж *?* пару звездочек (**) следует заменить символом Т. а. Разработайте решение поставленной задачи в виде обычной после' оват ной программы. Вы увидите, что решение задачи не такое простое,, как -^ жется. Взаимодействие различных элементов программы оказываете д0 точно сложным в связи с преобразованием длины строк; кроме того, дЛ11 считанной с перфокарты строки меняется в зависимости от того^. сколь пар звездочек удалось в ней обнаружить. Чтобы сделать решение прставле ной задачи более понятным и минимизировать количество потентршльн- ошибок, имеет смысл реализовать программу как три различные процедупм' Первая считывает строки перфокарты, добавляет к каждой из них пробел в записывает поток символов во временный файл. После того как будут счи таны все перфокарты, вторая продедура приступает к чтению временного файла, выполняет замену ** на Т и записывает результат во второй временный файл. Третья процедура читает второй временный файл и вь_ одит его строками по 125 символов. Д б Последовательное решение непривлекательно хотя бы в силу больших накладных расходов на операции ввода-вывода и создание временны* файлов. Конвей (Conway) предложил новый вид структуры программы,— сопрограмму, которая позволяет написать приложение как три программы, присоединенные к односимвольному буферу (см. листинг 5.22). При спользо- вании традиционных процедур между вызывающей и вызываемой процедурами устанавливается отношение ведущий/ведомый. Вызывающая процедура может в любой момент осуществить вызов; вызываемая процедура начинает работу со своей точки входа и возвращает управление вызывающей процедуре в точке вызова. Сопрограмма демонстрирует более симметричные отношения. При каждом вызове выполнение продолжается от последней активной точки вызванной процедуры. Поскольку в таком случае невозможно говорить о том, что вызывающая процедура "выше" вызываемой, возврата из процедуры нет. Вместо этого любая сопрограмма может передать управление любой другой сопрограмме при помощи команды resui - При первом вызове сопрограммы она "продолжает выполнение" со своей точки входа. Затем сопрограммы возобновляют выполнение в то х своих последних вызовов команды resume. Заметим, что одновременно может выполняться только одна сопрограмма основной программы и что передача управления явным образом указывается в коде сопрограммы, так то говорить о параллельных вычислениях в этом случае не приходится. Р смотрите и поясните работу программы, приведенной в листинге 5.22. *f в. В программе нет условия окончания работы. Полагая, что по грам ввода-вывода READCARD возвращает значение true, если успешно С итывае и размещает 80-символьный образ в inbuf (и false в противном случае;- измените программу так, чтобы она учитывала возможность оконч *»л ния карты (заметим, что в этом случае последняя выведенная строка **o содержать менее 125 символов). -: г. Перепишите это решение в виде множества, состоящего из трех про ес использованием семафоров. гстинг 5.22. Применение сопрограмм • L — ar rs, sp; :f ar inbuf[80]; V ■ .1 18 Часть 2. oaec i cnat outbuf[125]; v { void readO while(true) { READCARD(inbuf); for(int i = 0; i < 80; i++) { rs = inbuf[i]; RESUME squash; } rs = " "; RESUME squash; } } void print () { while(true) { for(int j = 0; j < 125; j++) { outbuf[j] - sp; RESUME squash; } OUTPUT(outbuf); } } void squash() { while(true) { if (rs != "*••) { sp = rs; RESUME print; } else { RESUME read; if (rs == "*") { sp = "T"; RESUME print; } else { sp = " + "; I RESUME print; sp = rs; S RESUME print; } ) RESUME read; , ,-.■ °- Параллельные вычисления: взаимоисключения. ■ f
Рассмотрим параллельно выполняющуюся программу с двумя процессами и q, определенными так, как показано ниже. А, В, С, D и Е — пР0изВ0Льные атомарные (неделимые) операторы. Предположим также, что не показанная здесь основная программа выполняет операцию parbegin с этими двумя процессами. Приведите все возможные чередования атомарных операторов при работе описанных процессов. void p() void q() < f A; D; Й В; Е; Ш С; } > ^ Рассмотрим следующую программу: ** const int n = 50; .£_. int tally; void total() { int count; л for(count = 1; count <= n; count++) { tally++; ^ \ Ф i -'ft } a* ■3-Ч- ij# m i void main() ^ { -'Й tally = 0; >Щ parbegin(total(), total()); p write (tally () ; ■% } .M а. Определите нижнюю и верхнюю границы окончательного значения разде ляемой переменной tally на выходе из приведенной программы в.предпО' ложении, что процессы могут выполняться с любой относительно скоро стью и что значение может быть увеличено только после того, как оно за гружено в регистр отдельной машинной командой. б. Предположим, что одновременно может выполняться произвольное коли чество процессов (при этом остаются в силе предположения о работ п™ граммы из предыдущего задания). Как это повлияет на границы , ончв тельного значения переменной tally? '.* Всегда ли пережидание занятости менее эффективно (с точки зрения сорного времени), чем блокирующее ожидание? Поясните свой ответ. & Рассмотрим следующую программу: ■•£■ цес- **i. boolean blocked[2J; int turn; .'Jf. void P(int id) "%■ while(true) у blocked[id] = true; t% while(turn != id) Ш i .* while(blocked[l~id]) j { S I Часть 2. iT " turn = id; } } /* Критический раздел */ blocked[id] ~ false; /* Остальной код */ } } void main() { blocked[0] = false; blocked[l] ~ falser- turn = 0; parbegin (P(0), P(D); } Это решение задачи взаимных блокировок предложено в [HYMA66]. Найдите контрпример, демонстрирующий некорректность данного решения. Интересно, что даже редакция журнала Communications of the ACM сочла это решение корректным. Докажите корректность алгоритма Деккера. а. Докажите, что при этом обеспечиваются взаимные исключения. Указание: покажите, что когда Pi входит в критический раздел, следующее выражение истинно: flag[i] and (not flag[l-i]). б. Докажите, что процесс, запрашивающий доступ к критическому разделу, не может быть навсегда задержан. Указание: рассмотрите следующие случаи: 1) в критический раздел пытается войти единственный процесс; 2) оба процесса пытаются войти в критический раздел и при этом 2а) turn=0 и flag[0]=false и 26) turn=0 и f lag [0] ==true. Рассмотрим алгоритм Деккера, полученный для произвольного количества процессов путем замены выполняемой при выходе из критического раздела инструкции turn = 1 - i /* Р0 устанавливает turn равным 1, а Р1 — равным 0 */ инструкцией turn = (turn + 1) % n /* n - количество процессов */ Проследите работу алгоритма при количестве параллельных процессов, превышающем два. Алгоритм Петерсона может быть обобщен для обеспечения взаимоисключения N процессов. Предположим, что у нас есть два глобальных массива — q и turn. Начальное значение N элементов массива q и N-1 элементов массива turn равно 0. Каждый процесс имеет локальные переменные j и к, используемые в качестве индексов массивов. Алгоритм r-го процесса выглядит следующим образом: int q[N], turn[N-1]; /* Глобальные массивы */ while(true) i for(int j =0; j < N-1; j++) { q[i] = j; turn[j] = i; for (int k = 0; k < N; k++) 5. Параллельные вычисления: взаимоисключения... 311
{ '"i if (к != i) continue; -st* while((q[k] >= j) && (turn[jl == i) ) ; -Д. ) V } r> /* Критический раздел */ , q[i] = 0; h /* Остальной код */ "vt При рассмотрении алгоритма значение локальной переменной у мо но сматривать как "стадию" алгоритма, на которой происходит выполвени процесса i. Глобальный массив q указывает стадию каждого процес Когда процесс входит в критический раздел, он переходит к стадии N. |" Если q[x]> q[y], мы говорим, что процесс х предшествует процесс у (пли находится перед ним). Мы должны показать, что этот алгоритм обведете аег • взаимные исключения; ;''"■ • отсутствие взаимоблокировок; "•-& • невозможность голодания. \ Для этого докажите следующие леммы. ~ а. Лемма 1. Процесс, предшествующий остальным, может пройти ред как минимум к следующей стадии. Указание: пусть в седьмой строк приведенного кода i-й процесс обнаруживает, что "ЧЪ j = q[i] > q[k ] для всех к Ф j . '? б. Лемма 2. Когда процесс переходит от стадии у к стадии у'+1, выл лняется в точности одно из утверждений: .'-.^ • он предшествует всем остальным процессам, -4,-v* • он не единственный на стадии у". *Щ. Указание: пусть процесс i готов увеличить q[i]; проверьте И. тинность уравнения из предыдущей леммы при этом действии. JJy в. Лемма 3. Если имеется по меньшей мере два процесса на стадия то имеется (как минимум) один процесс на каждой из стадий k (1< _у-П- Указание: доказывается методом индукции по у. ,;$£ г. Лемма 4. Максимальное количество процессов, которое может Н чодиться на стадии у, равно N - j +1, 1 < j < N -1. Указание: применит* остеи- шую арифметику. ""' Д. Основываясь на леммах 1—4, покажите, что алгоритм обеспе г ч< т в моисключения при отсутствии взаимоблокировок и голодания. <■*$? Еще одним подходом к задаче взаимоисключений является алгор ,; °?' ной Лампорта (Lamport) [LAMP74], названный так из-за того, что о» я°' на практике булочных (и других магазинов), в которых каждый цркуп при входе получает нумерованный билет, позволяющий обслужить все купателей по очереди, boolean choosing[n]; int number [n]; l!- while (true) ■",- { choosing [i] = true; i> number[i] = 1+getmax(number[], n); choosing[i] = false; Часть 2; I oU 'I for (int j = 0; j < n; j++) ■' { I while(choosing[j]) {); I while((number[j] != 0) &6 J (number[j],j) < (number[i],i) ■ ) {}; /* Критический раздел */ number[i] = 0; /* Остальная часть кода */ } :!, } ! Массивы choosing и number инициализируются соответственно значениями О и false, i-й элемент каждого массива может быть прочитан и перезаписан процессом £, но другие процессы могут только читать соответствующие зна- | чения. Запись (o,b)<(c,d) означает |, (а<с) или (а=с и b<d). а. Опишите алгоритм словами. б. Покажите, что данный алгоритм позволяет избежать взаимоблокировок. в. Покажите, что данный алгоритм обеспечивает взаимные исключения. 5.10. Покажите, что следующие программные подходы к реализации взаимоис- ' ключений не зависят от элементарных взаимоисключений на уровне доступа к памяти. а. Алгоритм булочной. б. Алгоритм Петерсона. 5.11. При использовании для реализации взаимоисключений специальных машинных команд в листинге 5.4 никакой контроль над продолжительностью ожидания доступа к критическому разделу не осуществлялся. Разработайте алгоритм, который использует команду testset и гарантирует, что любой процесс, ожидающий ' входа в критический раздел, дождется своей очереди в пределах л-1 цикла, где \, п — количество процессов, которые могут запросить доступ на вход в критиче- j ский раздел, а "цикл" — событие, состоящее в том, что один процесс покидает , критический раздел, а другой получает право входа в него. 5-12. Рассмотрим следующее определение семафоров: void wait(s) : if (s.count > 0) | s. count--; !' } v else { Поместить этот процесс в s.queue 3aблокировать ) } void signal(s) i if {Имеется по крайней мере один '* приостановленный семафором s процесс) I < . '" Удалить процесс Р из s. queue §e 5. Параллельные вычисления: взаимоисключения... 313
Поместить Р в список активных процессов '■$». } % else ф s.count++; ;\f > # Сравните это определение с приведенным в листинге 5.5. Обратите вяяма на одно отличие: в приведенном здесь определении семафор никогда ' п * кимает отрицательное значение. Насколько это отличие влияет на" * семафора? Изменится ли работа программы, если заменить в ней севда D листинга 5.5 семафором из данного упражнения? -~i Бинарных семафоров должно быть достаточно для реализации обобщнвы семафоров. Мы можем использовать для этого операции waitB и sig ,n два бинарных семафора, delay и mutex. Рассмотрим следующий код. & void wait (semaphore s) V;»-* { Ш waitB(mutex); J s ' ■<$* if (s < 0) Щ signalB(mutex); ^* waitB (delay) ; "...v > Щ else :■■*% signalB (mutex) ; ^'й ■Ачр void signal (semaphore s) ' ;,U waitB(mutex); 4$ s++; *%, if (s <= 0) yp signalB(delay); Ц signalB (mutex) ; -?: } »> Изначально семафор s инициализирован необходимым нам значением*; " ** операция wait уменьшает значение s, a signal — увеличивает. Бинар ^ -ма' фор mutex, инициализированный значением 1, обеспечивает взаимные ис юче" ния при обновлении значения s, а бинарный семафор delay, инициализи ва*1" ный нулевым значением, использован для приостановки процесса. Т.' В приведенном коде имеется один дефект. Найдите его и предложите. т0Д исправления. Указание: рассмотрите ситуацию, когда два процесса . 3 а* ют wait (s) в тот момент, когда s равно О, и сразу после того, как рвЫ» выполнит signalB (mutex), но до waitB (delay), вызов wait(s)... орЫ^ процессом дойдет до той же точки. Все, что надо сделать для реш ^ п°~ ставленной задачи, это переместить одну строку кода. ..-■«s- В 1978 году Дейкстра выдвинул предположение о том, что не имеется задачи взаимных исключений неизвестного, но конечного числа процессов с * пользованием конечного числа слабых семафоров, которое позволяло бы #* проблемы голодания. В 1979 году Моррис (J. M. Morris) опроверг это Р~а0^гО. жение, опубликовав решение с использованием трех слабых семафоро*. AJ^1 ритм можно описать следующим образом. Если один или несколько £Г цеС^, находятся в состоянии ожидания в операции wait (s), а другой процесс ВЫ» няет операцию signal (s), то значение семафора s не изменяется И Д11Н Часть 2. П "eC ожидающих процессов деблокируется независимо от wait (s). Кроме этих трех семафоров алгоритм использует две неотрицательные целые переменные в качестве счетчиков числа процессов, находящихся в различных разделах алгоритма. Итак, семафоры А и В инициализированы значением 1, а семафор М и счетчики NA и NM — значением О. Семафор В обеспечивает взаимоисключения при доступе к совместно используемой переменной NA. Процесс, пытающийся войти в критический раздел, должен пройти через два барьера, представленные семафорами А и М. Счетчики NA и NM содержат, соответственно, число процессов, готовых пересечь барьер А и пересекших А, но еще не пересекших М. Во второй части протокола NM процессов, заблокированных семафором М, будут входить в критический раздел один за другим, с использованием каскадной методики, аналогичной использованной в первой части. Напишите код алгоритма, соответствующего данному описанию. Следующая задача однажды была предложена на экзамене. Парк Юрского периода состоит из музея динозавров и безвольерного зоопарка. Имеется m пассажиров и п одноместных машин. Пассажиры некоторое время проводят в музее, а затем на машине посещают зоопарк. Если имеется свободная машина, в ней размещается один пассажир, который совершает поездку по парку в течение некоторого (случайного) времени. Если все п машин заняты, то пассажиры, желающие посетить парк, ожидают, пока машины не освободятся; если есть свободные машины, но нет ожидающих их пассажиров, то в состоянии ожидания находятся машины. Используйте семафоры для синхронизации m процессов пассажиров и п процессов машин. Приведенный далее набросок кода был найден на обрывке бумаги в экзаменационной аудитории. Проверьте корректность наброска, не обращая внимания на синтаксис и отсутствие объявлений переменных. Не забывайте, что Р и V соответствуют wait и signal. \begin{verbatim} resource Jurassic_Park() sem car := 0, car_taken := 0, car_filled := 0, passenger_released :- 0; process passenger(i := 1 to num_passengers) do true -> nap(int(random(1000*wander_time))) P(car_avail); V(car_taken); P(car_filled) P(passenger_released) od end passenger process car(j := 1 to num_cars) do true -> V(car_avail); P(car_taken); V(car_filled) nap(int(random(1000*ride_time))) V(passenger_released) od end car end Jurassic_Park Vend{verbatim} В комментариях к листингу 5.8 и табл. 5.2 говорится: "Простое перемещение проверки в критический раздел потребителя недопустимо, так как может привести к взаимоблокировке". Продемонстрируйте это при помощи таблицы, аналогичной табл. 5.2. 5. Параллельные вычисления: взаимоисключения... 315
Рассмотрим решение задачи производителя/потребителя с бесконечным фером, приведенное в листинге 5.9. Предположим, что скорости работы п У~ изводителя и потребителя примерно одинаковы. Тогда сценарий работы жет выглядеть примерно следующим образом: Производитель: append;signal;produce;...;append;signal;produce;... Потребитель: consume;...;take;wait;consume;...;take;wait;... > Производитель всегда ухитряется добавлять новый элемент в буфер и СЙГй лизировать об этом в тот момент, когда потребитель изымает из буфера пп * дыдущий элемент. При этом производитель всегда добавляет новый Г&пемеп ~ в пустой буфер, а потребитель изымает из буфера единственный имеющийг там элемент. Хотя потребитель никогда не блокируется семафором,* к нему при этом выполняется достаточно большое количество обращений, «но ппи водит к существенным накладным расходам. jji Разработайте новую, более эффективно работающую в этих условиях программу Указание: позвольте п принимать значение -1, означающее, что буфер пуст, и что потребитель распознал это состояние буфера и заблокирован до тех пор, цока производитель не добавит в буфер новые данные. Это решение не требует использования локальной переменной т, которая имеется в листинге 5.9. Рассмотрите листинг 5.11. Изменится ли смысл программы при взаимной замене приведенных далее инструкций? * а. wait (e) wait (s) б. signal (s) signal (n) "*' в. wait (n) wait(s) .»_ r. signal (s) signal (e) * Обратите внимание, что при рассмотрении задачи производителя/потребителя с ограниченным буфером наше определение алгоритма позволяло иметь не более л-1 элемента в буфере. а. Чем вызвано данное ограничение? б. Измените алгоритм таким образом, чтобы исправить этот недостаток. Ответьте на следующие вопросы, относящиеся к алгоритму парикмахерской (листинг 5.14). а. Обеспечивает ли разработанный код то, что плату у клиента принимает тот парикмахер, который его стриг? б. Всегда ли парикмахер использует одно и то же кресло? . '_f' В решении задачи о парикмахерской имеется ряд проблем. Измените программу из листинга 5.14 таким образом, чтобы снять следующие вопросы- а. Если два или три клиента ожидают возможности расплатиться г к ссир может принять плату у одного клиента, но отпустить из парикма ерско другого. К счастью, если клиент уже вынул деньги из кармана, оя яе ^ жет положить их обратно, и в конечном итоге в кассе окажется^ верн сумма. Тем не менее хотелось бы, чтобы из парикмахерской уходил *м но тот клиент, чей платеж был только что принят. б. Семафор leave_b_chair согласно нашей идее должен защищать к 1° попыток множественного доступа к нему. К сожалению, этот семафор в няет свою работу не во всех случаях. Предположим, например, что все три рикмахера завершили стрижку и заблокированы wait (leave__b_chair). Работа двух процессов клиентов прервана недос ^ венно перед вызовом leave_barber_chair (). Третий клиент покидает и выполняет signal (leave_b_chair). Какой из парикмахеров ос Д Поскольку очередь leave_b_chair работает по принципу "первьп* ш первым вышел", освободится парикмахер, заблокированный первым*, Д Часть 2. li\* 5.22- это парикмахер, стригший просигналившего клиента? Возможно — да, возможно — нет. Если нет, то новый клиент придет и усядется на колени клиенту, который уже начал подниматься с кресла, в. Программа требует, чтобы клиент сел на диван даже в том случае, когда имеется пустое кресло. Конечно, это очень небольшая проблема, а ее решение делает и без того сумбурный код еще более запутанным. Тем не менее попытайтесь решить ее. Эта задача демонстрирует использование семафоров для согласования процессов трех типов.1 Дед Мороз спит в своей избушке на Северном полюсе и может быть разбужен только 1) пятью сестрами-Снегурочками, вернувшимися из отпуска из Крыма, или 2) несколькими Снеговиками, у которых возникли проблемы при изготовлении игрушек. Чтобы дать Деду Морозу поспать, Снеговики будят его только в том случае, когда проблемы возникают у троих из них. Когда трое Снеговиков решат свои вопросы, все остальные Снеговики, желающие посетить Деда Мороза, должны ждать, пока не вернется побывавшая у него тройка. Если проснувшийся Дед Мороз обнаруживает у дверей избушки и Снеговиков, и последнюю из Снегурочек, то он просит Снеговиков обождать со своими проблемами до окончания празднования Нового года, поскольку куда важнее ехать поздравлять малышей. (Снегурочки не спешат вернуться из Крыма и остаются там до последнего момента.) Прибывшая последней Снегурочка идет будить Деда Мороза, пока остальные занимаются макияжем в своих комнатах. Решите эту задачу с помощью семафоров. 5.23. Покажите, что система передачи сообщений и семафоры обладают эквивалентной функциональностью, для чего выполните следующее. а. Реализуйте передачу сообщений с использованием семафоров. Указание: сделайте это с помощью совместно используемого буфера для хранения почтовых ящиков, каждый из которых представляет собой массив сообщений. б. Реализуйте семафоры с использованием передачи сообщений. Указание: добавьте в систему синхронизирующий процесс. ? '% п л пРизнателен Джону Троно (John Trono) из колледжа се. Михаила в Вермонте ".'.: р€доставление этой задачи. 7^а 5. Параллельные вычисления: взаимоисключения .. 317 Ш
■&' ; г v- f* ,1 ЗДК A ■ffif: Л 'л-. ,£ **. ГЛАВА 6 Взаимоблокировка и голодание 6.1. Принципы взаимного блокирования 6.2. Предотвращение взаимоблокировок 6.3. Устранение взаимоблокировок 6.4. Обнаружение взаимоблокировок 6.5. Интегрированные стратегии разрешения взаимоблокировок 6.6. Задача об обедающих философах 6.7. Механизмы параллельных вычислений в UNIX 6.8. Примитивы синхронизации потоков Solaris 6.9. Механизмы параллельных вычислений в Windows 2000 6.10. Резюме, ключевые термины и контрольные вопросы 6.11. Рекомендуемая литература 6.12. Задачи
та глава продолжает рассмотрение параллельных вычислений и посвяпш двум проблемам, доставляющим основные неприятности при работе, р., раллельными вычислениями: взаимоблокировкам и голоданию. Глава" i с изложения основных принципов взаимоблокировок, а затем мы уз ! - их можно предотвратить, обнаружить и устранить. Под конец мы раесм''""' еще одну классическую задачу, иллюстрирующую вопросы синхронизации : йоблокировки, а именно — задачу об обедающих философах. Как и в главе 5, "Параллельные вычисления: взаимоисключения и многозада .", здесь мы ограничимся рассмотрением проблем в единой системе; распреде ам системам посвящена глава 14, "Управление распределенными процессами" L. ПРИНЦИПЫ ВЗАИМНОГО БЛОКИРОВ Щ Взаимное блокирование (deadlock1) можно определить как постоянн е бло- вание множества процессов, которые либо конкурируют в борьбе за с стем- ресурсы, либо сообщаются один с другим. В отличие от других п лем, якающих в процессе управления параллельными вычислениями, ная нема в общем случае эффективного решения не имеет. 3&' Все взаимоблокировки предполагают наличие конфликта в борьбе ад ур- ежду двумя или несколькими процессами. Наиболее ярким приме м мо- служить транспортная взаимоблокировка. На рис. 6.1 показана ситуация, 1 четыре автомобиля должны примерно одновременно пересечь перек сток tpe квадранта перекрестка представляют собой ресурсы, которые тр тся ессам. В частности, для успешного пересечения перекрестка всеми1 тырь- зтомобилями необходимые ресурсы выглядят следующим образом: '"Щ автомобилю, движущемуся на север, нужны квадранты 1 и 2; :^ автомобилю, движущемуся на запад, нужны квадранты 2 и 3; автомобилю, движущемуся на юг, нужны квадранты 3 и 4; -Ж, автомобилю, движущемуся на восток, нужны квадранты 4 и 1. ''Ж Обычное правило пересечения перекрестка состоит в том, что автомобиль :ен уступить дорогу движущемуся справа. Это правило работает, когда пе- всток пересекают два или три автомобиля. Например, если на перекрестке !тятся автомобили, движущиеся на север и на запад, то автомобиль, дви- ийся на север, уступит дорогу автомобилю, движущемуся на запад. Я : ес1И <ресток пересекают одновременно четыре автомобиля, каждый из роторы* 1сно правилу воздержится от въезда на перекресток, возникнет в , О"4 вка. Она возникнет и в том случае, если все четыре машины проигнррирУ ило и осторожно въедут на перекресток, поскольку при этом каждьщ ль захватит один ресурс (один квадрант) и останется на вечной f._ ке <ании, когда другой автомобиль освободит следующий требующийся,$( [ения перекрестка квадрант. Итак, мы опять получили взаимоблокир^ к <. ■ * '.:-'v'. Дословно — "мертвые объятия". В русскоязычной литературе встречай '■ "тупик", "клинч", однако наиболее полно отражает суть происходят^ ; ин "взаимоблокировка". — Прим. перев. -*-Ц Р нн Часть 2. П сС 3 4 ■* § i 1 \**x£j*£b ^wjcwar^* ^тъв. "Щ -■£ Jipy -'Щ. &j vm л ~. f а) Возможна взаимоблокировка Рис. 6.1. Пример взаимоблокировки б) Взаимоблокировка Рассмотрим теперь картину взаимоблокировки с участием процессов и системных ресурсов. На рис. 6.2 показано выполнение двух процессов, конкурирующих в борьбе за два ресурса. Каждый из процессов требует исключительного владения обоими ресурсами на некоторое время. Процессы Р и Q имеют общий вид: Process P Process Q Get A Get В Get Б Get А Rel ease А Rel ease в Release В Release A m *йе проц ИС' 6n2 °СЬ Х представляет выполнение процесса Р, а ось у — выполне- ^ДставитГ ТаКИМ °браЗОМ' совместное выполнение двух процессов можно °*йоПро1т7 В ВИ?е ПУТИ И3 начала координат в северо-восточном направлении. В °Аи« пост ° СИСТеМе В КажДый момент времени может выполняться только р Цесс, так что путь состоит из чередующихся горизонтальных и верти- Щь 1а 6. Взаимоблокировка и голодание 321
[ьных отрезков, причем горизонтальные отрезки представляют работу проце ?, а вертикальные — процесса Q. Л Выполнение Q Освобождение А л ^ Освобождение В Получение А Получение В Требуется В н е Получение Получение Освобождение Освобождение ABA В Требуется В Рис. 6.2. Пример взаимоблокировки [BAC098J На рис. 6.2 показаны шесть различных путей выполнения процессов. . Q получает ресурс В, затем — ресурс А, затем освобождает ресурсы В и А. Когда процесс Р продолжает выполнение, он может получить оба рее а. . Q получает ресурс В, а затем — ресурс А. Процесс Р начинает работу и блокируется при запросе ресурса A. Q освобождает ресурсы В и А. Когда процесс Р продолжает выполнение, он может получить оба ресурса. ,j > - Q получает ресурс В, затем Р получает ресурс А. Взаимоблокировка ней - бежна, поскольку выполнение Q заблокируется при запросе ресу а А-, выполнение процесса Р — при запросе ресурса В. . Р получает ресурс А, затем Q получает ресурс В. Взаимоблокировка не бежна, поскольку выполнение Q заблокируется при запросе ресурса А. выполнение процесса Р — при запросе ресурса В. - ■ . Р получает ресурс А, а затем — ресурс В. Процесс Q начинает работу и кируется при запросе ресурса В. Р освобождает ресурсы А и В. Когда Р^ цесс Q продолжает выполнение, он может получить оба ресурса. ?^ Часть 2. П":>егс 6. Р получает ресурс А, затем — ресурс В, затем освобождает ресурсы А и В. Когда процесс Q продолжает выполнение, он может получить оба ресурса. Произойдет взаимоблокировка или нет, зависит как от динамики выполнения процессов, так и от подробностей построения приложения. Предположим, например, что процесс Р не требует получения обоих ресурсов одновременно и имеет следующий вид: process P Get А Release A Get В Release В Эта ситуация изображена на рис. 6.3. Немного поразмыслив, вы можете убедиться, что независимо от того, каким образом два процесса выполняются друг относительно друга, взаимоблокировка невозможна Повторно используемые ресурсы Ресурсы можно разделить на две основные категории: повторно используе- Ые (reusable) и расходуемые (consumable). Повторно используемые ресурсы могут безопасно использоваться одновременно только одним процессом и при этом истощаться. Процесс получает ресурс, который позже освобождает для по- рного использования другими процессами. Примерами повторно используе- Х ресУРсов могут служить процессор, каналы ввода-вывода, основная и вто- ка -I^H память' пеРиФерийные устройства, а также структуры данных — такие, к Файлы, базы данных и семафоры. 'Г* в. Взаимоблокировка и голодание 323
Выполнение Q Освобождение А Требуется 1 А -<( Освобождение В Получение А Требуется В Получение " В .1$ Процессам! РиО требуется А Процессам РиО требуется В ■Г к j? Получение Освобождение Получение Освобождение В полнение В В Требуется А 1С. 6.3. Пример отсутствия взаимоблокировки [ВАС098] Требуется В ;ь -¥ В качестве примера взаимоблокировки с повторно используемым ресурсом осмотрим два процесса, которые конкурируют за исключительный доступ к исковому файлу D и стримеру Т. Программа выполняет показанные щ/рис. 6.4 т.ерации. Взаимоблокировка осуществляется в том случае, когда каждый провес захватывает один ресурс и запрашивает другой. Например, вза облоки- >вка произойдет при следующем чередовании двух процессов: PoPiQoQiP Ч • ^°" ет показаться, что это ошибка программиста, не имеющая отношениями разра- >тчику операционной системы. Однако, как мы знаем, разработка .программ тя параллельных вычислений — весьма сложная задача, и выявление ,источяи- а взаимоблокировки в сложной программе — дело очень непростое. ^Одна из Тратегий при работе с такими взаимоблокировками состоит в наложении сис- >мных ограничений на порядок запроса ресурсов. Процесс Р Шаг Действие Шаг Процесс Q Действие Зо 3l >2 Ъ 34 э5 Зв 3anpoc(D) Блокировка(Б) Запрос(Т) Блокировка(Т) Выполнение функции Деблокирование(Б) Деблокирование(Т) qo qi q2 qs q* qe qe Запрос(Т) Блокировка(Т) 3anpoc(D) /rg Блокировкаф)й Выполнение фу^кДи Деблокирование^) Деблокирование(В) ■ic. 6.4. Пример конкуренции двух процессов в борьбе за повторно используемы» суР° 24 Часть 2. пес Другим примером взаимоблокировки с повторно используемыми ресурсами оГут быть запросы к основной памяти. Предположим, что для распределения лоступно 200 Кбайт памяти, и выполняется такая последовательность запросов: Запрос Запрос Р1 • • • 80 • • • 60 Кбайт; Кбайт; Запрос Запрос Р2 • • • 70 • • • 80 Кбайт; Кбайт; Если оба процесса дойдут да своего второго запроса, возникнет взаимоблокировка. Если количество требуемой памяти заранее неизвестно, работать с таким типом взаимоблокировок на уровне системных ограничений (в том числе и операционной системы) очень сложно. Наилучший способ справиться с этой конкретной проблемой заключается в использовании виртуальной памяти, о которой рассказывается в главе 8, "Виртуальная память". Расходуемые ресурсы Расходуемыми являются те ресурсы, которые могут быть созданы (произведены) и уничтожены (потреблены). Обычно ограничений на количество расходуемых ресурсов определенного типа нет. Незаблокированный процесс- производитель может выпустить любое количество таких ресурсов; когда процесс запрашивает некоторый ресурс, последний прекращает свое существование. Примерами расходуемых ресурсов могут служить прерывания, сигналы, сообщения и информация в буферах ввода-вывода. В качестве примера взаимоблокировки с расходуемыми ресурсами рассмотрим следующую пару процессов, где каждый из процессов пытается получить сообщение от другого процесса, а затем отправить сообщение своему визави. Р1 • • • Receive • • • Send(P2/ (Р2); Ml) ; Р2 • • • Receive • • • Send(PI, (Pi); М2) ; ^ к 3апм°блокировка осуществляется, если операция Receive является бло- g РУ1°Щей (т.е. получающий процесс блокируется до тех пор, пока сообщение не *: Ра еТ Получен°)- И вновь причиной взаимоблокировки является ошибка при 0-ул раоотке программы. Такие ошибки обычно довольно таинственны и трудного МЬ1' ^Р°ме того, может оказаться, что взаимоблокировку вызывает только - j-gg ат°чно редкая комбинация событий, и тогда до того, как ошибка проявит ' пРограмма может побывать в эксплуатации многие годы *ЗДа 6. Взаимоблокировка и голодание 325
Единой эффективной стратегии для работы со всеми типами взаи блоки- ок нет. Позже мы изучим различные подходы к решению проблемы, но сн а рассмотрим условия возникновения взаимоблокировок. :ловия возникновения взаимоблокировок Для того чтобы взаимоблокировка стала возможной, требуется наличие х условий. Взаимные исключения. Одновременно использовать ресурс может только один процесс. Удержание и ожидание. Процесс может удерживать выделенные ресурсы во время ожидания других ресурсов. Отсутствие перераспределения. Ресурс не может быть принудительно отобран у удерживающего его процесса. Эти условия выполняются довольно часто. Например, взаимонсключе- i необходимы для гарантии согласованности результатов и целостности ы данных. Аналогично, невозможно произвольное применение перерас- !деления, в особенности при работе с данными, когда требуется обеспечить санизм отката. , Кроме перечисленных трех условий для реального осуществления заимо- жировки требуется выполнение четвертого условия. ■Лл Циклическое ожидание. Существует замкнутая цепь процессов, каждый из которых удерживает как минимум один ресурс, необходимый процессу, следующему в цепи после данного (см. рис. 6.5). .:. 1 >U Рис. 6.5. Циклическое ожидание Первые три условия являются необходимыми, но не достаточными Д ществления взаимоблокировки. Четвертое условие в действительности пр вляет собой потенциальное следствие первых трех — т.е. при наличия.лер х условий может осуществиться такая последовательность событий, ко «ведет к неразрешимому циклическому ожиданию (что, по сути, и явля «делением взаимоблокировки). Неразрешимость циклического ожид ювия 4 обеспечивается выполнением предыдущих трех условий. Таким .£ 6 Часть 2. П ЦССЫ зом, совокупность четырех перечисленных выше условий является необходимым й достаточным условием взаимоблокировки.2 16.2. ПРЕДОТВРАЩЕНИЕ ВЗАИМОБЛОКИРОВОК » V '" Стратегия предотвращения по сути представляет собой такую разработку системы, которая позволит исключить саму возможность взаимоблокировок. Методы предотвращения взаимоблокировок можно разбить на два класса. Косвенный метод состоит в предотвращении одного из первых трех условий возникновения взаимоблокировки; прямой метод предотвращает циклическое ожидание (условие 4). Рассмотрим приемы, связанные с каждым из условий, в отдельности. Взаимоисключения В общем случае избежать использования взаимоисключений невозможно. Если доступ к ресурсу должен быть исключительным, то операционная система обязана поддерживать взаимоисключения. Некоторые ресурсы, такие, как файлы, могут позволять множественный доступ для чтения и исключительный доступ для записи. Но даже в этом случае возможно возникновение взаимоблокировки, если право записи в файл требуется нескольким процессам одновременно. Удержание и ожидание Этого условия можно избежать, потребовав, чтобы процесс запрашивал все необходимые ресурсы одновременно, и блокировать процесс до тех пор, пока такой запрос не сможет быть выполнен полностью в один и тот же момент времени. Такой подход неэффективен по двум причинам. Во-первых, процесс может длительное время ожидать одновременной доступности всех затребованных ресурсов, в то время как реально он мог бы работать и только с частью из них. Во- вторых, затребованные процессом ресурсы могут оставаться неиспользуемыми значительное время, в течение которого они оказываются недоступными другим процессам. Еще одна проблема состоит в том, что процессу может не быть известно заранее, какие именно ресурсы ему потребуются. Имеется также практическая проблема, возникающая при использова- ии парадигмы модульности в программировании. Использующее описанную ехнологию приложение для одновременного запроса должно знать о всех е°бходимых ресурсах на всех уровнях или во всех модулях, что противоречит упомянутой парадигме. оси ^^но в литературе все четыре условия перечисляются как необходимые для Ко спгвления взаимоблокировки, однако такое изложение скрывает некоторые тон- лиц ^аниого вопроса [SHUB90J. Условие циклического ожидания кардинально от- Сут тся от остальных трех условий. Первые три условия представляют собой, по ■ »с0/п ' Незыблемые правила, в то время как условие 4 представляет собой ситуацию, *"i вобо л м°жст осуществиться при определенной последовательности запросов и ос- \<*оло ewu" Ресурсов процессом. Объединение все четырех условий в единый блок мето- * ?*аац Чески приводит к стиранию различий между предотвращением и устранением , . им°блокировок. J*Ba 6. Взаимоблокировка и голодание 327
тсутствие перераспределения Этого условия можно избежать несколькими путями. Например, можно гт упить следующим образом: если процесс удерживает некоторые ресурсы и ev ■казано в очередном запросе, то он должен освободить захваченные ресурсы )и необходимости запросить их вновь вместе с тем ресурсом, в доступе к кото >му ему было отказано. С другой стороны, если процесс затребовал некий пе рс, в настоящий момент захваченный другим процессом, то операционная сие ма может вытеснить этот процесс и потребовать от него освободить захвачен je им ресурсы. Этот метод может предотвратить взаимоблокировку лишь в том [учае, когда процессы имеют разные приоритеты. .^ Такой подход на практике применим только к тем ресурсам, состо е ко- ■рых можно легко сохранить, а позже восстановить — как, например, в том [учае, когда ресурс представляет собой процессор. [иклическое ожидание Условия циклического ожидания лгожно избежать путем упорядоч ния ти- )в ресурсов. При этом если процесс запросил ресурс типа R, то далее о может лросить только ресурсы, следующие согласно указанному упорядочещ за R. Чтобы убедиться в эффективности данной стратегии, свяжем с каждым ти- )М ресурса свой индекс. Тогда ресурс Д предшествует ресурсу Д, если i<j. эперь предположим, что два процесса, А и В, взаимно заблокированы, по- ;ольку процесс А захватил ресурс Д и запрашивает ресурс Д, а процесс В за- затил ресурс Д и запрашивает ресурс Д. Однако такая ситуация невозможна, в хлу того что из нее следует одновременное выполнение условий i< j и'*j<i. Как и в случае предотвращения удержания и ожидания, технология пре- )твращения циклического ожидания может оказаться неэффективной, сни- ающей скорость работы процесса и закрывающей доступ к ресурсам без особой j то необходимости. 4* 3.3. УСТРАНЕНИЕ ВЗАИМОБЛОКЙЩШ «j5*- >■ ■ Другим подходом к решению проблемы взаимоблокировок является устранение »аимоблокировок.3 В случае предотвращения взаимоблокировок мы нак ьша. тред елейные ограничения на запросы к ресурсам, с тем чтобы сделать £е озмо им осуществление по крайней мере одного из необходимых условий сущ ваН $аимоблокировок и тем самым предотвратить саму возможность их возникнове сожалению, этот метод приводит к неэффективному использованию р^с шжению скорости работы процесса. Устранение взаимоблокировок допуска ичие трех необходимых условий возникновения взаимоблокировок, но мы ДР аем меры к тому, чтобы ситуация взаимного блокирования процессов не »1ть достигнута. Соответственно, устранение взаимоблокировок обеспечивает гую параллельность вычислений, чем предотвращение. Решение о том, сп 3 Термин "устранение" несколько запутывает ситуацию. В некотором 11 ш(яи* чатриваемые в данном разделе стратегии можно считать примерами пред у гаимоблокировок так как их использование действительно предотвращает; Ц жледних. 28 Часть 2.? Й дес ^кущий запрос ресурса в случае его удовлетворения привести к возникновению в3аЛМоблокировки, принимается в этом случае динамически (и, следовательно, при использовании данной технологии необходимо знать о том, какие ресурсы потребуется процессу в дальнейшем). В этом разделе мы познакомимся с двумя подходами к устранению взаимоблокировок. , Не запускать процесс, если его запросы могут привести к взаимоблокировке. • Не удовлетворять запросы процесса, если их выполнение способно привести к взаимоблокировке. Запрещение запуска процесса Рассмотрим систему из п процессов и т различных типов ресурсов. Определим следующие векторы и матрицы: Общее количество каждого ресурса в системе Общее количество каждого ресурса, не выделенного процессам Ресурс = Доступность {Ri>R2 Rm) (ад vg Требования = Распределение = (С С ^-21 V22 Ai A2 Си,, Am А'« пт ) \ ,A,i А,2 -• А„ Запросы каждого процесса на каждый из ресурсов Текущее распределение ресурсов Матрица требований, в которой каждая строка описывает один из процессов, Указывает максимальные требования каждого процесса к разным ресурсам, т.е. Сч — это требования процессом i ресурса у. Для работоспособности метода устранения взаимоблокировок эта информация должна быть объявлена процессом заранее. Аналогично, Aij — текущее количество ресурса у, выделенное процессу i. Должны выполняться следующие соотношения. я • Ri ~ Vj + 2w А, Для всех I: все ресурсы либо свободны, либо выделены. • С;/ < Rt для всех k и i: ни один процесс не может потребовать ресурс, превышающий его общее количество в системе. \ - О; Для всех ft и i: ни один процесс не может получить больше ресурсов, чем было затребовано им. ^ю да все Указанные величины определены, мы в состоянии создать стратег-Пи Устранения взаимоблокировок, которая запрещает запуск нового процесса, **есс рГ° Требования Ресурсов могут привести к взаимоблокировке. Новый про- Д|+1 запускается только если *,г с,„,„. + SQ для всех L *=i vBa 6. Взаимоблокировка и голодание 329
Это означает, что запуск нового процесса произойдет только в том случ [И могут быть удовлетворены максимальные требования всех текущих поп ' ► плюс требования запускаемого процесса. Эта стратегия ни в коей ме&е в*» зтся оптимальной, поскольку предполагает худшее: что все процессы хгрел-ь г максимальные требования одновременно. $щ ч inpex выделения ресурса Стратегия запрета выделения ресурса, известная также как алгоритм 6а» ра,4 впервые была предложена в работе [DIJK65]. Мы начнем рассмотрение нцепций состояния (state) и безопасного состояния (safe state). Остановимся системе с фиксированным количеством процессов и фиксированным количе- юм ресурсов. В каждый момент времени процесс может иметь несколько вы- пенных ему ресурсов (или не иметь ни одного). Состояние системы представ- ет собой просто текущее распределение ресурсов по процессам. Следовательно зтояние можно представить как два ранее определенных вектора — ресурсов и ступности — и две матрицы — требований и распределения. Безопасное со- эяние — это такое состояние, в котором имеется по крайней мере одна nocie- вательность, которая не приводит к взаимоблокировке (т.е. все процессы мо- г быть выполнены до завершения). Состояние, не являющееся безопасным, ва- вается, соответственно, опасным состоянием. Описанную концепцию иллюстрирует приведенный далее пример. На jpiic. 6.6,a казано состояние системы, образованной четырьмя процессами и тремя ресурсами, чцее количество ресурсов Rl, R2 и R3 составляет соответственно 9, 3 и в единиц, результате сделанного к этому моменту распределения ресурсов по процессам дос- пными остались по одной единице ресурсов R2 и R3. Безопасно ли данное состоя- ;е? Для ответа на этот вопрос зададимся другим вопросом, а именно — южет ли кой-нибудь из четырех процессов быть выполнен при данных доступных ах завершения? Или, говоря иначе, могут ли при данном распределении ресурсов гть удовлетворены максимальные требования какого-то из процессов за счет ос- вшихся ресурсов? Ясно, что для процесса Р1 это невозможно, так как у него име- ся только одна единица ресурса R1, и для полного удовлетворения ему требуется де по две единицы ресурсов Rl, R2 и R3. Однако если выделить процессу Р2 одну иницу ресурса R3, то будут удовлетворены максимальные требования этого про- :сса и он сможет быть завершен. Дейкстра воспользовался таким названием, сравнивая эту задачу с деяте гью банка, где клиент, который хочет осуществить заем денег, отождестал т юцессом, а деньги — с ресурсом. Банк имеет ограниченное количество денег огя )в, и список клиентов, у каждого из которых имеется своя предельная вели, '■та. Клиент может неоднократно осуществлять заем в пределах этой веяич к ' v м нет никакой гарантии, что он погасит хотя бы часть задолженности dO'ff1 тта, пока не займет всю возможную сумму. Таким образом, если несколько •* рут частичные займы, то гарантировать возврат этих денег банку може ' ы ^который резервный фонд. В худшем случае, когда все клиенты погашаютп олько по достижении ими предельной суммы кредита, этот фонд должен $сП ^ *зможностъ выдать им эти максимальные суммы. Следовательно, при исчё по 'жных запасов до размеров резервного фонда банк будет вынужден отказатАЪ]04 у клиенту в предоставлении займа, иначе деньги в банк могут никогда не ее НУ1" 30 Часть 2. Йрой (. pi Р2 РЗ Р4 R1 R2 R3 3 6 3 4 2 1 1 2 2 3 4 2 Матрица требований R1 R2 R3 Р1 Р2 РЗ Р4 1 6 2 0 0 1 1 0 0 2 1 2 Матрица распределения а) Начальное состояние h ■j- /■ « ^ Р1 Р2 РЗ Р4 R1 3 0 3 4 R2 2 0 1 2 R3 2 0 4 2 Матрица требований Р1 Р2 РЗ Р4 R1 R2 R3 1 0 2 0 0 0 1 0 0 0 1 2 Матрица распределения б) Р2 выполнен до завершения R1 R2 R3 d Вектор ресурсов R1 R2 R3 Q 1 1 Вектор доступности Rf R2 R3 6 2 3 Вектор доступности Р1 Р2 РЗ Р4 R1 R2 R3 0 0 3 4 0 0 1 2 0 0 4 2 Матрица требований R1 R2 R3 0 0 2 0 0 0 1 0 0 0 1 2 Р1 Р2 РЗ Р4 Матрица распределения в) Р1 выполнен до завершения R1 R2 R3 7 2 3 Вектор доступности R1 Р1 Р2 РЗ Р4 R2 R3 0 0 0 4 0 0 0 2 0 0 0 2 Матрица требований R1 R2 R3 Р1 Р2 РЗ Р4 0 0 0 0 0 0 0 0 0 0 0 2 Матрица распределения R1 R2 R3 9 3 4 Вектор доступности г) РЗ выполнен до завершения Рис. 6.6. Определение безопасного состояния Шеи редположим' что именно так и произошло — процесс Р2 оказался заверяете И распределенные емУ Ресурсы вернулись в пул доступных. Это состояние сов ММЫ Показано на Рис- 6.6,6. Вернувшись к вопросу о том, какой из процес- ■ летв0°ЖеТ быть завеРшен в данной ситуации, мы находим, что могут быть удов- - й°Ло^еНЫ максимальные требования как процесса Р1, так и процесса РЗ. Пред- 1 ^аны.ИМ' ЧТ° МЫ выбрали процесс Р1. По его завершении и возвращении захва- >оцааа* им РесУРсов в пул доступных ситуация будет выглядеть так, как ^°яниН0 На РИ°" 6'6,в* И' наконеЦ» по завершении процесса РЗ мы придем к со- Ч а Ю' ИзображенномУ на Рис- б.б.г. К этому моменту все процессы заверше- _* » следовательно, исходное состояние (рис. 6.6,а) является безопасным. 6. Взаимоблокировка и голодание 331
Описанная концепция автоматически приводит к стратегии устранен аимоблокировок, которая гарантирует, что система процессов и ресурсов в * а находится в безопасном состоянии. Когда процесс делает запрос к цекото / множеству ресурсов, предполагается, что запрос удовлетворен, после чего о деляется, является ли обновленное состояние системы безопасным. Если к, то запрос удовлетворяется; в противном случае процесс блокируется до т* >р, пока удовлетворение его запроса не станет безопасным. ь Рассмотрим состояние, определяемое матрицей на рис. 6.7,а. Предположим ч> процесс Р2 делает запрос на одну дополнительную единицу ресурса Щ и ол ; — ресурса R3. Если запрос будет выполнен, то в результате состояние систе- ы станет таким, как показано на рис. 6.6,а. Мы уже видели, что это состояние шяется безопасным. Таким образом, запрос можно удовлетворить. Теперь вер- ;мся к состоянию, представленному на рис. 6.7,а, и предположим, что такой е запрос на одну дополнительную единицу ресурса R1 и одну — ресурса R3 де- *ет процесс Р1. Если этот запрос будет удовлетворен, состояние системы станет 1ким, как показано на рис. 6.7,6. Является ли это состояние безопасным? В шном случае ответ — нет, поскольку каждому из процессов требуется по одной шолнительной единице ресурса R1, а в наличии свободных единиц этого ресур- i уже нет. Следовательно, запрос процесса Р1 должен быть отклонен, а сам роцесс блокирован. Р1 Р2 РЗ Р4 R1 R2 R3 3 6 3 4 2 1 1 2 2 3 4 2 Матрица требований Р1 Р2 РЗ Р4 R1 R2 R3 1 5 2 0 0 1 1 0 0 1 1 2 Матрица распределения а) Начальное состояние R1 R2 Вектор ресурсов R1 R3 9 .« 6 R2 R3 1 1 ~\2 Вектор доступности Р1 Р2 РЗ Р4 R1 R2 R3 3 6 3 4 2 1 1 2 2 3 4 2 Матрица требований R1 Р1 Р2 РЗ Р4 R2 R3 2 5 2 0 0 1 1 0 1 1 1 2 R1 R2 R3 И Вектор доступности *fs f •# Матрица распределения б) Процесс Р1 запрашивает по одной единице ресурсов R1 и R3 Рис. 6.7. Определение опасного состояния ;.,' Важно отметить, что состояние, представленное на рис. 6.7,<5, не $., п е заимоблокировкой. Оно всего лишь может привести к ней. Например, fiP1 " эте процесс Р1 может освободить по одной единице ресурсов R1 и R3, и 74^ новь вернется в безопасное состояние. Следовательно, стратегия устр е 32 Часть 2. П0 е взаимоблокировок не занимается точным предсказанием взаимоблокировок; она пишь предвидит их возможность и устраняет ее. В листинге 6.1 приведена логика работы алгоритма устранения взаимоблокировок. Основной алгоритм показан в части б. Состояние системы описывается структурой state, а вектор request [*] определяет ресурсы, затребованные Процессом i. Сначала выполняется проверка того, что запрос не превышает исходные требования процесса. Если запрос корректен, то следующий шаг алгоритма состоит в определении возможности удовлетворения запроса (т.е. выяснении, достаточно ли для этого свободных ресурсов). Если нет — процесс приостанавливается; если же ресурсов достаточно, выполняется последняя проверка — безопасно ли выполнение запроса. Для этого процессу гипотетически выделяются требуемые ресурсы, в результате чего получается новое состояние системы newstate, которое и проверяется на безопасность с использованием алгоритма из листинга 6.1,е. Листинг 6.1. Алгоритм устранения взаимоблокировок struct state { int resource [гл] ; int available[m]; int claim[n][m]; int alloc[n][m]; } a) Глобальная структура данных if (allocfi,*] + request[*] > cla±m[Lr*]) { < Ошибка > /* Суммарный запрос превышает требования */ } else if (request!*] > available[*)) { < Приостановка процесса > } else /* Моделируем выполнение запроса */ < Определение нового состояния: alloc[i,*] = alloc[i,*] + requestf*]; available!*] = available!*] - request!*]• > } if (safe(newstate)) < Выполнение распределения > 51 : else i „- { < Восстановление исходного состояния > . < Приостановка процесса > ■ bo 1 ^ Алгоритм выделения ресурсов - { olean safe(state S) lnt currentavail[m]• £pBa 6. Взаимоблокировка и голодание 333
process rest[<Количество процессов>]; currentavail = available; rest = { Все процессы } ; possible = true; ... while(possible) 1 { < Найти Pk в rest такой, что •■(■ claim[k,*] - alloc[к,*] <= currentavail; > ■-,> if (<Найден>) /* Моделирование выполнения Рк */ { currentavail = currentavail + allocfk,*]; .. . rest = rest - {Pk}; 1, else possible = false; '* } return (rest =- NULL); в) Проверка безопасности алгоритма (алгоритм банкира) Устранение взаимоблокировок обладает тем достоинством, что при его и .зовании не нужны ни перераспределение, ни откат процессов, как в случ ружения взаимоблокировок; кроме того, этот метод накладывает меньше ог гчений по сравнению с предотвращением взаимоблокировок. Однако исполь ние этого метода требует выполнения определенных условий. i| Должны быть заранее указаны максимальные требования каждого процесса к ресурсам. Рассматриваемые процессы должны быть независимы, т.е. порядок их выполнения не должен ограничиваться никакими требованиями синхронизации^, Должно иметься фиксированное количество распределяемых ресурсов. Ни один процесс не должен завершаться в состоянии захвата ресурсов. 1. ОБНАРУЖЕНИЕ ВЗАИМОБЛОКИРОВОК Стратегии предотвращения взаимоблокировок весьма консервативны, решают проблему взаимоблокировок путем ограничения доступа проц с- к ресурсам и наложения ограничений на процессы. Их противойолож- ь — стратегии обнаружения взаимоблокировок, которые не огранич в (оступ к ресурсам и не налагают никаких ограничений на действия ЯР ов. При обнаружении взаимоблокировок запрошенные р^СУР шляются процессам при первой возможности. Периодически one система выполняет алгоритм, который позволяет обнаружить УЧ ° тического ожидания (см. рис. 6.5). '••. % о* горитм обнаружения взаимоблокировки Проверка наличия взаимоблокировки может выполняться как при К осе ресурса, так и менее часто, в зависимости от того, насколько В*Р° Часть 2. И "\ cCbI возникновение взаимоблокировки. С одной стороны, проверка при каждом запросе ресурса имеет два основных преимущества: раннее обнаружение и упрощенце алгоритма, поскольку он основан на инкрементальных изменениях состоя- нля системы. С другой стороны, столь частая проверка приводит к заметному потреблению времени процессора. Обобщенный алгоритм обнаружения взаимоблокировок описан в [COFF71]. g нем используются матрица распределения и вектор доступности, описанные в предыдущем разделе. Кроме того, определена матрица запросов Q такая, что qtj представляет собой количество ресурсов типа /, затребованное процессом i. Алгоритм работает, помечая незаблокированные процессы. Изначально все процессы не помечены. После этого выполняются следующие шаги. 1. Помечаем все процессы, у которых строки в матрице распределения состоят из одних нолей. 2. Временный вектор W инициализируем значениями вектора доступности. 3. Находим индекс i, такой, что процесс i в настоящий момент не помечен, и 1-я строка матрицы Q не превышает W, т.е. для всех \<k<m выполняется Qlk < Wk. Если такой строки нет, алгоритм прекращает свою работу. 4. Если такая строка имеется, помечаем процесс i и добавляем соответствующую строку матрицы распределения к W, т.е. выполняем присвоение Wk = Wk + \ для всех 1 < к < m . Возвращаемся к шагу 3. Взаимоблокировка имеется тогда и только тогда, когда после выполнения алгоритма есть непомеченные процессы; каждый непомеченный процесс заблокирован. Стратегия этого алгоритма состоит в поиске процесса, запросы которого могут быть удовлетворены доступными ресурсами, а затем предполагается, что эти ресурсы ему выделены и процесс, завершив свою работу, освобождает их. После этого алгоритм приступает к поиску другого процесса, который может успешно завершить свою работу. Заметим, что данный алгоритм не гарантирует предотвращения взаимоблокировок — это зависит от порядка удовлетворения запросов процессов. Все, что делает данный алгоритм, — это определяет, имеется ли взаимоблокировка в настоящий момент. Для иллюстрации алгоритма обнаружения взаимоблокировок рассмотрим рис. 6.8. Алгоритм работает следующим образом. 1- Помечаем Р4, поскольку этот процесс не имеет распределенных ему ресурсов. 2- Устанавливаем W = (О О О О 1). 3. Запрос процесса РЗ не превышает W, так что помечаем РЗ и устанавливаем W = W 4- (О О О 1 0) = (О 0 0 1 1). 4- Других непомеченных процессов, строки матрицы Q которых не превышают W, нет. Алгоритм прекращает свою работу. Таким образом, алгоритм позволяет заключить, что процессы Р1 и Р2 взаимно заблокированы. Гл ава 6. Взаимоблокировка и голодание 335
P1 P2 P3 P4 R1 0 0 0 1 R2 1 0 0 0 R3 0 1 0 1 R4 0 0 0 0 R5 1 1 1 1 P1 P2 P3 P4 R1 1 1 0 0 R2 0 1 0 0 R3 1 0 0 0 R4 1 0 1 0 R5 0 0 0 0 R1 R2 R3 FM 1 1 2: R5 Матрица запросов О Матрица распределения А Вектор ресурсов .,'£ R1 R2 R3 [ -R4 я$ т Вектор доступности. Рис. 6.8. Пример обнаружения взаимоблокировки ^ •осстановление '1 После того как взаимоблокировка обнаружена, требуется некоторая страте- 1Я для восстановления нормальной работоспособности системы. Вот несколько >зможных подходов к решению этой проблемы, перечисленные в порядке воз- астания сложности. ,, i 1. Прекратить выполнение всех заблокированных процессов. Хотите — верьте хотите — нет, но это самый распространенный подход, принятый & операционных системах. .; 2. Вернуть каждый из заблокированных процессов в некоторую ранее определенную точку и перезапустить все процессы. Для этого в систему должны быть встроены механизмы отката и перезапуска. Самый большой риск при таком подходе заключается в том, что взаимоблокировка может прояв пъся вновь. Однако неопределенность относительных скоростей выполнения параллельных вычислений обычно позволяет этого избежать. 3. Последовательно прекращать выполнение заблокированных процессов по одному до тех пор, пока взаимоблокировка не прекратится. Порядок выбора уничтожаемых процессов должен базироваться на некотором критерии минимальной стоимости. После каждого уничтожения процесса должен быть вызван алгоритм обнаружения взаимоблокировок для проверки, не устранены ли они 4. Последовательно перераспределять ресурсы до тех пор, пока взаимоблокировка не прекратится. Как и в предыдущем случае, выбор процесса должен осуществляться в соответствии с некоторым критерием минимальной стоимости, а после осуществления перераспределения должен вызываться алгоритм обнаружения взаимоблокировок. Процесс, ресурсы которого перераспределяются, должен быть возвращен к состоянию, в котором он находился до получения этого ресурса. В случае использования вариантов 3 и 4 критерий выбора процесса может лть, например, одним из следующих: • процесс, потребляющий минимальное время процессора; • процесс с минимальным выводом информации; • процесс с наибольшим временем ожидания; • процесс с минимальным количеством захваченных ресурсов; • процесс с минимальным приоритетом. •$ 36 Часть 2. П и •■?■. сь 3. При выборе критерия следует учитывать затраты времени на вычисление той 11Ля иной стоимости, а также отдавать себе отчет в том, что в данной ситуации понятие "стоимости" имеет смысл только для операционной системы в целом. fe.5. ИНТЕГРИРОВАННЫЕ СТРАТЕГИИ " ^«J РАЗРЕШЕНИЯ ВЗАИМОБЛОКИРОВОК" I У каждой стратегии разрешения взаимоблокировок есть свои достоинства и недостатки, а потому наиболее эффективным путем может оказаться применение разных подходов в различных ситуациях. В работе [SILB98] предлагается следующий подход к данной проблеме. • Сгруппировать ресурсы в несколько различных классов. • Для предотвращения взаимоблокировок между классами ресурсов использовать описанный ранее метод упорядочения типов ресурсов. • В пределах одного класса ресурсов использовать наиболее подходящий для данного типа ресурсов алгоритм. В качестве примера такой методики рассмотрим следующие классы ресурсов. • Пространство подкачки. Блоки памяти на вторичных устройствах хранения информации, используемые при свопинге процессов. • Ресурсы процесса. Назначаемые устройства, такие, как стримеры или файлы. • Основная память. Страницы или сегменты, назначаемые процессу. • Внутренние ресурсы. Такие ресурсы, как, например, каналы ввода-вывода. Порядок перечисления ресурсов в приведенном списке представляет собой порядок их выделения. Этот порядок обосновывается обычной последовательностью действий процесса. В пределах каждого класса ресурсов могут использоваться следующие стратегии. • Пространство подкачки. Предотвращение взаимоблокировок с помощью требования, чтобы все ресурсы распределялись одновременно. Такая стратегия вполне применима, если известны максимальные требования (что зачастую выполняется на практике). Можно также использовать стратегию устранения взаимоблокировок. • Ресурсы процесса. В этой категории ресурсов зачастую наиболее эффективным является использование стратегии устранения взаимоблокировок, поскольку можно ожидать, что процесс заранее объявит о требуемых ему ресурсах этого типа. Кроме того, можно использовать предотвращение взаимоблокировок путем упорядочения ресурсов в пределах данного класса. Основная память. Пожалуй, наиболее подходящим методом предотвращения взаимоблокировок в этом случае может оказаться перераспределение Ресурсов. Процесс, ресурсы которого перераспределяются, просто сбрасывается на вторичные устройства хранения информации, освобождая основную ; намять для разрешения взаимоблокировки. ^Ба 6. Взаимоблокировка и голодание 337
;& Внутренние ресурсы. Можно использовать предотвращение взаимоблч>кт> вок путем упорядочения ресурсов в пределах данного класса. *> •;1 "SSTW" .6. ЗАДАЧАСОБ ОБЕДАЮЩИХ ЛИЛОСО АХ В некотором царстве, в некотором государстве жили вместе пять философе Сизнь каждого из них проходила в основном в размышлениях, прерываемых пои " ом пищи. Философы давно сошлись во мнении, что только спагетти в состоянии останавливать их подточенные непрерывными размышлениями силы. Питались они за одним круглым столом (см. рис. 6.9), на который помета эсь большое блюдо со спагетти, пять тарелок, по одной для каждого философа пять вилок. Проголодавшийся философ садится на свое место за столом и эльзуясь двумя вилками, приступает к еде. Задача состоит в том, чтобы разра- этать ритуал (читай — алгоритм) обеда, который обеспечивает взаимоисключе- ия (два философа не могут одновременно пользоваться одной вилкой) и не до- ускает взаимоблокировок и голодания (обратите внимание, насколько уместен казался этот термин в данной задаче!). Эта задача Дейкстры хорошо иллюстрирует проблемы взаимоблокировок и >лодания. Кроме того, при решении данной задачи приходится сталкиваться со ногими трудностями в организации параллельных вычислений (см., например, jrING90]), Задача об обедающих философах может рассматриваться как типич- ая задача, возникающая в многопоточных приложениях при работе с совместно спользуемыми ресурсами и, соответственно, может выступать в качестве тесто- эй при разработке новых подходов к проблеме синхронизации. Рис. 6.9. Обеденный стол философов S- I". ■V* i 1 & (38 Часть 2. П он сС В листинге 6.2 предложено решение этой задачи с использованием семафо- оБ. Каждый философ, садясь за стол, сначала берет левую вилку, а затем пра- \-ю- После того как философ пообедает, использованные им вилки заменяются. Увы. такое решение может привести к взаимоблокировке, если философы, одно- еменно проголодавшись, все вместе сядут за стол и одновременно возьмут ле- ясашие слева вилки. В этой неприятной ситуации им придется голодать. Листинг 6.2. Первое решение задачи об обедающих философах semaphore fork[5] = {1}; int i; void philosopher(int i) while(true) { think (); wait(forkfi]); wait(forkf(i+1) mod 5]); eat (); signal(fork[(i+1) mod 5] ) ; signal(fork[i]); } } void main() { parbegin(philosopher(0),philosopher(1), philosopher(2),philosopher(3) , philosopher(4)); } Чтобы избежать риска взаимоблокировки, можно купить еще пять вилок Окстати, самое подходящее решение задачи с точки зрения гигиены!) или научить Философов есть спагетти одной вилкой. Еще один подход состоит в том, чтобы нанять вышибалу, который не позволит пяти философам садиться за стол одновременно. Если же за столом соберутся не более четырех философов, то по крайней мере ^Дин из mix сможет воспользоваться двумя вилками. В листинге 6.3 приведено соот- тствующее решение задачи (вновь с использованием семафоров). Ни взаимоблокировок, ни голодания при таком решении просто не может быть. ^^тинг 6.3. Второе решение задачи об обедающих философах semaphore fork[5] = {1},- femaPhore room = {4}; yoj-d philosopher (int i) while(true) think{); wait(room); wait(fork[i]); wait(fork[(i+l) mod 5]) eat (); ^ ава 6. Взаимоблокировка и голодание 339
signal (fork [ (i+1) mod 5]); ч;. signal (fork[i] ) ; ;: signal(room); 1 ! i main () ,j parbegin(philosopher(0),philosopher(1) , philosopher(2),philosopher(3) , philosopher(4)); 7. МЕХАНИЗМЫ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ В UNIX Ж XS3- 6£ ,t ... _ ^^-^^ j&*-;.W to' # UNIX предоставляет различные механизмы для синхронизации и свя; и процессами. В этом разделе мы рассмотрим важнейшие из них: каналы; сообщения; разделяемую память; семафоры; сигналы. Каналы, сообщения и разделяемая память обеспечивают обмен дан i ду процессами, в то время как семафоры и сигналы используются для ини- ^ щи некоторых действий другого процесса. налы Каналы (pipes) являются одним из наиболее значительных вкладов UNIX в итие операционных систем. Разработанные на основе концепции сопрограмм f« 'С84], каналы представляют собой циклические буфера, которые позволяю"' i процессам связываться друг с другом в соответствии с моделью производи- /потребитель. Следовательно, канал — не что иное, как очередь, работаю по принципу "первым вошел — первым вышел", запись в которую осуЩ^7" ;тся одним процессом, а чтение — другим. При создании канала он получает буфер определенного размера. При зая11С нал при наличии свободного места соответствующий запрос удовлетворяет ^ ;дленно; в противном случае процесс блокируется. Аналогично блоки УеТС tecc, пытающийся прочесть из канала большее количество информаци_ , ющееся в нем; в противном случае запрос на чтение выполняется не^еДЛ Эперационная система обеспечивает взаимоисключения — одновременно Д к каналу имеет только один процесс. "^ Существует два типа каналов: именованные и неименованные. Со0*& »льзовать неименованные каналы могут только связанные друг с ДРУГО ы; не связанные друг с другом процессы могут совместно использоваТ* :менованные каналы. ► Часть 2. П *еС » Сообщения Сообщение представляет собой блок текста определенного типа. UNIX для боты с системой передачи сообщений предоставляет процессам системные вызовы msgsnd и msgrcv. С каждым процессом связана очередь сообщений, функционирующая подобно почтовому ящику. Указанный отправителем тип сообщения может быть использован получателем как критерий отбора сообщений. Он может получать сообщения либо в соответствии с принципом "первым вошел — первым вышел", либо в соответствии с их типом. При попытке отправить сообщение в заполненную очередь выполнение процесса приостанавливается, так же как и при попытке прочесть сообщение из пустой очереди. Если же процесс пытается прочесть сообщение определенного типа, но такого сообщения в очереди нет, процесс не приостанавливается. Разделяемая память Наиболее быстрым видом связи между процессами, обеспечиваемым операционной системой UNIX, является разделяемая память. Это общий блок виртуальной памяти, совместно используемый многими процессами. Процессы читают информацию и записывают ее в разделяемую память с помощью тех же инструкций чтения и записи, что и при работе с другими частями своего виртуального пространства памяти. Права доступа (чтение и запись или только чтение) к разделяемой памяти предоставляются каждому из процессов в отдельности. Взаимоисключения не являются частью механизма разделяемой памяти и должны обеспечиваться процессами, использующими разделяемую память. Семафоры Система вызовов семафоров в UNIX System V представляет собой обобщение примитивов wait и signal, определенных в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность". Все требуемые при работе с семафорами операции выполняются ядром автоматически; ни один процесс не может получить доступ к семафору, пока с ним выполняется операция, вызванная другим процессом. Семафор состоит из следующих элементов. • Текущее значение семафора. • Идентификатор последнего процесса, работавшего с семафором. • Количество процессов, ожидающих, пока значение семафора не превысит текущее. Количество процессов, ожидающих, пока значение семафора не станет равным нулю. <- семафором связаны очереди приостановленных процессов. При создании семафоры принадлежат множествам. Множество может со- s ауь Как один так и несколько создаваемых семафоров. Системный вызов Kn ~ Позволяет установить значения всех семафоров множества одновременно. е того, имеется системный вызов semop, в качестве аргумента которому пе- Мв - ТСЯ список операций с семафорами (по одной для каждого семафора из "Но TpveCTBa^- При этом вызове ядро выполняет указанные операции одновремен- ; ■ аяодая из операций определяется значением sem__op. f: ®* Взаимоблокировка и голодание 341
Если sem op положительно, ядро увеличивает значение семафора '»»,-. зирует все процессы, ожидающие увеличения значения семафора. . Если semop равно 0, ядро проверяет значение семафора. Если ононуле то ядро переходит к выполнению операций со следующим семафопом. ' противном случае количество процессов, ожидающих обнуления сё adjon увеличивается, и процесс приостанавливается до тех пор, пока значение ' мафора не станет равным нулю. л > Если sem_cp отрицательно, а его абсолютное значение не превышает знач ние семафора, ядро добавляет semop (отрицательное число!) к значению семафора. Если полученный результат равен нулю, ядро активизирует все процессы, ожидавшие обнуления значения семафора. > Если sem_op отрицательно, а его абсолютное значение больше значения семафора, ядро приостанавливает процесс до тех пор, пока значение семафора не увеличится. Такое обобщение семафоров обеспечивает значительную гибкость при вы- лнении синхронизации и координации процессов. игналы Сигнал представляет собой программный механизм, информирующий процесс о ступлении асинхронного события. Сигнал подобен аппаратному прерыванию но не пользует систему приоритетов, т.е. все сигналы обрабатываются одинаково. Просе получает сигналы по одному, без специального упорядочения. ЛЩ Процессы могут посылать сигналы друг другу; в обмене сигналами может шнимать участие и ядро. Доставка сигнала выполняется путем обновления по- i в таблице процесса, которому послан данный сигнал. Поскольку каж ый сиг- 1л соответствует отдельному биту, сигналы одного типа не могут накапливаться виде очереди. Сигнал обрабатывается сразу же после активизации ", ропесса 1и возврата его из системного вызова. Процесс может ответить на сигнал вы- >лнением некоторых действий по умолчанию (например, завершением аботы), •шолнить функцию обработки сигнала или проигнорировать его. В табл. 6.1 перечислены сигналы UNIX SVR4. ; ■v аблнца 6.1. Сигналы UNIX 1ачение Имя Описание SIGHUP Завесить; посылается процессу, когда ядро полагает, ч*о пользователь этого процесса выполняет бесполезную работу SIGINT Прерывание SIGQUIT Выход; посылается пользователем, для того чтобы вызвать тановку процесса и сброс дампа памяти SIGILL Некорректная инструкция SIGTRAP Запуск кода трассировки процесса SIGIOT Инструкция ЮТ , SIGEMT Инструкция ЕМТ SIGFPT Исключение при работе с числами с плавающей точкой 42 Часть 2. П Окончание табл. 5.1 *, % ч Значение Имя Описание 09 ю 11 12 13 14 15 16 17 18 19 SIGKILL Прекращение работы процесса SIGBUS Ошибка шины SIGSEGV Нарушение сегментации; процесс пытается обратиться к ячейке памяти вне своего виртуального адресного пространства SIGSYS Неверный аргумент системного вызова SIGPIPE Запись в канал, к которому не присоединены процессы, считывающие из него информацию SIGALARM Сигнал от часов; используется, когда процесс должен получить сигнал после определенного периода времени SIGTERM Завершение работы программы SIGUSR1 Пользовательский сигнал 1 SIGUSR2 Пользовательский сигнал 2 STGCLD Завершение дочернего процесса SIGPWR Сбой питания 6$. ПРИМИТИВЫ СИНХРОНИЗАЦИИ ^зж^; .&- ПОТОКОВ SOLARIS В дополнение к механизмам параллельных вычислений UNIX SVR4, Solaris поддерживает четыре примитива синхронизации потоков. • Блокировки взаимоисключений (mutex). • Семафоры. • Блокировки читатели/писатель (несколько читателей, один писатель). • Переменные условий. Примитивы для потоков ядра в Solaris реализованы в самом ядре; для работы с ользовательскими потоками имеется соответствующая библиотека. Работа с примитивами осуществляется через структуры данных, содержащие определяемые еоз- ^ощим эти структуры потоком параметры. После создания синхронизирующего КТЙ С Шш' по СУТИ» могУт выполняться только две операции: войти (захватить, локировать) и освободить (деблокировать). Ни в ядре, ни в библиотеке нет меха- °в, обеспечивающих взаимоисключения или отсутствие взаимоблокировок. Ооз е примитивы синхронизации требуют наличия машинных команд, которые ляют атомарно проверить и установить значение объекта (см. раздел 5.3). л<>кировки взаимоисключений Работу °Кировки взаимоисключений (мьютексы5) предотвращают одновременную 6отУ о НесКольких потоков при захвате блокировки. Поток, блокировавший ра- J* Дебл°ТаЛЬНЫХ потоков (посредством вызова примитива mutex_enter), должен ^^ окировать их (посредством вызова примитива mutex_exit). Если прими- m mutex — mutual exclusion. — Прим. перев. "■ Взаимоблокировка и голодание 343
"J mutex enter не в состоянии установить блокировку (поскольку онал »влена другим потоком), то его дальнейшие действия зависят от инфрр^я^ труктуры данных блокировки. По умолчанию поток циклически опрадцяв ояние блокировки, однако может применяться и механизм прерываний >едью заблокированных потоков. \% Для работы с блокировками используются следующие примитивы. вх enter (} Захват блокировки; если уже захвачена — блокировали\ потока ex exit () Освобождение блокировки с возможным деблокировани ем ожидающего потока '["'"V ex tryenter () Определение состояния блокировки (захвачена лц она каким-либо потоком в настоящее время) -щ Примитив mutex_tryenter () обеспечивает программисту возможность менять на уровне пользовательских потоков технологию пережидания заняли, что позволяет избежать блокирования всего процесса в целом из-за бю- ования одного из потоков. мафоры ^ Solaris поддерживает классические семафоры-счетчики, предоставляя для эты с ними следующие примитивы. ьм$, а_р {) Уменьшает значение семафора (с возможным блокиро ем потока) '-,$ й v () Увеличивает значение семафора (с возможным деблокирова- нием ожидающего потока) Щ ia_tryp () Уменьшает значение семафора (если не требуется блокирование) ■$ Примитив sema_tryp() обеспечивает программисту возможность и^пользо- ь на уровне пользовательских потоков технологию пережидания занятости. [окировки читатели/писатель Щ Данная блокировка обеспечивает возможность одновременного Доступа ько для чтения к защищенному ею объекту нескольким потокам,' а>; также спечивает исключительный доступ для записи объекта одному./ потоку ключительный означает, что когда такая блокировка оказывается эахвачен- i потоком для записи, все остальные потоки, как читающие, так и аписЫ- лцие, переходят в состояние ожидания). Для работы с блокировка*^** это ta используются следующие примитивы. Л enter () Попытка захвата блокировки для чтения или записи; exit () Освобождение блокировки 'Ш _tryenter() Неблокирующий захват downgrade () Поток, захвативший блокировку для записи, прев а ее в блокировку для чтения. Все потоки записи в .осТ0 нии ожидания ждут освобождения блокировки. Если та вых нет, то примитив активизирует все потоки чтенй tryupgrade() Пытается преобразовать блокировку для чтения в^очоь ровку для записи ,/' 4 Часть 2. ЛГ г ■'? Довременные условий Данные переменные используются для ожидания выполнения некоторого условия и должны применяться вместе с блокировками взаимоисключений (тем самым реализуются мониторы, использованные в листинге 5.15). Для работы с ними имеются следующие примитивы. | cv wait () Блокирование потока до тех пор, пока условие не будет вы- t s полнено v * cv signal () Активизация одного из потоков, заблокированных примитивом cv_wait{) - cv broadcast () Активизация всех потоков, заблокированных примитивом ч: сv_wa i t () Примитив cv_wait{) освобождает связанный с ним мьютекс перед блоки- >■ рованием потока и вновь захватывает его перед завершением работы. Поскольку I повторный захват мьютекса может быть заблокирован другим ожидающим потоком, следует повторно проверить выполнение условия, вызвавшего ожидание. Таким образом, типичный фрагмент кода, работающего с переменными условий, выглядит следующим образом: mutex_enter{&m) ; Y ] а- while(some_condition) { cv_wa i t {& с v, &m) ; } mutex^exit(&m) ; Поскольку при таком подходе условие защищено мьютексом, в качестве него может использоваться сложное выражение. ! £ ВЫЧИСЛЕНИЙ В WINDOWS 2000 1 windows 2000 (W2K) обеспечивает синхронизацию потоков как часть объ- *' йИзН°Й архитектУРы- Механизм, использованный W2K для реализации синхро- Ции, представляет собой семейство следующих объектов синхронизации. - ■ * Процесс. J * Поток. * Файл. Засольный ввод. ведомление об изменении файлов. Мьютекс. *ла "• Взаимоблокировка и голодание 345
Семафор. : Событие. Таймер ожидания. Первые четыре объекта в этом списке могут использоваться для целей син- низации, хотя это и не основное их предназначение. Остальные типьх'объек- разработаны специально для поддержки синхронизации. £ Экземпляр каждого из перечисленных объектов может находиться в одном двух состояний — сигнальном (signaled) и несигнальном (unsignaledj; поток обождается при входе объекта в сигнальное состояние. Механизм достаточно ют: поток выполняет запрос на ожидание к исполнительной системе "W2K с юльзованием дескриптора объекта синхронизации. Когда объект входит в нальное состояние, исполнительная система W2K освобождает все потоки, :одящиеся в состоянии ожидания этого объекта. у В табл. 6.2 приведен список событий, приводящих объекты в сигнальное тояние, и указано их влияние на ожидающие потоки. >лица 6.2. Объекты синхронизации Windows 20006 i объекта >цесс ГОК ал гсольный ввод гдомление об генении файлов ютекс яафор Определение Программа, включая адресное пространство и ресурсы, требуемые для ее выполнения Выполнимая единица внутри процесса Открытый файл или устройство ввода-вывода Буфер текстового окна (например, используемый для операций ввода-вывода приложений MS DOS) Уведомление о любых изменениях файловой системы Механизм обеспечения взаимоисключений в средах Win32 и OS/2 Счетчик, регулирующий количество потоков, которые могут использовать ресурс Переход в сигнальное состояние Завершение последнего потока Завершение работы потока Завершение операции ввода-вывода Имеется введенная информация, доступная процессу Изменения в файловой системе, соответствующие заданному объектом фильтру Поток освобождает мьютекс Счетчик семафора обнуляется Ожидающие потоки Освобождаются все потоки 1, ■ Освобожд ся все потоки Освобождаются вс потоки Освобождается один поток 1 М 1 ^ .» "Щ .-*£'■& ■ ■ Освобожу с один поток *i Освобождается один поток Освобождаются вое потоки __ ■—*~ f > 6 Заштрихованные строки соответствуют объектам, созданным спец ieu синхронизации. }■ ъно & Часть 2. П v ue Окончание табл. 6.2 Тип объекта Событие Таймер ожидания Определение Извещение о наступлении некоторого события в системе Счетчик, учитывающий прошедшее время Переход в сигнальное состояние Поток осуществляет событие Наступил указанный момент времени или истек указанный интервал времени Ожидающие потоки Освобождаются все потоки Освобождаются все потоки Мьютексы используются для взаимоисключительного доступа к ресурсам, благодаря им обеспечивается получение доступа к ресурсу одновременно только одним объектом (т.е., по сути, они выступают в роли бинарного семафора). При входе мьютекса в сигнальное состояние освобождается только один из ожидающих этого потоков. Мьютексы могут также использоваться для синхронизации потоков разных процессов. Так же как и мьютексы, семафоры могут совместно использоваться потоками разных процессов. В W2K семафоры являются классическими семафорами- счетчиками. Таймер ожидания — новый объект ядра, появившийся в Windows NT 4.0, который подает сигнал в определенный момент времени и/или через заданные промежутки времени. 6.10. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ т И КОНТРОЛЬНЫЕ ВОПРОСЫ ; Ar" JBlIf _л-*£? л- —-=■-* ^im " if*? Взаимоблокировка представляет собой блокирование множества процессов, которые либо конкурируют в борьбе за обладание системными ресурсами, либо поддерживают связь друг с другом. Такая блокировка оказывается постоянной, если операционная система не предпримет экстраординарных действий типа прекращения или отката одного или нескольких процессов. Взаимоблокировка ожет происходить при работе как с повторно используемыми, так и с расходуемыми ресурсами. Расходуемые ресурсы уничтожаются при захвате их про- Сс°м; примером такого ресурса может служить информация в буфере ввода- ВоДа. Повторно используемый ресурс, например канал ввода-вывода или об- ть Памяти, не истощается и не уничтожается при работе с ним. И Ра^оте с взаимоблокировками имеется три основных подхода: предот- йа е' обнаружение и устранение. Предотвращение путем устранения одной воз 80 димых причин взаимоблокировки гарантирует, что взаимоблокировка кнуть не может. Обнаружение требуется, если операционная система всегда Дс-Лж Уд-овлетворить запрос на ресурс; в таком случае операционная система стви а РегУляРно проверять наличие взаимоблокировки и предпринимать дей- \*Кл*о П° 8е разРешению' если таковая возникла. Устранение взаимоблокировок *Я0Лн 8еТ анализ каждого нового запроса для выяснения, не может ли его вы- нзаи Ие пРивести к взаимоблокировке, и удовлетворение запроса, только если блокировка невозможна. ;** 6. Взаимоблокировка и голодание 347
ночевые термины горитм банкира Перераспределение Удержание и ожидание аимное исключение Повторно используемый Устранение шмоблокировка ресурс взаимоблокировок иодание Предотвращение Циклическое ожидадЕйv наружение взаимоблокировок ф-^ >v взаимоблокировок Расходуемый ресурс -^ ,7""' энтрольные вопросы 6.1. Приведите примеры расходуемых и повторно используемых ресурсов 6.2. Какие три условия являются необходимыми для осуществления Взаимоблокировки? .: 1ж 6.3. Выполнение каких четырех условий приводит к возникновению в о- блокировки? #§Г 6.4. Каким образом можно предотвратить условие удержания и ожидания? 6.5. Перечислите два способа предотвращения условия отсутствия перераспределения. :$" 6.6. Каким образом можно предотвратить циклическое ожидание? ;4^ 6.7. В чем заключается разница между предотвращением, обнаруживаем и устранением блокировок? 3* Lll. РЕКОМЕНДУЕМАЯ ЛИТЕРАТ^Ж! Особый интерес представляет классическая статья [HOLT72], посвященная аимоблокировкам, так же как и работа [COFF71]. Неплохой обзор по данной ме можно найти в [ISLO80] и [DIMI98]. Обнаружению взаимоблокировок по- ящена работа [CORB96]. Механизмы синхронизации в UNIX SVR4, Solaris 2.x и Windows. NT 4.0 статочно полно описаны, соответственно, в [GRAY97], [GRAH95] и [RICH97]. — — — — — x-r- TSwTSf .. X3FF71 Coffman E., Elphick M., Shoshami A. System Deadlocks. — Computing Surveys June 1971. .#' ХЖВ96 Corbett J. Evaluating Deadlock Detection Methods for Concurrent Software. — IEEE Transactions on Software Engineering* March 1996. MM198 Dimitoglou G. Deadlocks and Methods for Their Detection, Prevention, and Recovery in Modern Operating Systems. — Operating Systems Review, July 199». 5RAH95 Graham J. Solaris 2.x: Internals and Architecture. — New York: McGrav- Hill, 1995. 5RAY97 Gray J. Interprocess Communications in UNIX: The Nooks ono Grannies. — Upper Saddle River, NJ: Prentice Hall, 1997. HOLT72 Holt R. Some Deadlock Properties of Computer Systems. — Computing Sun ys September 1972. [SLO80 Isloor S., Marsland T. The Deadlock Problem: An Overview. — Сотри** ■ September 1980. RICH97 Richter J. Advanced Windows. — Redmond, WA: Microsoft Press, 199? • 48 Часть 2. П J" f6.12. ЗАДАЧИ Sl SftSL щег^т q 1 Опишите каждый из шести приведенных на рис. 6.3 путей так же, как это сделано для рис. 6.2 в разделе 6.1. 6.2. Как Указывалось, в ситуации, изображенной на рис. 6.3, взаимоблокировка возникнуть не может. Обоснуйте это утверждение. 6.3. Рассмотрим следующее состояние системы, в котором в данный момент не имеется никаких очередей неудовлетворенных запросов. Доступно П г2 гЗ г4 0 0 Максимальные требования r4 rl г2 гЗ Требуется г4 rl г2 гЗ г4 6.4. в.5. 1 0 2 0 2 0 0 0 0 3 3 1 0 3 5 3 2 0 4 4 2 0 2 6 4 0 0 7 6 3 6 1 5 5 5 5 2 0 6 6 2 Текущее распределение Процесс _rl г2 гЗ pl р2 рЗ р4 р5 а. Определите, какие ресурсы может запросить каждый из процессов, и заполните столбцы "Требуется" таблицы. б. В каком состоянии — опасном или безопасном — находится система в настоящий момент? Обоснуйте свой ответ. в. Заблокирована система в настоящий момент или нет? Обоснуйте свой ответ. г. Какой процесс (если таковой имеется) находится в состоянии взаимоблокировки (или может быть заблокирован)? д. Если процессом рЗ будет выполнен запрос (0,1,0,0), безопасно ли его немедленное удовлетворение? В каком именно состоянии окажется система после его немедленного удовлетворения? Какие процессы (если таковые имеются) окажутся (или могут оказаться) заблокированными при немедленном удовлетворении этого запроса? Примените алгоритм обнаружения взаимоблокировки из раздела 6.4 к приведенным данным. Доступность = (2100), Г200П fOOlO^ Требования = 1010 2100 Распределение = 2001 0120 Си стема буферизации, представленная на рис. 6.10, состоит из процесса ввода ^ пользовательского процесса Р и процесса вывода О, соединенных с двумя ^Уферами. Процессы обмениваются блоками данных одинакового размера, которые оуферизуются на диске; граница между входным и выходным буферами намическая, зависящая от скорости работы процессов. Используемые провесами примитивы гарантируют выполнение условия i + o<max , где ад: максимальное количество блоков на диске; — количество входных блоков на диске; О — количество выходных блоков на диске. Ь. Взаимоблокировка и голодание 349
m О работе процессов известно следующее. ,^ 1. Пока система производит данные, процесс I записывает их на диск (&> на диске имеется свободное место). h 'tt 2. Пока на диске имеются входные данные, процесс Р считывает вдц » каждого считанного блока выводит некоторое конечное количество л* ных (если на диске имеется свободное место). *& 3. Пока на диске имеются выходные данные, процесс О считывает их. Покажите, что в этой системе может возникнуть взаимоблокировка. О Входной буфер е Выходной буфер Рис. 6.10. Система буферизации Предложите дополнительное условие использования ресурсов, которое предотвращает взаимоблокировку в задаче 6.5, но при этом разрешает перемещение границы между входным и выходным буфером в зависимости от текущих нужд процессов. »> Во многозадачной системе THE [DIJK68] барабан (предшественник магнитных дисков) разделен на входные буферы, рабочую область и выходные буферы с подвижными границами, зависящими от скорости работы процессов. Текущее состояние барабана можно охарактеризовать следующими параметрами: max — максимальное количество страниц на барабане; i — количество входных страниц на барабане; р — количество страниц рабочей области на барабане; о — количество выходных страниц на барабане; reso — минимальное количество страниц, зарезервированных для выхода; resp — минимальное количество страниц, зарезервированных для раб ты. Сформулируйте ограничения, которые должны быть наложены на ресурсы, с тем чтобы гарантировать, что не будет превышена емкость барабана и что Д1Я выходных данных и рабочей области постоянно зарезервировано минимальное количество страниц. В многозадачной системе THE возможны следующие переходы между состояниями страницы. (ввод данных), (использование ввода), (вывод данных), (использование вывода), (вызов процедуры).1' (возврат из процеду м). 1. Пустая -} входной буфер 2. Входной буфер -> рабочая область 3. Рабочая область —> выходной буфер 4. Выходной буфер -» пустая 5- Пустая -> рабочая область 6. Рабочая область —» пустая а. Опишите действие этих переходов в терминах величин г, о и р. б. Пусть процесс ввода, пользовательский и процесс вывода подчини ТСЯ - виям задачи 6.5. Может ли в таком случае один из них привести,к в ной блокировке? ~р Рассмотрим систему с общим количеством памяти, равным 150 ДиН распределенным между процессами следующим образом: Процесс Максимум Получено 1 70 45 2 60 40 3 60 15 .%.. ' .V Часть 2 J д Примените алгоритм банкира для определения того, безопасно ли удовлетворение описанных ниже запросов, и если да — то укажите соответствующую последовательность завершения работы процессов. а. Начинает работу четвертый процесс с максимальными требованиями к памяти, равными 60 единицам, и начальным запросом на 25 единиц памяти. б. Начинает работу четвертый процесс с максимальными требованиями к памяти, равными 60 единицам, и начальным запросом на 35 единиц памяти. Оцените применимость алгоритма банкира в реальной жизни. Алгоритм конвейера реализован таким образом, что поток элементов данных типа Т. производимых процессом Р0, проходит через последовательность процессов Р^ Р2, ..., Р„.!, обрабатывающих проходящие данные в указанном порядке. а. Определите обобщенный буфер сообщений, который содержит все частично использованные элементы данных, и разработайте алгоритм работы процесса Р„ 0 < i < п — 1. Алгоритм должен иметь следующий вид: repeat Получение информации от предшественника; Использование полученного элемента; Послать информацию преемнику; forever Для простоты считаем, что процесс Р0 получает пустые элементы данных, посылаемые ему процессом Рп.\. Разработанный алгоритм должен позволять процессу работать непосредственно с сообщениями, хранящимися в буфере, не выполняя копирования элементов данных. б. Покажите, что, несмотря на работу с общим буфером, взаимоблокировка процессов в этой ситуации невозможна. а. Три процесса совместно используют четыре единицы ресурса, которые могут быть распределены и освобождены только в отдельности. Каждому процессу требуется не более двух единиц ресурса. Покажите, что взаимоблокировка при этом невозможна. б. N процессов совместно используют М единиц ресурса, которые могут быть распределены и освобождены только по одной единице одновременно. Максимальное требование каждого из процессов не превышает М единиц, причем сумма максимальных требований процессов меньше, чем N+M. Покажите, что взаимоблокировка при этом невозможна. Рассмотрим следующие способы работы с взаимоблокировками. 1. Алгоритм банкира. 2. Обнаружение взаимоблокировки и прекращение работы потока с освобождением всех ресурсов. 3. Резервирование всех ресурсов заранее. 4. Перезапуск потока и освобождение всех ресурсов, если поток должен находиться в состоянии ожидания. 5. Упорядочение ресурсов. 6. Обнаружение взаимоблокировки и откат потока. а- Одним из критериев оценки различных подходов к проблеме блокировки является оценка максимальной допустимой параллельности вычислений, иными словами, какой из методов позволяет работать наибольшему количеству потоков без ожидания и возникновения взаимоблокировок? Упорядочьте перечисленные Ранее методы борьбы с взаимоблокировками в порядке уменьшения обеспечиваемой ими степени параллельности и прокомментируйте ваше решение. & 6. Взаимоблокировка и голодание 351
i.15. ч& б. Еще одним критерием может служить эффективность; другими. Ьлсъ какой из методов требует меньших накладных расходов процессорного ' мени? Считая, что взаимоблокировка — весьма редкое событие, упоЪялп ^ перечисленные ранее методы борьбы с взаимоблокировками в поп Т* уменьшения их эффективности и прокомментируйте ваше решение. И нится ли порядок, если взаимоблокировки будут происходить часто? '" ** >.14. Прокомментируйте следующее решение задачи об обедающих философах, П 'ИГ голодавшийся философ сперва берет вилку слева от себя. Затем, если в ? справа свободна, он берет ее и приступает к еде; в противном случае он кА С левую вилку на стол и повторяет цикл. „» v» Данное упражнение демонстрирует тонкости задачи об обедающих филос и сложность написания корректной программы с использованием сечафоро в листинге 6.4 приведено решение этой задачи из книги, посвященной операцн онным системам ([TANE97], [TANE92]). " а. Опишите принцип решения задачи словами. б. Хотя автор решения и утверждает, что оно "корректно и обеспечивает максимальную параллельность для произвольного количества философов" на самом деле оно обеспечивает отсутствие взаимоблокировок, но не голодания. Покажите это при помощи контрпримера. Указание: рассмотрите случай с пятью философами. Пусть это будут обжоры, которые никогда не размышляют и, пообедав, приступают к этому процессу вновь. Рассмотрите ситуацию, когда два философа будут непрерывно обедать, а остальные три будут сидеть голодными. Тистинг 6.4. Предлагаемое решение задачи об обедающих философах ^define N 5 tdefine LEFT (i-1) ^define RIGHT (i+1) define THINKING 0 ■define HUNGRY 1 :define EATING 2 :ypedef int semaphore; -nt state [N] ; semaphore mutex = 1; semaphore s [N] ; roid philosopher(int i) while(TRUE) { think(); take_forks(i); eat (); put forks(i) ; /* Количество философов %N /* Левый сосед i-го философа Правый сосед i-ro философа Философ размышляет %N /* /* /* /* */ */ V" Философ пытается взять вилки */ Философ ест !/ц /* Семафор - специальный тип int*/ /* Массив для отслеживания состояний философов */,■ /* Взаимоисключение для критического раздела */ /* Номер философа от 0 до N-1 /* Бесконечный цикл /* Философ думает /* Берет две вилки или блокируется /* Философ ест спагетти /* кладет вилки на стол */ */ */ */ * */ ■' */ •: t ■ч- 152 Часть 2. П <>иеС void take_forks(int i) { /* Номер философа от 0 до N-1 wait(mutex); state[i] = HUNGRY; test(i); signal(mutex); wait(s[i]); /* /* /* /* /* */ */ Вход в критический раздел Запоминаем, что философ проголодался Пытаемся взять две вилки Выход из критического раздела*/ Блокирование, если обе вилки в настоящий момент недоступны*/ */ */ } void put_forks(int i) { wait(mutex); state[i] = THINKING; test(LEFT); test(RIGHT); signal(mutex); /* Номер философа от 0 до N-1 7 /* /* /* /* /* Вход в критический раздел */ Философ завершил обед */ Может ли обедать сосед слева */ Может ли обедать сосед справа*/ Выход из критического раздела*/ } void { test(int i) /* Номер философа от 0 до N-1 */ if (state[i] == HUNGRY && State[LEFT] != EATING && state[RIGHT] != EATING) { state [i] = EATING; signal(s[i]) ; } } 6.16. Предположим, что имеется два типа философов — "левые", которые всегда берут первой вилку слева, и "правые", которые начинают с правой вилки. Поведение левых философов показано в листинге 6.2; поведение правых — в приведенном фрагменте кода. begin repeat think(); wait (fork [ (i+D mod 5] } ; wait(fork[i]); eat(); signal(fork[i]); signal(fork[(i+1) mod 5]); forever end; Докажите следующие утверждения. а. Любое размещение за столом левых и правых философов с присутствием как минимум по одному философу каждого типа позволит устранить взаимоблокировку. 6- Любое размещение за столом левых и правых философов с присутствием как минимум по одному философу каждого типа поэволит-предотвратить голодание. в* 6. Взаимоблокировка и голодание 363
■■•# * ■ .9 »•■ I; w* I f .it- » У"- ■■a» 4 t'j 2< *.* Часть З ПаМЯТЬ Одним из наиболее сложных аспектов разработки операционной системы является управление памятью. Хотя стоимость памяти постоянно снижается и в результате растет размер основной памяти на современных машинах, достигая гигабаитового диапазона, ее всегда недостаточно для хранения всех программ и структур данных, необходимых активным процессам и операционной системе в целом. Соответственно, одной из центральных задач операционной системы является управление памятью, включающее выгрузку и загрузку блоков данных из вторичной памяти. Однако операции ввода-вывода довольно медленные, и их скорость с каждым годом все больше и больше отстает от скорости работы процессора. Для эффективной работы процессо- ра(ов) операционная система должна четко рассчитывать процессы подкачки для минимизации влияния операций ввода-вывода на производительность. Глава 7. Управление памятью В этой главе представлен обзор фундаментальных механизмов, использующихся при управлении памятью. Сперва вы познакомитесь с основными требованиями схем управления памятью, а затем — с использованием технологии распределения памяти. Распределение памяти используется в основном в специальных случаях, но рассмотрение этих вопросов позволяет осветить множество проблем, возникающих при разработке систем управления памятью. Остальная часть главы посвящена сегментам и страницам памяти, представляющим собой фундамент практически всех современных систем управления памятью. Глава 8. Виртуальная память Виртуальная память, базирующаяся на использовании страниц либо комбинации страниц и сегментов, представляет почти универсальный подход к управлению памятью в современных машинах.
3» Виртуальная память представляет собой схему, прозрачную для рнклад. процессов и позволяющую каждому процессу работать так, как е i бы в эаспоряжении был неограниченный объем памяти. Для достижени этого ;кта операционная система создает для каждого процесса виртуальд<? адрес- пространство на диске. Часть виртуальной памяти при необходимости раа. ается в основной памяти. Таким образом, относительно малый объе основ- памяти может совместно использоваться многими процессами. Дл ффек- ой работы виртуальной памяти основные функции работы со стрйЩщами и ентами должны быть реализованы аппаратно (например, трансляцн вирту- ых адресов в реальные и обратно). Данная глава начинается с обз ра этих ратных механизмов; затем вы познакомитесь с вопросами разрабо; ки опе- юнных систем, связанными с использованием виртуальной памяти../^ ■4.* a V -■Si ■V- e Часть 3. ***** ГЛАВА Управление памятью 7.1. Требования к управлению памятью 7.2. Распределение памяти 7.3. Страничная организация 7.4. Сегментация 7.5. Резюме, ключевые термины и контрольные вопросы 7.6. Рекомендуемая литература 7.7. Задачи Приложение. Загрузка и связывание 7
однозадачных системах основная память разделяется на две части: одн» часть — Для операционной системы (резидентный монитор, ядро), а вто- рая — для выполняющейся в текущий момент времени программы. В мво- ачных системах "пользовательская" часть памяти должна быть распределе- я размещения нескольких процессов. Эта задача распределения вьшочняет- ерационной системой динамически и известна под названием управления гью (memory management). Эффективное управление памятью жизненно важно для многозадачных сис- Если в памяти располагается только небольшое число процессов, то боль- часть времени все эти процессы будут находиться в состоянии ожидания шения операций ввода-вывода, и загрузка процессора будет низкой. Таким ом, желательно эффективное распределение памяти, позволяющее размес- j ней как можно больше процессов. ""лава начинается с рассмотрения требований, которым должны удовлетво- разрабатываемые системы управления памятью. Позже мы приступим к отрению различных технологий управления памятью, начав с применен ia льких простых схем. Мы будем исходить из того, что для выполнения про- 1ы она должна быть загружена в основную память. !*-.' — --"rtf&jif- -^*K*-WVK.1C . ТРЕБОВАНИЯ К УПРАВЛЕНИИ! ПАМЯТЬЮ р %& Три рассмотрении различных механизмов и стратегий, связанных с управ- м памятью, полезно помнить требования, которым они должны удо летво- В [LIST93] перечислены пять требований. , ч 1еремещение. 1ащита. Совместное использование. 1огическая организация. Физическая организация. ;; емещение i многозадачной системе доступная основная память разделяется множество ссов. Обычно программист не знает заранее, какие программы будут резиде кодиться в основной памяти во время работы разрабатываемой им црогра» 5 того, для максимизации загрузки процессора желательно иметь большой пу- ссов, готовых к исполнению, для чего требуется возможность загрузки и л активных процессов из основной памяти. Требование, чтобы выгрузке ■и программа была вновь загружена в то же самое место, где находилась И Р ыло бы слишком сильным ограничением. Крайне желательно, чтобы,ПроН» гла быть перемещена (relocate) в другую область памяти. "^ Таким образом, заранее неизвестно, где именно будет размещена прогр кроме того, программа может быть перемещена из одной области |*амЯ ю при свопинге. Эти обстоятельства обуславливают наличие опреДеле ческих требований к адресации, проиллюстрированных на рис. 1\1- г* Часть 3. '■!»' сунке представлен образ процесса. Для простоты предположим, что образ процесса занимает одну непрерывную область основной памяти. Очевидно, что операционной системе необходимо знать местоположение управляющей информации процесса и стека исполнения, а также точки входа для начала выполнения процесса. Поскольку управлением памятью занимается операционная система и она же размещает процесс в основной памяти, соответствующие адреса она получает автоматически. Однако помимо получения операционной системой указанной информации, процесс должен иметь возможность обращаться к памяти в самой программе. Так, команды ветвления содержат адреса, указывающие на команды, которые должны быть выполнены после них; команды обращения к данным — адреса байтов или слов, с которыми они работают. Так или иначе, но процессор и программное обеспечение операционной системы должны быть способны перевести ссылки в коде программы в реальные физические адреса, соответствующие текущему расположению программы в основной памяти. Управляющая информация процесса Команда ветвления Увеличение адресов Ссылка на данные ► программы вершина стека Управляющий блок процесса Программа Данные Стек Рис. 7.1. Требования к адресации процесса Защ ита Каждый процесс должен быть защищен от нежелательного воздействия других Цессов, случайного или преднамеренного. Следовательно, код других процессов са °ЛЖен иметь возможности без разрешения обращаться к памяти данного процес- ЛсокЛя чтения или записи. Однако удовлетворение требованию перемещаемости устное еТ Задачу заш.иты- Поскольку расположение программы в основной памяти КромДСКаЗУеМ°' проверка абсолютных адресов во время компиляции невозможна. ЧИсл Т0Г°' В большинстве языков программирования возможно динамическое вы- ^^ение адресов во время исполнения (например, вычисление адреса элемента мас- Или указателя на поле структуры данных). Следовательно, во время работы fааа 7. Управление памятью 359
ь раммы необходимо выполнять проверку всех обращений к памяти, г^вгерируе процессом, чтобы удостовериться, что все они — только к памяти, вщ^|еано" юму процессу. К счастью, как вы увидите позже, механизмы поддерявдй neDe [ений обеспечивают и поддержку защиты. wf,' Обычно пользовательский процесс не может получить доступ ни^ какой 'И операционной системы — ни к коду, ни к данным. Код одного процесса не сет выполнить команду ветвления, целевой код которой находится-» yj^ цессе. Если не приняты специальные меры, код одного процесса Не^может учить доступ к данным другого процесса. Процессор должен быть способен рвать выполнение таких команд. ^^Ш* ♦ Заметим, что требования защиты памяти должны быть удовлетворены на уров процессора (аппаратного обеспечения), а не на уровне операционной системы )граммного обеспечения), поскольку операционная система не в схютояюш предать все обращения к памяти, которые будут выполнены программой. Д е если такое было возможно, сканирование каждой программы в поиске предлагаемых ушений защиты было бы слишком расточительно с точки зрения испсС,^ вания цессорного времени. Следовательно, соответствующие возможности аппа атного :печения — единственный способ определения допустимости обращения к лтамяти 1ным или коду) во время работы программы. ■0 вместное использование Любой механизм защиты должен иметь достаточную гибкость, дл того бы обеспечить возможность нескольким процессам обращаться к одной и той об части основной памяти. Например, если несколько процессов выполняют :н и тот же машинный код, то будет выгодно позволить каждому процессу отать с одной и той же копией этого кода, а не создавать свою собственную, эцессам, сотрудничающим в работе над некоторой задачей, может потребо- ься совместный доступ к одним и тем же структурам данных. Система рав- [ия памятью должна, таким образом, обеспечивать управляемый доступ к деляемым областям памяти, при этом никоим образом не ослабляя защиту 1яти. Как мы увидим позже, механизмы поддержки перемещений обеспечи- эт и поддержку совместного использования памяти. >гическая организация . Фактически всегда основная память в компьютерной системе органиэо_^ к мйное (одномерное) адресное пространство, состоящее из последователъиобтя ! или слов. Аналогично организована и вторичная память на своем- еск ►вне. Хотя такая организация и отражает особенности используемого anffifP8 стечения, она не соответствует способу, которым обычно создаются программ* иьшинство программ организованы в виде модулей, некоторые из которых н аны (только для чтения, только для исполнения), а другие содержат данные, >ые могут быть изменены. Если операционная система и аппаратное обеспече «пьютера могут эффективно работать с пользовательскими программами И Д ми, представленными модулями, то это обеспечивает ряд преимуществ- .г,.р .. Модули могут быть созданы и скомпилированы независимо друг 6* ДР> при этом все ссылки из одного модуля во второй разрешаются систв о время работы программы. i ,* ■I Ю Часть 3»; м ТЬ 2. Разные модули могут получить разные степени защиты (только для чтения, только для исполнения) за счет весьма умеренных накладных расходов. 3. Возможно применение механизма, обеспечивающего совместное использование модулей разными процессами. Основное достоинство обеспечения совместного использования на уровне модулей заключается в том, что они соответствуют взгляду программиста на задачу и, следовательно, ему проще определить, требуется или нет совместное использование того или иного модуля. Инструментом, наилучшим образом удовлетворяющим данным требованиям, является сегментация, которая будет рассмотрена в данной главе среди прочих методов управления памятью. физическая организация Как указывалось в разделе 1.5, память компьютера разделяется как минимум на два уровня: основная и вторичная. Основная память обеспечивает быстрый доступ по относительно высокой цене; кроме того, она энергозависима, т.е. не обеспечивает долговременного хранения. Вторичная память медленнее и дешевле основной и обычно энергонезависима. Следовательно, вторичная память большой емкости может служить для долговременного хранения программ и данных, а основная память меньшей емкости — для хранения программ и данных, использующихся в текущий момент. В такой двухуровневой структуре основной заботой системы становится организация потоков информации между основной и вторичной памятью. Ответственность за эти потоки может быть возложена и на отдельного программиста, но это непрактично и нежелательно по следующим причинам. 1. Основной памяти может быть недостаточно для программы и ее данных. В этом случае программист вынужден прибегнуть к практике, известной как структуры с перекрытием — оверлеи (overlay), когда программа и данные организованы таким образом, что различные модули могут быть назначены одной и той же области памяти; основная программа при этом ответственна за перезагрузку модулей при необходимости. Даже при помощи соответствующего инструментария компиляции оверлеев разработка таких программ приводит к дополнительным затратам времени программиста. *• Во многозадачной среде программист при разработке программы не знает, какой объем памяти будет доступен программе и где эта память будет располагаться. Таким образом, очевидно, что задача перемещения информации между дву- Уровнями памяти должна возлагаться на операционную систему. Эта задача вляется сущностью управления памятью. V ^ осно ЛаБНой опеРаЧией управления памятью является размещение программы в » ?*еннН Памяти Для ее выполнения процессором. Практически во всех совре- ^А°Й Г* МНогозадачных системах эта задача предполагает использование слож- \«л хемы, известной как виртуальная память. Виртуальная память, в свою * Ва 7. Управление памятью 361
I пь, основана на использовании одной или обеих базовых технологий —. нтов и страниц. Перед тем как перейти к рассмотрению этих методсдГ0рга. 1,ии виртуальной памяти, мы должны сперва познакомиться с более про- и методами (табл. 7.1). Одна из приведенных в таблице технологий -™ рас^ ■ление памяти — использовалась в различных вариациях в некоторы уж ■} 1бытых к настоящему времени операционных системах. Две другие те ноло^' - простая страничная организация и сегментация — сами по себе вв исЬ: гуются, однако их рассмотрение в отрыве от виртуальной памяти упрости • «йшее понимание предлагаемого материала. ица 7.1. Технологии управления памятью элогия Описание Сильные стороны Слабые стороны иров&вное геделение мическое ределение тая странич- эрганнзация гтая сегмен- Основная память разделяется на ряд статических разделов во время генерации системы. Процесс может быть загружен в раздел равного или большего размера Разделы создаются динамически; каждый процесс загружается в раздел строго необходимого размера Основная память распределена на ряд кадров равного размера. Каждый процесс распределен на некоторое количество страниц равного размера и той же длины, что и кадры. Процесс загружается путем загрузки всех его страниц в доступные, но не обязательно последовательные, кадры Каждый процесс распределен на ряд сегментов. Процесс загружается nvTeM загрузки всех своих сегментов в динамические (не обязательно смежные) разделы Простота реализации, малые системные накладные расходы Отсутствует внутренняя фрагментация, более эффективное использование основной памяти Отсутствует внешняя фрагментация Неэффективное использование памяти из-за внутренней.фраг- ментации, фиксированное максимальное количество активных процессов '•ир1 Неэффекти н '■ использоввдй** процессор*/ э- а необходимости уплотнения для противоде сйчвия внешней фрагментации '^l Наличие я . ль- шой внут . рей фрагментации Отсутствует внутренняя фрагментация Улучшенное использование памяти и син#«вя- ные накладные расходы по^ср нению с динамическим ра<^ Де" лением Часть З.Д.**1* Окончание табл. 7.1 Технология Описание Сильные стороны Слабые стороны Страничная организация виртуальной памяти Сегментация виртуальной памяти Все, как при простой страничной организации, с тем исключением, что не требуется одновременно загружать все страницы процесса. Необходимые нерезидентные страницы автоматически загружаются в память Все, как при простой сегментации, с тем исключением, что не требуется одновременно загружать все сегменты процесса. Необходимые нерезидентные сегменты автоматически загружаются в память Нет внешней фрагментации; более высокая степень многозадачности; большое виртуальное адресное пространство Накладные расходы из-за сложности системы управления памятью Нет внутренней фрагментации; более высокая степень многозадачности; большое виртуальное адресное пространство; поддержка защиты и совместного использования Накладные расходы из-за сложности системы управления памятью Фиксированное распределение В большинстве схем управления памятью мы будем полагать, что операционная система занимает некоторую фиксированную часть основной памяти и что остальная часть основной памяти доступна для использования многочисленным процессам. Простейшая схема управления этой доступной памятью — ее распределение на области с фиксированными границами. Размеры разделов На рис. 7.2 показаны два примера фиксированного распределения. Одна возможность состоит в использовании разделов одинакового размера. В этом случае любой процесс, размер которого не превышает размер раздела, может быть загружен в любой доступный раздел. Если все разделы заняты и нет ни одного процесса в состоянии готовности или работы, операционная система может выгрузить процесс из любого раздела и загрузить другой процесс, обеспечивая тем самым процессор работой. При использовании разделов с одинаковым размером имеются две трудности. • Программа может быть слишком велика для размещения в разделе. В этом случае программист должен разрабатывать программу, использующую оверлеи, с тем чтобы в любой момент времени ей требовался только один раздел основной памяти. Когда требуется модуль, который в настоящий момент отсутствует в основной памяти, пользовательская программа должна сама загрузить этот модуль в раздел памяти программы (независимо от того, является ли этот модуль кодом или данными). Использование основной памяти при этом крайне неэффективно. Любая программа, независимо от ее размера, занимает раздел целиком. Так, в нашем примере программа размером менее мегабайта все равно будет зани- -Чава 7. Управление памятью 363
V" дать целиком раздел в 8 Мбайт; при этом остаются неиспользованными Г Мбайт блока. Этот феномен появления неиспользованной памяти gj^ a То_ -о что загружаемый блок по размеру меньше раздела, называется в'ну^рен *ей фрагментацией (internal fragmentation). ■'* Операционная система 8М БМ 8М 8м 8М Операционная система 8М 2М 4м 6м 8м 8М 8М 8м 8М 12М 16М ■ ч 2 .5- "W. &.-!-'■ ГЦ I \t а) Разделы одинакового размера б) Разделы разных размеров Рис. 7.2. Пример фиксированного распределения 64-мегабайтовай памяти Бороться с этими трудностями (хотя и не устранить полностью) мс* О твом использования разделов разных размеров (см. рис. 7.2,6). В st^J4; рограмма размером 16 Мбайт может обойтись без оверлеев, а раздел*?. .змера позволяют уменьшить внутреннюю фрагментацию при загруз^ ^ м малого размера. ! 1 о У о Часть 3. > Алгоритм размещения В том случае, когда разделы имеют одинаковый размер, размещение процессов в памяти представляет собой тривиальную задачу. Не имеет значения, в каком из свободных разделов будет размещен процесс. Если все разделы заняты процессами, которые не готовы к немедленной работе, любой из них может быть выгружен для освобождения памяти для нового процесса. Принятие решения о том, какой именно процесс следует выгрузить — задача планировщика (об этом мы поговорим в части 4, "Планирование"). Когда разделы имеют разные размеры, есть два возможных подхода к назначению процессов разделам памяти. Простейший путь состоит в том, чтобы каждый процесс размещался в наименьшем разделе, способном полностью вместить данный процесс.1 В таком случае для каждого раздела требуется очередь планировщика, в которой хранятся выгруженные из памяти процессы, предназначенные для данного раздела памяти (см. рис. 7.3,а). Достоинство такого подхода заключается в том, что процессы могут быть распределены между разделами памяти так, чтобы минимизировать внутреннюю фрагментацию. Новые процессы НИМИ MIIIIII ними MIIIIII MIIIIII ними мини —► — Операционная система Новые процессы шип Операционная система а) По одной очереди для каждого раздела б) Общая очередь для всех разделов Рис. 7.3. Распределение памяти при фиксированном распределении Хотя этот метод представляется оптимальным с точки зрения отдельного Раздела, он не оптимален с точки зрения системы в целом. Представим, что в стеме, изображенной на рис. 7.2,6, в некоторый момент времени нет ни одного во **Ри этом предполагается, что заранее известно, какое максимальное количест- Си Млгпи может потребоваться процессу, однако это далеко не всегда так. Если мак- 0 " ьное количество необходимой процессу памяти неизвестно, следует использовать Рлеи или виртуальную память. **ава 7^ управдение памятью 365
г scca размером от 12 до 16 Мбайт. В результате раздел размером 16 \q ' пустовать, в то время как он мог бы с успехом использоваться меньшим весами. Таким образом, более предпочтительным подходом является гование одной очереди для всех процессов (см. рис. 7.3,6). В момент," 0гл 'ется загрузить процесс в основную память, для этого выбирается наэдиень доступный раздел, способный вместить данный процесс. Если все р депы гы, следует принять решение об освобождении одного из них. По-видному гет отдать предпочтение процессу, занимающему наименьший разде|£ спо* ли вместить загружаемый процесс. Можно учесть и другие факторы,, яаки приоритет процесса или его состояние (заблокирован он или активен)* s Использование разделов разного размера по сравнению с использование^ разде- динакового размера придает дополнительную гибкость данному методу.. Кром схемы с фиксированными разделами относительно просты, предъявля ми- льные требования к операционной системе; накладные расходы работы Процес- невелики. Однако у этих схем имеются серьезные недостатки. ' i Количество разделов, определенное в момент генерации системы, о вает количество активных (не приостановленных) процессов. Поскольку размеры разделов устанавливаются заранее, в момент генерации системы, небольшие процессы приводят к неэффективному использованию памяти. В средах, где заранее известны потребности в памяти всех задач, применение описанной схемы может быть оправдано, но в большинств случаев эффективность этой технологии крайне низка. Фиксированное распределение в настоящее время практически не иейользу- —— 1 ■'" Примером успешной операционной системы с использованием данной тех гии может служить ранняя операционная система IBM для мейнф ймов IFT (многозадачная с фиксированным количеством задач — Multiprogram- with a Fixed number of Tasks). [амическое распределение Для преодоления сложностей, связанных с фиксированным распределением, разработан альтернативный подход, известный как динамическое распреде- е. Этот подход в настоящее время также вытеснен более сложными й ф- ивными технологиями управления памятью. В свое время динамическое эеделение использовала операционная система IBM для мейнфре мов IVT (многозадачная с переменным количеством задач — Multiprogrft 8 a Variable number of Tasks). :$ При динамическом распределении образуется переменное количество азде- 1еременной длины. При размещении процесса в основной памяти ДЛЯ нег ляется строго необходимое количество памяти, и не более. В качестве ДР рассмотрим использование 64 Мбайт основной памяти (рис. 7.4). Изн чаль- :я память пуста, за исключением области, используемой операционной с й (рис. 7.4,а). Первые три процесса загружаются в память, начиная: <раДР :оторым заканчивается операционная система, и используя ровно с ь ти, сколько требуется данному процессу (рис. 1Л,б~г). После этого .в;.КОН шой памяти остается "дыра", слишком малая для размещения четверт0 есса. В некоторый момент все процессы в памяти оказываются неак i операционная система выгружает второй процесс (рис. 7.4,д), после ьо *'& Часть 3. *ть -I оого остается достаточно памяти для загрузки нового, четвертого процесса (рис. 7.4,е). Поскольку процесс 4 меньше процесса 2, создается еще одна небольшая "дыра" в памяти. После того как в некоторый момент времени все процессы в памяти оказываются неактивными, но зато готов к работе процесс 2, свободного места в памяти для него не находится, и операционная система вынуждена выгрузить процесс 1, чтобы освободить необходимое место (рис. 7А,ж) и разместить процесс 2 в основной памяти (рис. 7.4,з). Операционная система I 8М У 56м а) Операционная система Процесс 1 I 20м ► 36м б) Операционная система Процесс 1 Процесс 2 20м 14М 22М в) Операционная система Процесс 1 Процесс 2 Процесс 3 ■ 20м 14м 18М ■4М Операционная система Процесс! Процесс 3 20М 14М 18М 4М Операционная система Процесс 1 Процесс4 Процесс 3 20м 8м 6М 18М 4м Операционная система Процесс 4 Процесс 3 I 20м - 8М 6М Г 18М 4М ж) Операционная система Процесс2 Процесс4 Процесс 3 э) им 6М 8м 6М 18М 4М Д) е) с' 7-4- Действие динамического распределения Как показывает данный пример, этот метод хорошо начинает работу, но охо продолжает — в конечном счете он приводит к наличию множества мел- х дыр в памяти. Со временем память становится все более и более фрагменти- ^ ванной, и снижается эффективность ее использования. Это явление называется еШвей фрагментацией (external fragmentation), что отражает тот факт, что s; Лава 7. Управление памятью 367
но фрагментированной становится память, внешняя по отношению ко всем влам (в отличие от рассмотренной ранее внутренней фрагментации). Один из методов преодоления этого явления состоит в уплотнен»» paction): время от времени операционная система перемещает процес [ти так, чтобы они занимали смежные области памяти; свободная п мять этом собирается в один блок. Например, на рис. 7.4,з после уплотнен Па, [ мы получим блок свободной памяти размером 16 Мбайт, чего може ока- ;я вполне достаточно для загрузки нового процесса. Сложность прим нения тнения состоит в том, что при этом расходуется дополнительное i ремя* ie того, уплотнение требует динамического перемещения процессов памя- 1 '.е. должна быть обеспечена возможность перемещения программы и£ одной сти основной памяти в другую без потери корректности ее обращений к па- [ (см. приложение к данной главе). I " Алгоритм размещения Поскольку уплотнение памяти вызывает дополнительные расходы времени ,ессора, разработчик операционной системы должен принять разумное реше- d том, каким образом размещать процессы в памяти (образно говоря, как im зом затыкать дыры). Когда наступает момент загрузки процесса в основную [ть и имеется несколько блоков свободной памяти достаточного размера ационная система должна принять решение о том, какой именно свобод использовать.2 „.j$M, Можно рассматривать три основных алгоритма — наилучший подх дя , первый подходящий, следующий подходящий. Все они, само ^о* о :р ■ется, ограничены выбором среди свободных блоков размера, достато/ч о шого для размещения процесса. Метод наилучшего подходящего вы и- блок, размер которого наиболее близок к требуемому; метод пер го :одящего проверяет все свободные блоки с начала памяти и вы; рЛ,т ый достаточный по размеру для размещения процесса. Метод слер$ЮЩ одходящего работает так же, как и метод первого подходящего, он о (нает проверку с того места, где был выделен блок в последний раз (йо ижении конца памяти он продолжает работу с ее начала). ^ На рис. 7.5,а показан пример конфигурации памяти после ряда р м - ни и выгрузки процессов из памяти. Последним использованным блоком блок размером 22 Мбайт, в котором был создан раздел в 14 Мбайт. На 7.5,6 показано различие в технологии наилучшего, первого и след^Н)ВДе юдходящего при выполнении запроса на выделение блока размером Гбайт. Метод наилучшего подходящего просматривает все свободны бло- л выбирает наиболее близкий по размеру блок в 18 Мбайт, ос? вляя ■мент размером 2 Мбайт. Метод первого подходящего в данной сЩГУаЯиИ вляет фрагмент свободной памяти размером 6 Мбайт, а метод следую11*6" эдходящего — 20 Мбайт. '$. - *? Дополнительный материал по вопросам динамического распределения ' , - тель может найти в разделе 2.5 (стр. 488) книги Кнут Д.Э. Искусство вания. Том 1. Основные алгоритмы, 3-е изд. — М.: Издательский дом "В — Прим. ред. ';■ J Ч Часть 3/ J ть 1-Г Последний выделенный 6лок(14М) 8М 12м 22М 18М 8м 6М Первый подходящий ВМ 12м Наилучший подходящий 2М - 14м 36м j | Выделенный блок | Свободный блок Следующий подходящий 8М 6М 14м !■>. 20М а) До выделения б) После выделения Рис. 7.5. Пример конфигурации памяти до и после выделения блока размером 16 Мбайт ^ Какой из этих методов окажется наилучшим, будет зависеть от точной МожнД°ВаТеЛЬНОСТИ загрузки и сгрузки процессов и их размеров. Однако [BAYS77°irPIiTb ° некот°Рых обобщенных выводах (см. [BREN89], [SHOR75], быстп 0бычно алгоритм первого подходящего не только проще, но и прави И ДаеТ Лучшие Результаты. Алгоритм следующего подходящего, как ^еду» ДаеТ Н6МНОГО хУДшие Результаты. Это связано с тем, что алгоритм памятиЩеГ° Подходящего проявляет склонность к более частому выделению б*оКи И3 свободных блоков в конце памяти. В результате самые большие 6Ыстоо °ДНОЙ памяти (которые обычно располагаются в конце памяти) Вайии Разбиваются на меньшие фрагменты и, следовательно, при использо- ^е- С птТ°Д/ следующего подходящего уплотнение должно выполняться ча- ' Ло Памя ° СТороны' алгоритм первого подходящего обычно засоряет нача- ^"Ремени™ Небольшими свободными блоками, что приводит к увеличению 1 ^°Д«Шег П°ИСКа п°Дх°ДяЩего блока в последующем. Метод наилучшего под- "£ ' вопРеки своему названию, оказывается, как правило, наихудшим. ^Ва 7. Управление памятью 369 1 Г i •
-я, как он ищет блоки, наиболее близкие по размеру к требуемому, он 1яет после себя множество очень маленьких блоков. В результате4 -г каждом выделении впустую тратится наименьшее возможное количест яти, основная память очень быстро засоряется множеством мелки неспособных удовлетворить ни один запрос (так что при этом алг отнение памяти должно выполняться значительно чаще). Алгоритм замещения В многозадачной системе с использованием динамического раслредел н 1ает момент, когда все процессы в основной памяти находятся в заблокированном оянии, а памяти для дополнительного процесса недостаточно даже пос&е уплот ля. Чтобы избежать потерь процессорного времени на ожидание деблокирования явного процесса, операционная система может выгрузить один из процессов из )вной памяти, и, таким образом, освободить место для нового процесса, или про- :а в состоянии готовности. Задача операционной системы — определить, какой нно процесс должен быть выгружен из памяти. Поскольку тема алгоритма заме- [ия будет детально рассматриваться в связи с различными схемами виртуальной яти, пока что мы отложим обсуждение этого вопроса. стема двойников ^ Как фиксированное, так и динамическое распределение памяти им hr свои остатки. Фиксированное распределение ограничивает количество jftfc *вных цессов и неэффективно использует память при несоответствии межд# разме- и разделов и процессов. Динамическое распределение реализуется более жно и включает накладные расходы по уплотнению памяти. Интересным спромиссом в этом плане является система двойников ([KNUT97], [РЕТЕ77]). В системе двойников память распределяется блоками размером 2, L<KSU, 2L — минимальный размер выделяемого блока памяти; 2и — наибольший распределяемый блок; вообще говоря, 2и представляет собой размер всей доступной для распределения памяти. *"".?; ■■■# Вначале все доступное для распределения пространство рассматривается : единый блок размера 2и. При запросе размером s, такй$*. что 1 < s < 2° , выделяется весь блок. В противном случае блок раздел ется н эквивалентных двойника с размерами 2й'1. Если 2l'~2 <s<2u~lt то по за- >су выделяется один из двух двойников; в противном случае один ■йников вновь делится пополам. Этот процесс продолжается ДО тех п са не будет сгенерирован наименьший блок, размер которого не меньше • :тема двойников постоянно ведет список "дыр" (доступных блоков) £ кдого размера 2'. Дыра может быть удалена из списка (i+1) разделен - пополам и внесением двух новых дыр размера 2' в список i. Когда •йников в списке i оказывается освобожденной, они удаляются и^,с «бъединяются в единый блок в списке (i+1) Ниже приведен рекУ 1 _._1 . ^ **'■& КО* 'оритм ([LIST93]) для удовлетворения запроса размера 2 <къ£'. л осуществляется поиск дыры размером 21. Ld get hole(int i) r О Часть ; al* 4 "**, } if (i == (U+l)) <. Ошибка > ; if (< Список i пуст >) { get_hole(i+1); < Разделить дыру на двойники >; < Поместить двойники в список i >; t < Езять первую дыру из списка i >; На рис. 7.6 приведен пример использования блока с начальным размером 1 Мбайт. Первый запрос А - на 100 Кбайт (для него требуется блок размером 128 Кбайт). Для этого начальный блок делится на два двойника по 512 Кбайт. Первый из них делится на двойники размером 256 Кбайт, и, в свою очередь, первый из получившихся при этом разделении двойников также делится пополам. Один из получившихся двойников размером 128 Кбайт выделяется запросу А. Следующий запрос В требует 256 Кбайт Такой блок имеется в наличии и выделяется. Процесс продолжается с разделением и слиянием двойников при необходимости. Обратите внимание, что после освобождения блока Е происходит слияние двойников по 128 Кбайт в один блок размером 256 Кбайт, который, в свою очередь, тут же сливается со своим двойником. i *' .,, «■ Управление памятью 371
П П Г -XL О с VO 2 В оок ■*— рос *— со со 40К со рос с й 64К о про со со п п п й о. с: со со ее Й Й X I П П 1Л г- о. с= со со о X i О) «8 о со «3 о 5й * о «О 2 S S- а «о О о* »У. f J '« в Js1 ■Vj-., ■".5*4 £■ * #. На рис. 7.7 показано представление системы двойников в виде бинарного дерева, непосредственно после освобождения блока В. Листья представляют текущее распределение памяти. Если два двойника являются листьями, то по крайней мере один из них занят; в противном случае они должны слиться в блок большего размера. 512К 256К 128К 28К jC = 64KJ64K D = 256K Рис. 7.7. Представление системы двойников в виде бинарного дерева Система двойников представляет собой разумный компромисс для преодоления недостатков схем фиксированного и динамического распределения, но в современных операционных системах ее превосходит виртуальная память, основанная на страничной организации и сегментации. Однако система двойников нашла применение в параллельных системах как эффективное средство распределения и освобождения параллельных программ (см., например, [JOHN92]). Модифицированная версия системы двойников используется для распределения памяти ядром UNIX (подробнее об этом вы узнаете в главе 8, "Виртуальная память"). Перемещение Перед тем как мы рассмотрим способы, с помощью которых можно избе- *ать недостатков распределения, следует до конца разобраться в вопросах, свя- иных с размещением процессов в памяти. При использовании фиксированной емы распределения, показанной на рис. 7.3,а, можно ожидать, что процесс гда будет назначаться одному и тому же разделу памяти. Это означает, что ои бы раздел ни был выбран для нового процесса, для размещения этого Цесса после выгрузки и последующей загрузки в память всегда будет исполь- з ТЬся именно этот раздел. В данном случае можно использовать простейший от» описанный в приложении к данной главе: при загрузке процесса все '■Дел СИТельные ссылки в коде замещаются абсолютными адресами памяти, опре- s иными на основе базового адреса загруженного процесса. §ва 7. Управление памятью 373
Если размеры разделов равны (рис. 7.2) и существует единая очередь npbitec жзделов разного размера (рис. 7.3,6), процесс по ходу работы может р^а ае разделы. При первом создании образа процесса он загружается в неко опый л памяти; позже, после того как он был выгружен из памяти и вновь «, -жен, есс может оказаться в другом разделе (не в том, в котором он размещался в п шй раз). Та же ситуация возможна и при динамическом распределении, ад 7.4,в и з процесс 2 занимает при размещении в памяти различные места,, ром при выполнении уплотнения процессы также перемещаются в основное'"йамя 'аким образом, расположение команд и данных, к которым обращается Процесс'^ шлется фиксированным и изменяется всякий раз при выгрузке и загрузке (или иещении) процесса. Для решения этой проблемы следует различать типъг адре* Логический адрес представляет собой ссылку на ячейку памяти, не зависящую :кущего расположения данных в памяти; перед тем как получить доступе это ке памяти, необходимо транслировать логический адрес в физический.: осиный адрес представляет собой частный случай логического адреса, когда целяется положением относительно некоторой известной точки (обычно «* нач - рограммы). Физический адрес (известный также как абсолютный) предйтавля д действительное расположение интересующей нас ячейки основной гш^яти. Если программа использует относительные адреса, это означает, что все рсылк1 амять в загружаемом процессе даны относительно начала этой программы. Та- образом, для корректной работы программы требуется аппаратный м ичт рый бы транслировал относительные адреса в физические в процессе выполне- команды, которая обращается к памяти. На рис. 7.8 показан обычно используемый способ трансляции адреса. Когда lecc переходит в состояние выполнения, в специальный регистр процессора, шо* зазываемый базовым, загружается начальный адрес процесса в основной памяти, «е того, используется "граничный" (bounds) регистр, в котором содержится адрес ;едней ячейки памяти программы. Эти значения заносятся в регистры при за- ке программы в основную память. При выполнении процесса встречающиеся в андах относительные адреса обрабатываются процессором в два этапа. Сначала к гсительному адресу прибавляется значение базового регистра для получения ао- отного адреса. Затем полученный абсолютный адрес сравнивается со значением в [ичном регистре. Если полученный абсолютный адрес принадлежит данному jeccy, команда может быть выполнена; в противном случае генерируется, соответ- ющее данной ошибке прерывание операционной системы. Схема, представленная на рис. 7.8, обеспечивает возможность выгрузки и заики программ в основную память в процессе их выполнения; кроме того* образ дого процесса ограничен адресами, содержащимися в базовом и граничном реги- IX, и защищен от нежелательного доступа со стороны других процессов. 3. СТРАНИЧНАЯ ОРГАНИЗАЦИЯ!* "^^УЗкй"***^'' >V-: J ме Как разделы с разными фиксированными размерами, так и разделы . ^^ 3 размера недостаточно эффективно используют память. Результате Р^ ^ вых становится внутренняя фрагментация, результатом работы п коВие шняя. Предположим, однако, что основная память разделена на о ^^ ки относительно небольшого фиксированного размера. Тогда блоки^ ^ да. естные как страницы (pages), могут быть связаны со свободными блр * {М - 4 Часть 3; г ят мяти, известными как кадры (frames), или фреймы. Каждый кадр может содержать одну страницу данных. При такой организации памяти, как вы узнаете из этого раздела, внешняя фрагментация отсутствует вовсе, а потери из-за внутренней фрагментации ограничены частью последней страницы процесса. Относительный адрес %г ■"■ t 1 1 - ( >i \ Базовый регистр Граничный регистр #• ► " Сумматор " Компаратор -- 1 i Прерывание операционной системы Абсолютный адрес — — т 1 1 ► Управляющий блок процесса Программа Данные Стек Образ процесса в основной памяти Рис. 7.8. Аппаратная поддержка перемещения На рис. 7.9 показано использование страниц и кадров. В любой момент времени некоторые из кадров памяти используются, а некоторые свободны. Операционная система поддерживает список свободных кадров. Процесс А, хранящийся на диске, состоит из четырех страниц. Когда приходит время загрузить этот процесс в память, операционная система находит четыре свободных кадра и загружает страницы процесса А в эти кадры (рис. 7.9,6). Затем загружаются процесс В, состоящий из трех страниц, и процесс С, состоящий из четырех страниц. После этого процесс В приос- адавливается и выгружается из основной памяти. Позже наступает момент, когда процессы в памяти оказываются заблокированы, и операционная система загру- ет в память новый процесс D, состоящий из пяти страниц. Теперь предположим, что, как в только что рассмотренном выше примере, не ; ется одной непрерывной области кадров, достаточной для размещения процесса | Ком- Помешает ли это операционной системе загрузить процесс D? Нет, по- • q ЬкУ в этой ситуации можно воспользоваться концепцией логических адресов. : Го °Дного регистра базового адреса в этой ситуации недостаточно, и для каждо- ^стг> ^Чесса операционная система должна поддерживать таблицу страниц. Таблица трйа *** УКазывает расположение кадров каждой страницы процесса. Внутри про- v;W— -1ЛЫ логический адрес состоит из номера страницы и смещения внутри нее. 1*~- 375 JP*a 7. Управление памятью
■V пшм, что в случае простого распределения логический адрес представд т Со_ асположение слова относительно начала программы, которое процессор' адс- >т в физический адрес. При страничной организации преобразование логических ов в физические также остается задачей аппаратного уровня, решаемой,п Цес. [. Теперь процессор должен иметь информацию о том, где находится т лица иц текущего процесса. Представленный логический адрес (номер страницы и ение) процессор превращает с использованием таблицы страниц в физический (номер кадра, смещение). 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Основная память 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Основная память А.0 А.1 А.2 А.З о 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Основная память № № - В.0 В.1 '£■■ V'' а) 15 доступных кадров 6) Загрузка процесса А в)Загрузил цессаВ Основная память Основная память г) Загрузка процесса С д) Выгрузка процесса В 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Основная А.0 А.1 «: А.2 A3 DO D.1 D мять С ■ D е) Загрузка роцессв Рис. 7.9. Распределение страниц по свободным кадрам. 3 Часть 3 Па На рис. 7.10 показаны различные таблицы страниц, после того как процесс р оказывается загруженным в страницы 4, 5, 6, 11 и 12. Таблица страниц содержит по одной записи для каждой страницы процесса, так что таблицу легко проиндексировать номером страницы, начиная с 0. Каждая запись содержит номер фрейма в основной памяти (если таковой имеется), в котором хранится соответствующая страница. Кроме того, операционная система поддерживает единый список свободных (т.е. не занятых никаким процессом и доступных для размещения в них страниц) кадров. 0 1 2 Таолица страниц процесса А Таблица страниц процесса В 0 1 2 3 10 Таблица страниц процесса С 0 1 2 3 4 11 12 13 14 Список свободных кадров Таблица страниц процесса D Рис. 7.10. Структуры данных, соответствующие примеру, помещенному на рис. 7.9,е Таким образом, описанная здесь простая страничная организация подобна фиксированному распределению. Отличия заключаются в достаточно малом размере разделов, которые к тому же могут не быть смежными. Для удобства работы с такой схемой добавим правило, в соответствии с которым размер страницы (а, следовательно, и размер кадра) должен представлять собой степень 2. При использовании такого размера страниц легко показать, что ,. относительный адрес, который определяется относительно начала программы, и ^логический адрес, представляющий собой номер кадра и смещение, идентичны. Соответствующий пример приведен на рис. 7.11. Здесь используется 16-битовый адрес и страницы размером 1 Кбайт = 1024 байт. Относительный адрес 1502 в бинарном виде записывается как 0000010111011110. При размере страницы в 1 Кбайт поле смещения требует 10 бит, оставляя 6 бит для номера страницы. Таким образом, программа может состоять максимум из 26 = 64 страниц по 1 Кбайт каждая. Как показано на рис. 7.11, относительный адрес 1502 соответствует смещению 478 (0111011110) на странице 1 (000001), что дает то же бинарное число 0000010111011110. Использование страниц с размером, равным степени двойки, приводит к таким следствиям. Во-первых, схема логической адресации прозрачна для программиста, ассемблера и компоновщика. Каждый логический адрес (номер стра- яцы и смещение) программы идентичен относительному адресу. Во-вторых, при том относительно просто реализуется аппаратная функция преобразования адресов во время работы. Рассмотрим адрес из п+т бит, где крайние слева п бит РЭДставляют собой номер страницы, а крайние справа т бит — смещение. В ем примере (рис. 7.11,6) п = 6 и т = 10. Для преобразования адреса необхо- Мо выполнить следующие шаги. выделить номер страницы, который представлен п левыми битами логического адреса. спользуя номер страницы в качестве индекса в таблице страниц процесса, -->< найти номер кадра k. Ч а 7. Управление памятью 377
Относительный адрес -1502 Логический адрес: Страница 1. смещение 478 Логический адрес- Сегмент 1, сменив 752 7ЙТ0 бо Ю111011110 00000110111011110 ШШЦоЩЗоро! 4 о со 11 X X то о. »— о а)Разделение со н J со ее со > L_ то СО Q. в) Сегментаций б) Страничная организация (размер страницы — 1 Кбайт) Рис. 7.11. Логические адреса К Начальный физический адрес кадра - *х2" , и интересующий нас физический адрес представляет собой это число плюс смещение. Такой адрес не надо вычислять — он получается в результате простого добавления номера кадра к смещению. В нашем примере имеется логический адрес 0000010111011110, представ- ощий страницу номер 1 и смещение 478. Предположим, что эта страниц (мешена в кадре основной памяти номер 6 (бинарное представлеви^ 3110). В таком случае физический адрес представляет собой кадр б, ФеЩ В, т.е. 0001100111011110 (рис. 7.12,а). ..-V я Итак, в случае простой страничной организации основная памят*.ра - :я на множество небольших кадров одинакового размера. КаждьЩ: зделяется на страницы того же размера, что и кадры; малые процессы ? ^ ^ ныпего количества кадров, большие — большего. При загрузке про# ее ^ ть все его страницы загружаются в свободные кадры, и информацияjp *^дяеТ !нии страниц заносится в соответствующую таблицу. Такой подход *К>3 эежать множества присущих распределению памяти проблем. опесс уют с [Л. СЕГМЕНТАЦИЯ j^j^na^ ■+ Р Альтернативным способом распределения пользовательской програМ- ется сегментация. В этом случае программа и связанные с нею дан ые гв Часть S,pe ляются на ряд сегментов. Хотя и существует максимальный размер сегмента, на них не накладывается условие равенства размеров. Как и при страничной организации, логический адрес состоит из двух частей, в данном случае — номера сегмента и смещения. 16-битовый логический адрес 6-битовый номер страницы 10-битовое смещение Таблица страниц процесса К 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 16-битовый физический адрес а) Страничная организация 4-битовый 16-битовый логический адрес номер сегмента 12-битовое смещение 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 Длина База 001011101110 011110011110 00000100000000001 ooiooooooaioaoooi Таблица сегментов процесса © 0 о о|о|i|i}o|o|o|iI о} о 1о|о" 16-битовый физический адрес б) Сегментация Рис. 7.12. Примеры трансляции логических адресов в физические Использованием сегментов разного размера этот способ похож на динамическое . j|- Ределение памяти. Если не используются оверлеи и виртуальная память то для отл Лнения программы все ее сегменты должны быть загружены в память; однако в С^п^е °Т л-инамическог° распределения в этом случае сегменты могут занимать не- Ко разделов, которые, к тому же, могут не быть смежными. Сегментация уст- : а 7. Управление памятью 379
внутреннюю фрагментацию, однако, как и динамическое распредел ни эт от фрагментации внешней. Тем не менее ее степень снижается, в силу того оцесс разбивается на ряд небольших частей. -:, . то время как страничная организация невидима для программист^. Сег дия, как правило, видима и обычно используется при размещении да и х в разных сегментах. При использовании принципов модульного пво ирования как код, так и данные могут быть дополнительно разбиты на 1ты. Главным недостатком при работе с сегментами является необходи- заботиться о том, чтобы размер сегмента не превысил максимальньлй. !ще одно следствие того, что сегменты имеют разные размеры, состоит в отсут- простого соотношения между логическими и физическими адресами. Анадо- страничной организации, схема простой сегментации использует таблицу сег- в для каждого процесса и список свободных блоков основной памяти. Ка- »дая > таблицы сегментов должна содержать стартовый адрес сегмента в основной и и его длину, чтобы обезопасить систему от использования некорректных ад- При работе процесса адрес его таблицы сегментов заносится в специальный гр, используемый аппаратным обеспечением. Рассмотрим адрес из п+т бит, где ие слева п бит являются номером сегмента, а правые т бит — вмещением. В & примере, помещенном на рис. 7.11,в, п ~ 4 и т = 12. Таким образом, макси- :ый размер сегмента составляет 212 = 4096. Для трансляции адреса необходимо шение следующих действий. Зыделить из логического адреса п крайних слева битов, получив таким образом номер сегмента. -ч' Используя номер сегмента в качестве индекса в таблице сегментов цроцесса, зайти физический адрес начала сегмента. Сравнить смещение, представляющее собой крайние справа т бит, с длиной сегмента. Если смещение больше длины, адрес некорректен. Требуемый физический адрес представляет собой сумму физического реса начала сегмента и смещения. # В нашем примере имеется логический адрес ОООЮОЮШЮООО^преД- шющий собой сегмент номер 1, смещение 752. Предположим, что этот гнт располагается в основной памяти начиная с физического ДРеса 000000100000. Тогда интересующий нас физический адрес pasei 000000100000+001011110000 = 0010001100010000 (см. рис. 7.12,6). Итак, в случае простой сегментации процесс разделяется на ряд сег1£ нтов, ер которых может быть разным. При загрузке процесса все его с£. еНТ ещаются в свободных областях памяти, и соответствующая инфор ^ ится в таблицу сегментов. ? .г?ч э. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ^. * И КОНТРОЛЬНЫЕ ВОПРОСЫ $£, Одной из наиболее важных и сложных задач операционной систем^**, ^рС правление памятью. Основная память может рассматриваться кА% лЯ рый распределяется и совместно используется рядом активных П I Часть &* с>Рс' Для эффективного использования процессора и устройств ввода-вывода желательно размещение в основной памяти максимально возможного количества процессов. Кроме того, желательно дать программисту возможность разрабатывать программы без ограничений их размера. Основными инструментами управления памятью являются страничная организация и сегментация. При страничной организации каждый процесс разделяется на относительно малые страницы фиксированного размера; сегментация позволяет использовать части разного размера. Кроме того, возможно комбинирование сегментации и страничной организации в единой схеме управления памятью. Ключевые термины Абсолютная загрузка Логическая организация Внешняя фрагментация Логический адрес Внутренняя фрагментация Относительный адрес Динамическая загрузка Перенос времени исполнения Переносимая загрузка Динамическое распределениеРаспределение Динамическое связывание Редактор связей Загрузка Связывание Защита Сегментация Кадр Система двойников Совместное использование Страница Страничная организация Таблица страниц Уплотнение Управление памятью Физическая организация Физический адрес Фиксированное распределение Контрольные вопросы 7.1. Каким требованиям должно удовлетворять управление памятью? 7.2. Почему желательно обеспечить возможность переноса процессов? 7.3. Почему невозможно обеспечить защиту памяти во время компиляции программы? 7.4. По каким причинам может потребоваться обеспечение доступа к одной области памяти нескольким процессам? 7.5. В чем состоит преимущество использования разделов разного размера при использовании схемы фиксированного распределения? 7.6. В чем состоит отличие между внутренней и внешней фрагментацией? 7.7. В чем заключается различие между логическим,, относительным и физическим адресами? 7.8. В чем разница между страницей и кадром? 7.9. В чем разница между страницей и сегментом? <£. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА .^1 -..*■!!*..- уц _■_.«'«- i Кни ш £&*> =Г2й Са«Щен«Л* рекоменД°ванные для чтения в разделе 2.9, включают материал, по- П вопР°сам управления памятью. <5ольШинстЛЬКУ распределение вытесняется технологиями виртуальной памяти, ^ ство книг предлагают только поверхностный обзор рассматриваемых в :$ а '• Управление памятью 381
ной главе методов. Одной из наиболее полных и интересных работ является LE92]; обсуждение стратегий распределения памяти имеется и в [KNUT97]. Вопросы компоновки и загрузки рассматриваются во многих книгах, посвя- шых разработке программ, архитектуре компьютеров и операционным система. . сь можно порекомендовать обратиться к книгам [БЕСК90] и [CLAR98]. 2СК90 Beck L. System Software. — Reading, MA: Addison-Wesley, 1990^-' ,AR98 Clarke D., Merusi D. System Software Programming: The Wa 7 Thine Work. — Upper Saddle River, HJ: Prentice Hall, 1998. ^%" MUT97 Кнут Д.Э. Искусство программирования. Том I. Основные алгоритмы 3- е изд. — М.: Издательский дом "Вильяме", 2000. ILE92 Milenkovic M. Operating Systems: Concepts and Design. — New York- McGraw-Hill, 1992. -,~ | .7. ЗАДАЧИ '~ 4«S^i В разделе 2.3 были перечислены пять целей управления памятью, а в разделе 7.1 — пять требований. Обоснуйте взаимосвязанность этих списков. Рассмотрите схему динамического распределения. Покажите, что в среднем количество свободных блоков памяти ("дыр") в два раза меньше количества выделенных процессам разделов. Для реализации различных алгоритмов распределения, обсуждавшихся при рассмотрении динамического распределения (раздел 7.2), необходима поддержка списка свободных блоков памяти. Какова средняя продолжительность поиска для каждого из рассмотренных методов (наилучшего, первого и следующего подходящего)? ..... Рассмотрите еще один алгоритм размещения при динамическом распределении — метод наихудшего подходящего, при котором для размещения процесса используется наибольший свободный блок памяти. Каковы его достоинства и недостатки по сравнению с другими рассмотренными методами? Какова средняя длина поиска при этом методе? -ч Система двойников используется для распределения блока размером 1 1ба т а. Изобразите в виде, подобном приведенному на рис. 7.6, результат в. почне- ния такой последовательности запросов: запрос А = 70 Кбайт, запр00 В = 35 Кбайт, запрос С = 80 Кбайт, освобождение А, запрос D =■ 60 Кбайт, освобождение В, освобождение D, освобождение С. * б. Приведите представление системы двойников в виде бинарного дерева пост освобождения В. П. Рассмотрим систему двойников, в которой некий только что выделен л имеет адрес 011011110000. ч.. а. Если размер блока равен 4, то каков бинарный адрес его двойника" iff* б. Если размер блока равен 16, то каков бинарный адрес его двойника^;' Пусть buddy\ [х) — адрес того блока размером 2Ь, который является., ком блока по адресу х. Запишите выражение для buddy,. (*) . Последовательность Фибоначчи определяется следующим образом F0=0,F, =1 F,l+2=Fn+l + Fn,n>0 > ! Часть 3^ м •■•'%. а. Можно ли использовать эту последовательность для разработки системы двойников? б. Каким достоинством должна обладать такая система двойников по сравнению с описанной в данной главе? 7.9. В° время выполнения программы процессор увеличивает содержимое регистра команд (счетчика кода) на одно слово после выборки каждой команды. Однако если встречаются команды ветвления или вызова подпрограммы, то содержимое данного регистра вызывает продолжение выполнения в некотором другом месте программы. Рассмотрим рис. 7.8. Имеется альтернатива. • В регистре команд использовать относительный адрес и выполнять трансляцию адресов динамически, с содержимым регистра команд в качестве входных данных. Команды ветвления или вызова подпрограммы генерируют относительный адрес, который и заносится в регистр команд. • В регистре команд содержать абсолютный адрес. В этом случае команды ветвления или вызова подпрограммы генерируют относительный адрес, который динамически транслируется, и результат трансляции заносится в регистр команд. Какой подход следует предпочесть? 7.10. Виртуальный адрес а в страничной системе представляет собой пару {p.w) , в которой р — номер страницы, aw — номер байта этой страницы. Пусть z — количество байтов в странице. Найдите формулу, представляющую р и w как функции от z и а. 7.11. Рассмотрим память, в которой смежные сегменты Slt S2, -.., S„ размещаются в порядке их создания от одного конца памяти к другому, как показано ниже: Si S„ Свободно При создании сегмента Sn+i он размещается непосредственно после сегмента S„, даже если некоторые из сегментов Si, S2, ..., S„ были к этому моменту удалены. Когда граница между сегментами (используемыми или удаленными) и свободной памятью достигает конца памяти, используемые сегменты уплотняются. а. Покажите, что доля времени F, затрачиваемая на уплотнение, удовлетворяет следующему неравенству: F>^—^-, где*= —-1 l + kf 2s Здесь s — средняя длина сегмента в словах, t — среднее время жизни сегмента (в обращениях к памяти), / доля памяти, не используемая в установившихся условиях. Указание: найдите среднюю скорость, с которой рассматриваемая граница движется по памяти, и предположите, что копирование одного слова требует как минимум двух обращений к памяти. б. Определите F для / = 0.2, t = 1000 и s = 50. €*\Л0ЖЕНИЕ. ЗАГРШКА ВДВЯЗЫВАНЙМ Щ ^^^сной е*>ВЬ1м шагом в создании активного процесса является загрузка программы в ^йчв *° память и создание образа процесса (рис. 7.13). На рис. 7.14 показан ти Для большинства систем сценарий. Приложение состоит из ряда скомпили -g «■ Управление памятью 383
>ванных или ассемблированных модулей в виде объектного кода. Эти модули ев лваются для разрешения всех ссылок между ними, а также обращений к библи '*- !чным подпрограммам (которые могут быть внедрены в программу или быть tfoaM ■но используемым кодом, представляемым операционной системой). В этом Прало ении мы познакомимся с ключевыми свойствами компоновщиков и загруз ля ясности изложения мы начнем с описания задачи загрузки программы, ;ей из одного модуля, когда связывание не требуется. Объектный код W Управляющий блок процесса Программа Данные Стек Образ процесса в памяти Ц В ■^ш- ч Рис. 7.13. Загрузка агрузка На рис. 7.14 загрузчик размещает загружаемый модуль в основной памяти, «иная с адреса х. При этом должны удовлетворяться требования к сапи*1 эоцесса, приведенные на рис. 7.1. В целом могут использоваться три подхо а> • Абсолютная загрузка. » • Перемещаемая загрузка. • Динамическая загрузка времени исполнения. Абсолютная загрузка Абсолютный загрузчик требует, чтобы данный загружаемый модуль все «полагался в одном и том же месте в памяти. Следовательно, в модуле, п Р* 1ваемом для загрузки, все обращения должны быть к конкретным, ЙЛ# отным, адресам основной памяти. S4 Часть 3. П яТ1" Память С Модуль 1 Модуль 2 Модуль л Компоновщик i Загружаемый модуль Загрузчик Рис. 7.14. Сценарий загрузки Назначение определенных адресов ссылкам к памяти в программе может быть выполнено либо программистом, либо автоматически в процессе компиляции или ассемблирования (табл. 7.2,а). У такого подхода имеется ряд серьезных недостатков. Во-первых, каждый программист должен знать стратегию размещения модулей в основной памяти. Во-вторых, при любых изменениях в программе, которые включают вставку или удаление кода или,данных, требуется соответствующим образом изменить все адреса. Поэтому желательно, чтобы все адреса в памяти были выражены символьно, с тем чтобы в процессе компиляции или ассемблирования разрешить эти символьные ссылки (см. рис. 7.15). Каждая ссылка на команду или элемент данных изначально представлена символом. При подготовке модуля к абсолютной загрузке ассемблер или компилятор преобразуют все эти ссылки в конкретные адреса, как показано на рис. 7.15,в. ^абдица 7.2. Связывание адресов Заработка ^граммы Эпиляция а) Загрузчик Действия Загр Узка Программист использует конкретные физические адреса непосредственно в программе Программа содержит ссылки на символьные адреса, которые преобразуются в реальные физические адреса компилятором или ассемблером Компилятор или ассемблер генерируют относительные адреса, которые транслируются в абсолютные в процессе загрузки программы Загруженная программа использует относительные адреса, которые динамически конвертируются процессором в абсолютные Jlft ' • Управление памятью 385
Окончание тцб 72 б) Компоновщик '% ляция [ие саемого я жа яение аммы ьные са Программа JUMPX LOADY Действия . --"z —- ГГ^тТяп инешний код или данные*Про- Slkssssss: ££-—- - - программ, на которые имеются ссылки „м„ к которой имеется обращение, должен Код каждой подпрограммы, к которой бы?ь ассемблировав в качестве модуля ^«йтгмт/ются с использованием от оси- Все объектные мод^и ^T%£Z«rc* в одно целое, и все еГГпеТсГыв3;^ относительно начала образую*,^* едн- ГнГнГГылки не Разре^тся до ^^^^^J^Z размещен в основной *™™ю* обрДения, добавляются к основ- ГуМГлйюГиТо^внИоГиТлСй витальной памяТи разкец* весь комплект целиком внепший. в*** * Внешние ссылки не **"™™^ процесс прерывав «■. будет выполнен °Р^с^ся f^^meft программой , .« пГяеодимый модуль связывается , ?* Абсолютные адреса 1024 Относительные адреса 1424 2224 JUMP 400 Программа LOAD 1200 у Данные /'1 U а) Объектный модуль б) Модуль с абсолютными адресами в)Модульсотнос*ель адресами Рис. 7.15. Абсолютная и переместимся загрузка модуля Часть "'' П^Я Переместимая загрузка Недостаток привязки обращений к памяти к конкретным адресам до за- грузки заключается в том, что полученный модуль может быть загружен только одну область основной памяти. Однако когда память совместно используется несколькими программами, нежелательно заранее определять, в какую область памяти должен быть загружен тот или иной модуль. Такое решение лучше принимать в момент загрузки. Следовательно, нам требуется, чтобы загружаемый модуль мог быть размещен в произвольном месте памяти. Для удовлетворения этого нового требования ассемблер или компилятор генерируют не абсолютные адреса, а адреса относительно некоторой известной точки, такой, как начало программы. Этот метод продемонстрирован на рис. 7.15,е. Началу загружаемого модуля назначается относительный адрес О, и все прочие ссыл- | кИ внутри модуля выражаются относительно его начала. 'г- Когда все ссылки выражены в относительном виде, размещение модуля в любом месте памяти становится достаточно простой задачей. Если модуль загружается в память, начиная с адреса х, то загрузчик при размещении модуля в памяти просто добавляет х к каждой ссылке. Для этого загружаемый модуль должен включать информацию, которая сообщает загрузчику, где именно располагаются обращения к памяти и как их следует трактовать (обычно от начала программы, однако могут быть и другие способы отсчета — например, от текущей позиции). Эта информация подготавливается компилятором и обычно известна под названием словаря перемещения (relocation dictionary). Динамическая загрузка времени исполнения Переносимая загрузка — обычное, широко распространенное явление с очевидными преимуществами перед абсолютной загрузкой. Однако в многозадачной среде (даже в не зависящей от виртуальной памяти) схема переносимой |загрузки становится неадекватной. Мы уже говорили о необходимости выгрузки и загрузки процессов в основную память для максимального использования процессора. Для максимального использования основной памяти нам нужна | возможность загрузки процесса, после того как он был выгружен, всякий раз в Другое место в памяти. Следовательно, будучи однажды загруженной, программа может быть сброшена на диск, а затем загружена в другое место в памяти. Это невозможно, если обращения к памяти в момент начальной загрузки привязаны к абсолютным адресам. / Альтернативное решение состоит в том, чтобы отложить вычисление абсо- | ютного адреса до того момента, пока он не потребуется реально во время ис- ■янения. С этой целью модуль загружается в основную память со ссылками в носительном виде (рис. 7.15,в), и только при реальном выполнении команды , исляется абсолютный адрес. Для того чтобы такой метод не снижал общую Г Изв°Дительность, требуется аппаратная поддержка вычисления абсолютного -С^Реса (о чем говорилось в разделе 7.2). ^ Динамическое вычисление адресов обеспечивает высокую гибкость — про- Ма может быть загружена в любую область основной памяти, причем про- й- Adv Ma Может быть выгружена из основной памяти, а позднее — загружена в ? '; Уг°е место в памяти. * #а ^" Управление памятью 387
Vf. ПОИОВКа качестве входа набор объектных модулей^квд- Сомпововщик полжет■ объединением множества модул». *„. т на их основе загружаемый д. узчику. в каждом объектном ЯаНВНХ СьТяТьГкина"в'„ругих'модулях. Каждая »«,;; ыл, ,е могут иметься ссыл*" н 6ыть выражена только символьно..: юкк """ныгГзХужаГи^оДУлькоторЫЙ объединяет ^.^е,. ик создает яш*1"^ ля в другои дрлжя быт •; .бъектные модули. Каждая ссыль» и■ « на ячейку шчяте шена и транслирована » е»™°*0^А на р«с. 7.16,а содержит вы го загружаемого модуля, «*~^*toh6JU««« в единый Загру Р-ОЦмГль Символьная ссылка на модуль В заменяется конкретной ссылко рёс точки 'входа Б в загрузочном модуле. ., Относительные .V,. адреса Модуль А 1 ,ульВ CALL В; I ДлинаL Модуль А JSRT" - Return L21 ^ Return^ McAVAbB Ll- Модуль В CALLC; JSRt+M" ДлинаМ Return L+M-1 L+M Return Модуль С Модуль С Длина N L+M + N-1 Return б) Загружаемый модуль Return а) Объектные модули Рис. 7Л6. Компоновка v.i Часть \S П^ редактор связей Природа компоновки адресов зависит от типа создаваемого модуля и време- компоновки (см. табл. 7.2,6). Если требуется создание перемещаемого моду- то компоновка обычно выполняется следующим образом. Каждый скомпилированный объектный модуль создается со ссылками относительно начала объ- ктного модуля. Все эти модули объединяются в единый перемещаемый груЖаемый модуль, в котором все ссылки даны относительно начала единого модУля- Такой модуль можно использовать для переносимой загрузки или динамической загрузки времени исполнения. Компоновщик, который создает перемещаемый загрузочный модуль, часто называется редактором связей (на рис. 7.16 проиллюстрирована его работа). Динамический компоновщик Как и в случае загрузки, некоторые функции компоновки могут быть отложены. Метод, при котором компоновка отдельных внешних модулей откладыва- J Гнется на время после создания загружаемого модуля, называется динамической \ компоновкой (dynamic linking). Таким образом, загружаемый модуль содержит неразрешенные обращения к другим программам, которые могут быть разрешены либо в процессе загрузки, либо во время работы программы. При динамическом связывании во время загрузки выполняются следующие I действия. Загрузочный модуль (модуль приложения) считывается в память. Лю- i бые обращения ко внешнему (целевому) модулю приводят к поиску этого модуля \ загрузчиком, его загрузке и преобразованию ссылки в относительный адрес, отсчитываемый от начала модуля приложения. У такого динамического способа связывания имеется ряд преимуществ по сравнению со статической загрузкой. • В4 этом случае облегчается возможность внесения изменений в целевой модуль, который, например, может представлять собой утилиту операционной системы. В случае статической компоновки изменения в таком модуле поддержки могут потребовать полной сборки всего модуля приложения заново, а это не только неэффективно, но зачастую и невозможно — так, например, большинство коммерческих программ выпускаются в виде загрузочных модулей, и их исходные тексты и объектные модули попросту недоступны. • Наличие целевого кода в динамически связываемом файле естественным путем приводит к совместному использованию этого кода различными программами. Поскольку операционная система загружает и связывает целевой код с приложением, она может распознать, что один и тот же целевой код используется несколькими приложениями одновременно. Операционная система может использовать имеющуюся в ее распоряжении информацию, для того чтобы загрузить в память только одну копию целевого кода и связать ее с несколькими приложениями, вместо того чтобы загружать для каждого приложения отдельную копию. "^зависимым производителям программного обеспечения становится легче расширять функциональность таких распространенных операци- ; °нных систем, как, например, Linux. Разработчик может предоставить ^ овую полезную функцию дчя ряда приложений в виде динамически ; • ^ к°Мпонуемого модуля. i - fia 7. Управление памятью 389
■л- .А При динамической компоновке времени исполнения часть связей остается решенной до времени исполнения. При выполнении вызова подпрограммы сутствующего модуля операционная система находит этот модуль, загруЖа. связывает его с вызывающим модулем. % Как мы уже видели, динамическая загрузка позволяет перемещать в. память модуль целиком; однако структура модуля является статической, оста- , неизменной как во время работы процесса, так и при различных сках »сса. Однако в некоторых случаях до начала выполнения невозможно ука- какие именно объектные модули будут необходимы. Такие ситуа и ти- ы в приложениях обработки транзакций, таких, как система резерв. 1рова- 1виабилетов или банковские приложения. Природа транзакций определяет е именно модули требуются для выполнения программы; именно этаг.моду. 1тем загружаются в память и связываются с основной программой, f авное >инство такого динамического связывания состоит в том, что для^ одутей эаммы не требуется выделять память до тех пор, пока эти модули стано- i действительно необходимыми. Это свойство динамического связ вания иьзуется при поддержке системы сегментации. ,$- Кроме того, приложению не надо знать ни имен всех модулей,' н точек а подпрограмм, которые могут быть им вызваны. Например, у нас еется эамма для построения диаграмм, которая может выводить результат своей гы на различных плоттерах, каждый из которых управляется свои набо- црайверов. Приложение может узнать о том, какой плоттер использ ется в ой системе, от другого процесса или из конфигурационного файла и;; и поль- ъ соответствующие динамические компонуемые драйверы. Это но воляет ожению использовать новые плоттеры, которых попросту могло не ущест- гь в тот момент, когда была завершена разработка самого приложения» ■■ е -t. Часть :ПаМЯ ГЛАВА Виртуальная память 8.1. Аппаратное обеспечение и управляющие структуры 8.2. Программное обеспечение операционной системы 8.3. Управление памятью в UNIX и Solaris 8.4. Управление памятью в Linux 8.5. Управление памятью в Windows 2000 8.6. Резюме, ключевые термины и контрольные вопросы 8.7. Рекомендуемая литература 8.8. Задачи Приложение. Хеш-таблицы 8
np 7 "Управление памятью", вы познакомились с концепциями страниц Г«й оогавизации памяти и сегментации и анализом их недостатков, Тецерь м« перейдем к обсуждению виртуальной памяти. Трудность изучения этой 'чается в том, что управление памятью представляет собой сложную Гржяу аппаратным обеспечением (процессором) и программным обеспечени ^анионной системы. Сперва мы остановимся на рассмотрении аппаратного Z виртуальной памяти, познакомимся с использованием страничной органи■> . f гргментации и их комбинации, а затем обратимся к вопросам, возникаю^ при разработке средств виртуальной памяти в операционных системах. 3. .' АППАРАТНОЕ ОБЕСПЕЧЕНИЕ И УПРАВЛЯЮЩИЕ СТРУКТУРЫ %£; Сравнивая простую страничную организацию и сегментацию с фиксирован- и динамическим распределением памяти, мы видим базу для фундамен- його прорыва в технологии управления памятью. Ключевыми для него яв- гся следующие характеристики страничной организации и сегментации. Все обращения к памяти в рамках процесса представляют собой лог гческие адреса, которые динамически транслируются в физические адреса во время исполнения. Это означает, что процесс может быть выгружен на диск и вновь загружен в основную память, так что во время работы он может находиться в разных местах основной памяти. Процесс может быть разбит на ряд частей (страниц или сегментов), которые не обязательно должны располагаться в основной памяти единым непрерывным блоком. Это обеспечивается за счет динамической трансляции адресов и использования таблицы страниц или сегментов. Теперь перейдем к нашему прорыву в технологии управления памятью. Ее- в системе выполняются указанные характеристики, то наличие всех аниц или сегментов процесса в основной памяти одновременно н л ется ттелъным условием. . Рассмотрим, каким образом это может осуществляться. Сейчас мь! гово- [ об этой технологии обобщенно, так что для обозначения страницы и*1И яента используем термин блок — в зависимости от того, имеем л%: ы ^е" со страничной организацией или с сегментацией. Предположим^ то напило время загрузки нового процесса в память. Операционная с сте ;инает ее с размещения в памяти только одного или нескольких блок [ючая блок, содержащий начало программы. Часть процесса, раегю ага яся в некоторый момент времени в основной памяти, называется Ре пгным множеством процесса. Во время выполнения процесса все прои г так, как если бы все ссылки были только на резидентное^ множе )цесса. При помощи таблицы сегментов или страниц процессор всегда ^ т определить, располагается ли блок, к которому требуется обрашени < ювной памяти. Если процессор сталкивается с логическим адресом, й не находится в основной памяти, он генерирует прерывание^ свиде «ующее об ошибке доступа к памяти. Операционная система пеРеБйие ерванный процесс в заблокированное состояние и получает упраБЛ 2 Часть 3. а Чтобы продолжить выполнение прерванного процесса, операционной системе необходимо загрузить в основную память блок, содержащий вызвавший проблемы логический адрес. Для этого операционная система использует запрос на чтение с диска (во время выполнения которого может продолжаться выполнение других процессов). После того как необходимый блок загружен в основную память, выполняется прерывание ввода-вывода, передающее управление операционной системе, которая, в свою очередь, переводит заблокированный процесс в состояние готовности. Естественно, тут же возникает вопрос об эффективности использования такой технологии, когда выполнение процесса постоянно прерывается только из-за того, что в основной памяти размещены не все его блоки. Отложим пока рассмотрение вопроса эффективности, полагая, что эффективная работа все же возможна, и обратимся к следствиям применения нашей новой стратегии. Их два (причем второе потрясает воображение), и оба приводят к повышению эффективности использования системы. 1. В основной памяти может поддерживаться большее количество процессов. Поскольку в основную память загружаются только некоторые из блоков каждого процесса, мы можем разместить в ней большее количество процессов. Это, в свою очередь, приводит к более эффективному использованию процессора, поскольку повышается вероятность наличия активных процессов в любой момент времени. 2. Процесс может быть больше, чем вся основная память. Преодолено одно из наиболее существенных ограничений в программировании. Обычно программист долже^ изначально рассчитывать, какое количество памяти потребуется его программе. Если разработанная программа окажется слишком большой, программист должен принять соответствующие меры по разделению программы на части, которые могли бы быть загружены в память в отдельности, с использованием той или иной оверлейной стратегии. В случае использования виртуальной памяти на основе страничной организации или сегментации эта функция передается операционной системе и аппаратному обеспечению. Программе (и программисту) при этом доступен огромный объем памяти, по сути, представляющий собой размер дискового пространства. Операционная система при необходимости автоматически загружает нужные блоки процесса в память. Поскольку процесс выполняется только в основной памяти, эта память называется также реальной (real memory). Однако программист или пользо- атель имеют дело с потенциально гораздо большей памятью — выделенной а диске. Эта память известна как виртуальная (virtual memory). Виртуаль- ая память обеспечивает очень эффективную многозадачность и облегчает ооту пользователя, снимая жесткие ограничения относительно объема ос- вной памяти. В табл. 8.1 приведены основные характеристики страничной анизации и сегментации с использованием виртуальной памяти и без нее. ^ *ва g Виртуальная память 393
Локализация и виртуальная память Достоинства виртуальной памяти весьма привлекательны, но насколько практична данная схема? Одно время на эту тему шли оживленные дебаты, однако опыт ее использования многими операционными системами продемонстрировал бесспорную жизнеспособность этой схемы — виртуальная память стала неотъемлемым компонентом большинства современных операционных систем. Чтобы понять, в чем заключается ключевое свойство виртуальной памяти и почему она вызвала такие бурные дебаты, обратимся вновь к задачам операционной системы, связанным с виртуальной памятью. Рассмотрим большой процесс, состоящий из длинного кода и ряда массивов данных. В каждый небольшой промежуток времени выполнение программы сосредотачивается в малой части кода (например, в одной из подпрограмм), и обращается эта часть кода, как правило, только к одному или двум массивам данных. В таком случае загружать в память все данные и код, в то время как перед приостановкой и выгрузкой процесса из памяти будут использоваться только небольшие их части, — расточительство. Память будет использоваться гораздо эффективнее, если загружать в нее только необходимые части программы. Соответственно, в этом случае при обращении к данным или коду, которых в настоящий момент нет в основной памяти, происходит прерывание выполнения программы, которое говорит операционной системе о необходимости загрузки в основную память затребованной части программы. Таким образом, в основной памяти в каждый момент времени находится только некоторая, как правило, небольшая, часть данного процесса и, следовательно, в основной памяти может быть одновременно размещено большее количество процессов. К тому же при этом получается определенная экономия времени, так как неиспользуемые части процессов не приходится постоянно выгружать из памяти и загружать вновь. Однако операционная система Должна очень разумно работать с такой схемой управления памятью. В установившемся состоянии практически вся основная память занята фрагментами процессов, чтобы процессор и операционная система могли работать с как можно большим количеством процессов одновременно. Следовательно, при загрузке в основную память некоторого блока другой блок должен быть выгружен оттуда. Если из памяти выгрузить блок, который тут же потребуется вновь, операционная система будет заниматься постоянным перемещением °Дних и тех же блоков в основную память и на диск. Большое количество аких перебросок приводит к ситуации, известной как снижение пропускной особности (thrashing): процессор в основном занимается не выполнением Р°Цессов, а выгрузкой и загрузкой в основную память. Задаче устранения го нежелательного эффекта посвящен ряд исследовательских работ, вы- Лнявшихся в 70-х годах, приведших к появлению различных сложных, но Фективных алг°ритмов. По сути, они сводятся к попыткам определить на овании последних событий в системе, какие блоки памяти потребуются в нижайшем будущем. ^ Эти методы базируются на принципе локализации (см. главу 1, "Обзор ^ Пь*отерных систем"), который гласит, что обращения к коду и данным в ^РОЦ, "S ессе имеют тенденцию к кластеризации. Следовательно, логично допус- #**a 8. Виртуальная память 395
что в течение некоторого небольшого времени для работы будет трео ;я только небольшая часть процесса; кроме того, можно сделать1 CD ные предположения о том, какие именно части процесса потребуете работы в ближайшем будущем, и тем самым свести снижение протек '** способности к минимуму. "': Один из способов подтвердить справедливость принципа локализаци -и дотреть выполнение процессов в среде с виртуальной памятью. На рщ„4$Ч едена знаменитая диаграмма из [HATF72], иллюстрирующая этот прк^ц тите внимание, как во время работы процесса обращения к памяти оград'•'"- ются небольшим подмножеством страниц. х го о. ь- о сз о. W S о 34 ММ 9г~ ii i i mm m—tt у T Н1НШ> * 32 4-r 30 28 mtmi itfe I11' Wit Itiif—I* it ,f—a*—a* шШшштт ¥ШШШцМй fli 1177/j4t ^^.e_ 26K-f t I J,1 j 'nWirrH- ■MHHMMHMi 18 .1 Щ I II t 8 I, |'18|ЩГ'ЩПЮШ'МЯВ)!ЧИ.ЯШчМ^»1''''Ч"| BilOW n M'f. l*-ir 1М1ГвМВ|ПШИ1!ыта11Ш>' j II j¥ Время работы »■ Puc. S.i. Использование страниц пачяти типичным процессом f •:■■ %Щ -ilk .«а ь Часть 8. Таким образом, наличие принципа локализации позволяет надеяться на эффективность работы виртуальной памяти. Для этого требуется, чтобы, во- первых, имелась аппаратная поддержка страничной организации и/или сегментации, а во-вторых, операционная система должна включать программное обеспечение для управления перемещением страниц и/ил и сегментов между вторичной и основной памятью. В этом разделе мы рассмотрим аппаратный аспект проблемы и познакомимся с необходимыми управляющими структурами, создаваемыми и поддерживаемыми операционной системой, но используемыми аппаратным обеспечением; вопросы же работы операционной системы будут рассмотрены в следующем разделе. Страничная организация Термин виртуальная память обычно ассоциируется с системами, использующими страничную организацию, хотя используется и виртуальная память на основе сегментации (которую мы рассмотрим чуть позже). Впервые сообщение о виртуальной памяти на основе страничной организации появилось в работе [KILB62], и вскоре после этого виртуальная память стала широко использоваться в коммерческих системах. При рассмотрении простой страничной организации мы указывали, что каждый процесс имеет свою собственную таблицу страниц, которая создается при загрузке всех страниц процесса в основную память. Каждая запись в таблице страниц содержит номер кадра соответствующей страницы в памяти. Такая же таблица страниц, связанная с каждым из процессов, требуется и при организации виртуальной памяти на базе страничной организации — однако в этом случае структура записей таблицы становится несколько более сложной, (рис. 8.2,л). Поскольку в основной памяти могут находиться только некоторые из страниц процесса, в каждой записи таблицы должен иметься бит Р, указывающий на присутствие соответствующей страницы в основной памяти. Если данная страница располагается в основной памяти, то в записи таблицы содержится номер ее кадра. Другим управляющим битом в записи таблицы страниц является бит модификации — М, который указывает, было ли изменено содержимое данной страницы со времени последней загрузки в основную память. Если изменений не было, то когда наступит время замены страницы в занимаемом ею в данный момент кадре, записывать эту страницу на диск не следует, так как на диске уже имеется ее точная копия. В записи таблицы страниц могут быть и другие управляющие биты, например, служащие для целей защиты или совместного использования памяти на уровне страниц а 8. Виртуальная память 397
Виртуальный адрес Номер страницы Смещение Запись таблицы страниц Ш Другие [ Г1 управляющие биты Номер кадра а) Страничная организация ■ \ Виртуальный адрес Номер сегмента Смещение Запись таблицы сегментов PU Другие Г ] управляющие биты Длина Начальный адрес сегмента б) Сегментация *:?tW- £ Виртуальный адрес Номер сегмента Номер страницы Смещение .;{.' Запись таблицы сегментов Другие управляющие биты Длина Начальный адрес сегмента Запись таблицы страниц К' в Другие управляющие биты Номер кадра Р —бит присутствия , М — бит модификации в) Комбинирование страничной организации и сегментации Ж ш <К Рис. 8.2. Типичные форматы систем управления памятью Структура таблицы страниц Базовый механизм чтения слова из памяти включает в себя трансдйиию •туального, или логического, адреса, состоящего из номера страницы Л. ме~ ния, в физический адрес, который представляет собой номер кадра и с ше" !, с использованием таблицы страниц. Поскольку таблица страниц им ., пе" 1енную длину, зависящую от размера процесса, разместить ее в регистру н вставляется возможным, и таблица страниц должна располагаться в ,оВ" I памяти. На рис. 8.3 показана аппаратная реализация этого механизма^ ЛР полнении некоторого процесса стартовый адрес его таблицы страниц хран, тс •егистре, а номер страницы из виртуального адреса используется в клЧ *екса элемента, в котором ищется соответствующий номер кадра- Затев(, дер объединяется со смещением из виртуального адреса для получения 'о физического адреса интересующей нас ячейки памяти. £-'\ В большинстве систем для каждого процесса имеется одна таблица *ако каждый процесс может использовать большой объем виртуальной п х ., например, в архитектуре VAX каждый процесс может иметь до 2. — х" 8 Часть 3. виртуальной памяти. При использовании страниц размером 2° = 512 байт оказывается, что нам требуется до 2 записей в таблице страниц для каждого процесса. Понятно, что количество памяти, отводимое таблицам страниц, не может быть так велико. Для преодоления этой проблемы большинство схем виртуальной памяти хранят таблицы страниц не в реальной, а в виртуальной памяти. Это означает, что сами таблицы страниц становятся объектами страничной организации, как и любые другие страницы. При работе процесса как минимум часть его таблицы страниц должна располагаться в основной памяти, в том числе запись о странице, выполняющейся в настоящий момент. Некоторые процессоры используют двухуровневую схему для больших таблиц страниц. При такой схеме имеется каталог таблиц страниц, в котором каждая запись указывает на таблицу страниц. Таким образом, если размер каталога — X, а максимальный размер таблицы страниц — У, то процесс может состоять максимум из X х Y страниц. Обычно максимальный размер таблицы страниц определяется условием ее размещения в одной странице (такой подход используется, например, в процессоре Pentium). Виртуальный адрес Номер страницы. Смещение flporpi амма Номер кадра Регистр Указатель на таблицу страниц Таблица страниц •? о. zs о т ±? о Номер кадра Смещение Механизм страниц 3 1 f Основная память Рис.^.З. Трансляция адреса в системе со страничной организацией На рис. 8.4 приведен пример двухуровневой схемы, типичной для 32- ^итовой адресации. Принимая условие адресации байтов и 4-Кбайтовые (212) Ракицы, мы получим 4-Гбайтовое (23Z) виртуальное адресное пространство, со- вленное из 2 страниц. Если каждая из этих страниц отображается посредст- тел °ДНОЙ 4-байт°вой записи в таблице страниц, то мы можем создать пользований*-10 таблиц-У страниц, состоящую из 220 записей, общим объемом 4 Мбайт айт). Такая огромная таблица может быть размещена в 210 страницах вир- Из о^?°Й Памятн' которые отображаются корневой таблицей страниц, состоящей записей, которые занимают 4 Кбайт (212 байт) основной памяти. На Лава 8. Виртуальная память 399
с. 8.5 показаны действия, выполняемые при трансляции адреса в Двухуровне й системе. Корневая страница всегда остается в основной памяти. Первое in * т виртуального адреса используются для индексации в корневой таблице>.для иска записи о странице пользовательской таблицы. Если нужная страница от- тствует в основной памяти, генерируется ошибка доступа к странице. Е<у£и Жв обходимая страница находится в основной памяти, то следующие 10 бщйв р. ального адреса используются как индекс для поиска записи о странице, на ко рую ссылается исходный виртуальный адрес. $ »невзя таблица аниц (4 Кбайт) тьзовательская лица страниц Ибайт) тьзовательское >есное ш «транство (6 Гбайт) 5* Рис. 8.4. Двухуровневая иерархическая таблица страниц [JAC098a] ''?' I t Р. i J я»-. виртуальный адрес 10 бит 10 бит 12 бит Программа Номер кадра Смещение Указатель на корневую таблицу страниц -И + 4> Корневая таблица страниц(1024 записи) Таблица страниц размером 4 Кбайт (1024 записи) Механизм страниц Основная память Рис. 8.5. Трансляция адреса в системе с двухуровневой страничной организаци ю Часть 3. ть vir i-T Виртуальный адрес Е Номер страницы Смещение Номер страницы Таблица страниц Запись Цепочка {Хэш-значение) Номер кадра Номер кадра Смещение Хэш-таблица Инвертированная таблица страниц Реальный адрес Рис. 8.6. Структура, инвертированной таблицы страниц Еще одним подходом к использованию одно- или двухуровневых таблиц страниц является применение инвертированной таблицы страниц (inverted page table), представленной на рис. 8.6. Этот подход применяется на машинах Power PC и IBM AS/400. Этот же подход использован и в операционной системе Mach на RT-PC. При таком подходе часть виртуального адреса, представляющая собой номер страницы, отображается в хеш-таблицу с использованием простой функции хеширования.1 Хеш-таблица содержит указатель на инвертированную таблицу страниц. Каждой странице реальной памяти при этом соответствует одна запись в хеш- таблице и инвертированной таблице страниц. Таким образом, для хранения таблиц требуется фиксированная часть основной памяти, независимо от размера и количества процессов и поддерживаемых виртуальных страниц. Поскольку на одну и ту же запись хеш-таблицы могут отображаться несколько виртуальных адресов, для обработки переполнения используется технология цепочек (которые на практике обычно Достаточно коротки — как правило, от одной до двух записей). Буфер поиска трансляции В принципе каждый виртуальный адрес вызывает обращение к двум физи- ским адресам: одно для выборки соответствующей записи из таблицы страниц еще одно — для обращения к адресуемым данным. Следовательно, простая ема виртуальной памяти, по сути, удваивает время обращения к памяти. Для Реодоления этой проблемы большинство реально использующихся схем вирту- ьной памяти использует специальный высокоскоростной кэш для записей таб- Вопросы хеширования будут затронуты в приложении к данной главе. ^ава 8. Виртуальная память 401
ч 1 рые страниц, который обычно называют буфером быстрого преобразования ал или просто буфером поиска трансляции (translation lookaside bufff Этот кэш функционирует так же, как и обычный кэш памяти (см. гл ) компьютерных систем") и содержит те записи таблицы страниц, ко ьзовались последними. Организация аппаратной поддержки использов о юказана на рис. 8.7. Получив виртуальный адрес, процессор сперва р0. ивает TLB. Если требуемая запись найдена, процессор получает номер кад- юрмирует реальный адрес. Если запись в TLB не найдена, то процессор ис- ует номер страницы в качестве индекса для таблицы страниц процесса и атривает соответствующую запись. Если бит присутствия в ней установлен т, искомая страница находится в основной памяти, и процессор просто по- г номер кадра из записи таблицы страниц и формирует реальный адрес ременно внося использованную запись таблицы страниц в TLB. И, наконец, эит присутствия не установлен, значит, искомой страницы в основной па- нет, и процессор генерирует ошибку обращения к странице. В этот момент [ючается операционная система, которая загружает требуемую страницу в ную память и обновляет таблицу страниц. Виртуальный адрес Основная память Вторичная память страницы Смещение TLB Поиск в TLB успешен Таблица страниц Поиск в TLB неуспешен Номер кадра Смещение Реальный адрес Ошибка обращения к странице Рис. 8.7. Использование TLB "» На рис. 8.8 приведена диаграмма использования TLB. На ней показано*4 требующаяся страница отсутствует в основной памяти, то прерывание бки обращения к странице вызывает соответствующую программу сюр0" Для упрощения диаграммы в ней не отражен тот факт, что в процессе в тения операций ввода-вывода операционная система может паралл льн пенными операциями дискового ввода-вывода выполнять другой , °ц Часть З.Й ** Исходя из принципа локализации большинство обращений к виртуальной памяти будут сосредоточены в недавно использованных страницах и соответствующие записи будут находиться в кэше, так что с помощью TLB повышается эффективность работы виртуальной памяти, что, например, показано при изучении VAX TLB [CLAR85, SATY81]. Возврат к инструкции, вызвавшей прерывание Программа обработки прерывания обращения к странице Операционная система заставляет процессор считать страницу с диска V Процессор активизирует аппаратное обеспечение ввода-вывода 1 г Страница переносится с диска в основную память <СГпамятъ заполнена ?^> Нет Да УГ Обновление таблиц страниц Нет ( Начало работы ) г Процессор просматривает TLB ^■^"Запись таблицы4^ Ч. страниц находится .^ Нет 1 Обращение к таблице страниц Да ^>^ Страница ^v. ^>sv. памяти? ^s^ Да Т Обновление TLB 1 1' Процессор генерирует физический адрес г Обновление таблиц страниц & Рис. 8.8. Диаграмма трансляции адреса с использованием TLB ч^оль организ?Чии TLB имеется ряд особенностей. Так, поскольку TLB содержит \**OMe° НекотоРые из записей таблицы страниц, индексация записей в TLB на основе ч Ра страницы не представляется возможной; вместо этого каждая запись TLB %*ва 8. Виртуальная память 403
iyf ■.was а наряду с полной информацией из записи таблицы страниц включать^ страницы. Процессор аппаратно способен одновременно опрашивать ряд/ J3 для определения того, какая из них соответствует заданному номеру стэй Такая методика известна как ассоциативное отображение (assoct tiv ig). B отличие от прямого отображения, или индексирования, примедйейлт >иска в таблице страниц как показано на рис. 8.9. Конструкция TLB д© предусматривать способ организации записей в кэше и принятия решен • л акая из старых записей должна быть удалена при внесении в кэш новой' *'^ рочем, этим вопросам следует уделять внимание при разработке любого^^цп ■о кэша. Однако они не входят в круг вопросов, рассматриваемых в; заинтересованному читателю можно порекомендовать обратиться к спеДй -щ; 1ННОЙ литературе на эту тему (например, [STALOO]). - * "' t гальныи адрес !р г. иды Смещение I 502 | Виртуальный адрес Номер страницы Смещение I 5 I 502 I 37 Реальный адрес а) Прямое отображение I 37 | 502 1 Номер Смещение кадра Реальный адрес Номер Записи страницы таблицы страниц 19 37 27 14 211 90 17" з7 \ т. i TLB б) Ассоциативное отображение Номер С кадре * Реальный •ЪА #к** .ш *ж Н :•,?* л' 4 9. Прямой и ассоциативный поиск записи таблицы, страниц I наконец, механизм виртуальной памяти должен взаимодействовать £ кэ- кэшем основной памяти, не TLB). Это взаимодействие продемонстрировав0 1С. 8.10. Виртуальный адрес, вообще говоря, представляет собой' дарУ р страницы — смещение". Сначала происходит обращение к TLB ДЛ$ в ия, имеется ли в нем соответствующая запись таблицы страниц. Щ^1 гельном результате путем объединения номера кадра и смещения гевериР- >еальный (физический) адрес (если требуемой записи в TLB нет, ее ЩрУ4 :з таблицы страниц). После того как сгенерирован реальный ,. Р6' тавляющий собой дескриптор2 и остальную часть адреса, выполняв .Я -■>.„ См. рис. 1.17. Обычно дескриптор представляет собой несколько крайни, реального адреса. Более детально о кэшировании можно узнать в [STAL00 ев Часть 3.. ращение к кэшу для выяснения, не содержится ли в нем блок с интересующим нас словом. Если ответ положительный, то требуемое значение передается процессору; в противном случае происходит выборка слова из основной памяти. TLB Виртуальный адрес I Номер страницы Смещение Отсутствует TLB Имеется Кэш W " Реальный адрес Г Дескриптор Остаток Кэш Таблица страниц "~-Отсутствует Имеется Значение ► Основная память Значение ► Рис. 8.10. Взаимодействие кэша основной памяти и TLB Читатель должен оценить сложность аппаратного обеспечения процессора, вовлеченного в единственное обращение к памяти, когда виртуальный адрес преобразуется в реальный. ^Это приводит к обращению к записи таблицы страниц, которая может оказаться в TLB, в основной памяти или на диске. Само слово, к которому °существляется обращение, тоже может оказаться в разных местах — в кэше, в основной памяти или на диске. В последнем случае соответствующая страница должна Ь1тъ загружена в основную память, а блок, содержащий слово, — в кэш. Кроме то- » должна быть обновлена запись для данной страницы в таблице страниц. Размер страницы Весьма важным вопросом при разработке является выбор размера стра- й Ч — здесь следует учесть сразу несколько факторов. Один из них — внутрен- Фрагментация. Понятно, что внутренняя фрагментация, которую желатёль- Уменьшить для оптимизации использования основной памяти, находится в ^ямой зависимости от размера страницы. С другой стороны, чем меньше размор Цьг НИЦ' ТеМ больше их тРебУется для процесса, что означает увеличение табли- стРаниц. Для больших программ в загруженной многозадачной среде это ?ава 8. Виртуальная память 405
т означать, что часть таблиц страниц активных процессов будет находиться ггуальной памяти и при обращении к памяти будет возникать двойное прение из-за отсутствия страницы: сперва при получении требуемой записи из щы страниц, а затем — при обращении к странице процесса. Еще одни ором, который следует учесть, являются физические характеристики боль. •,тва устройств вторичной памяти, приводящие к тому, что передача боль- ' блоков осуществляется более эффективно. Вопрос усложняется еще и тем, что на частоту возникновения прерывания отсутствия страницы в основной памяти влияет размер страницы. На 8.11,а показано обычное поведение частоты возникновения прерываний из- сутствия страницы с учетом принципа локализации. Если размер страницы > мал, то в памяти размещается относительно большое количество ©tj>a ц есса. Через некоторое время страницы в памяти будут содержать чаеп£ ~. l, сосредоточенные вблизи последних обращений, и частота возникноЬен ывания из-за отсутствия страницы должна быть невелика. По мере уве; \ . размера страницы каждая отдельная страница будет содержать данньй^/ч»- е располагаются все дальше и дальше от последних выполненных обр к памяти. Соответственно, действие принципа локализации ослабевает, и юдается рост количества прерываний из-за отсутствия страницы. В конце ов, когда размер страницы начинает становиться сравнимым с размером есса (точка Р на графике), прерывания из-за отсутствия страницы ст овят- е реже, а по достижении размера этого процесса прекращаются вовсе.-' И- ** б) Количество выделенных кадров страниц а) Размер страницы Р — размер процесса IV— размер рабочего множества N — общее количество страниц процесса Рис. 8.11. Типичное поведение страничной организации ■■>;* •Т.'-, 'vi Следует учитывать также влияние количества кадров, распределенные /. На рис. 8.11,6 показано, что для фиксированного размера странице возникновения прерываний из-за отсутствия страницы уменьшается с р числа страниц, находящихся в основной памяти.3 Таким образом, н пасс» шва Часть 3. ят граммную стратегию (объем памяти, выделяемой процессу) влияет аппаратное решение (размер страницы). В табл. 8.2 приведены размеры страниц на разных машинах Таблица 8.2. Примеры размеров страниц Компьютер Размер страницы Atlas 512 48-битовых слов Honeywell-Multics 1024 36-битовых слова IBM 370/XA и 370/ESA 4 Кбайт Семейство VAX 512 байт IBM AS/400 512 байт DEC Alpha 8 Кбайт MIPS от 4 Кбайт до 16 Мбайт UltraSPARC от 8 Кбайт до 4 Мбайт Pentium от 4 Кбайт до 4 Мбайт PowerPC 4 Кбайт И наконец, решение об используемом размере страниц связано с размером физической основной памяти и размером программы. Ведь растет не только объем основной памяти в компьютерах, но и адресное пространство, используемое приложениями. Эта тенденция наиболее заметна в персональных компьютерах и рабочих станциях, где особенно резко проявляется увеличение размеров и возрастание сложности используемых приложений. Кроме того, современные технологии программирования, используемые в больших программах, приводят к снижению локализации ссылок процесса [HUCK93]. В качестве примеров можно привести следующие. " • Объектно-ориентированные технологии, стимулирующие использование множества мелких модулей кода' и данных с обращениями к большому количеству объектов за относительно короткое время. • МногопоточныеЧфиложения, приводящие к внезапным изменениям в потоке команд и .обращениям к памяти, разбросанным по разным адресам. Результативность поиска в TLB определенного размера с ростом размера процессов и уменьшением локализации снижается. При таком положении дел TLB мо- >Кет стать узким местом, ограничивающим производительность [CHEN92]. Один из способов повышения производительности TLB — использование °льшого TLB с большим количеством записей. Однако увеличение размера TLB язано с другими аспектами аппаратного решения вопросов обращения к памя- такими, как размер кэша основной памяти и количество обращений к па- ти при выполнении одной команды [TALL92], что заставляет сделать вывод о возможности роста размера TLB такими же темпами, как и увеличение размере °0Новной памяти. Альтернативой может быть использование больших разме- м СтРаниц7 с тем чтобы каждая запись в TLB ссылалась на большой блок па- ' ^ и. Однако мы уже видели, что использование больших размеров страниц >Кет привести к потере производительности. -Vt* - ^ава 8. Виртуальная память 407
Считывая обстоятельства, рассмотренные нами ранее, ряд разрабо *$*« пи к использованию множественных размеров страниц [TALL92, КНд^оо-,, оторые из микропроцессоров, такие, как MIPS R4000, Alpha, UltraS ARn tium, поддерживают эту методику. Множественные размеры страниц б ают необходимую для эффективного использования TLB гибкость, Брдьт»* рывные области адресного пространства процесса, например программный могут отображаться с использованием небольшого количества бо ~щцу иц, в то время как стеки потоков могут использовать для отобразкенйя ицы малого размера. Однако большинство коммерческих операционных л все еще поддерживают только один размер страниц, независимо от спо- ;ти аппаратного обеспечения работать со страницами разного размера 1на этого отставания в том, что с размером страниц связано большое кол ''* ) разнообразных аспектов операционных систем, и переход на множестве - азмер страниц оказывается очень сложным [GANA98]. Еентация 1начение виртуальной памяти )егментация позволяет программисту рассматривать память как область, [щую из множества адресных пространств, или сегментов. Сегменты могут разные (фактически динамические) размеры. Обращения к памяти ис- уют адреса, представляющие собой пары {номер сегмента, смещение) 'акая организация имеет ряд преимуществ по сравнению с несегментиро- [м адресным пространством. ^прощается обработка растущих структур данных. Если программисту аранее не известен размер структур данных, с которыми предстоит ра- отать, и есть возможность использовать сегментацию, структуре дан- !ых может быть назначен ее собственный сегмент, размер которого опе- гационная система будет увеличивать или уменьшать по мере необходи- юсти. Если сегмент, размер которого следует увеличить, находится в сновной памяти и для его увеличения нет свободного места, операци- нная система может переместить его в большую область или выгрузить ;а диск (в этом случае увеличенный сегмент будет загружен вновь при :ервой возможности). , 1рограммы могут изменяться и перекомпилироваться независимо от ком- :иляции или компоновки всего множества программ (что осуществл «тсЯ :ри использовании множественных сегментов). V. f ^прощается совместное использование кода и данных разными процессами. 1рограммист может поместить код утилиты или необходимые даняы^ оТ" ельный сегмент, к которому будут обращаться другие процессы. д ^ лучшается защита. Так как сегмент представляет собой точно опред л :ые множества программ или данных, программист или системный. & истратор могут назначать права доступа просто и удобно. ^ )рганизация 1ри рассмотрении простой сегментации мы отмечали, что каждые ПР имеет собственную таблицу сегментов, и при загрузке всех сегмент Часть 3. а яТЬ Процесса в основную память создается таблица сегментов процесса, которая также загружается в основную память. В каждой записи таблицы сегментов указан начальный адрес соответствующего сегмента в основной памяти и его длина. Та же таблица сегментов нужна и при схеме виртуальной памяти, основанной на сегментации. Типичным приемом является использование отдельной таблицы сегментов для каждого процесса. Записи таблицы сегментов в этом случае усложняются (рис. 8.2,6). Поскольку в основной памяти могут находится не все сегменты процесса, в каждой записи требуется наличие бита присутствия, указывающего, располагается ли данный сегмент в основной памяти. Если сегмент расположен в основной памяти, то запись включает его начальный адрес и длину. Еще один бит, необходимый в данной схеме, — бит модификации, указывающий, было ли изменено содержимое сегмента со времени его последней загрузки в основную память. Если изменений не было, то при выгрузке сегмента нет необходимости в его записи на диск. Могут иметься и другие управляющие биты, например при организации защиты или совместного использования на уровне сегментов. Основной механизм чтения слова из памяти включает преобразование виртуального, или логического, адреса, состоящего из номера сегмента и смешения, в физический адрес с использованием таблицы сегментов. Поскольку таблица сегментов имеет переменную длину, зависящую от размера процесса, мы не можем рассчитывать на ее хранение в регистрах, ч и для хранения таблицы сегментов используется основная память. На рис. 8.12 „предложена аппаратная реализация описываемой схемы. Когда запускается определенный процесс, в регистре хранится стартовый адрес его таблицы сегментов. Номер сегмента из виртуального адреса используется в качестве индекса таблицы, позволяющего определить начальный адрес сегмента. Для получения физического адреса к начальному адресу сегмента добавляется смещение из виртуального адреса. Комбинация сегментации и страничной организации И страничная организация, и сегментация имеют свои достоинства. Страничная организация, прозрачная для программиста, устраняет внешнюю фрагментацию и таким образом обеспечивает эффективное использование основной памяти. Кроме того, поскольку перемещаемые в основную память и из нее блоки имеют фиксированный, одинаковый4 размер, облегчается создание эффективных алгоритмов управления памятью. Сегментация, являясь видимой для программиста, имеет перечисленные в предыдущем разделу достоинства, включающие модульность, возможность обработки растущих структур данных, а также поддержку совместного использования и защиты памяти. Некоторые вычислительные систему, будучи оснащены соответствующим аппаратным обеспечением и операционной системой, используют достоинства обоих методов. В такой комбинированной системе адресное пространство пользователя раз- ивается на ряд сегментов по усмотрению программиста. Каждый сегмент в свою еРедь разбивается на ряд страниц фиксированного размера, соответствующего4 Размеру кадра основной памяти. Если размер сегмента меньше размера страни- ы> он занимает страницу целиком. С точки зрения программиста, логический ^Рес в этом случае состоит из номера сегмента и смещения в нем. С позиции ^рационной "системы смещение в сегменте следует рассматривать как номер Раницы определенного сегмента и смещение в ней. Ч;Л&Ва 8. Виртуальная память 409
Виртуальный адрес «ер ента Смещение = d -0- Таблица сегментов Регистр Начальный адрес + d Указатель на таблицу сегментов Таблица сегментов го || IE ф о Длина Начальный адрес Программа , Механизм сегментации ш 5 Основная память Рис. 8.12. Трансляция адреса в системе с сегментацией ^ На рис. 8.13 предложена структура для поддержки комбинации сегмента и страничной организации. С каждым процессом связана одна таблица сег- ов и несколько (по одной на сегмент) таблиц страниц. При работе Q еде* ого процесса в регистре процессора хранится начальный адрес соответс? цей таблицы сегментов. Получив виртуальный адрес, процессор использует гасть, представляющую номер сегмента, в качестве индекса в таблице се - ов для поиска таблицы страниц данного сегмента. После этого часть адреса. ставляющая собой номер страницы, используется для поиска соответствую- кадра основной памяти в таблице страниц; затем часть адреса, представ- цая смещение, используется для получения искомого физического адрес м добавления к начальному адресу кадра. , \ На рис. 8.2,в предложены форматы записей таблицы сегментов и табл траниц. Как и ранее, запись таблицы сегментов содержит значение дл ;егмента, а также поле с начальным адресом сегмента, которое тепер ывает на таблицу страниц. Биты присутствия и модификации в з пис * ицы сегментов в данном случае не нужны, так как эти вопросы решают- а уровне страниц. Использование других управляющих битов может про хаться, например в упомянутых ранее целях совместного использован» щиты. Запись таблицы страниц — по сути та же, что и использовавшая еме с "чистой" страничной организацией. При наличии страницы ° юй памяти (на что указывает бит присутствия) ее номер отображается Ф соответствующего кадра; бит модификации указывает, требуется л запись страницы на диск при ее выгрузке из памяти. Как и ранее, ( льзоваться и другие управляющие биты. -^ оПт Часть 3. Па &ъ Виртуальный адрес Номер сегмента Номер [страницы Смещение 1 Программа Указатель на таблицу сегментов Таблица сегментов -? га ф -^ ГС Q> о Механизм сегментации Номер кадра Смещение Таблица страниц г^б Ж Механизм страничной организации ф X CD 3 St Основная память Рис. 8.13. Трансляция адреса при совместном использовании сегментации и страничной организации Защита и совместное использование Сегментация вполне пригодна для реализации стратегии защиты и совместного использования. Поскольку каждая запись таблицы сегментов включает начальный адрес и значение длины, программа не в состоянии непреднамеренно обратиться к основной памяти за границами сегмента. Для осуществления совместного использования ссылки на один и тот же сегмент могут быть в таблицах сегментов нескольких процессов. Тот же механизм, естественно, осуществим и на уровне страниц. Однако в случае использования страниц они невидимы для программиста и делают определение правил защиты и совместного использования неудобным.- На рис. 8.14 показаны типы защиты, которые могут быть реализованы в такой системе. Можно обеспечить и более интеллектуальный механизм защиты. Обычная схема использует кольцевую структуру защиты, с которой мы встречались в задаче 3.6. В этой схеме внутренние кольца (с меньшими номерами) имеют большие привилегии по сравнению с внешними кольцами. Обычно кольцо О зарезервировано для функций ядра операционной системы, а приложения находятся во внешнем кольце. Не- оторые утилиты или операционная система могут занимать промежуточные кольца, новными принципами системы колец являются следующие. *■• Программа может получить доступ только к данным, расположенным в том же или менее привилегированном кольце. ■ Программа может вызвать сервис из того же или более привилегированного кольца. ^ f ава 8. Виртуальная память 411
Адрес О 20К 35К 50К Основная память 60К 90К 140К 190К Диспетчер Процесс А ■st---_: ; Процесс В Процесс С ш. Y 4 Л Доступ запрещен Инструкция ветвления (запрещена) л Y * Л Обращение к данным (разрешено) Обращение к данным (запрещено) V Л .'А>1>й? ■4 # f 1 Рис. 8.14. Отношения защиты между сегментами ^ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ^ОПЕРАЦИОННОЙ СИСТЕМЫ • ~ ЛЬ..*. „Л^л — ™ _-.«- Особенности разработки части программного обеспечения операщ*о но гмы, управляющей памятью, зависят от ответа на три основных вопрос - Будет ли использоваться виртуальная память. Будет ли использоваться сегментация, страничная адресация или oof У* занные технологии. Какие алгоритмы будут использованы для различных аспектов управлеН памятью. Ответы на первые два вопроса тесно связаны с используемой аппа атной формой. Так, ранние реализации UNIX не использовали виртуальною " ■, поскольку процессоры, на которых работали эти операционные си$те ' оддерживали ни сегментации, ни страничной организации, а без аппа т ^ Часть 3. мя п0Ддержки преобразования адресов ни сегментация, ни страничная организация никакой практической ценности не представляют. Приведем два небольших замечания по поводу первых двух вопросов из представленного списка. Во-первых, за исключением операционных систем типа jy[S DOS для некоторых старых персональных компьютеров и специализированных систем, все важные операционные системы используют виртуальную память. Во-вторых, "чистая" сегментация становится очень редким явлением. При комбинации сегментации и страничной организации основная масса вопросов управления памятью, с которыми сталкивается разработчик операционной системы, лежит в области страничной организации.4 Таким образом, мы сосредоточим свое внимание на вопросах, связанных со страничной организацией памяти. Ответ на третий из поставленных в этом разделе вопросов связан с программным обеспечением операционной системы, и именно ему посвящен данный раздел. В табл. 8.3 перечислены основные рассматриваемые в этом разделе стратегии. В каждом случае ключевым вопросом становится производительность: требуется сократить количество прерываний из-за отсутствия страницы в памяти, поскольку их обработка приводит к существенным накладным расходам, которые включают как минимум принятие решения о том, какие резидентные страницы должны быть замещены, и операции ввода-вывода по замене страниц в основной памяти. Кроме того, операционная система должна активизировать на время выполнения медленных операций ввода-вывода другой готовый к работе процесс. Ни одна из перечисленных в табл. 8.3 стратегий не является "наилучшей". Задача управления памятью чрезвычайно сложна. Кроме того, производительность каждого набора стратегий зависит от размера основной памяти, относительной скорости основной и вторичной памяти, размера и количества конкурирующих за ресурсы процессов и поведения отдельных программ. Последняя характеристика зависит от природы приложения, использованных языка программирования и компилятора, стиля программиста, а для интерактивных программ — от динамичности пользователя. Так что читатель не должен ожидать окончательного ответа на поставленные вопросы. Для малых вычислительных систем разработчик операционной системы должен попытаться выбрать такой набор стратегий, который представляется ему наиболее подходящим; в случае использования больших систем, в частности мейнфреймов, операционная система Должна быть оснащена инструментами для мониторинга и управления, которые позволят администратору настроить ее таким образом, чтобы получить наивысшую производительность для данных физических параметров и решаемых на ней задач. таблица 8.3. Стратегии операционной системы для виртуальной памяти тратегия выборки Управление резидентным множеством Но требованию Размер резидентного множества Предварительная выборка Фиксированный Переменный Ратегия размещения Область видимости замещения Глобальная тРатегия замещения Локальная \ в ■" комбинированной системе защита и совместное использование обычно реализо- На уровне сегментов. Эти вопросы будут рассматриваться в следующей главе. 7ава 8- Виртуальная память 413
Окончание табл. g 3 ■вные алгоритмы г птимальный Стратегия очистки очьше всех неиспользовавшиеся По требованию ,*i ервым вошел — первым вышел Предварительная очистка >^, асовой • :.»#' уферизация страниц Управление загрузкой "ft Степень многозадачности Г тегия выборки гратегия выборки определяет, когда страница должна быть передана в э память. Два основных варианта — по требованию и предваритель о сборке по требованию страница передается в основную память только то- эгда выполняется обращение к ячейке памяти, расположенной на'-%той це. Если все прочие элементы системы управления памятью работают, хо- то должно произойти следующее. Когда процесс только запускается, воз- • поток прерываний обращений к странице, но далее срабатывает принцип [зации, и все большее количество обращений выполняется к недавно за- шым страницам. Соответственно, количество прерываний из-за отсутствия цы снижается до весьма низкого уровня. \ случае предварительной выборки загружается не только странице, вы- ш прерывание обращения. Предварительная выборка использует характе* .и большинства устройств вторичной памяти, таких, как диски, у которых я время поиска и задержка, связанная с вращением диска. Если стрр щы са расположены во вторичной памяти последовательно, то гораздо :. олее гивной будет загрузка в основную память нескольких последовать ных ц за один раз, чем загрузка этих же страниц по одной в течение некоторо- «ежутка времени. Естественно, эта стратегия не дает никакого выигр&ша, 5ращения к дополнительно загруженным страницам не происходит^ редварительная выборка может применяться либо при первом запуске цроцес- раницам, тем или иным способом указываемым программистом, либо к л каждом прерывании обращения к странице. Последний случай кажется бо- ;дпочтительным, поскольку он прозрачен для программиста. Тем не ме ""Высь использования предварительной выборки не доказана [МАЕК87]. % е следует путать предварительную выборку и свопинг. При выгрузку про- 13 памяти и переводе его в приостановленное состояние из основной амя- ляются все его резидентные страницы. При возобновлении выполнения са все его страницы, которые ранее находились в основной памяти, овЬ щаются в нее "V тегия размещения % гратегия размещения определяет, где именно в физической памяти УДУ* агаться части процесса. В случае "чистой" сегментации стратегия Jf e" является весьма важным вопросом, решения которого в виде стрк** о подходящего, очередного подходящего и других рассматривались В; Гча" 'Управление памятью". Однако для систем, использующих только; ра- '";?■* Часть 3. П& *тЬ «чную организацию или страничную организацию в сочетании с сегментацией, тоатегия размещения обычно не так важна, поскольку аппаратная трансляция поеса и аппаратное обращение к памяти одинаково результативны при любых сочетаниях страница-кадр. В так называемых многопроцессорных системах с неоднородным доступом к памяти (nonuniform memory access — NXJMA) размещение является довольно важным вопросом, требующим всестороннего исследования. Обратиться к распределенной совместно используемой памяти может любой процессор, однако на время доступа к определенному физическому адресу влияет расстояние между процессором и модулем памяти. Таким образом, суммарная производительность в огромной степени зависит от того, насколько близко к процессору размещены обрабатываемые им данные [LAR092, BOL089, СОХ89]. В системах с неоднородным доступом к памяти в соответствии со стратегией автоматического размещения страницы должны размещаться в модулях памяти, обеспечивающих нал- большую производительность. , Стратегия замещения В большинстве публикаций, посвященных операционным системам, рассмотрение управления памятью включает в себя раздел, озаглавленный "Стратегия замещения", в котором говорится о выборе страниц в основной памяти для замещения их загружаемыми из вторичной памяти страницами Эта тема достаточно сложна методологически, поскольку включает ряд взаимосвязанных вопросов. • Какое количество кадров должно быть выделено каждому активному процессу. • Должно ли множество страниц, которые потенциально могут быть замещены загружаемыми страницами, ограничиваться одним процессом или в качестве кандидатов на замещение могут рассматриваться все кадры страниц основной памяти. • Какие именно страницы из рассматриваемого множества следует выбрать для замещения. Первые два вопроса — из области управления резидентным множеством, о чем мы поговорим в следующем подразделе; термин же "стратегия замещения" мы будем использовать для обозначения третьего вопроса. Вопросы стратегии замещения представляют собой, пожалуй, наиболее полно изученный за последние 20 лет аспект управления памятью. Когда все кадры основной памяти заняты и нам требуется разместить новую страницу в процессе обработки прерывания из-за отсутствия страницы, стратегия замещения определяет, какая из находящихся в настоящее время в основной памяти страниц Должна быть выгружена, чтобы освободить кадр для загружаемой страницы. Все стратегии направлены на то, чтобы выгрузить страницу, обращений к которой в °ли>кайшем будущем не последует. В соответствии с принципом локализации часто наблюдается сильная корреляция между множеством страниц, к которым последнее время были обращения, и множеством страниц, к которым будут Ращения в ближайшее время. Таким образом, большинство стратегий пытаются определить будущее поведение программы на основе ее прошлого поведения. РИ рассмотрении разных стратегий следует учитывать, что чем более совер- ^f лава 8. Виртуальная память 415
1енный и интеллектуальный алгоритм использует стратегия, тем выше бул акладные расходы при его реализации. * Блокировка кадров /JpN * Перед рассмотрением различных алгоритмов следует упомянуть об одэд* \ & граничении: некоторые кадры основной памяти могут быть заблокиров ; ,j£ локировка кадра означает, что страница, хранящаяся в данный момент в это ^ адре, не может быть замещена. Большинство ядер операционных систем « : > Ъ. ятся в заблокированных кадрах, так же, как и основные управляющие ст укс- k /ры. Кроме того, в заблокированных кадрах основной памяти могут распо ' ч 1ться буфера ввода-вывода и другие критические по отношению ко Bpelte Ч эступа данные и код. Блокировка осуществляется путем установки соответствующего бита у каждого кадра. Этот бит может находиться как в таблице кад* эв, так и быть включенным в текущую таблицу страниц. t t:i- Основные алгоритмы ' ч Независимо от стратегии управления резидентным множеством имеется.ряд' ;новных алгоритмов, используемых для выбора замещаемой страницы: *Jf • оптимальный алгоритм; 'ЗШ К$ т. ■'■ • алгоритм дольше всех неиспользовавшегося; • •*■- V. <$£-- • алгоритм "первым вошел — первым вышел"; ^ 5- • часовой алгоритм. Д:^ Оптимальная стратегия состоит в выборе для замещения той страницы1, * ' ицение к которой будет через наибольший промежуток времени по срав всеми остальными страницами. Можно показать, что этот алгоритм приводит ^ минимальному количеству прерываний из-за отсутствия страницы [BEL/M36]* ...- энятно, что реализовать такой алгоритм невозможно, поскольку для этогр сие ^ ме требуется знать все будущие события. Однако этот алгоритм является стан- щ ртом, с которым сравниваются реальные алгоритмы. "^Г \ На рис. 8.15 приведен пример оптимальной стратегии. Предполагаете » что я данного процесса используется фиксированное распределение кадров иксированный размер резидентного множества, состоящего из трех кал ов). лполнение процесса приводит к обращениям к пяти различным страница. . В оцессе работы обращения к страницам выполняются в следующем порядке: >#< 232152453252 ^ Оптимальная стратегия приводит после заполнения всего множества кадров к ем прерываниям обращения к странице (обозначенным на рисунке буквами F) Стратегия дольше всех неиспользовавшегося элемента замещает в па тИ страницу, обращений к которой не было дольше, чем к другим. Сог асн инципу локализации можно ожидать, что эта страница не будет использо в.^ъ и в ближайшем будущем. Эта стратегия и в самом деле недалека от 0 та' льной. Основная проблема заключается в сложности ее реализации. Од и эиантов реализации предполагает отмечать время последнего обращ* я жнице; это должно делаться при каждом обращении к памяти, независимо ° "о, выполняется ли обращение к коду или данным. Даже в случае аппаратно 6 Часть 3. Д *ть -/за поддержки этой схемы накладные расходы слишком велики. Еще один вариант предполагает поддержание стека обращений к страницам, что тоже обходится недешево для производительности системы. Обращения («страницам 232152453252 Оптимальный алгоритм 2 2 3 2 3 2 3 1 2 3 5 F 2 3 5 4 3 5 F 4 3 5 4 3 5 2 3 5 F 2 3 5 2 3 5 Алгоритм дольше всех неиспользовавшегося 2 2 3 2 3 2 3 1 2 5 1 F 2 5 1 2 5 4 F 2 5 4 3 5 4 F 3 5 2 F 3 5 2 3 5 2 Алгоритм "первым вошел — первым вышел" 2 2 3 2 3 2 3 1 3 1 5 2 1 5 2 4 5 2 4 3 2 4 3 2 4 F F F F 3 5 4 F 3 5 2 F Часовой алгоритм Т 2* 3* —► >• 3* —► 2* 3" 1* "? 1 5* 2* 1 5* 2* 4* —» ^ Т 4* з"Н ГзП-» з* -» у 2_-*_2l_ _i_ _2! 4 4 5* 5* .F F F F F Рис. 8.15. Поведение четырех алгоритмов замещения страниц На рис. 8.15 приведен пример выполнения алгоритма дольше всех неиспользовавшегося элемента с тем же потоком данных, что и для оптимального алгоритма. Стратегия "первым вошел — первым вышел" рассматривает кадры страниц процесса как циклический буфер, с циклическим же удалением страниц из него. Все, что требуется для реализации этой стратегии, — это указатель, циклически проходящий по кадрам страниц процесса. Таким образом, это одна из простейших в реализации стратегий замещения. Логика ее работы заключается в том, что замещается страница, находящаяся в основной памяти дольше других. Однако далеко не всегда эта страница редко используется; очень часто некоторая область данных или кода интенсивно используется программой, и страницы из этой области при использовании описанной стратегии будут загружаться и выгружаться вновь и вновь. На рис. 8.15 описанная стратегия приводит к шести прерываниям из-за от- сУтствия страницы. Заметим, что предыдущая стратегия распознает, что чаще Других используются страницы 2 и 5, в то время как стратегия "первым вошел — первым вышел" на это неспособна. Хотя стратегия дольше всех неиспользовавшегося элемента и близка к оп- имальной, она трудна в реализации и приводит к значительным накладным Расходам. Стратегия "первым вошел — первым вышел" реализуется очень про- °. но относительно редко приводит к хорошим результатам. В течение долгого Ремени разработчики операционных систем испытывали различные алгоритмы, Ыт&ясь достичь увеличения производительности стратегии дольше всех неис- ..? Лава 8. Виртуальная память 417
звавшегося элемента при значительном снижении накладных расходе ie из этих алгоритмов представляют собой варианты схемы, известно^ Ка ' ш стратегия (clock policy). Ф *',. $ простейшей схеме часовой стратегии с каждым кадром связывается"шин нительный бит, известный как бит использования. Когда страница вдервые "' •кается в кадр, бит использования устанавливается равным 1. При после- их обращениях к странице, вызвавших прерывание из-за отсутствия стра- этот бит устанавливается равным 1. При работе алгоритма замещения ество кадров, являющихся кандидатами на замещение (текущий процесс :ьная область видимости, вся основная память или глобальная область ви* ■ти5), рассматривается как циклический буфер, с которым связан ураза- При замещении страницы указатель перемещается к следующему кадру < »е. Когда наступает время замещения страницы, операционная система ска * •т буфер для поиска кадра, бит использования которого равен 0. Всякий согда в процессе поиска встречается кадр с битом использования, равным 1* расывается в 0. Первый же встреченный кадр с нулевым битом исподьзова- 1ыбирается для замещения. Если все кадры имеют бит использования, рав* 1, указатель совершает полный круг и возвращается к начальному положе заменяя страницу в этом кадре. Как видим, эта стратегия схожа со страте- "первым вошел — первым вышел", но отличается тем, что кадры, имеющие :овленный бит использования, пропускаются алгоритмом. Буфер кадров гиц представлен в виде круга, откуда и произошло название стратегии. Ряд щионных систем используют различные варианты часовой стратегии яшер, Multics [CORB68]). На рис. 8.16 приведен простейший пример использования часовой трате Для замещения доступны п~[ кадры основной памяти, представл^ ые в циклического буфера. Непосредственно перед тем, как заместить с иду рере загружаемой из вторичной памяти страницей 727, указатель,, .(буфере эгзает на кадр 2, содержащий страницу 45. Теперь приступим к выполнению юго алгоритма. Поскольку бит использования страницы 45 в кадре равен а страница не замещается; вместо этого ее бит использования сбрасывается, 1затель перемещается к следующему кадру. Не замещается также страница 43 кадра 3; в соответствии с алгоритмом сбрасывается ее бит использования. эдующем кадре (номер 4) бит использования страницы равен 0. Таким обра- страница 556 замещается загружаемой в основную память страницей 727, использования которой устанавливается равным 1. Далее указатель фера ходит к кадру 5, и на этом выполнение алгоритма завершается. Дляфвоно- места на рис. 8.16 бит использования обозначен как use. ?*i& Поведение часового алгоритма показано на рис. 8.15. Наличие зв$, оЧК чает, что бит использования соответствующей страницы равен 1, а стрелочь ывает текущее положение указателя. Заметим, что данный алгоритм « защитить страницы 2 и 5 от замещения. ■ V ■ w Концепция области видимости рассматривается в подразделе "ОбластпМу. замещения'' на стр. 424. 7'- '* Часть 3. Первый кадр буфера кадров, являющихся кандидатами для замещения .драница 22 8 luse = 0 а) Состояние буфера непосредственно перед замещением страницы л-1 б) Состояние буфера непосредственно после замещения страницы Рис. 8.16. Пример работы часового алгоритма 4«ia Ва 8. Виртуальная память 419
•la рис. 8.17 показаны результаты эксперимента ([BAER80]), в кот ивались четыре рассмотренных в этом разделе алгоритма; предполаг оличество отводимых процессу кадров постоянно. Результат основан щ'' \ ,НИи 0.25х106 обращений к памяти в программе на языке FORTRAN tj: ованяем страниц размером 256 слов. Эксперимент проводился с тлд*"рщя юцессу 6, 8, 10, 12 и 14 кадров. Различия в используемых алгоритмах'*^,, четко видны при малом количестве кадров (при этом алгоритм "перв. ; л — первым вышел" более чем в два раза хуже оптимального). Практи^ •акие же результаты представлены в [FINK88], где максимальное отклове> гакже оказывалось больше, чем в 2 раза. В этой работе моделировал^ лие различных стратегий на сгенерированной последовательности обра?ц^ с страницам длиной 10000 обращений к виртуальному пространству из | [иц. Для достижения эффекта локализации использовалось экспоненци w аспределение вероятности ссылок к конкретной странице. Алгоритм 40 ^"первым вошел — первым вышел" ° 5 со =} о. га сг °- ^ о ее о о :=- ш _ о 35 30 25 20 15 10 5 Часовой алгоритм Алгоритм дольше всех неиспользо- вавшегося Оптимальный алгоритм f i "■isf. •Ж. 6 8 Ю Количество выделенных кадров Рис. 8.17. Сравнение различных стратегий замещения страниц Проводились также исследования по сравнению алгоритмов при раейред - си переменного количества кадров процессу, а также при глобальной И о- ,ной областях видимости ([CARR81, CARR84]). Как выяснилось, по про зв. льности часовой алгоритм наиболее близок к алгоритму дольше всех^ не .зовавшегося. ' ко- Повысить эффективность часового алгоритма можно путем увеличении! :ства используемых при его работе битов6. Во всех поддерживающих, ^ *ую организацию процессорах с каждой страницей в основной памяти ^-*.fl дельно, с каждым кадром) связан бит модификации. Этот бит испольэу_. указания того, что данная страница не может быть замещена до тех^ 1 ее содержимое не будет записано обратно во вторичную память. Это.Ъ Q :ет использоваться часовым алгоритмом следующим образом. Приним , .* 6 С другой стороны, уменьшение количества битов до нуля дает нам а вым вошел — первым вышел". «^ п- ) Часть 3. мят внимание биты использования и модификации, все кадры можно разделить на четыре категории: • использован давно, не модифицирован (и = 0, т = 0); • использован недавно, не модифицирован (и = 1, т = 0); • использован давно, модифицирован (и = 0, т = 1); • использован недавно, модифицирован (и — 1, т = 1). Используя эту классификацию, изменим часовой алгоритм, который теперь будет описан следующим образом. 1. Сканируем буфер кадров, начиная с текущего положения. В процессе сканирования бит использования не изменяется. Первая же страница с состоянием (и = 0, т = О) замещается. 2. Если выполнение первого шага алгоритма не увенчалось успехом, ищем страницу с параметрами (и = 0, т = 1). Если таковая найдена, она замещается. В процессе выполнения данного шага у всех просмотренных страниц сбрасывается бит использования. 3. Если выполнение предыдущего шага не дало результата, указатель возвращается в исходное положение, но у всех страниц значение бита использования сброшено в 0. Повторим, шаг 1 и, при необходимости, шаг 2. Очевидно, на этот раз требуемая страница будет найдена. Итак, часовой алгоритм циклически проходит по всем страницам буфера в поисках страницы, которая не была модифицирована со времени загрузки и давно не использовалась. Такая страница — хороший кандидат на замещение, особенно с учетом того, что ее не надо записывать на диск. Если при первом проходе кандидатов на замещение не нашлось, алгоритм снова проверяет буфер, теперь уже в поисках модифицированной, давно не использовавшейся страницы. Хотя такая страница и должна быть записана перед замещением, в соответствии с принципом локализации она вряд ли понадобится в ближайшем будущем. Если и этот проход окажется неудачным, все страницы помечаются как давно не использованные, и выполняется третий проход. Такой алгоритм использован в схеме виртуальной памяти Macintosh [GOLD89], представленной на рис. 8.18. Положительный момент этого алгоритма состоит, в отличие от простого часового алгоритма, в преимуществе замены не изменявшихся страниц по сравнению с заменой модифицированных страниц. Буферизация страниц Хотя алгоритмы дольше всех неиспользовавшегося и часовой и превос- °Дят алгоритм "первым вошел — первым вышел", они оба сложны и имеют веские накладные расходы по сравнению с последним. Кроме того, следует итывать, что стоимость замещения модифицированной страницы выше оимости замещения немодифицированной, которую не надо записывать во коричную память. Есть еще' одна интересная стратегия, которая может повысить производи- льность страничной организации при использовании простейшего алгоритма смещения. Это — буферизация страниц, использованная в VAX VMS. В качест- алгоритма замещения страниц используется простейший алгоритм "первым Лава 8. Виртуальная память 421
з?ч i — первым вышел". Для повышения его производительности заметдёц^д ица не теряется, а вносится в один из двух списков: в список свободНЬ1Х; иц, если страница не модифицировалась, или в список модифицированных иц! Заметим, что физически страница не перемещается — вместо это ее ь удаляется из таблицы страниц и переносится в список свободных тавд ж0#. жированных страниц. .:#j| Первый кадр буфера кадров, являющихся кандидатами для замещения Следующая замещенная 3 Последняя замещенная ]<^tm "Ш .Ж3^ Ж •■**№ ж 6 5 Рис. 8.18. Часовой алгоритм замещения страниц [GOLD89J '-.V.,' я Список свободных страниц представляет собой список кадров страниц, цля чтения. VMS пытается постоянно поддерживать некоторое небольшое; о свободных кадров. Когда страница считывается в кадр, используется^, шоженный в начале списка; при этом страница, находившаяся в нем гожается. При замещении ^модифицированной страницы она остается в ее кадр добавляется к концу списка свободных страниц; аналогично, мо ^ ванная страница добавляется к списку модифицированных страниц. Важным аспектом этих перемещений является то, что замещаемые CTJ? стаются в памяти. Следовательно, если процесс обращается к такой .<йф >на возвращается в резидентное множество процесса без значительны*- В действительности, списки свободных и модифицированных сгр&т0>- г от в качестве кэша страниц. Список модифицированных страниц поз ^ сывать их не по одной, а кластерами, что существенно снижает кол^ аций ввода-вывода, а следовательно, и время обращения к диску- ■ ^ Простейшая версия буферизации страниц реализована в операционно ^^ Mach [RASH88]. В этой операционной системе не делается различий^ [фицированными и ^модифицированными страницами. ■ш it Часть 3. ять Стратегия замещения и размер кэша Как отмечалось ранее, размер основной памяти со временем становится все больше, как, впрочем, и размер приложений. Утешением может служить то, что размеры 4кэшей также увеличиваются. Большие — до нескольких мегабайтов — кэши в настоящее время вполне возможны [BORG90]. При использовании кэшей ботьшого размера замещение страниц виртуальной памяти может влиять на Производительность. Если кадр страницы, выбранный для замещения, располагается в кэше, то вместе с потерей страницы из блока кэша теряется весь блок. В системах с использованием буферизации того или иного вида производительность кэша можно увеличить путем добавления к стратегии замещения стратегию размещения страниц в буфере. Большинство операционных систем размещают страницы в буфере в произвольных кадрах, как правило, с использованием алгоритма "первым вошёл — первым вышел". Исследования в [KESS92] показали, что правильный выбор стратегии размещения может привести к уменьшению неуспешных поисков в кэше на 10-20%. В [KESS92] описаны исследования ряда алгоритмов размещения в зависимости от структуры кэша и используемых стратегий. Суть этих стратегий состоит в размещении последовательных страниц в основной памяти таким образом, чтобы минимизировать количество кадров страниц, отображаемых в одни и те же слоты кэша. Управление резидентным множеством Размер резидентного множества При использовании страничной виртуальной памяти для подготовки процесса к выполнению нет необходимости размещать в основной памяти все его страницы. Следовательно, операционная система должна принять решение о том, какое количество страниц следует загрузить, т.е. какое количество памяти выделяется конкретному процессу. Здесь играют роль ряд факторов. • Чем меньше памяти выделяется процессу, тем большее количество процессов может одновременно находиться в основной памяти. Это увеличивает вероятность того, что операционная система в любой момент времени найдет как минимум один готовый к выполнению процесс и, следовательно, снижает затраты времени на свопинг процессов. • При относительно небольшом количестве страниц процесса, размещенных в основной памяти, несмотря на принцип локализации частота возникновения прерываний из-за отсутствия страницы будет достаточно велика (см. рис. 8.11,6). После определенного предела дополнительное выделение основной памяти некоторому процессу в соответствии с принципом локализации не будет приводить к сколь-нибудь значительному снижению частоты возникновения прерываний из-за отсутствия страницы. С учетом *этих факторов в современных операционных системах использу- Q Я ДВа типа стратегий. Стратегия фиксированного распределения выделяет Цессу фиксированное количество кадров основной памяти, в пределах кото- °н выполняется. Это количество определяется в момент начальной загрузки ^-яава 8- Виртуальная память 423
! оздании процесса) и может быть определено на основании типа пйй а„ « ^ ч * ~ *, есса активный, пакетный и т.п.) либо на основании указании програ " 1с ястемного администратора. При использовании стратегии фиксиров но ^деления прерывание из-за отсутствия страницы приводит к замеще^и»-- «мой страницей одной из страниц процесса. "'""■' 'тратегия переменного распределения позволяет количеству выделен [роцессу кадров страниц изменяться во время работы процесса. В идеа оцессу, который страдает от большого количества прерываний из-"" от- шя страницы, выделяются дополнительные кадры страниц; и напротив цесса, при работе которого таких прерываний относительно мало, могут - изъяты кадры в расчете на то, что это не намного увеличит частоту кновения прерываний. Использование стратегии переменного распреде [ связано с концепцией области видимости замещения, речь о которой :т в следующем подразделе. Стратегия переменного распределения представляется более мощной, одна- удности данного подхода состоят в том, что операционная система при это на отслеживать поведение процессов. Это приводит к очень высоким на [ым расходам, зависящим от возможностей аппаратного обеспечения кон :ой платформы. Область видимости замещения Область видимости стратегии замещения можно классифицировать как 1ьную или глобальную. Стратегии обоих типов активируются прерыва- обращения к странице при отсутствии свободных кадров. Локальная 'егия замещения выбирает страницу только среди резидентных страниц процесса, который стал причиной прерывания. Глобальная стратегия щения рассматривает в качестве кандидатов на замещение все незабло ванные страницы в основной памяти, независимо от принадлежности ретной страницы тому или иному процессу. Хотя локальная cTpat гия i ie для анализа, нет убедительных доказательств того, что она дае „ луч результаты по сравнению с глобальной стратегией, которая привлекав i простотой реализации и минимальными накладными расходами Ж84, МАЕК87]. Имеется связь между областью видимости замещения и размером рези ного множества (табл. 8.4). Фиксированное резидентное множество при т к локальной стратегии замещения — для поддержания фиксированно 1змера резидентного множества удаляемая из основной памяти стр нии> сна быть замещена другой страницей того же процесса. Стратеги^ пеР [ого распределения, естественно, совместима с глобальным замещен ie ■ на страницы одного процесса в основной памяти страницей другого про- а приводит к перераспределению размеров содержащихся в основной п i частей процессов. Мы также узнаем, что переменное распределен^ ет работать и с локальным замещением. А теперь рассмотрим все т ожных сочетания в отдельности. .,,. Часть 3. мяТ Таблица 8.4. Управление резидентным множеством Локальное замещение Глобальное замещение фиксированное распределение Переменное распределение • Количество кадров процесса фиксировано • Страница для замещения выбирается среди выделенных процессу кадров Количество выделенных процессу кадров может время от времени "изменяться Страница для замещения выбирается феди выделенных процессу кадров Невозможно Страница для замещения выбирается среди всех доступных кадров в основной памяти; это приводит к изменению размера резидентного множества процесса Фиксированное распределение, локальная область видимости Имеется работающий процесс, количество кадров основной памяти которого фиксировано. При прерывании обращения к странице операционная система должна выбрать для замещения страницу среди резидентных страниц данного процесса. Для этого может использоваться один из рассмотренных нами алгоритмов. При фиксированном распределении необходимо заранее решить вопрос о количестве выделяемых процессу кадров. Это решение может быть принято в зависимости от типа приложения и количества памяти, запрашиваемого программой. У такого подхода два основных недостатка. Если выделить процессу слишком малую память, получим высокую частоту возникновения прерываний обращения к памяти, что, в свою очередь, ведет к снижению производительности многозадачной системы. Если же выделить процессу неоправданно много памяти, то в основной памяти удастся разместить слишком мало программ, и производительность системы будет снижена за счет необходимости частого выполнения свопинга. Переменное распределение, глобальная область видимости Эта комбинация, вероятно, наиболее проста в реализации и принята во многих операционных системах. В любой момент времени в основной памяти имеется несколько процессов, каждому из которых выделено некоторое количество кадров. Обычно операционная система поддерживает также список свободных кадров. При возникновении прерывания обращения к странице к резидентному множеству процесса добавляется свободный кадр, и затребованная страница загружается в него. *аким образом, размер процесса постепенно растет, что должно снижать общее количество прерываний из-за отсутствия страницы в системе. Сложность при таком подходе заключается в выборе страницы для замеще- *я. Когда свободные кадры оказываются израсходованными, операционная сис- ел*а должна выбрать для замещения страницу, находящуюся в данный момент основной памяти. Этот выбор производится из всех незаблокированных стра- б ^ В Памяти- %При использовании любой из рассмотренных ранее стратегий вы- Раемая страница может принадлежать любому из резидентных процессов; не " с твУет способа для определения того, какой из процессов должен потерять • Раницу их своего резидентного множества. Таким образом, снижение размера -, ; иДентного множества процесса может оказаться не оптимальным. *ава 8. Виртуальная память 425
'■'■М Одним из способов учета потенциальных проблем с производитель ог переменном распределении с глобальной областью видимости являете ,зование буферизации страниц. В этом случае выбор замещаемой страш ieT меньшую роль, так как страница может быть восстановлена, есл 0g ие к ней будет выполнено до очередного перемещения на диск. """" S ->■• я Переменное распределение, локальная область видимости ^ С помощью данной стратегии делается попытка преодолеть проблем^ вп, ающие при использовании стратегии глобальной области видимости. Вкрати ожно описать следующим образом. ' •. 'i ■ Н При загрузке нового процесса в основную память ему в качестве резидентного множества выделяется некоторое количество кадров страниц; количество кадров определяется исходя из типа приложения, запроса программы или на основе других критериев. Для заполнения резидентного множества используется стратегия выборки по требованию либо предварительная выборка. '' При возникновении прерывания из-за отсутствия страницы страница для замещения выбирается среди резидентного множества процесса, сгенерировавшего прерывание. Время от времени выполняется переоценка распределения памяти процессам, которая приводит к увеличению или уменьшению размера выделяемой процессу памяти для повышения общей производительности системы. При использовании данной стратегии решение об увеличении или уменыпе- размера резидентного множества принимается на основе оценки ожидаемых ований активных процессов. Такая оценка делает эту стратегию бол слож- чем простая стратегия глобального замещения, но приводит к повышению ;зводительности системы. Ключевыми элементами стратегии переменного распределения с локальной стью видимости являются критерии, используемые для определения размера центного множества и момента внесения изменений. Одна из стратегий, ча- 1ругих упоминаемая в литературе, известна как стратегия рабочего мно (working set strategy). Хотя ее реализация очень сложна, следует изучит ую стратегию хотя бы как критерий для оценки других. ц' Рабочее множество представляет собой концепцию, введенную ДенИ ning) и популяризованную в работах [DENN68, DENN70, DENNSObj? ? ;епция оказала большое влияние на разработку систем управлениЯ|В Р ой памятью. Рабочее множество W[t.&) с параметром А процесса 8£, ирту- ый момент времени t представляет собой множество страниц, к йр^торы ,есс обращался за последние Д единиц виртуального времени. Здесь, ^ы * зуем концепцию виртуального времени, которое является времене^^е выполнения процесса. Его можно измерять в командах процессора.^ к команда представляет собой одну единицу виртуального времени. £&& tf Рассмотрим каждую из двух переменных W. Переменная Д — это^ *-н зь которое мы наблюдаем за процессом. Размер рабочего множеств»: ЯР 1яет собой неубывающую функцию от размера окна. В табл. 8.5 (Щ?"*0^ JH85]) показаны последовательности обращений процесса к страниц таблице обозначают моменты времени, когда рабочее множество не # У i ' -sfc р ' V*. Часть £* "> яТЬ л0еь- Обратите внимание — чем больше размер окна, тем больше и рабочее м1южество. Это можно выразить следующим соотношением: Таблица 8.5. Зависимость размера рабочего множества процесса от размера окна Последовательность 0б ращений к страницам 24 15 18 23 24 17 18 24 18 17 17 15 24 17 24 18 2 -24 24 15 15 18 18 23 23 24 24 17 17 18 18 24 • 18 17 17 17 15 18 24 24 17 • 24 18 Размер 3 24 24 15 24 15 18 15 18 23 18 23 24 23 24 17 24 17 18 • 18 24 24 18 17 18 17 17 15 17 15 24 • 24 17 17 24 18 окна А 4 24 24 15 24 15 18 24 15 18 23 • 18 23 24 17 • 24 17 18 • • • 18 17 15 17 15 24 • • 17 24 18 5 24 24 15 24 15 18 24 15 18 23 • 15 18 23 24 17 18 23 24 17 • 24 17 18 • • 24 18 17 15 • 17 15 24 • 15 17 24 18 \ Рабочее множество является также функцией и от времени. Если продолжительность процесса более Д единиц времени и он использует только одну страницу, то |№'^,дм = 1 . Рабочее множество процесса может расти с той же скоростью, что и количество страниц процесса N, если при его выполнении происходят обращения к различным страницам и если это позволяет выбранный размер окна, т.е. l<|w(f,A)|<min(A,N) На рис. 8.19 показан один из вариантов изменения во времени размера рабочего множества при фиксированном значении Д. Для многих программ периоды относительно стабильного рабочего множества чередуются с периодами быстрых изменений. В начале выполнения процесса рабочее множество быстро растет за счет обращения к новым страницам. В итоге в соответствии с принципом локализадии процесс должен стабилизироваться с определенным множеством страниц. Последующие переходные периоды отражают изменение стабильного состояния. В это время некоторые старые страницы все еще остаются в пРеделах окна Д, вызывая всплеск рабочего множества при обращении процесса Глава 8. Виртуальная память 427
ювым страницам. Постепенно старые страницы уходят из окна, и в окде-tjc, отся только страницы, соответствующие новой локализации процесса. .rtiS' ■ '£ а* к^? Переходный период Переходный период Переходный период Переходный период Период стабильности Период стабильности Период стабильности Период стабильности щ? Рис. 8.19. Типичная диаграмма изменения размера рабочего множества [МАЕК87}* Концепция рабочего множества может использоваться стратегией определе [я размера резидентного множества. 1. Отслеживаем рабочее множество каждого процесса. 2. Периодически удаляем из резидентного множества страницы, не входящие в рабочее множество. 3. Процесс может выполняться только тогда, когда его рабочее множество ;|Ш ходится в основной памяти (т.е. его резидентное множество включае^ ра чее множество). ; : Эта стратегия, использующая принцип локализации, должна миним з .. ть количество прерываний из-за отсутствия страниц, но, к сожаленикь|^пр ом возникает ряд проблем. щ 1. По прошлому не всегда можно судить о будущем. Как размер раО че множества, так и его состав время от времени изменяются (см., напр Mepi рис. 8.19). ■'$ 2. Определение рабочего множества каждого процесса непрактично. Для этого обходимо помечать время обращения каждого процесса к каждой стрвязля использованием виртуального времени процесса, а также поддерживатьг упор доченную по времени обращения очередь страниц для каждого процесса.; 28 Часть 3. ть 3. Оптимальное значение Д неизвестно и для разных ситуаций может быть различным. Тем не менее сама идея данной стратегии вполне корректна, и ряд операционных систем пытаются к ней приблизиться. Один из способов сделать это заключается не в работе с конкретными обращениями к страницам, а в работе с уровнем генерации данным процессом прерываний из-за отсутствия страницы. Как показано на рис. 8.11,6, с ростом резидентного множества процесса уровень генерации прерываний падает. Таким образом, вместо непосредственного отслеживания рабочего множества мы можем получить сравнимые результаты путем отслеживания уровня генерации прерываний. Если уровень генерации прерываний у какого-то процесса ниже некоторого минимального порога, система может выиграть, назначив данному процессу резидентное множество меньшего размера (и освободив кадры основной памяти для других процессов) без ущерба для этого процесса. Если же для некоторого процесса уровень генерации прерываний превысил некоторое максимальное пороговое значение, то следует, по возможности, увечичить размер его резидентного множества. Соответствующий этой стратегии алгоритм называется алгоритмом частоты прерываний обращения к странице (page fault frequency — PFF) [CHU72, GUPT78]. Этот алгоритм требует наличия у каждой страницы в основной памяти бита использования, устанавливаемого равным 1 при обращении к странице. Когда возникает прерывание обращения к странице, операционная система замечает виртуальное время с момента последней генерации прерывания из-за отсутствия страницы данным процессом; это осуществляется посредством счетчика обращений к страницам. Если прошедшее с момента последнего прерывания время меньше определенного порога F, то страница добавляется к резидентному множеству процесса. В противном случае все страницы с битом использования, равным О, сбрасываются, и, соответственно, уменьшается резидентное множество процесса. В этот же момент битам использования всех оставшихся страниц присваивается нулевое значение. Стратегия может быть усовершенствована с помощью двух пороговых значений — верхнего порога, используемого для роста резидентного множества, и нижнего, по достижении которого резидентное множество уменьшается. Промежутки времени между прерываниями обращения к странице соответствуют частоте генерации прерываний. Хотя лучшим методом представляется измерение средней частоты генерации прерываний обращения к странице, измерение промежутков времени между ними представляет собой вполне разумный компромисс, позволяющий принимать решения о размере резидентного множества. При использовании такой стратегии совместно с буферизацией страниц Должны получаться неплохие результаты. Тем не менее этот подход имеет один существенный недостаток, заключающийся в его неработоспособности в момент перехода процесса из одного локализованного состояния в другое. В этот момент частота генерации прерываний обращения к страницам резко возрастает, что, в соответствии с рассмотренным ал- г°ритмом, вызывает резкое увеличение размера резидентного множества и может привести к таким нежелательным результатам, как деактивация и свопинг других процессов. Обойтись небольшими накладными расходами в переходные периоды при- вана стратегия рабочего множества с переменным пробным интервалом Variable-interval sampled working set — VSWS) [FERR83]. Эта стратегия вычис- !*лава 8. Виртуальная память 429
■ размер рабочего множества процесса по пробным образцам на основе и него виртуального времени. В начале пробного интервала бит использована резидентных страниц процесса сбрасывается; в конце интервала бит и -пол ния установлен только у тех страниц, к которым в этом интервале было ofi ение. Эти страницы остаются в резидентном множестве в течение след те нтервала времени; остальные страницы сбрасываются. Таким образом пая резидентного множества может уменьшаться только в конце к дого ;рвала. В течение интервала страницы, вызвавшие ошибку обращени д0- [яются к резидентному множеству (таким образом, в это время размер рези 'ного множества не убывает). -V» Стратегия VSWS руководствуется тремя параметрами: - минимальная продолжительность пробного интервала; максимальная продолжительность пробного интервала; f* - допустимое количество прерываний обращения к странице, которые акь. гут произойти между пробными интервалами. Стратегия VSWS работает следующим образом. Если виртуальный промежуток времени с момента последнего пробного интервала достиг L, процесс приостанавливается и выполняется сканирование битов использования. Если до истечения виртуального времени L произошло Q прерываний обращения, то; а) если виртуальное время с момента последнего пробного интервала меньше М, мы ожидаем, пока не пройдет этот промежуток времени, чтобы приступить к сканированию битов использования; б) если же это время не меньше М, процесс приостанавливается и начинается сканирование битов использования. Значения параметров выбираются такими, чтобы обычно процесс сканиро- ия запускался по достижении Q-ro прерывания обращения к странице; ос- ьные два параметра служат граничными значениями для исключительных овий. С помощью стратегии VSWS делается попытка снизить пиковые требо- ия к памяти, вызываемые переходами процесса от одной локализации к ДРУ- путем сброса неиспользуемых страниц при учащении генерации прерываний ащения. Опыт использования этой стратегии в операционной системе для Ьнфреймов GCOS 8 показывает, что стратегия VSWS столь же проста В реали- ,ии, как и стратегия PFF, но при этом более эффективна [PIZZ89]. •'• ратегия очистки '** Стратегия очистки является противоположностью стратегии выборки- «• ;ача состоит в определении момента, когда измененная страница долж гь записана во вторичную память. Два основных ее метода — очистка !бованию и предварительная очистка. При очистке по требованию стран записывается во вторичную память только тогда, когда она выбирав * замещения. Предварительная очистка записывает модифицироваЯЯ >аницы до того, как потребуются занимаемые ими кадры, так ЧТО э >аницы могут записываться пакетами. О Часть 3. т Имеется опасность прямолинейного следования любой из стратегий. При предварительной очистке записанная страница остается в основной памяти до тех пор, пока ее не удалит оттуда алгоритм замещения. Предварительная очистка позволяет записывать страницы пакетами, но не имеет смысла записывать сотни или тысячи страниц только для того, чтобы убедиться, что до замещения они вновь успели модифицироваться. Пропускная способность вторичной памяти ограничена и не должна засоряться излишними операциями очистки. С другой стороны, при очистке по требованию запись модифицированной страницы сопровождается чтением новой страницы, так что несмотря на минимизацию записей страниц прерывание обращения может вызывать пересылку двух страниц между основной и вторичной памятью и тем самым снижать эффективность использования процессора. Улучшенный подход включает буферизацию страниц, что позволяет принять следующую стратегию: очищать только замещаемые страницы, но при этом разделить операции очистки и замещения. При использовании буферизации страниц замещаемые страницы могут находиться в двух списках: модифицированных и немодифицированных страниц. Страницы из списка модифицированных могут периодически записываться пакетами и переноситься в список немодифицированных. Страница из списка немодифицированных страниц может либо быть удалена из него при обращении к ней, либо потеряна при загрузке в ее кадр новой страницы. Управление загрузкой Управление загрузкой^— это определение количества процессов, которые будут резидентными в основной памяти. Стратегия управления загрузкой представляет собой критическую часть эффективно работающей системы управления памятью. Если одновременно резидентны только несколько процессов, то очень часто будет возникать ситуация, когда все процессы будут оказываться заблокированными, и системе придется тратить излишнее время на осуществление свопинга. С другой стороны, если разместить в основной памяти очень много процессов, то в среднем размер резидентного множества каждого процесса окажется Довольно малым, что приведет к слишком частой генерации ошибки обращения и снижению пропускной способности системы. Уровень многозадачности Снижение пропускной способности проиллюстрировано на рис. 8.20. При возрастании уровня многозадачности от малых значений эффективность использования процессора возрастает в связи с уменьшением вероятности одновременного блокирования всех процессов. Однако через некоторое время достигается состояние, когда сРедний размер резидентного множества становится неадекватным. Это приводит к существенному росту количества прерываний обращений к странице и, как следст- Иет к снижению эффективности использования процессора. Имеется ряд вариантов решения этой проблемы. Алгоритмы рабочего множества или частоты генерации прерываний неявным образом включают управские загрузкой. Выполняться могут только те процессы, резидентные множест- а которых достаточно велики. Обеспечивая для каждого активного процесса требуемый размер резидентного множества, используемая стратегия автоматиче- . ^и (и динамически) определяет количество активных программ. 5Лава 8. Виртуальная память 431
a Степень многозадачности -' t j Рис. 8.20. Влияние уровня многозадачности на сте- _ •> пень использования процессора v Еще один подход, известный под названием критерий L = S, был пред южен Деннингом (Denning) и его коллегами [DENN80b]. При этом подходV /ровень многозадачности настраивается таким образом, чтобы среднее время «ежду прерываниями равнялось среднему времени, требующемуся для о ра- эотки прерывания. В результате исследований сделан вывод, что этот уро- зень многозадачности обеспечивает максимальную производительность процессора. Использование стратегии с аналогичным эффектом, предложенно в LER076] и известной как критерий 50%, способствует поддержке степени использования устройства хранения страниц на уровне 50%. Исследования показывают, что при этом также достигается максимальная степень использования процессора. Еще один подход состоит в адаптации часового алгоритма замещения, описанного ранее (см. рис. 8.16). В [CARR84] описана методика с использованием глобальной области видимости, которая включает отслеживание ч с- тоты сканирования циклического буфера кадров. Если частота меньше п -; допределенного нижнего порога, это указывает на то, что возникла одна следующих ситуаций 1 д г" Генерируется малое количество прерываний из-за отсутствия страницы, ^ _ приводит к малому количеству перемещений указателя. :; Среднее количество сканируемых для каждого запроса кадров мало; это говорит о том, что в системе много резидентных страниц, к которым не б обращений и которые могут быть немедленно замещены. •>*» В обоих случаях уровень многозадачности может быть благополучно увел С другой стороны, если частота сканирования превышает верхний по » это указывает либо на большое количество прерываний из-за отсутствия стр ^ цы, либо на сложность обнаружения страниц для замещения, что свидетель^ »У ет о слишком высоком уровне многозадачности. • f чен 432 Часть 3. Па тЬ Приостановка процессов При снижении степени многозадачности один или несколько резидентных в настоящее время процессов должны быть приостановлены (выгружены во вторичную память). В [CARR84] перечислены шесть возможностей • Процесс с наименьшим приоритетом. Так реализована стратегия планировщика, не имеющая отношения к вопросам производительности. • Процесс, вызывающий прерывания. Данный выбор основан на большой вероятности того, что у процесса, генерирующего прерывания из-за отсутствия страницы, рабочее множество не резидентно, и суммарная производительность системы не пострадает при приостановке данного процесса. Кроме того, при таком выборе блокируется процесс, который и так практически все время находится в заблокированном состоянии, так что его приостановка приводит к снижению накладных расходов, связанных с замещением страниц и операциями ввода-вывода. • Последний активированный процесс. Маловероятно, что у этого процесса рабочее множество резидентно. • Процесс с минимальным резидентным множеством. Этот выбор минимизирует будупше затраты на загрузку данного процесса. К сожалению, таковыми являются процессы с высокой степенью локализации. • Наибольший процесс. При этом выборе мы освобождаем большое количество кадров перегруженной процессами памяти, снижая тем самым количество процессов, которые должны быть деактивированы. • Процесс с максимальным остаточным .окном исполнения. В большинстве схем планирования процесс может выполняться только определенное количество квантов времени до прерывания и перемещения его в конец очереди активных процессов. Данный выбор приближается к стратегии планирования, предоставляющей преимущество процессам с наименьшим временем работы. Как и во многих других областях разработки операционных систем, выбор стратегии основан на здравом смысле и зависит от множества факторов, как, например, характеристик выполняемых в системе программ. 183. УПРАВЛЕНИЕ ПАМЯТЬЮ В'ШГХ? Ь И SOLARIS ' Щ- Система управления памятью в UNIX варьируется в разных операционных системах. Ранние версии UNIX использовали переменное распределение памяти ез применения виртуальной памяти. Современные реализации, включая SVR4 и °laris 2.x, используют страничную виртуальную память. В SVR4 и Solaris, по сути, имеются две раздельные схемы управления па- * ятью. Страничная система обеспечивает реализацию возможностей виртуаль- °и памяти, распределяя кадры основной памяти среди процессов а также сре- буферов диска. Хотя описанная схема эффективно работает с пользователь- 'Ими процессами и дисковым вводом-выводом, страничная виртуальная память a-io приспособлена для управления памятью ядра. Для этой цели используется Распределение памяти ядра. Рассмотрим оба механизма. *лава 8. Виртуальная память 433
граничная система Структуры данных Для страничной виртуальной памяти UNIX использует ряд структур IX. которые (с минимальной коррекцией) являются машинно-независим f^a vr. рис. 8.21 и табл. 8.6). • Страница таблиц. Обычно для каждого процесса используется одна таб ицц> страниц, в которой каждой странице виртуальной памяти процесса соотве - ствует одна запись. 1- • Дескриптор дискового блока. В этой таблице каждой странице процесс со % ответствует запись, описывающая дисковую копию этой страницы. Таблица кадров. Описывает каждый кадр реальной памяти; таблица проиндексирована номерами кадров. ' "' Таблица использования свопинга. Для каждого устройства свопинга имеется своя таблица, в которой для каждой страницы на этом устройстве имеет* ся своя запись. ** '&£■ Номер кадра Возраст Копирование при записи Номер устройства свопинга Модифицирована Обращения а) Запись таблицы страниц Номерблока устройства В памяти Защищенной Тип памяти 1'. &-: Состояние страницы б) Дескриптор дискового блока Количество ссылок Логическое устройство Номер блока ••# Указат^лц^ на данные кадра 'J8B Количество ссылок в) Запись таблицы кадров Идентификатор страницы г) Таблица использования свопинга ■1С. 8.21. Структуры данных системы управления памятью UNIX SVR4 7,«С§&, $ < 34 Часть 3. \ ят» Таблица 8.6. Параметры структур данных системы управления памятью UNIX SVR4 Запись таблицы страниц Номер кадра Указывает кадр в реальной памяти. Возраст Указывает, как долго страница находится в памяти без обращения к ней. Длина и содержимое данного поля зависят от используемого процессора. Копирование при записи Устанавливается, когда страница разделяется несколькими процессами. Если один из процессов производит запись в страницу, сначала должны быть сделаны отдельные копии страницы для каждого из совместно использующих ее процессов. Эта возможность позволяет отложить операцию копирования до тех пор, пока она не станет необходима, и избежать ее в тех случаях, когда она не является таковой. Модифицирована Указывает, изменено ли содержимое страницы. Обращения Указывает, что к странице были обращения. Этот бит устанавливается равным нулю при первой загрузке страницы и может периодически сбрасываться алгоритмом замещения страниц. В памяти Указывает, что страница находится в основной памяти. Защищенность Указывает, что разрешена операция записи. \ Дескриптор дискового блока Номер устройства свопинга Номер логического устройства вторичной памяти, хранящей соответствующую страницу. Номер блока устройства Расположение блока страницы на устройстве вторичной памяти. Тип памяти Вторичная память может представлять собой модуль свопинга или исполнимый файл. В последнем случае имеется признак, указывающий, должна ли распределяемая виртуальная память быть предварительно очищенной. Запись таблицы кадров Состояние страницы Указывает, свободен ли кадр или содержит страницу. В этом случае указывает статус страницы: на устройстве свопинга, в выполнимом файле, или выполняется прямое обращение к памяти. Количество ссылок Количество процессов, обращающихся к странице. Логическое устройство Логическое устройство, содержащее копию страницы. Номер блока Расположение блока копии страницы на логическом устройстве. Указатель на данные кадра Указатель на другие записи таблицы в списке свободных страниц и ,в хеш-таблице страниц. Глава 8. Виртуальная память е;
I Окончание Ц'З' Таблица использования свопинга Количество ссылок Кочичество записей таблицы страниц, указывающих на страницы на устройстве cboi Идентификатор страницы Идентификатор страницы в модуле вторичной памяти. Большинство полей, приведенных в табл. 8.6, не требуют пояснений. Поле возраста в записи таблицы страниц указывает, как давно программа не об а- лась к этому кадру. Размер и частота обновления этого поля зависят от кон т- ной реализации. Таким образом, нет универсального использования операционной системой UNIX этого поля при реализации стратегии замещения страниц; Наличие поля типа памяти в дескрипторе дискового блока необходим^ по следующей причине: когда выполнимый файл используется для создания нового процесса, в реальную память может быть загружена только часть кода и данных. Позже, при возникновении прерывания из-за отсутствия страницы, #'память загружаются новые порции кода или данных. Страницы виртуально^ ца- мяти создаются и связываются с определенными положениями на устройстве свопинга только в момент первоначальной загрузки. В этот момент операционная система решает, следует ли очистить (установить равными 0) ячейки кадра страницы перед первой загрузкой блока кода или данных. Замещение страниц ~/. Для замещения страниц используется таблица кадров. Для создания f п сков в этой таблице применяются несколько указателей. Все доступные к р объединены в один список свободных кадров, в которых могут размещат я страницы. Когда количество доступных страниц становится ниже некоторого о- рогового значения, ядро в качестве компенсации отдает ряд страниц загруэк - ных процессов. ^ Алгоритм замещения страниц, использованный в SVR4, представляет^ о- бой усовершенствованный часовой алгоритм (см. рис. 8.16), известный поя званием часового алгоритма с двумя стрелками (рис. 8.22). Этот алгоритм ic пользует бит обращений из записи таблицы страниц для каждой из стр ш памяти, которая может быть выгружена из основной памяти (т.е. не забло i- рована). Этот бит устанавливается равным 0 при первоначальной загру^" страницы, и равным 1 — при обращении к ней для чтения или записи. Пе ний указатель проходит по страницам, содержащимся в списке пригодных, выгрузки страниц, и устанавливает бит обращений каждой из них равны ^0. Несколько позже по тем же страницам проходит задний указатель и провер, т бит обращений. Если он равен 1, значит, к данной странице было обращвй» между проверками ее передним и задним указателями, и такая страница и?»0" рируется. Страница же, бит обращений которой остался равен 0, переносите.^ список выгружаемых страниц. ±* Работа алгоритма определяется двумя параметрами. <:' • Частота сканирования. Частота, с которой указатели сканируют спи о страниц (в кадрах в секунду). ." • Охват. Интервал между передним и задним указателями. я "а Часть 3. Пам Конец списка страниц Начало списка страниц Рис. 822. Часовой алгоритм замещения с двумя стрелками Эти параметры в процессе загрузки операционной системы получают значения по умолчанию, основанные на количестве физической памяти. Частота сканирования в процессе работы может изменяться, чтобы соответствовать изменяющимся условиям работы системы. Параметр линейно изменяется от минимального значения до максимального, определенных при настройке системы, с изменением количества свободной памяти от максимального до минимального — иными словами, чем меньше свободной памяти в системе, чем чаще выполняется сканирование. Охват определяет интервал между указателями и вместе с частотой сканирования определяет промежуток времени, в течение которого к странице должно произойти обращение, чтобы она оставалась в основной памяти. Распределение памяти ядра Ядро в процессе работы часто генерирует и уничтожает маленькие таблицы буфера, память для каждого из которых выделяется динамически. В i AHA96] перечислены следующие примеры. Преобразование имени пути может запросить буфер для копирования имени из пользовательского пространства Подпрограмма allocb О выделяет буфера произвольного размера. Ряд реализаций UNIX выделяют "зомби"-структуры для хранения информации о состоянии выходами использовании ресурсов завершенными процессами. ш ава 8. Виртуальная память- 437
В SVR4 и Solaris ядро динамически распределяет множество объ [таких, как структуры процессов, блоки дескрипторов файлов и др.). ,ш Размер большинства этих блоков гораздо меньше типичного размере\е'тп [ памяти и, соответственно, использование страничного механизма в Д& 0 ie крайне неэффективно. В SVR4 используется модификация системьх" в (описанной в разделе 7.2). :v ■*. Стоимость выделения свободного блока памяти в системе двойников меньше в случае использования стратегий первого или наилучшего подходяще ПГ97]. Однако при управлении памятью ядра выделение и освобождение памяти но выполняться с максимально возможной скоростью. Недостатком же системы шков являются затраты времени на разделение и слияние блоков. Беркли (Barkley) и Ли (Lee) из AT&T предложили модификацию, известную 'ленивая" система двойников [BARK89], которая принята в SVR4. Авторами :ено, что UNIX часто демонстрирует устойчивое состояние памяти ядра, т.е. ко- :тво требующихся блоков определенного размера мало меняется со временем. м образом, вполне возможна ситуация, когда освобождающийся блок размером гвается со своим двойником в блок размером 2" , который тут же вновь разде- я на два блока размером 2' в соответствии с запросом системы. Чтобы избежать нних слияний и разделений блоков, слияние освобожденных блоков отклады я до того момента, когда оно оказывается действительно необходимым (и тогд шодится максимально возможное количество слияний блоков). модифицированной таким образом системе двойников используются ел ще параметры: текущее количество блоков размером 2'; текущее количество занятых блоков размером 2'; А текущее количество глобально свободных блоков размером 2' (Это блоки, пригодные для слияния со своими двойниками. Когда двойник такого блока становится глобально свободным, эти два блока сливаются в глобально свободный блок размером 2'1"1. Все свободные блоки в систе двойников могут рассматриваться как глобально свободные.); текущее количество локально свободных блоков размером 2' (Это блоки, не пригодные для слияния. Даже если двойник такого блока становится свободным, эти два блока не сливаются, а остаются в ожидании последующих запросов на блоки данного размера.). Выполняется следующее соотношение: Д.-;Г 7У,=Д+С( + ^( $ В целом данная система двойников пытается поддерживать пул ло^аль >дных блоков и производит слияние, только когда количество локалый) <* ых блоков превышает предопределенный порог (при наличии СЛЗЙ к лого количества локально свободных блоков возрастает вероятность нед 1 блоков большего размера для удовлетворения требований системы)* ** ом при освобождении блока слияние не выполняется, что минимизирует ные расходы. Никаких различий между локально и глобально свобо ВЫ ами при выделении блока в ответ на запрос системы не делается. . -Z тг «^ * по- Для слияния используется критерий, согласно которому количес , но свободных блоков данного размера не должно превышать количество Часть 3.1L яТ нятых блоков этого размера (т.е. должно выполняться условие Ц < Д.). Это вполне разумный принцип для ограничения количества локально свободных блоков; эксперименты, описанные в [BARK89], подтверждают, что такая схема приводит к значительному снижению стоимости распределения памяти. Для реализации описанной схемы ее авторы определили переменную задержки D, = Д - Ц ~ /V, -2Ц -Gl . Алгоритм схемы приведен в листинге 8.1. Листинг 8.1. Алгоритм "ленивой" системы двойников Начальное значение DL равно О После выполнения операций значение D; изменяется следующим образом (I) Если следующая операция является запросом на выделение\блока: Если,имеется свободный блок, выбрать его Если выбранный блок локально свободен, D,- := Di + 2 иначе D± is* Dx + 1 в противном случае Получить два блока путем разделения большего блока на два меньших (рекурсивная операция). Выбрать один из них, пометив Еторой как локально свободный. / D± остается неизменным (при этом значение D для других размеров блоков может измениться в связи с использованием рекурсивности). (II) Если следующая операция — запрос на освобождение блока При D1 > 2 Пометить блок как локально свободный и освободить его локально Dx := Di -2 При D; = 1 Пометить блок как глобально свободный и освободить его глобально; если это возможно - выполнить слияние блоков. D, := О При Di = О Пометить блок как глобально свободный и освободить его глобально; если это возможно - выполнить слияние блоков. Выбрать один локально свободный блок размером 21 и освободить его глобально; если это возможно - выполнить слияние блоков. D, := О m |?4. УПРАВЛЕНИЕ ПАМЯТЬЮ В LINUX Многие характеристики схем управления памятью других реализаций UNIX тол еНИг^ы и к Linux> однако эта операционная система имеет и свои, присущие « *€сьК° 6Й' особеныости- Вообще говоря, система управления памятью в Linux ма сложна [DUBE98], и здесь мы дадим только краткое ее описание. 5 Л. ^гВа 8. Виртуальная память ' 439
ртуальная память Linux Адресация виртуальной памяти Linux использует трехуровневую структуру таблицы страниц, состоящую из дующих типов таблиц (каждая отдельная таблица имеет размер, равный ;од- '- [ странице). ^, Каталог страниц. Активный процесс имеет единый каталог страниц, размер которого равен одной странице. Каждая запись в каталоге страниц указьгва- ет на одну страницу промежуточного каталога страниц. Каталог страниц активного процесса должен находиться в активной памяти. Промежуточный каталог страниц. Промежуточный каталог страниц мож т охватывать несколько страниц. Каждая запись промежуточного каталога указывает на одну страницу таблицы страниц. Таблица страниц. Таблица страниц также может охватывать несколько страниц. Каждая запись таблицы страниц указывает на одну виртуальную страницу процесса. Для использования трехуровневой структуры таблицы страниц виртуаль [й адрес в Linux рассматривается как состоящий из четырех частей. Лё Оё шболее значащее) поле используется в качестве индекса в каталоге стращсц* вдующее поле служит в качестве индекса в промежуточном каталоге страшвд етье поле представляет собой индекс таблицы страниц, а четвертое — сме е :е в пределах страницы памяти. '??* Структура таблицы страниц Linux платформонезависима и разработана я: боты с 64-битовым процессором Alpha, который обеспечивает аппаратную под ржку трехуровневой страничной организации. При использовании 64-битовьх)с:; ресов использование только двух уровней может привести к тому, что таблйц&Е- каталоги страниц будут очень большими. 32-битовая архитектура Pentium'/9t£ ладает только двухуровневым механизмом страничной организации, и^-йро/,-1- |аммное обеспечение Linux использует двухуровневую схему путем определен^ 1змера промежуточного каталога, равного одной странице. Распределение страниц Чтобы повысить эффективность чтения страниц из основной памяти и за ней страниц в нее, Linux определяет механизм для работы со смежными бло?; ами страниц, отображаемых на смежные блоки кадров страниц. С этой цельк*: mux использует систему двойников. Ядро поддерживает список групп смеж ых кадров фиксированного размера; группа может состоять из 1, 2, 4, 8, 1 и 32 кадров страниц. При выделении и освобождении страниц в основно амяти доступные группы разделяются и объединяются с использованием ал эритма двойников. Алгоритм замещения страниц * «,. Алгоритм замещения страниц Linux основан на часовом ^гоРИТМ*' ^ ^ ом в разделе 8.2 (см. рис. 8.16). В случае использования простого псового оритма с каждой страницей основной памяти связаны биты исПОЛ^ЗОВ^ 8- юдификации. В схеме, применяемой в Linux, бит использования заме£ I Л£\ Часть 3. П ** TI битовой переменной возраста7, значение которой увеличивается при каждом обращении к странице. В фоновом режиме Linux периодически сканирует страницы основной памяти и уменьшает значения их переменных возраста. Страницы с нулевым значением представляют собой "старые" страницы, к которым некоторое время не было обращений и которые являются наиболее подходящими кандидатами для замещения. Чем больше значение возраста страницы, тем чаще она использовалась в последнее время и тем менее она подходит для замещения. Таким образом, алгоритм, используемый в Linux, представляет собой разновидность стратегии замещения наименее часто используемых страниц. Распределение памяти ядра Фундаментомк распределения памяти ядра в Linux является механизм распределения страниц, используемый для управления пользовательской виртуальной памятью. Здесь, как и в схеме виртуальной памяти, используется алгоритм двойникюв, так что память для нужд ядра может выделяться и освобождаться на уровне страниц. Поскольку минимальное количество памяти, которое может быть выделено таким образом, составляет одну страницу, такое распределение неэффективно в связи с частыми запросами на выделение небольших участков памяти разного размера с малым временем жизни. Для повышения эффективности Linux использует схему, известную как кусочное распределение (slab allocation) [BONW94] в пределах выделенной страницы. На машинах Pentium/x86 размер страницы составляет 4 Кбайт, и участки памяти, выделяемые в пределах страницы, могут иметь размеры 32, 64, 128, 252, 508, 2040 и 4080 байт. Такое распределение является относительно сложным и детально здесь не рассматривается; его полное описание можно найти в [VAHA96]. По сути, Linux поддерживает множество связанных списков, по одному для участков каждого размера. Участки могут быть разделены на меньшие или объединены вместе, подобно разделению и слиянию блоков в алгоритме двойников, и перемещаться из одного списка в другой соответственно изменению их размеров. 8.5. УПРАВЛЕ1Ше1пАМЯТЬЮ Т " | В WINDOWS 2000 I Система управления виртуальной памятью Windows 2000 (W2K) контролирует распределение памяти и работу страничной организации. Диспетчер памяти сконструирован для работы на множестве платформ и использует страницы размером от 4 до 64 Кбайт. На платформах Intel, PowerPC и MIPS размер страницы составляет 4096 байт, а у DEC Alpha — 8192 байт. Карта виртуальных адресов W2K Каждый пользовательский процесс W2K получает отдельное 32-битовое аДресное пространство, предоставляющее процессу до 4 Гбайт памяти. По Умолчанию часть памяти зарезервирована для операционной системы, так По сути — частоты использования. — Прим. ред. г *лава 8. Виртуальная память 441 ?
7Я° что каждому пользователю на самом деле доступны 2 Гбайт виртуального адресного пространства, и все процессы совместно используют одни и т& Же 2 Гбайт системного пространства. W2K предоставляет возможность увеличения пользовательского адресного пространства до 3 Гбайт, оставляя системе только 1 Гбайт. В документации W2K указано, что эта возможность предназначена для поддержки интенсивно использующих большое количество памяти приложений, работающих на серверах со многими гигабайтами оперативной памяти, и что использование большего адресного пространства модсет существенно повысить производительность таких приложений, как системы поддержки принятия решений или огромных баз данных. *4 На рис. 8.23 показано виртуальное адресное пространство по умолч ю, видимое пользовательскому процессу. Оно состоит из четырех областей. • От 0x00000000 до 0x0000FFFF: предназначено для помощи программисту в перехвате присвоений указателю NULL. * • От 0x00010000 до 0x7FFEFFFF: адресное пространство, доступное пользователю. Это пространство разделяется на страницы, которые могут быть загружены в основную память. • От 0x7FFF0000O до 0x7FFFFFFF: защитная страница, недоступная пользо- вателю. Эта страница облегчает операционной системе проверку вы ода указателя за границы блока памяти. • От 0x00000000 до OxOOOOFFFF: системное адресное пространство. Этот 2- Гбайтовый процесс предназначен для исполняющей системы W2K, микро-, ядра и драйверов устройств. ** Страничная организация W2K При создании процесса в принципе ему полностью доступно пользователь ское пространство размером 2 Гбайт (минус 128 Кбайт). Это пространство разде ляется на страницы фиксированного размера, каждая из которых может ьщз» загружена в основную память. На практике для простоты учета страница мд находиться в одном из трех состоянии. ^ 1. Доступна. Страница в настоящее время не используется процессом. щ ^ 2. Зарезервирована. Множество смежных страниц, которые диспетчер вир -; альной памяти предназначает процессу, но которые не учитываются в к»0; , памяти процесса до их использования. Когда процесс требует записи ft-**,;, мять, часть зарезервированной памяти передается процессу. (Н| ; 3. Размещена. Страницы, для которых диспетчер виртуальной памяти вь^ ляет память в страничном файле (т.е. дисковом файле, в который загш * ваются страницы при удалении их из основной памяти). ?$ Различие между зарезервированной и размещенной памятью (1) позволяет- минимизировать дисковое пространство, предназначенное определенному пр0* цессу, тем самым сохраняя это пространство для других процессов, и (2) Р * решает потоку или процессу объявить объем памяти, который будет бЫС , выделен при необходимости. 442 Часть 3. Па ят Недоступная пользователю область размером 64 Кбайт" для перехвата присвоений указателю NULL Защитная область размером 64 Кбайт для проверки выхода за пределы значения указателя OxFFFFFFFF Пользовательское адресное пространство размером 2 Гбайт Недоступная пользователю область памяти операционной системы размером 2 Гбайт Рис. 8.23. Виртуальное адресное пространство Windows 2000 по умолчанию Схема управления резидентным множеством, используемая в W2K, — переменное распределение с локальной областью видимости (см. табл. 8.4). При первой активации процесса ему в качестве рабочего множества передается некоторое количество кадров основной памяти. Когда процесс обращается к странице, отсутствующей в памяти, одна из резидентных страниц этого процесса выгружается и на ее место загружается требующаяся страница. Рабочие множества активных процессов настраиваются во время работы с использованием следующих общих соглашений. При большом размере основной памяти диспетчер виртуальной памяти позволяет расти резидентным множествам активных процессов. Для этого при генерации прерывания из-за отсутствия страницы новая страница загружается в память, но старая при этом не выгружается. При малом размере основной памяти диспетчер виртуальной памяти возвращает память системе, удаляя давно не использовавшиеуся страницы из рабочих множеств активных процессов, снижая тем самым их размеры. А Лава 8. Виртуальная память 443
8.6. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ И КОНТРОЛЬНЫЕ ВОПРОСЫ е 3v~& 7 «г# ' I Для эффективного использования процессора и систем ввода-вывода ЖШ& тельно поддерживать в основной памяти как можно большее количество прод"8'% сов одновременно. Кроме того, желательно освободить программиста от ограничений, накладываемых на размер создаваемых им программ. ~rf| Решение обеих задач состоит в использовании виртуальной памяти."При использовании виртуальной памяти все адреса являются логическими, прео&р^ зуемыми в процессе работы в физические. Это позволяет процессу располага *\ в произвольном месте основной памяти, а также изменять свое местополож.е|щ . в памяти в процессе работы. Кроме того, виртуальная память позволяет ра V* лить процесс на несколько частей, которые не обязательно должны располагать, ся в смежных блоках основной памяти, более того — не все должны находи в основной памяти во время работы процесса. |К Виртуальная память опирается на два основных подхода — страничную организацию и сегментацию. При страничной организации каждый процесс разделяется нг относительно малые страницы фиксированного размера. Сегментация же позвф использовать части различного размера. В одной схеме управления памятью могут совместно использоваться и сегментация, и страничная организация. -f Схема управления виртуальной памятью требует как программной, так и аппаратной поддержки. Аппаратная поддержка, обеспечиваемая процессором, вклю динамическое преобразование виртуальных адресов в физические и генерацию прерывания при отсутствии адресуемой страницы или сегмента в основной памяти. Это прерывание обрабатывается программным обеспечением управления памятью. ч При разработке системы управления памятью следует решить множество связанных с ней вопросов, включающих следующие. • Стратегия выборки. Страницы могут загружаться в основную память как по требованию процесса, так и с использованием стратегии предварительной выборки, при которой происходит загрузка страниц кластерами. v> • Стратегия размещения. В случае выбора системы с использованием то ко сегментации все вновь загружаемые сегменты должны быть размещен ч доступном пространстве в памяти. *% , • Стратегия замещения. При заполнении памяти следует принять решение су то какая страница (или страницы) будет замещена загружаемыми в память. :.->; • Управление резидентным множеством. Операционная система дол$К решать, какой именно объем памяти должен быть отведен тому. , ! иному процессу при его загрузке в память. Этот объем может быть в. делен статически, в момент создания процесса, либо изменяться ДИВ мически в процессе работы. • Стратегия очистки. Измененные страницы процесса должны быть запис при их замещении; однако возможно использование стратегии предварительно! очистки, при которой за одну операцию производится запись кластера стран! • • Управление загрузкой. Управление загрузкой заключается в определен! количества процессов, которые должны быть резидентны в основной п , ят в данный момент. 444 Часть 3. П ят Ключевые термины Дссоциативное Пропускная способность отображение Рабочее множество Буфер поиска трансляции Резидентное множество Виртуальная память Сегмент Внешняя фрагментация Сегментация Внутренняя фрагментация Страница Кадр / Страничная организация Кусочное распределение Стратегия выборки Стратегия замещения страниц Локализация Прерывание из-за отсутствия страницы Стратегия размещения страниц Таблица сегментов Таблица страниц Управление резидентным множеством Физическая память Хеширование Хеш-таблица \ Контрольные вопросы 8.1. В чем состоит отличие между простой страничной организацией и страничной организацией виртуальной памяти? 8.2. Поясните эффект снижения пропускной способности системы. 8.3. Почему принцип локализации так важен для использования виртуальной памяти? 8.4. Какие элементы обычно содержатся в записи таблицы страниц? Вкратце опишите каждый элемент. 8.5. В чем заключается цель буфера поиска трансляции (TLB)? 8.6. Вкратце опишите различные стратегии выборки страниц. 8.7. В чем заключается отличие между управлением резидентным множеством и стратегией замещения страниц? 8.8. Как соотносятся между собой алгоритм замещения "первым вошел — первым вышел" и часовой? 8.9. В чем заключается буферизация страниц? 8.10. Почему невозможно объединить стратегию глобального замещения со стратегией фиксированного размещения? 8.11. В чем состоит разница между резидентным и рабочим множествами? 8.12. В чем состоит разница между очисткой по требованию и предварительной очисткой? ИВ! *Л 87. РЕКОМЕНДУЕМАЯ^,ДИТЕ1>АТУР^^:„„ ocBeiTaK И СЛедовало ожиДать, темы, связанные с виртуальной памятью, широко зоп ~^аЮтся в литературе по операционным системам. В [MILE92] приведен об- *>тся я ИЧНЫХ исследований в эт°й области; в [CARR84] подробно рассматривали TDEN>J7m производительности- Заслуживает внимания и классическая ста- Горитм 7°J- B [DOWD93] содержится анализ производительности разных ал- в обпя замещения' а в Ь*АС098а] - обзор современного состояния разработок *ой on ВИртуальной ^мяти. В [JAC098b] рассматриваются вопросы аппарат- Рганизации виртуальной памяти в современных микропроцессорах. % ^Лава 8. Виртуальная память 445_
Всю сложность проблемы демонстрирует работа [IBM86], которая посъпще- аа детальному описанию оптимизации стратегий виртуальной памяти MVS. ;^ Одна из лучших характеристик различных схем управления памятью, Jhc_ пользованных в разных реализациях UNIX, содержится в [VAHA96]. .| CARR84 Сагг R- Virtual Memory Management — Ann Arbor, MI: UMI Research Press, 1984. DENN70 Denning, P. Virtual Memory. — Computing Surveys, September 1у70. DOWD93 Dowdy L., Lowery С P.S. to Operating Systems. — Upper Saddle River, NJ: Prentice Hall, 1993. IBM86 IBM National Technical Support, Large Systems. Multiple Virtual Storage (MVS) Virtual Storage Tuning Cookbook. — Dallas Systems Center Technical Bulletin G320-0597, June 1986. JAC098aJacob В., Mudge T. Virtual Memory: Issues of Implementation.— Computer? June 1998. JAC098b Jacob В., Mudge T. Virtual Memory in Contemporary Microprocessors. -~ IEEE Micro, August 1998. ; ! MILE92 Milenkovic M. Operating Systems: Concepts and Design. — New York- McGraw-Hill, 1992. VAHA96 Vahalia U. UNIX Internals: The New Frontiers. — Upper Saddle River, NJ f. Prentice Hall, 1996. _ __ -.,,_„. 8.8. ЗАДАЧИ 8 1 Предположим, что таблица страниц текущего процесса выглядит так, как показано ниже. Все числа в таблице — десятичные, вся нумерация начинается с нуля, а все адреса представляют собой адреса отдельных байтов памяти. Размер страницы равен 1024 байт. а. Опишите, как именно виртуальный адрес транслируется в физический адр с основной памяти. б. Какой физический адрес (если таковой имеется) соответствует каждому i з приведенных виртуальных адресов? (Вы не должны пытаться обработать прерывание из-за отсутствия страницы). i) 1052 * ii) 2221 iii)5499 446 Номер виртуальной страницы Бит присутствия в памяти 0 0 Бит обращений 1 0 0 0 Бит модификации 0 0 о Номер 4 —■& а Часть З.Й'\*ТЬ 8.2. (В этой задаче, как и в предыдущей, все числа — десятичные, и вся нумерация начинается с нуля). Процессу выделены четыре кадра. Приведенная ниже таблица содержит время последней загрузки страницы в каждый кадр, время последнего обращения к странице в каждом кадре, а также биты обращений (R) и модификации (М). Все временные отрезки приведены относительно начала работы процесса (т.е. указаны промежутки времени от начала работы процесса до осуществления события, а не от события до момента рассмотрения). В настоящий момент генерируется прерывание обращения к странице номер 4. Содержимое какого кадра будет замещено в случае использования каждой из перечисленных стратегий? Поясните ваш ответ. а. Алгоритм "первым вошел — первым вышел". б. Алгоритм дольше всех неиспользовавшегося. в. Часовой алгоритм. г. Оптимальный алгоритм (при использовании указанной далее последовательности обращений к страницам). д. Рассмотрите последовательность обращений к виртуальным страницам: 4, 0, 0, 0, 2, 4, 2, 1, 0, 3, 2. Считая, что приведенное в таблице состояние памяти соответствует моменту непосредственно перед генерацией прерывания из-за отсутствия страницы, определите количество сгенерированных прерываний при использовании стратегии рабочего множества с размером окна, равным 4. Укажите все возникшие при этом прерывания. 8.3. 8.4. 8.5. Номер виртуальной страницы 2 1 0 3 Кадр 0 1 2 3 Время загрузки 60 130 26 20 Время обращения 161 160 162 163 ButR 0 0 1 1 Бит М 1 0 0 1 Процесс обращается к страницам А, В, С, D и Е в следующем порядке: ABCDABEABCDE Примените алгоритм замещения "первым вошел — первым вышел" и определите количество пересылок страниц в процессе выполнения указанных обращений, если работа процесса выполняется с тремя изначально пустыми кадрами основной памяти. Решите ту же задачу для четырех кадров. Процесс содержит восемь виртуальных страниц на диске, и ему выделено четыре фиксированных кадра в основной памяти. Далее выполняются обращения к следующим страницам: 1. 0, 2, 2, 1, 7, 6, 7, 0, 1, 2, 0, 3, 0, 4, 5, 1, 5, 2, 4, 5, 6, 7, 6, 7, 2, 4, 2, 7,,3, 3, 2, 3. а. Укажите последовательность размещения страниц в кадрах при использовании алгоритма замещения наиболее долго не использовавшейся страницы. Вычислите результативность обращения к основной памяти (считаем, что изначально все кадры пусты), о- Выполните то же задание для алгоритма "первым вошел — первым вышел". в- Сравните результативности обращения к основной памяти, вычисленные в первых двух заданиях, и прокомментируйте эффективность использования указанных алгоритмов применительно к данной последовательности обращений. Пользовательские таблицы страниц в VAX располагаются в виртуальных адресах системного пространства. Каковы преимущества такого размещения по *. **5f* 8. Виртуальная память 447
> & м if сравнению с размещением таблиц в основной памяти? Каковы недостатки этл го размещения? 8.6. Предположим, что фрагмент кода for (i = 1; i <= n; i++) a[i] - b[i] + c[i] * выполняется в памяти с размером страницы, равным 1000 слов. Пусть п — 1000. Напишите гипотетическую машинную программу, реализующую приведенный фрагмент (считая, что машина имеет полный набор комаш* д»» пересылки информации между регистрами и может использовать индексные регистры). Затем покажите последовательность обращения к страницам про,, цессе выполнения кода. t 8.7. Архитектура IBM System/370 использует двухуровневую структуру памяти, в которой эти уровни названы сегментами и страницами (несмотря на то что такая сегментация не обладает многими возможностями, рассмотренными в этой главе). Размер страницы в данной архитектуре может быть равен 2 или 4 Кбайт, а размер сегмента, являющийся в данной архитектуре фиксированным, — либо 64 Кбайт, либо 1 Мбайт. В архитектурах 370/ХА и 370 ESA размер страницы равен 4 Кбайт, а размер сегмента — 1 Мбайт. Какие пре- ^ 2 имущества сегментации утрачены данной архитектурой? Какие выгоды прино- ^Щ сит сегментация System/370? * „ 8.8. Предположим, что размер страницы — 4 Кбайт и что запись таблицы страниц Щ занимает 4 байт. Сколько уровней таблиц страниц потребуется для отображе- Ш ния 64-битового адресного пространства, если таблица верхнего уровня зани- **' мает одну страницу? 8.9. Рассмотрим систему с отображением памяти на уровне страниц и использова нием одноуровневой таблицы страниц. Предположим» что нужная нам таблица " М J страниц уже находится в основной памяти. Ж а. Если обращение к памяти занимает 200 ns, чему будет равно время доступа sj§ к страничной памяти? 1 б. Добавим блок управления памятью, который создает накладные расходы в й-| 20 ns как при успешном, так и при неуспешном поиске. Предполагая, чт^^;'•■ Щ результативность поиска в TLB составляет 85%, вычислите эффективна'-?* время доступа к памяти. в. Поясните, как результативность поиска в TLB влияет на эффективное вр М&|-| доступа к памяти. ; 8.10. Рассмотрим последовательность обращения к страницам процесса с изначально пустым рабочим множеством из М кадров. Последовательность обращений к страницам длиной Р содержит N различных номеров страниц. Для произвольного алгоритма замещения страниц определите. а. Нижнюю границу количества прерываний из-за отсутствия страницы.* б. Верхнюю границу количества прерываний из-за отсутствия страницы^ $0р. г 8.11. При обсуждении алгоритма замещения страниц один из авторов провел анаЛрг^Ш^, Jf* i двигающейся по кругу снегоуборочной машиной. Снег равномерно засьшае£-К*р)^ ^: | цевую дорогу, по которой с постоянной скоростью движется снегоочиститель.J^®^*^- ~ отброшенный снегоочистителем, исчезает из рассматриваемой системы. <f ,_,._,%_ а. Какому из рассмотренных в разделе 8.2 алгоритмов соответствует эта аналоги*^; б. Какое предположение о поведении рассматриваемого алгоритма эаМбШе использует данная аналогия? 8.12. В архитектуре S/370 ключ управления памятью представляет собой упр** ляющее поле, связанное с каждым кадром в основной памяти, с размером к ра, равным размеру страницы. Два бита этого ключа относятся к зай6Ще 448 Часть З.амять страниц и представляют собой биты обращения и изменения. Бит обращения устанавливается равным 1, когда происходит чтение или запись ячейки памяти по адресу, находящемуся внутри кадра, и равным 0 — при первой загрузке новой страницы в кадр. Бит изменения становится равным 1 при выполнении операции записи в любую ячейку памяти в пределах кадра. Предложите способ определения страницы, которая не использовалась дольше других, используя только бит обращения. 8.13. Ключевым параметром производительности стратегии VSWS является значение Q. Опыт показывает, что при фиксированном значении Q наблюдаются значительные отличия в частоте генерации прерываний на разных стадиях выполнения процесса. Кроме того, если для разных процессов используется одно и то же значение Q, их частоты генерации прерываний существенно различаются. Эти наблюдения недвусмысленно указывают на то, что динамическое изменение значения Q в процессе жизни процесса может улучшить работу алгоритма. Предложите простейший механизм для реализации этой идеи. 8.14. Предположим, что задание разделено на четыре сегмента одинакового размера и что для каждого сегмента система строит таблицу дескрипторов страниц с восемью записями. Таким образом, описанная система представляет собой комбинацию сегментации и страничной организации. Предположим также, что размер страницы равен 2 Кбайт. а. Чему равен максимальный объем каждого сегмента? б. Каково максимальное логическое адресное пространство одного задания? в. Предположим, что рассматриваемое задание обратилось к ячейке памяти с физическим адресом 00021АВС. Каков формат генерируемого для этого логического адреса? Каково максимально возможное физическое адресное пространство в этой системе? 8.15. Рассмотрим страничное логическое адресное пространство, состоящее из 32 страниц по 2 Кбайт каждая, отображенное на 1-Мбайтовое физическое пространство. а. Каков формат логического адреса процессора? б. Чему равна длина и ширина таблицы страниц (без учета битов прав доступа)? в. Как повлияет на размер таблицы страниц уменьшение физической памяти в два раза? 8.16. Компьютер содержит кэш, основную память и диск, используемый в качестве виртуальной памяти. Если интересующее нас слово находится в кэше, для доступа к нему требуется 20 ns. Если это слово отсутствует в кэше, но присутствует в основной памяти, на его загрузку в кэш требуется 60 ns, после чего процедура обращения повторяется. Если же искомое слово отсутствует в основной памяти, на его выборку с диска требуется 12 ms, после чего 60 ns затрачивается на загрузку слова в кэш, и процедура обращения к слову повторяется. Результативность поиска в кэше равна 0.9, в основной памяти — 0.6. Чему равно среднее время обращения к слову в описанной системе? 8.17. Ядро UNIX при необходимости динамически увеличивает стек процесса в виртуальной памяти, но никогда не уменьшает его. Рассмотрим вызов подпрограммы на языке программирования С, в которой имеется локальный массив размером 10 Кбайт, размещаемый в стеке. Ядро увеличит сегмент стека, для того чтобы этот массив мог быть успешно размещен в стеке. При возврате из подпрограммы указатель стека перемещается, и выделенное пространство может быть освобождено ядром, но оно этого не делает. Поясните, почему в этот момент можно уменьшить размер стека и почему ядро UNIX не делает этого. Глава 8. Виртуальная память 449
.18. Изобразите схему, аналогичную той, которая приведена на рис. 8.5, для туальной адресации Linux. '.&% ПРИЛОЖЕНИЕ. ХЕШ-ТАБОТИЩа^^'/,,- 1 & fe Часть 3. ГГ ТЬ 45U Рассмотрим следующую задачу. В таблице хранится множество из N эле- [ентов, каждый из которых состоит из метки и некоторой дополнительной йн- юрмации, которую можно считать значением элемента. Мы хотим иметь воз- южность выполнять с таблицей ряд обычных операций, таких как вставка, удаление и поиск данного элемента по его метке. ,v .^ Если метки элементов представляют собой числа в диапазоне от О до М -J, J Щ 'о простейшее решение состоит в использовании таблицы размером М. Элемент -v : меткой i вставляется в таблицу в позиции i. При условии, что размер всех " шементов одинаков, поиск в таблице тривиален и сводится к индексированию габлицы на основе числового значения метки элемента. Кроме того, хранить «етку элемента в таблице не обязательно, поскольку она однозначно определяет- ;я положением элемента. Такая таблица называется таблицей прямого доступа [direct access table). l Если метки не являются числами, использование подхода, основанного на ,4 прямом доступе, все равно остается возможным. Обозначим элементы А|1), ...» A[N]. Каждый элемент A[i] состоит из метки, или ключа kt и значения и^ Определим функцию отображения / (к), дающую для всех ключей значения от 1 до М, такую, что 1{к()* Ilkj\ для любых / * j . В этом случае можно использовать таблицу прямого доступа длиной М. Единственная трудность в применении данной схемы возникает, когда М гораздо больше, чем N. В этом случае в таблице оказывается слишком много неиспользованных элементов, что приводит к неэффективному использованию памяти. Альтернативой является использование таблицы длиной N и хранение в ней N элементов (как значений, так и меток). В таком случае количество ис- ; пользуемой памяти минимально, однако теперь трудной задачей становится поиск нужного элемента в таблице. Применимы различные алгоритмы поиска. • Последовательный поиск. Подход "в лоб", требующий много времени при работе с большими таблицами. \ • Ассоциативный поиск. При наличии соответствующего аппаратного обеспечения все элементы таблицы могут просматриваться одновременно. Это очень ., специфичный подход, который не может применяться в общем случае. д\ • Бинарный поиск. Если метки (или их числовые отображения) расположен в таблице в возрастающем (убывающем) порядке, бинарный поиск знач»'; тельно быстрее последовательного (табл. 8.7) и не требует специального . j паратного обеспечения. |** '.:<% . — . * 'Й & Таблица 8.7. Средняя продолжительность поиска одного из ./V элементов в таблице размером М Атгоритм Прямой доступ_' Последовательный поиск Бинарный поиск Продолжительность поиска 1 М+1 2 log2M Линейное хеширование . д/ 2- — М 2-2N м Хеширование (переполнение с цепочками) N —I 1+ 2М Многообещающе для поиска в таблице выглядит бинарный поиск. Основным его недостатком является то, что добавление нового элемента в таблицу — процесс обычно непростой и требует переупорядочения записей таблицы. Таким образом, бинарный поиск обычно используется для более или менее статичных таблиц, которые достаточно редко изменяются. Конечно, хотелось бы избежать как перерасхода памяти при прямом доступе, так и излишней работы процессора при остальных перечисленных подходах. Наиболее часто используемым компромиссным методом является хеширование.1 Этот метод, разработанный еще в 50-х годах, прост в реализации и имеет два достоинства. Во-первых, он позволяет найти большинство элементов за одно обращение к таблице, как при прямом доступе, а во-вторых, добавления элементов в таблицу и удаления элементов из нее выполняются без излишней сложности. Хеширование можно определить следующим образом. Предположим, что до N элементов хранятся в таблице размером М > N , причем М не намного больше N. Вставка элемента в таблицу осуществляется следующим образом. И. Преобразуем метку элемента в почти случайное число п между 0 и М-1. Например, если метки представляют собой числовые значения, довольно распространенным методом является деление метки по модулю М. 12. Используем полученное значение л в качестве индекса в хеш-таблице. а. Если соответствующая запись в таблице пуста, значит, элемент ранее не был сохранен в таблице. б. Если запись уже занята и ее метка соответствует искомой, значит, найден требуемый элемент. Более детально с хешированием, можно познакомиться в разделе 6.4 книги Кнут *4.Э. Искусство программирования. Том 3. Сортировка и поиск, 2-е изд. — М.: Издатель- с*"й дом "Вильяме", 2000. — Прим. ред. Глава 8. Виртуальная память 451
Ж в. Если запись занята и ее метка не соответствует заданной, продоля^Р поиск в области переполнения. .■*'." Различные схемы хеширования отличаются способом обработки перепой 1Я. Одна из широко распространенных технологий, обычно использующаяся tf r >мпиляторах, — технология линейного хеширования. В этом случае правило .6 выглядит следующим образом. • <■" 2.6. Если запись занята, установить п = (/i + l)modA/ и вернуться к шагу. 12.а. Соответствующим образом изменяется и правило 12.е. На рис. 8.24,а приведен пример использования линейного хешировавизг;.<В шном случае метки элементов хранятся в виде чисел, а размер хеш-таблицы;, авен 8 (М = 8). Функция отображения представляет собой остаток при делеви а 8. Предполагается, что элементы вставляются в таблицу в возрастающем fto ядке (хотя это условие и не является необходимым). Таким образом, элемент^ О и 51 отображаются на позиции 2 и 3, соответственно, и поскольку соотвётст* ующие записи пусты, элементы оказываются вставленными в положения 50 и 1. Элемент 74 также отображается в позицию 2, но так как она занята» ы робуем вставить элемент в позицию 3. Поскольку она тоже занята, элемент 74 ставляется в таблицу в позиции 4. %$ Определить среднюю продолжительность поиска элемента при открытсой ;еш-таблице не так просто из-за наличия кластеризации. Приближенная форму- га [SCHA62] выглядит следующим образом: <5-.v4 2-г N ■**** Средняя продолжительность поиска = ——— , гдег = -—. ~:; Обратите внимание, что полученный результат не зависит от размераft. б- гацы, а зависит только от степени ее заполненности. Приятной неожиданн ? ю жазывается то, что даже при заполненности таблицы на 80% средняя продол- ките льность поиска оказывается равной 3. Однако даже такое значение продолжительности поиска можно рассматри* зать в ряде задач как слишком большое, да и процесс удаления элемента из та чицы при линейном хешировании достаточно сложен. Более привлекателен nog1* код, обеспечивающий меньшую продолжительность поиска (см. табл. 8.7) ц^бо. лее простое удаление элементов— переполнение с цепочками, показанное й рис. 8.24,6. В этом случае имеется отдельная таблица, в которой размещают^* элементы, вызывающие переполнение. Записи этой таблицы включают ука а$е* ли, связывающие элементы с одинаковым хеш-значением в цепочки. При. * чайно распределенных данных '^Ш ЙР Средняя продолжительность поиска = 1 + —— 2М Л/-1 4 8 '•л 452 Часть З.П * 1 1 1 [ » 1 ^г» ,.! Нг» 119 — 50 51 74 83 — 95 Значение (119) Значение (50) Значение (51) Значение (74) Значение (83) Значение (95) 50 51 74 83 95 119 а) Линейное хеширование 50 51 74 83 94 95 119 139 50 51 94 95 Хеш-таблица Значение (50) Значение (51) Значение (94) Значение (95) Таблица переполнения 74 83 119 139 Значение (74) Значение(83) Значение (119) Значение (139) б) Переполнение с цепочками Рис. 8.24. Хеширование Для больших значений N = М средняя продолжительность поиска стремится к 1.5. Таким образом, этот метод обеспечивает быстрый поиск при компактном хранении. ,\ Лава 8. Виртуальная память te-'' 453
'«' ,л I- Г4* ■f,;tv ■*.чЛ г* Si ■л .'* ,ч часть 4 Планирование Операционная система должна распределять компьютерные ресурсы между множеством процессов с потенциально конкурирующими требованиями. При использовании процессора распределяемый ресурс представляет собой время выполнения (или, что то же, использование процессора), а само распределение именуется планированием (scheduling). Планирование должно быть разработано таким образом, чтобы удовлетворять ряду требований, включая беспристрастность, обеспечение отсутствия голодания любого из процессов, эффективное использование процессорного времени и малые накладные расходы. Кроме того, системе планирования может потребоваться учет различных уровней приоритета процессов либо требований процессов реального времени. Планированию всегда уделялось много внимания исследователями и разработчиками, и в данной области имеется большое количество разработанных алгоритмов. На сегодняшний день основной упор в исследовании планирования делается на многопроцессорные системы, многопоточные приложения и планирование реального времени. ПУТЕВОДЩ*ЕЛЬ ПО ЧШШ^Щ^^ | Глава 9. Планирование в системах с одним процессором В данной главе рассматривается планирование в вычислительных системах на базе одного процессора. Эта ограниченная ситуация позволяет определить и прояснить многие вопросы, связанные с ^планированием. Глава начинается с рассмотрения трех типов планирования: долгосрочного, среднесрочного и краткосрочного. В основном материал главы посвящен вопросам краткосрочного планирования. Будут представлены в сравнении различные алгоритмы планирования.
шва Ю. Многопроцессорное планирование > планирование реального времени Эта глава посвящена двум основным направлениям современных исследова- « в области планирования. Наличие множества процессоров усложняет привя, Г пешений при планировании и одновременно открывает новые возможности- Частности, многопроцессорность позволяет одновременно выполнять ряд пото- в одного процесса. Первая часть данной главы содержит обзор, посвященный ««процессорное™ и многопоточному планированию. Остальной материал «ы посвящен планированию реального времени. Требования реального време д существенно усложняют планирование, поскольку они выходят за рамки ычных требований беспристрастности или учета приоритетов, ставя жесткие сменные рамки для запуска и завершения процессов. "*& *;-.."/-"v'** . 4} £■ *• ■^ ■^ В .■ \;!^ V7 J № & .-„ Часть 4. Планирование 456 v. ГЛАВА Планирование в системах с одним процессором 9.1. Типы планирования процессора 9.2. Алгоритмы планирования 9.3. Традиционное планирование UNIX 9.4. Резюме, ключевые термины и контрольные вопросы 9.5. Рекомендуемая литература 9.6. Задачи Приложение А. Время отклика Приложение Б. Очереди 9
о многозадачных системах в основной памяти одновременно содержится & * Зкод нескольких процессов. В работе каждого процесса периоды испол ; Г J вания процессора чередуются с ожиданием завершения выполнения опер."й \ гй ввода-вывода или некоторых внешних событий. Процессор (или процессе ; | р / нят выполнением одного процесса, в то время как остальные находятся S^TJjt * $ оянии ожидания. *'14Щ% ь * Ключом к многозадачности является планирование. Обычно использувдщ ^ -ц, j •тыре типа планирования (табл. 9.1). Одно из них— планирование вввда£^' ^ лвода — рассматривается в главе 11, "Управление вводом-выводом и дисково ,;£ *Л-<] тнирование", посвященной вопросам ввода-вывода. Планирование остальная ^ S >ех типов, являющееся планированием процессора, будет рассматриваться^. А( ■ой и следующей главах. *'Щ % Ш ■к, л аблица 9.1. Типы планирования олгосрочное Решение о добавлении процесса в пул выполняемых процессов 1анирование реднесрочное Решение о добавлении процесса к числу процессов, полностью и и.^ санирование частично размещенных в основной памяти ■=■■•■■' • w^ раткосрочное Решение о том, какой из доступных процессов будет выполнятьсяМ панирование процессором Щу- ланирование Решение о том, какой из запросов процессов на операции ввода-^' зода-вывода вывода будет обработан свободным устройством ввода-вывода '^ ^ X Данная глава начинается с рассмотрения трех типов планирования процес Ii эра, выявляя их взаимосвязь. Вы увидите, что долгосрочное и среднесрочно*»^ - ча ланирование определяется в первую очередь вопросами производительности!^ вязанными со степенью многозадачности (материал, с которым вы вкратце яб!^ накомились в главе 3, "Описание процессов и управление ими", и который ее детально был рассмотрен в главах 7, "Управление памятью", и .S4v. Виртуальная память"). В остальной части данной главы рассматриваются ^ю v [росы краткосрочного планирования в однопроцессорной системе. Поскол^у [зучение планирования при использовании нескольких процессоров сопряжено^ юполнительными сложностями, методологически правильнее сначала рассмот »еть работу одного процессора, чтобы отчетливее увидеть отличия разных алго--v >итмов планирования. ' ^р- Раздел 9.2 посвящен различным алгоритмам, которые могут использоватыщ 5 1ри краткосрочном планировании. ур: t . -.: ..^-^^J^S^- 5.1. ТИПЫ ПЛАНИРОВАНИЯ ПРОЦЕССОРА " Цель планирования процессора состоит в распределении во времени' °Р°^ :ов, выполняемых процессором (или процессорами) таким образом, чтобы уд^> нетворять требованиям системы, таким, как время отклика, пропускная СП°,Я' ность и эффективность работы процессора. Во многих системах планирован^ разбивается на три отдельные функции— долгосрочного, среднесрочного^ краткосрочного планирования. Их названия соответствуют временным масШТ бам выполнения этих функций. ..я. 4.58 Часть 4. Планиров 1 На рис. 9.1 функции планирования привязаны к диаграмме переходов состояния процесса (впервые показанной на рис. 3.6,6). Долгосрочное планирование осуществляется при создании нового процесса и представляет собой решение о добавлении нового процесса к множеству активных в настоящий момент процессов. Среднесрочное планирование является частью свопинга и представляет собой решение о добавлении процесса к множеству по крайней мере частично расположенных в основной памяти (и, следовательно, доступных для выполнения) процессов. Краткосрочное планирование является решением о том, какой из готовых к зыполнению процессов будет выполняться следующим. На рис. 9.2 диаграмма перекодов реорганизована таким образом, чтобы показать вложенность функций планирования. *-й'* ;Йрвый "&. Долгосрочное планирование Долгосрочное планирование ,Фтовый/ * "тЫовленный" Готовый Среднесрочное планирование Краткосрочное планирование ЙОЛНЯЮЩИЙСЯ Зт- Циод ванный/'; ^ Т^новленный ^ ■'•%£к ■ ' Среднесрочное Локированный* планирование Рис. 9.1. Место планирования в диаграмме переходов состояний процесса ».£ Лав& 9. Планирование в системах с одним процессором 459
^ u J*. Рис. 9.2. Уровни планирования .с" ■Р-. Часть 4. Планиро Планирование оказывает большое влияние на производительность системы, поскольку именно оно определяет, какой процесс будет выполняться, а какой — ожидать выполнения. На рис. 9.3 показаны очереди, включенные в диаграмму переходов состояний процесса.1 По сути планирование представляет собой управление очередями с целью минимизации задержек и оптимизации производительности системы. Долгосрочное планирование Тайм-аут Пакетные задания t Очередь готовых заданий I Интерактивные пользователи Событие Краткосрочное планирование Среднесрочное • планирование t Очередь готовых приостановленных заданий Процессор Выход Очередь заблокированных приостановленных заданий , Среднесрочное планирование Очередь заблокированных заданий Ожидание события Рис. 9.3. Диаграмма планирования с участием очередей Долгосрочное планирование Долгосрочное планирование указывает, какие программы допускаются к выполнению системой, и тем самым определяет степень многозадачности. Будучи допущенным к выполнению, задание (или пользовательская программа) становится процессом, который добавляется в очередь для краткосрочного планирования. В некоторых системах вновь созданный процесс добавляется к очереди среднесрочного планировщика, будучи целиком сброшенным на диск. В пакетных системах (или в пакетной части операционной системы общего назначения) новое задание направляется на диск и хранится в очереди пакетных заданий, а долгосрочный планировщик по возможности создает процессы для заданий из очереди. В такой ситуации планировщик должен принять решение, во-первых, о том, способна ли операционная система работать с дополнительными процессами, а во-вторых, о том, какое именно задание (или задания) следует превратить в процесс (процессы). Рассмотрим вкратце эти решения. Для простоты восприятия на рис. 9.3 новые процессы показаны как непосредственно становящиеся в очередь готовых к выполнению, в то время как на рис. 9.1 и 9.2 видно, что новый процесс может быть как в состоянии готовности, так и приостановленным. Глава 9. Планирование в системах с одним процессором 461
я.» m я?; fli 1 * Решение о том, когда следует создавать новый процесс, в общем определяет**»'! желаемым уровнем многозадачности. Чем больше процессов будет создано,- ■> меньший процент времени будет тратиться на выполнение каждого из . '*%''■ (поскольку в борьбе за одно и то же время конкурирует большее количество провес. '~ сов). Таким образом, долгосрочный планировщик может ограничить степень много- *'' задачности, с тем чтобы обеспечить удовлетворительный уровень обслуживания те- %-'^'£ кущего множества процессов. Каждый раз при завершении задания планировщик решает, следует ли добавить в систему один или несколько новых процессов. Кроме того, долгосрочный планировщик может быть вызван в случае, когда относительное время простоя процессора превышает некоторый предопределенный порог. * - Решение о том, какое из заданий должно быть добавлено в систему, может основываться на простейшем принципе "первым поступил — первым обслузке г кроме того, для управления производительностью системы может использоваться и специальный инструментарий. Используемые в последнем случае критешш могут включать приоритет заданий, ожидаемое время выполнения и требования для работы устройств ввода-вывода. Например, если заранее доступна детальная информация о процессах, планировщик может пытаться поддерживать в сиететад смесь из процессов, ориентированных на вычисления и загружающих процессор и процессов с высокой интерактивностью ввода-вывода и малой загрузкой про- 'It' цессора. Принимаемое решение может также зависеть от того, какие именно ресурсы ввода-вывода будут запрашиваться процессом. >u^i; 4 В случае использования интерактивных программ в системах с разделён '.^ времени запрос на запуск процесса может генерироваться действиями пользоТа«4 ц° теля по подключению к системе. Пользователи не просто вносятся в очереди, ожидании, когда система обработает их запрос на подключение. Вместо этй!# операционная система принимает всех зарегистрированных пользователей до-Щ^ 4 сыщения системы (пороговое значение которого определяется заранее). Пос, •*. достижения состояния насыщения на все запросы на вход в систему будет иолу- V чено сообщение о заполненности системы и временном прекращении достуйй к ней с предложением повторить операцию входа попозже. :;i5< " Среднесрочное планирование Среднесрочное планирование является частью системы свопинга, вопросы ■;, которого рассматривались в главах 3, "Описание процессов и управление имд » 7, "Управление памятью", и 8, "Виртуальная память". Обычно решение о загрузке процесса в память принимается в зависимости от степени многозадачно- % сти; кроме того, в системе с отсутствием виртуальной памяти среднесрочной1 планирование также тесно связано с вопросами управления памятью. Таким об*. разом, решение о загрузке процесса в память должно учитывать требованиями ^ памяти выгружаемого процесса. \'\ф1 V Краткосрочное планирование ;И# Рассматривая частоту работы планировщика, можно сказать, что долго срочное планирование выполняется сравнительно редко среднесрочное — сколько чаще. Краткосрочный же планировщик, известный также как диспетчер (dispatcher), работает чаще всего, определяя, какой именно процесс будет полняться следующим. '^ь i '",г .?■■■" 462 Часть 4. Планировй с Краткосрочный планировщик вызывается при наступлении события, которое может приостановить текущий процесс или предоставить возможность прекратить выполнение данного процесса в пользу другого. Вот некоторые примеры таких событий: ■ • прерывание таймера; • прерывания ввода-вывода; • вызовы операционной системы; • сигналы. 9.2. АЛГОРИТМЫ ПЛАНИРОВАНИЯ *£■*&$ Критерии краткосрочного планирования Основная цель краткосрочного планирования состоит в распределении процессорного времени таким образом, чтобы оптимизировать один или несколько аспектов поведения системы. Вообще говоря, имеется множество критериев оценки различных стратегий планирования. Наиболее распространенные критерии могут быть классифицированы в двух плоскостях. Во-первых, мы можем разделить их на пользовательские и системные. Пользовательские критерии связаны с поведением системы по отношению к отдельному пользователю или процессу. В качестве примера можно привести время отклика в интерактивной системе. Время отклика представляет собой интервал между передачей запроса и началом ответа на него. Его пользователь ощущает непосредственно, и, само собой, продолжительность интервала очень интересует его. Мы намерены создать стратегию планирования, обеспечивающую качественный сервис для пользователей? В таком случае для времени отклика следует установить порог, например в 2 секунды. Тогда цель механизма планирования должна заключаться в максимизации количества пользователей, среднее время отклика для которых не превышает 2 секунд. Системные критерии ориентированы на эффективность и полноту использования процессора. В качестве примера можно привести nponjcjcHj^^nqco6HocTb, которая представляет собой скорость завершения процессов. Это, безусловно, эффективная мера производительности системы, которая должна быть максимизирована. Однако она в большей степени ориентирована на производительность системы, а не на обслуживание пользователя, так что и удовлетворять она будет системного администратора, а не пользователей системы. В то время как пользовательские критерии важны почти для всех систем, системные критерии для однопользовательских систем не так значимы. В этом случае, пожалуй, достижение высокой эффективности использования процессора или высокая производительность не так существенны, как скорость ответа системы приложению пользователя. Еще один способ разделения критериев — на те, которые связаны с производительностью, и те, которые с производительностью непосредственно не связаны. Ориентированные на производительность критерии выражаются числовыми значениями и обычно достаточно легко измеримы — примерами их могут служить время отклика и пропускная способность. Критерии, не связанные с производительностью непо- Глава 9. Планирование в системах с одним процессором 463
средственно, либо качественны по своей природе, либо трудно поддаются измерена. ям и анализу. Примером такого критерия служит предсказуемость. Желательно чтобы предоставляемые пользователю сервисы в разное время имели одни и те эке характеристики, не зависящие от других задач, выполняемых в настоящее время системой. До некоторой степени этот критерий является измеримым — путем вычисления отклонений как функции от загрузки системы. Однако провести такие из- мерения оказывается вовсе не просто. Ч В табл. 9.2 приведены ключевые критерии планирования. Все они взаимозави- симы, и достичь оптимального результата по каждому из них одновременно невозможно. Например, обеспечение удовлетворительного отклика может потребовать применения алгоритма с высокой частотой переключения процессов, что повысит накладные расходы и, соответственно, снизит пропускную способность системы. Следовательно, разработка стратегии планирования представляет собой поиск компромисса среди противоречивых требований; относительный вес каждого из критериев определяется природой и предназначением разрабатываемой системы. В большинстве интерактивных операционных систем с одним пользователем или с разделяемым временем критичным требованием является время отклика* В связи с важностью этого критерия и тем, что определение его величины меняется о одной программы к другой, этот вопрос вынесен в приложение к данной главе. Таблица 9.2. Критерии планирования i ■i№ \ & i HV Время оборота Время отклика Предельный срок Предсказуемость Пропускная способность Пользовательские, связанные с производительностью Интервал времени между подачей процесса и его завершением. Включает время выполнения, а также время, затраченное на ожидание ресурсов, в том числе и процессора. Критерий вполне применим для пакетных заданий 1 > м В интерактивных процессах это время, истекшее между подачей запроса и началом получения ответа на него. Зачастую процесс может начать вывод информации пользователю, еще не окончив полной обработки запроса, так что описанный критерий — наибо- лее подходящий с точки зрения пользователя. Стратегия планиро-. вания должна пытаться сократить время получения ответа при максимизации количества интерактивных пользователей, время отклика для которых не выходит за заданные пределы При указании предельного срока завершения процесса планирование должно подчинить ему все прочие цели максимизации количе-^ ства процессов, завершающихся в срок Пользовательские, иные Данное задание должно выполняться примерно за одно и то же количество времени и с одной и той же стоимостью, независимо от загрузки ( системы. Большие вариации времени исполнения или времени отклика дезориентируют пользователей. Это явление может сигнализировать о больших колебаниях загрузки или о необходимости дополнительной настройки системы для устранения нестабильности ее работы Системные, связанные с производительностью Стратегия планирования должна пытаться максимизировать количество процессов, завершающихся за единицу времени, что является мерой количества выполненной системой работы. Очевидно, что эта величина зависит от средней продолжительности процесса; од-, нако на нее влияет и используемая стратегия планирования -^ ?. ■I..' V Л" - i. i, 7 #•*. 464 Часть 4. Планирован Щ i Окончание табл. 92 Использование Этот показатель представляет собой процент времени, в течение кото- процессора рого процессор оказывается занят. Для дорогих совместно используемых систем этот критерий достаточно важен; в однопользовательских же и некоторых других системах (типа систем реального времени) этот критерий менее важен по сравнению с рядом других Системные, иные Беспристрастность При отсутствии дополните чьных указаний от пользователя или системы все процессы должны рассматриваться как равнозначные и ни один процесс не должен подвергнуться голоданию Использование Если процессам назначены приоритеты, стратегия планирования приоритетов должна отдавать предпочтение процессам с более высоким приоритетом Баланс ресурсов Стратегия планирования должна поддерживать занятость системных ресурсов. Предпочтение должно быть отдано процессу, который недостаточно использует важные ресурсы. Этот критерий включает использование долгосрочного и среднесрочного планирования Использование приоритетов Во многих системах каждому процессу присвоен некоторый приоритет, и планировщик всегда должен среди процессов выбирать тот, у которого приоритет наибольший. На рис. 9.4 показано использование приоритетов. Для большей ясности диаграмма упрощена и игнорирует существование нескольких очередей заблокированных или приостановленных процессов (ср. с рис. 3.5,а). Вместо одной очереди готовых к исполнению процессов у нас имеется их множество, упорядоченное по убыванию приоритета: RQO, RQ1, ..., RQn, т.е. Приоритет[RQ/] > npuopumem[RQj] при /' < j .2 При выборе процесса планировщик начинает с очереди процессов с наивысшим приоритетом (RQO). Если в очереди имеются один или несколько процессов, процесс для работы выбирается с использованием некоторой стратегии планирования. Если очередь RQO пуста, рассматривается очередь RQ1 и т.д. Одна из основных проблем в такой чисто приоритетной схеме планирования состоит в том, что процессы с низким приоритетом могут оказаться в состоянии голодания. Это будет происходить при постоянном поступлении новых готовых к выполнению процессов с высоким приоритетом. Если такое поведение нежелательно, приоритет процесса может снижаться при его выполнении (пример такой стратегии планирования будет приведен позже). Альтернативные стратегии планирования А В табл. 9.3 представлена некоторая информация о различных стратегиях Планирования, рассматриваемых в данном подразделе. Функция выбора опреде- Ляет, какой из готовых к выполнению процессов будет выбран следующим для о В UNIX и многих других системах большие значения приоритетов соответст- Ующ процессам с низким приоритетом; если не указано иное, мы придерживаемся менно этого соглашения. Некоторые системы, такие, как OS/2 или Windows, исполь- УЮт обратное соглашение: большее значение указывает на более высокий приоритет. А-Дава 9. Планирование в системах с одним процессором -469
выполнения. Функция может быть основана на приоритете, требованиях ^ ре_ сурсам или характеристиках выполнения процессов. В этом случае имеют аначе- ■'* ние три величины: ?^ w — время, затраченное к этому моменту системой (ожидание и выполнение)* е — время, затраченное к этому моменту на выполнение; s — общее время обслуживания, требующееся процессу, включая е (обычно эта величина оценивается или задается пользователем). ' If ■s* RQ0 Запуск процесса Диспетчер RQ1 RQn Процессор Завершение процесса Вытеснение Событие Ожидание события Очередь заблокированных процессов 1' 4 ,н Рис, 9.4. Планирование с учетом приоритета процессов v \ Например, выбор функции max[w] определяет стратегию "первым посту-. пил — первым обслужен" (first-come-first-served — FCFS). Режим решения определяет, в какие моменты времени выполняется J^VHIC* ция выбора. Режимы решения подразделяются на две основные категории: • Невытесняющие. В этом случае находящийся в состоянии выполнения про> цесс продолжает выполнение до тех пор, пока он не завершится шит п°к не окажется в заблокированном состоянии ожидания завершения опёраЩ* ввода-вывода или запроса некоторого системного сервиса. ..; ■ • Вытесняющие. Выполняющийся в настоящий момент процесс может быть пре рван и переведен операционной системой в состояние готовности к выполнению. Решение о вытеснении может приниматься при запуске нового процесса по прерыванию, которое переводит заблокированный процесс в состояние готовнос к выполнению, или периодически — на основе прерываний таймера. * ■? V TV--" щ ■к е ■3 * ■гаду, ЗУ лаа Часть 4. ПланирС к ч ИЗ о а. к И « ft В «с с f- X н •■j s а - Ф х ч ее я at О Ч О U ф ф [I s и: «в 5 ы аб pa о к л « н х « >> хо с о g< 2 е g s 1-1 g CJ а. «я 1*4 Я" X **1 е ts ф 3 Л) а ора н ф >1 ш f- о н О 5 8- (Я £ « и О X о ч д 3 к л ч ев Я Я № 2 а отких про р, о х 03 я о троцессах Я о л ИВИЫМ ВВ о нтея к 1В0Д0М Л ОМ-В =1 № J3 Е- Ф о са ts (Я ю ф 2 Я I х п S Е* и О к и Я 3 ч о « S Я S! 3 £ vo 4 о * а о ф р« н ю о с о Я Я о Я ф р. m о Я СО О Е- Ш >> в О >. \ о я о и о Я я к и я о, я р. я и р 3 и Л ч 05 я я и я S о со - cj 8 $w 00 pa 3 м (Я о о X О о р. с 3 я я о х о о И "5 Й 4; СИ 1 | са Е- О Е- >. и SS о g >0 W ш о X о ч С о р. с X к я я я ч ее я а о с о Х о S п О CQ а о S § в Е Я К Р. ^ 5^ b is1 О ю я О Я <и , я о О О 03 Я о i ё8 з Sw С си 3 С Я" И г о ч: о и 3 Рч 2 I ю я b с л ° 3 л Е- J3 ю о S я S я о о а л 3 VD Е- О ь < ф ° „ Ю (Я Й ft °5 к ¥ t> Р* Ж О <ц 5 S- н О Sf о СОФ ясС ф ф я ч о « х г X я о о, о к ч ч ю о о ф И" о _ О, ]0 с О Е- Ф «О а ? ф а и ф ф Р, ю ф ф я I—• о р. о X X к к о а о а « Ч ю о о о ф СГ о р, ф 03 вэ Я tr <u Я о ф ф Е- „ ф Ф a g в с, в •а я ч я Ч v а о Е- С О Ф В! \0 X £ О 03 СО Ф 3 о р. о X 64 5 "* р. н « _ ф о S « р я Ф Я 03 ф о s н ф s; lliill S я s х и со 5R 3" я О « Я ф я ф я ф р. ф m Е- W CQ w С о ф ЕС ев » О £ о я е ч я о Ф е- Ю * ф Я К 3 05 03 X О о 3 « й 5 вч 2> и 3 й « Ф Q. Й 2 CQii <u 1 <n С £ ч 03 .V. о и 3 1 о ч я ф ф Е- Л ф + 5» *"* ч эЯ я 3 1 J ^ 1 1 J X Е СП Я К *s 03 ю ф и ющий ч X ф ф н ^ч ►а Ю н ф Ж ф н жением См еяи) S 0> г>. В) о я [тета 2 g г а о я а. с Ъ о
й V Вытесняющие стратегии приводят к повышенным накладным расходам %& равнению с невытесняющими, но при этом обеспечивают лучший уровень рб- :луживания всего множества процессов, поскольку предотвращают монопольной ** хспользование процессора в течение продолжительного времени одним из йро*> ;ессов. Кроме того, использование эффективных механизмов переключения про* э jeccoB (по возможности реализованное аппаратно) и большой объем основной 1амяти (для хранения в ней как можно большего количества процессов) позво^ 1яют поддерживать относительно небольшую стоимость вытеснения. ^-% При описании различных стратегий планирования в качестве примера, змьгs Зудем использовать набор процессов из табл. 9.4. Будем рассматривать их"к$к пакетные задания со временем обслуживания, равным общему времени вьщрл». ; нения. Эти же процессы можно рассматривать как непрерывные процессы, требующие циклического чередования работы процессора и устройств ввода-выво . Тогда время обслуживания будет представлять собой процессорное время, ^требующееся в одном цикле. В любом случае в рамках модели с очередями эта'в w личина соответствует времени обслуживания.1 Таблица 9.4. Пример планирования процессов Процесс Время запуска Время обслуживания 1к 3 А В О 2 С 4 D Е 6 8 6 4 5 2 Первым поступил — первым обслужен к Простейшая стратегия планирования "первым поступил - пеР*ьш °<£лу- жен» (first-come-first-served - FCFS) известна также как c™™™**™Jg*c шел - первым вышел», или схема строгой очередности. Как только провес становится готовым к выполнению, он присоединяется к очереди готовых- цессов. При прекращении выполнения текущего процесса для выполнения э бирается процесс, который находился в очереди дольше других. На рис. 9.5 приведен пример выполнения одного цикла описанного P примера, а в табл. 9.5 представлены некоторые ключевые РезУль™^ оП. первых, определено время завершения каждого процесса, так что мы може ределитъ время оборота Тг (turnaround time - TAT), которое приставляемо ^ полное время, затраченное процессом в системе (время ожидания и вре служивания). Более полезной величиной является нормализованное ™"* ^. мя которое определяется как отношение полного времени ко времени oD л*^ вания и указывает относительную задержку, испытываемую процессом, мальное значение этого отношения- 1. Возрастание значения отноШ^ соответствует снижению уровня обслуживания. | '■Ъ A£tQ 1 См. терминологию в приложении Б к данной главе. ?.». Часть 4. ПланироГ яй FCFS RR,q = 1 RR,q = 4 SPN SRT HRRN FB,q = 1 FB,q = 2' и I I l 1 1 1 A ' ■ в i : : с ; ; ; 1 1 D 1 i i i i 1 и I 1 i i i i b 1 1 1 20 1 i i .i i . i i i i i i i i i i —\—j—f i i i i i i i i i i i i i i i i i , ■ III! 1 1 1 1 1 1 D • • ■ i i t i i i e J ! ! ! ! i i . x • в! : с ; ; ; D i ■ i e ! ,' ! A I в ! J ! c i i i l 1 1 l l I 1 l l 1 I l l I l l 1 1 i 1 1 1 1 1 1 1 1 d :::;;; ; e 1 ! ! A | в ; ; ; с • • • i i i i i i i i i i i i i i , ■ i i i i i i i i i i i i i i i i i ■ ■it i i i i < i ■ i i : u i i '• i i i i i i i i i i i i i i i i i i i i i i i i i i i i : L i ■ • i • i i i 1 ■ t i i i i Zl : : • i i kr-l i i i i i i » i i i i i i i i i i i i i i i i i i i i i ■ i i i i i i 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 d ! ! ! 1 ; e ; ; ; A I в ; ; ; С i i i d ! ! I 1 e ; ; ; ; A j в • • < с: ; : ; 1 1 1 i 1 d I ! ! ! ! E « ' в • • с ! ! d ; j Е i ' B i i 1 "1 1 1 1 1 "1 1 с J ! ^ | l l l l : : : i : : ; • i i i i i ■ i i i i i i ■ i i i i i i • P 1 ! ■ i i i i i i i i i i i i i i i i i i i i i i ! I I l l l l ■ i i ■ ■ ■ i i i : : : ; I : : : i i i i i i i i i i i i i i i i i i i i j 1 1 1 1 1 ;;::;: iii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ™^"^^^^^™ ■ i i i i i i i i i i i i i i l_ i i i i i i i i i i i i Q 1 l 1 1 1 l l i i i i i i ■ i i i i i i i i i i i i i i i i i i i i i 1 i i i i i i i i i i i i i i i i i i i i i i i i i i I i 1 i i i i i i i i 1 i i U i i i i i i i i i . I e ...!!! ! i I 0 i 1 1 5 i i i • i i ~~7 I 1С 1 i i i i i i i i ■ ! ! i i i i i -. P 0 i i i i J □ : iiii i i i i ■ i i i "* "' i i i i i i i i I 1 15 i i " -1 i i i i i "T 1 1 1 1 20 Рис. 9.5. Сравнение стратегий планирования £л **& 9. Планирование в системах с одним процессором 469
абчица 9.5. Сравнение стратегий планирования Процесс А и '»PN 5RT HRRN В Время входа О Время обслужива- 3 ния Ts Время завершения 3 Время оборота Тг Tr/Ts _*-°°_ ■j^( q = 1 Время завершения 4 Время оборота Тг Tr/Ts 1"33 IR q = 4 Время завершения 3 т 1 Время оборота /г Tr/Tt i.oo Время завершения 3 Время оборота Тг j U 1.00 Время завершения 3 Время оборота Тг Tr/Ts Х-00 Время завершения 3 Время оборота Тг Tr/Ts im FB q = 1 Время завершения 4 Время оборота Тг ТГ(Т> 133 FB q = 2' Время завершения 4 Время оборота Тг Tr/Ts 13S 2 6 4 4 D 6 5 8 2 9 7 18 16 13 9 18 12 20 12 1.17 2.25 2.40 6.00 17 13 20 14 15 7 2.67 3.25 2.80 3.50 Среднее "■"115*. * ■к 8.60 2.56 10.80 2.71 !.< Как видите, стратегия FCFS гораздо лучше работает для длинных пр|Я », чем для коротких. Вот данные, приведенные в работе [FINK88]: J; % 470 Часть 4. Планиро ие Процесс W X Y Z Среднее Время входа 0 1 2 3 \ Время обслужива ния 1 100 1 100 Время начала 0 1 101 102 Время завершения 1 101 102 202 Время оборот а Тг 1 100 100 199 100 TJT, 1 1 100 1 99 26 V" Нормализованное время оборота для процесса Y оказывается существенно большим, чем для других процессов. Общее время нахождения процесса в системе в 100 раз превышает время, необходимое для обработки процесса. Такая ситуация возникает, когда короткий процесс поступает в систему сразу после длинного. С другой стороны, даже в таком экстремальном случае длинные процессы хорошо обрабатываются — так, время оборота процесса Z почти в два раза превышает время оборота Y, но нормализованное время ожидания процесса Z меньше 2. Другая трудность при использовании стратегии FCFS связана с тенденцией процессов, ориентированных на работу с процессором, к получению преимущества над процессами, ориентированными на ввод-вывод. Рассмотрим множество процессов, один из которых ориентирован на использование процессора, а остальные — на работу с устройствами ввода-вывода. При работе процесса, ориентированного на процессор, все остальные процессы вынуждены находиться в состоянии ожидания. Некоторые из них могут находиться в очереди ввода-вывода, в заблокированном состоянии, но могут и вернуться в очередь готовых к выполнению процессов за то время, пока выполняется процесс, ориентированный на использование процессора. Возникает ситуация, когда несмотря на потенциальное наличие работы для устройств ввода-вывода они находятся в состоянии простоя. При прерывании выполнения текущего процесса, готовые процессы (ориентированные на ввод-вывод) быстро проходят через состояние выполнения и тут же оказываются заблокированными очередной операцией ввода-вывода. Если же в этот момент окажется заблокирован и процесс, ориентированный на использование процессора, то последний будет находиться в состоянии простоя и, таким образом, стратегия FCFS может привести к неэффективному использованию как устройств ввода-вывода, так и процессора. Для однопроцессорных систем FCFS — не самая подходящая стратегия, но °на часто комбинируется с использованием приоритетов. В этом случае планировщик поддерживает ряд очередей, по одной для каждого уровня приоритета, и работает с процессами в каждой очереди в соответствии со стратегией FCFS. С примером такой системы мы познакомимся позже, при рассмотрении планирования с обратной связью. Круговое планирование Очевидный путь повышения эффективности работы с короткими процесса- в схеме FCFS — использование вытеснения на основе таймера. Простейшая Ратегия, основанная на этой идее, — стратегия кругового (карусельного) пла- Рования (round robin — RR). Таймер генерирует прерывания через определен- е интервалы времени. При каждом прерывании исполняющийся в настоящий s ;лава 9. Планирование в системах с одним процессором 471
момент процесс помещается в очередь готовых к выполнению процессов, и начинает выполняться очередной процесс, выбираемый в соответствии со стратегией FCFS Эта методика известна также как квантование времени (time slicing), поскольку перед тем как оказаться вытесненным, каждый процесс получает кван| времени для выполнения. га%л При круговом планировании принципиальным становится вопрос о продолу тельности кванта времени. При малом кванте времени короткие процессы будут,* J яоситечыю быстро проходить через систему, но при этом возрастают накладные рае^ ходы связанные с обработкой прерывания и выполнением функций планирования , Гпеловательно, очень коротких квантов времени следует избегать. Одно из полезных поавил в этом случае звучит так: квант времени должен быть немного больше, чем: воемя требующееся для типичного полного обслуживания. Если квант оказываемся меньшего размера, большинство процессов потребует как минимум два кванта вре,. мени На рис. 9.6 проиллюстрировано влияние продолжительности кванта времени на воемя отклика. Обратите внимание, что в предельном случае, когда квант времени превышает продолжительность самого длинного процесса, круговое планировать вырождается в планирование FCFS. 4%, Время -|^ Процесс получает Взаимодействие "^ квант времени завершено г? 1 1Чк&щ1--% :'У /;'-Ч \^Х/////Л >«- Время откликаs q-s I 1 Квант времени q а) Квант времени больше типичного взаимодействия t г Процесс получает Процесс Процесс получает Взаимодействие квант времени вытеснен квант времени завершено 1 1 1 I V ++ Выполнение другого процесса б) Квант времени меньше типичного взаимодействия Рис. 9.6. Влияние продолжительности кванта времени на время отклика -J?. AV9 Часть 4. ПланирО *й На рис. 9.5 и в табл. 9.5 показаны результаты работы круговой стратегии при использовании кванта времени q с продолжительностью 1 и 4. Обратите внимание, что наиболее короткий процесс Е значительно быстрее проходит через систему при малом кванте времени. Круговая стратегия эффективна в системах общего назначения с разделением времени и в^системах обработки транзакций. Чтобы обнаружить один из основных недостатков круговой схемы, рассмотрим работу с набором процессов, ориентированных как на процессор, так и на ввод-вывод. Обычно у процессов с интенсивным вводом-выводом промежуток времени между двумя операциями ввода-вывода, когда процесс использует процессор, меньше, чем у процесса, ориентированного на использование процессора. В результате возможна следующая ситуация: процесс с интенсивным вводом-выводом использует процессор в течение короткого промежутка времени и оказывается в заблокированном состоянии в ожидании завершения операции ввода- вывода. По завершении этой операции он вновь присоединяется к очереди готовых к выполнению процессов. С другой стороны, процесс с интенсивным использованием процессора обычно использует отпущенный ему квант времени полностью и немедленно возвращается в очередь готовых к выполнению процессов. Следовательно, процесс, ориентированный на работу с процессором, получает значительно большее процессорное время, что приводит к снижению производительности процессов с интенсивным вводом-выводом, неэффективному использованию устройств ввода-вывода и увеличению времени отклика. В [HALD91] предложено улучшение кругового планирования, которое названо в работе виртуальным круговым планированием (virtual round robin — VRR) и позволяет избежать пристрастности в работе. Данная схема показана на рис. 9.7. Новый процесс присоединяется к очереди готовых к выполнению процессов, управление которой осуществляется на основе стратегии FCFS. Когда исчерпывается время работающего процесса, он возвращается в очередь готовых к выполнению процессов; при блокировании процесса для ожидания завершения операции ввода-вывода он поступает в очередь процессов, ожидающих завершения операции ввода-вывода. Пока что все, как обычно. Новым оказывается наличие вспомогательной очереди, в которую переносятся процессы после их разблокирования по завершении операций ввода-вывода. При выборе процесса для выполнения преимущество отдается процессам из вспомогательной очереди. Изучение производительности такой схемы показывает, что с точки зрения беспристрастности данный подход лучше простого кругового планирования. Выбор самого короткого процесса Еще один путь к снижению перекоса в пользу длинных процессов — использование стратегии выбора самого короткого процесса (shortest process ext — SPN). Это невытесняющая стратегия, при которой для выполнения выдается процесс с наименьшим ожидаемым временем исполнения. На рис. 9.5 и в табл. 9.5 приведены результаты применения данной Ратегии к нашему примеру. Обратите внимание, что процесс Е обслуживания гораздо раньше, чем в случае применения FCFS-стратегии. В отношении Ремени отклика общая производительность системы также возрастает, но % ц. ава 9. Планирование в системах с одним процессором 473
,и этом увеличивается разброс его величины, в особенности для длинных юпессов (и, соответственно, снижается предсказуемость). ,{ Тайм-аут Запуск процесса Очередь готовых процессов Завершение ввода-вывода 1 Завершение ввода-вывода 2 Завершение ввода-вывода п 'j$ ■^ЁЪ Завершение ■' ^■'■^ процесса ?Щ Вспомогательная очередь Ожидание ввода-вывода 1 Очередь ввода-вывода 1 Ожидание ввода-вывода 2 Очередь ввода-вывода 2 Ожидание ввода-вывода л I ¥ Очередь ввода-вывода п Рис. 9.7. Диаграмма работы виртуального кругового планирования i3 Основная трудность в применении стратегии SPN состоит в том, что для •е осуществления необходима по меньшей мере оценка времени выпо™еК* ' гребующегося каждому процессу. При выполнении пакетных заданий |К> юнадобиться оценка этого значения программистом и предоставление операционной системе. Если оценка программиста существенно ниже ре ^ ного времени выполнения, система может прекратить выполнение заД*** ^ промышленных системах часто выполняются одни и те же задания, та можно собрать достаточно точную статистику. В случае выполнения рактивных процессов операционная система может поддерживать во » выполнения средний "разрыв" для каждого процесса. Простейшее вычи ние выглядит следующим образом: Г--. ,(9Д) ■ s1 474 Часть 4. Планиро -z*- где Tt— время работы процессора для j-ro экземпляра данного процесса (общее время работы для пакетного задания, время разрыва при интерактивной работе); S; — предсказанное значение для i-ro экземпляра; 5, — предсказанное значение для первого экземпляра (не вычисляется). Для того чтобы избежать повторного вычисления всей суммы, уравнение (9.1) можно записать следующим образом: $,♦,=-7;+ V (9.2) Заметим, что в данной формуле все экземпляры при усреднении имеют одинаковый вес, хотя обычно следует дать больший вес экземплярам, выполнявшимся последними, так как они в большей степени отражают будущее поведение процесса. Обычная технология предсказания будущего значения на основе значений прошедших серий представляет собой взвешенное усреднение SnH=aTn+(l-a)Sn, (9.3) где а — постоянный весовой множитель (0 < а < 1), определяющий относительный вес последнего и предыдущих наблюдений (сравните с (9.2)). При использовании постоянного значения а, не зависящего от количества наблюдений, мы получаем ситуацию, когда рассматриваются все прошлые значения, причем чем значение более давнее, тем меньше его вес. Чтобы было понятнее, распишем (9.3) как S„+\=<xTn+(l-a)aTe_l+... + (l-a)'aTt_l+... + (l-aysl. (9.4) Поскольку и а, и 1-а меньше единицы, каждый последующий множитель в (9.4) меньше предыдущего. Например, при а = 0.8 уравнение (9.4) записывается как 5я+1 =0.87; +о.1б7;_1 +о.оз2т;_2 +о.ооб4т;_з+..., т.е. чем старее наблюдение, тем меньший вклад оно вносит в вычисляемое среднее значение. Значение коэффициента как функции от положения члена в сумме показано на рис. 9.8. Чем больше значение а, тем больший вес имеют последние наблюдения. При « = 0.8 в вычислении среднего значения, по сути, участвуют только три-четыре последних наблюдения, в то время как при а = 0.2 заметный вклад вносят восьмое и более поздние наблюдения. Значения or, близкие к 1, позволяют нашему методу быстро реагировать, на любые изменения, но при этом увеличивается и реакция на случайные отклонения от среднего значения при наблюдениях, что приводит к излишне резким изме- Нениям вычисляемого значения. ^ ава 9. Планирование в системах с одним процессором 475
■ 44-i да; ■ ■£->■ |Ш1а = 0.2 |g = 0.5 ^■а = 0.8 Ll _a 4 5 6 7 8 Возраст наблюдения Рис. 9.8. Весовые коэффициенты при разных значениях а 10 .**< .1 ? На рис. 9.9 приведено сравнение простого и взвешенного усреднения ля цвух разных значений а. На рис. 9.9,а значения а начинаются с 1 и постепе но вырастают до 10, после чего продолжают удерживаться на этом уровне;* на рис. 9.9,6 наблюдаемые значения уменьшаются от 20 до 10. В обоих случаях^ мы начинаем с оценки 5, =0. Обратите внимание на то, насколько быстрее реаш у- ет на изменение наблюдаемых значений взвешенное среднее по сравнению с обычным средним, и чем больше значение а, тем выше скорость реакции. .{"Ц Основной риск при использовании стратегии SPN заключается в возмож ом голодании длинных процессов при стабильной работе коротких процессов. К ме того, хотя SPN снижает перекос в пользу длинных процессов, его примене ие нежелательно в системах с разделением времени или системах обработки тр н- закций из-за отсутствия вытеснения. Возвращаясь к анализу наихудшего ая для метода FCFS, мы увидим, что процессы W, X, Y и Z будут выполшгЕься в том же порядке, причем обслуживание процесса Y имеет значительно ху ие параметры, чем у других процессов. '?','■ t 476 Часть 4. Планирр нИр Время а) Возрастающая функция Рис. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Время 6) Убывающая функция 9.9. Использование взвешенного усреднения Ш [ава 9. Планирование в системах с одним процессором 477 ^
1 Наименьшее остающееся время ^ц Стратегия наименьшего остающегося времени (shortest remaining time -L, SRT) представляет собой вытесняющую версию стратегии SPN. В этом слу4а! планировщик выбирает процесс с наименьшим ожидаемым временем до окойча> ния процесса. При присоединении нового процесса к очереди готовых к исполГ нению процессов может оказаться, что его оставшееся время в действительно^^ меньше, чем оставшееся время выполняемого в настоящий момент процесса* Планировщик, соответственно, может применить вытеснение при готовности но-"* вого процесса. Как и при использовании стратегии SPN, планировщик для корректной работы функции выбора должен оценивать время выполнения процесса; в этом случае также имеется риск голодания длинных процессов. si В случае использования стратегии SRT нет таких больших перекосов в пользу длинных процессов, как при использовании стратегии FCFS; в отличие от стратегии RR, здесь не генерируются дополнительные прерывания, что снижает накладные расходы. Тем не менее в этом случае происходит увеличение наклад/ ных расходов из-за необходимости фиксировать и записывать время выполнен? процессов. В связи с тем что короткие задания немедленно получают преимуЩе ' ство перед выполняющимися длинными заданиями, стратегия SRT существе it выигрывает у стратегии SPN во времени оборота. ^i- Обратите внимание, что в нашем примере в табл. 9.5 три наиболее кратких процесса обслуживаются немедленно, что приводит к нормализованному времен '* оборота для каждого из них, равному 1.0. Наивысшее отношение отклика В табл. 9.5 мы использовали как показатель нормализованное время оборо та, представляющее собой отношение времени оборота к действительному време« ни обслуживания. Для каждого отдельного процесса этот показатель желательно минимизировать, так же, как и среднее значение по всем процессам. Вообще говоря, мы не можем знать время обслуживания заранее, но можем оценить е либо на основе предыдущих выполнений, либо на основе информации, ввод ой пользователем или задаваемой при настройке. Рассмотрим соотношение Ч 5 К , *р S '& где 'V R — отношение отклика; v w — время, затраченное процессом на ожидание; Ju' s — ожидаемое время обслуживания. Ig Если процесс будет немедленно диспетчеризован, его значение R будет рй но нормализованному времени оборота. Заметим, что минимальное значение,/* (равное 1.0) осуществляется при входе процесса в систему. ■ г. Таким образом, правило стратегии планирования наивысшего отноше отклика (highest response ratio next — HRRN) можно сформулировать так: й завершении или блокировании текущего процесса для выполнения из очере готовых процессов выбирается тот, который имеет наибольшее значение R- Т кой подход довольно привлекателен, поскольку учитывает возраст процесса. v роткие процессы получают преимущество по отношению к продолжительным (в 478 .'V Часть 4. Планирова силу меньшего знаменателя, увеличивающего отношение), однако и увеличение возраста процесса приводит к тому же результату, так что в конечном счете длинные процессы смогут конкурировать с короткими. Как и в случае использования стратегий SRT и SPN, в описанной стратегии требуется оценка времени обслуживания для определения максимального значения R. Снижение приоритета Если у нас нет никаких указаний об относительной продолжительности процессов, то мы не можем использовать ни одну из стратегий — SPN, SRT или HRRN. Еще один путь предоставления преимущества коротким процессам состоит в применении штрафных санкций к долго выполняющимся процессам. Другими словами, раз уж мы не можем работать с оставшимся временем выполнения, мы будем работать с затраченным временем. Вот как этого можно достичь. Выполняется вытесняющее (по квантам времени) планирование с использованием динамического механизма. При входе процесса в систему он помещается в очередь RQ0 (см. рис. 9.4). После первого выполнения и возвращения в состояние готовности процесс помещается в очередь RQ1. В дальнейшем при каждом вытеснении этого процесса он вносится в очередь со все меньшим приоритетом. Соответственно, быстро выполняющиеся короткие процессы не могут далеко зайти в иерархии приоритетов, в то время как длинные процессы постепенно теряют свой приоритет. Таким образом, новые короткие процессы получают преимущество в выполнении над старыми длинными процессами. В рамках каждой очереди для выбора процесса используется стратегия FCFS. По достижении очереди с наиболее низким приоритетом процесс уже не покидает ее, всякий раз после вытеснения попадая в нее вновь (таким образом, эта очередь, по сути, обрабатывается с использованием циклической стратегии). На рис. 9.10 проиллюстрирован этот механизм планирования; пунктирной линией показан путь длинного процесса по различным очередям. Такой подход известен как многоуровневый возврат (multilevel feedback2), поскольку при блокировании или вытеснении процесса осуществляется его возврат, на очередной уровень приоритетности. Имеется несколько разновидностей данной схемы. В простейшем случае вытеснение выполняется так же, как и в случае применения стратегии RR, — через периодические интервалы времени. В нашем примере (рис. 9.5 и табл. 9.5) использован именно этот метод, с квантом времени, равным 1. При такой простой схеме имеется один недостаток, заключающийся в том, что время оборота длинных процессов резко растягивается. В системе с частым запуском новых процессов в связи с этим вполне вероятно появление голодания. Для уменьшения отрицательного эффекта мы можем использовать разное время вытеснения для процессов из разных очередей: процесс из очереди RQ0 выполняется в течение одной единицы времени и вытесняется; процесс из очереди RQ1 выполняется в течение двух единиц времени и т.д. — процесс из очереди RQi выполняется до вытеснения в течение 2' единиц времени. Использование этой СХемы также проиллюстрировано на рис. 9.5 и в табл. 9.5. о На рис. 9.5 указан как FB. Л&ва 9. Планирование в системах с одним процессором 479
Запуск процесса RQ0 /WWtlfflafl Процессор Завершение процесса I • VZ '■few* RQ1 Процессор Завершение процесса •1% ь -'..1, 'V RQn ^ищивядаят Процессор! Завершение процесса Рис. 9.10. Планирование со снижением приоритета ■г Даже при выделении процессу с более низким приоритетом большего количества времени для выполнения не удается полностью избежать голодания* Еще одним средством против голодания может служить перемещение процесса щ оче- редь с более высоким приоритетом, если процесс не был обслужен в течение некоторого порогового времени в данной очереди. Сравнение производительности Очевидно, что при выборе стратегии планирования критическим стано ится вопрос производительности. Однако точное сравнение стратегий невозмоя$ о в силу того, что относительная производительность зависит от ряда факторов, включая распределение времени обслуживания различных процессов, эффе тив- ность планирования и механизм переключения контекстов, а также природу запросов к устройствам ввода-вывода и их производительность. Тем не мен мы попытаемся сделать хотя бы самые общие выводы. -' й> Анализ очередей щ В этом разделе мы используем основные формулы, описывающие ра очередей, в предположении запуска процессов в соответствии с распределен. Пуассона и экспоненциального времени обслуживания.3 ,. 3 Подробнее с терминологией, связанной с очередями, можно познакомиться втором приложении к данной главе; материалы по анализу очередей можно найгп^,. "° адресу: http://WilliamStallings. com/StudentSupport.html. ■/*£ "■А 480 Часть 4. Планиров * Сначала мы заметим, что любая стратегия планирования, которая выбирает очередной обслуживаемый процесс независимо от времени обслуживания, подчиняется следующему соотношению: где т — время оборота (общее время пребывания в системе, ожидания плюс выполнения); 7* — среднее время обслуживания (среднее время нахождения в состоянии выполняющегося процесса); р — степень использования процесса. В частности, планирование с использованием приоритетов, при котором приоритет каждому процессу назначается независимо от ожидаемого времени обслуживания, обеспечивает то же среднее время оборота, что и простейшая стратегия FCFS. Более того, эти средние значения не зависят от наличия или отсутствия вытеснения. За исключением стратегий FCFS и RR, рассматривавшиеся стратегии планирования осуществляют выбор процесса с учетом ожидаемого времени обслуживания. К сожалению, очень сложно разработать точные аналитические модели этих стратегий. Однако мы можем попытаться рассмотреть относительную производительность стратегий — в сравнении со стратегией FCFS, рассматривая приоритетное планирование, в котором приоритет основан на времени обслуживания. Если планирование выполняется с учетом приоритетов и если классы приоритетов процессам назначаются на основе времени обслуживания, выявляются определенные отличия разных стратегий. В табл. 9.6 приведены формулы, получающиеся при использовании двух классов приоритетов с различным временем обслуживания для каждого класса. А в таблице обозначает частоту поступления новых процессов в систему. Приведенные результаты могут быть обобщены для произвольного количества классов приоритетов. Обратите внимание, что для невытесняющего и вытесняющего планирования получаются разные результаты. При вытесняющем планировании предполагается, что низкоприоритетный процесс немедленно прерывается, как только становится готов к выполнению процесс с более высоким приоритетом. Таблица 9.6. Формулы для двух классов приоритетов Предположения: а) Общие формулы: • Поступление новых процессов подчиняется распре- Л = А. + А. . делению Пуассона ' 2 Процессы с приоритетом 1 обслуживаются перед 1 ' * процессами с приоритетом 2 Р2 = ^ 2 Для процессов с равным приоритетом применяется Р ~ Р1 гг стратегия "первым вошел — первым вышел" Я. А„ Во время обслуживания процессы не прерываются 1* ~ д**) + £ Ls 2 Процессы не покидают очередь т _^,т \ — I _г +-2-Т ' Я " Я '2 лава 9. Планирование в системах с одним процессором 481
Окончание табл. В.в Экспоненциальное время обслуживания, прерыва- я отсутствуют в) Экспоненциальное время об- » служивания с наличием вы- . !** теснения *> *Д тЛ=тЛ+- т =т + '#•2 's2T 1-А 1-Р t;. = i+ ^2=1 + Pi7*,i 1-А 1 1-Р Г рт \ - *- 1 sl i-pj f В качестве примера рассмотрим случай с двумя классами приоритетов, рав- ■ м количеством поступающих в систему процессов каждого класса и средним :менем обслуживания низкоприоритетного класса, в 5 раз превышающим :мя обслуживания высокоприоритетного класса. Тем самым мы хотим отдать . •дпочтение коротким процессам. На рис. 9.11 показан общий результат. При ~ гдпочтении коротких процессов среднее нормализованное время оборота еныиается. Как и следовало ожидать, результат еще лучше при использова- и вытеснения. Обратите, однако, внимание на то, что на общую производи- еьность это влияет не так сильно. ЮН 2 класса приоритетов Вытеснение с учетом приоритетов rsl=5*r, ■- С учетом приоритетов -■■ Без учета приоритетов о СЕ 2 & со Щ о X X «3 I 4h 0.2 0.4 0.6 Степень использования процессора (р) Рис. 9.11. Общее нормализованное время отклика Однако при отдельном рассмотрении классов приоритетов наблюд '1СЛ начительные отличия. На рис. 9.12 показаны результаты для коротких проЦеС" ов с высоким приоритетом. Для сравнения верхняя кривая на графике построе- 182 Часть 4. Планирой "ие на в предположении, что приоритеты не используются, и мы просто рассматриваем относительную производительность той половины процессов, продолжительность выполнения которых меньше. Две другие линии построены с учетом того, что эти процессы имеют более высокий приоритет. На рис. 9.13 показаны результаты того же анализа для низкоприоритетных длительных процессов. Как и следовало ожидать, у этих процессов при приоритетном планировании наблюдается снижение производительности. Ю-! 84 I "I о I 6- со 8 X X (U сз о а 2 О. о 2 класса с различным временем обработки ТЯ " 5 ' ls2 24 С учетом приоритетов Вытеснение с учетом приоритетов 1 ' ' " i i 0.0 "I I Г т—i—]—i—i i i—|—i—г—i—i—]—i—г т i—|—i 1 1—i—|—i—i i I—(—г 0 2 0.4 0.6 0 8 Степень использования процессора (р) 1.0 Рис. 9.12. Нормализованное время отклика для коротких процессов Имитационное моделирование Некоторые трудности аналитического моделирования преодолеваются посредством использования имитации дискретных событий, что позволяет моделировать широкий диапазон различных стратегий. Недостаток имитационного моделирования состоит в том, что полученный результат применим только для конкретного множества процессов при заданных предположениях. Несмотря на это, имитационное моделирование позволяет получить интересные и полезные результаты. Отчет об одном из таких исследований имеется в [FINK88]. Имитировалось Поведение 50 000 процессов со скоростью входа в систему Я = 0.8 и средним вре- енем обслуживания 7\ = 1. Таким образом, предполагается, что степень использования процессора равна р = ХТ^ 0.8. Обратите внимание — здесь исследуется только одна степень использования процессора. \ ^ лава 9. Планирование в системах с одним процессором 483^
10-1 И 2 класса с различным временем обработки 64 t .-'■Г f- ^ Степень использования процессора (р) Рис. 9.13. Нормализованное время отклика для длинных процессов Для представления результатов моделирования процессы группируются в юцентили по 500 процессов в соответствии со временем их обслуживания. Та* [м образом, 500 процессов с минимальным временем обслуживания содержатся первом процентиле; если исключить эти процессы, 500 процессов с минималь» jm временем обслуживания среди оставшихся попадают во второй процентиль т.д. Это позволяет рассматривать влияние различных стратегий планирования i процесс как функцию от длины процесса. На рис. 9.14 показано нормализованное время оборота, а на рис; 9Д6 — >еднее время ожидания. Взглянув на время оборота, мы можем увидеть, что юизводительность FCFS получается весьма непривлекательной — примерно, У »ети процессов время оборота более чем в 10 раз превышает время обслужил»* ш; к тому же это самые короткие процессы. С другой стороны, время ож?р 1Я при этом одинаково для всех процессов, что обусловлено независимостью 'ратегии от времени обслуживания. ■ ,,... tt?Mj При применении стратегии RR используется квант, равный одной едйяиц^; >емени (см. рис. 9.14 и 9.15). За исключением очень коротких процессовг.Я&£:\ шжительность которых менее одного кванта при этой стратегии нормализованное >емя оборота равняется примерно 5 квантам для всех процессов, тем самым . . т ;чивается беспристрастность. Производительность при использовании стране PN выше, если не принимать во внимание короткие процессы. Стратегия:ДК.* эедставляющая собой версию SPN с вытеснением, превосходит SPN по прО;;, стельности, за исключением 7% самых длинных процессов. Как видно по Р**У. 1там исследований, среди невытесняющих стратегий планирования FCFS 0?Дае 84 Часть 4. Планирйни предпочтение длинным процессам, a SPN — коротким. Стратегия HRRN разрабатывалась как компромиссное решение, и именно такой, по результатам исследования, она и является. И, наконец, как и ожидалось, стратегия со снижением приоритета с одинаковыми квантами времени для всех очередей неплохо работает с короткими процессами. 30 40 50 60 70 Процентили по времени обслуживания 100 Рис. 9.14. Результаты имитационного моделирования для нормализованного времени оборота Справедливое планирование Все рассмотренные алгоритмы планирования рассматривают множество готовых к выполнению процессов как единый пул, из которого выбирается очередной процесс для выполнения. Этот пул может быть разделен по степени приоритета процессов, но в противном случае он остается гомогенным. Однако в многопользовательских системах при организации приложений или заданий отдельных пользователей как множества процессов (или потоков) у них имеется структура, не распознаваемая традиционными планировщиками. С точки зрения пользователя, важно не то, как будет выполняться отдельный процесс, а то, как будет выполняться множество процессов, составляющих единое приложение. Таким образом, было бы неплохо, если бы планирование осуществлялось с учетом наличия таких множеств процессов. Данный подход в целом известен как справедливое (fair-share) планирование. Эта же концепция может ыть распространена на группы пользователей, даже если каждый из пользователей представлен единственным процессом. Например, в системе с разделением вРемени мы можем рассматривать всех пользователей данного отдела как членов Глава 9. Планирование в системах с одним процессором 486
ной группы. Планировщик принимает решения с учетом необходимости пре^ч вставить каждой группе пользователей по возможности одинаковый сервис. *f&t\\ т образом, если в системе находится много пользователей из одного отдела, да."''" (менение времени отклика должно в первую очередь коснуться именно пользе*, л-елей этого отдела, не затрагивая прочих пользователей. Ш J .■•>z Щ * \ 10 20 30 40 50 60 70 Процентили по времени обслуживания 80 90 Рис. 9.15. Результаты имитационного моделирования для времени ожидания Термин справедливое планирование указывает на философию, лежащую в снове такого планирования. Каждому пользователю назначен определенный ее, который определяет долю использования системных ресурсов данным Поль- ователем. В частности, каждый пользователь использует процессор. Данная хема работает более или менее линейно, так что если вес пользователя А в два >аза превышает вес пользователя В, то в течение достаточно длительного про- 1ежутка времени пользователь А должен выполнить в два раза большую работу, [ем пользователь В. Цель справедливого планирования состоит в отслеживании ^пользования ресурсов и предоставлении меньшего количества ресурсов то^Г юльзователю, который уже получил лишнее, и большего количества — va^f* [ья доля оказалась меньше справедливой. ^* Был предложен ряд алгоритмов справедливого планирования [НЕК ^» £AY88, WOOD86]. В этом разделе мы рассмотрим описанную в [HENR84] СУ ^ санирования, реализованную в ряде систем UNIX. Эта схема известна „ справедливый планировщик (fair-share scheduler — FSS). FSS при принятии ре- нения рассматривает историю выполнения связанной группы процессов вмесТ индивидуальными историями выполнения каждого процесса. Система раздел юльзовательское сообщество на множество групп со справедливым планиро 186 Часть 4. Планиро нием и распределяет процессорное время между ними. Так, если у нас имеется четыре группы, каждая из них получит по 25% процессорного времени. В результате каждая группа обеспечивается виртуальной системой, работающей, соответственно, медленнее, чем система в целом. Планирование осуществляется исходя из приоритетов с учетом приоритета процесса, недавнего использования им процессора и недавнего использования процессора группой, к которой он принадлежит. Чем больше числовое значение приоритета, тем ниже сам приоритет. Для процесса у из группы k применимы следующие формулы: ,. cpuМ-1) GCPU,{i) = ^ i n/.\ ~ CPUAi-l) GCPUk(i-\) P,(i)= Base, + - -+ — - , где CPU} (/) — мера загруженности процессора процессом j на интервале i; GCPUk (/) — мера загруженности процессора группой к на интервале i; Pj (i) — приоритет процесса j в начале интервала i (меньшее значение соответствует большему приоритету); Base^ — базовый приоритет процесса /; Wt — вес, назначенный группе k (0<Wk <1 и ^VVt=l). Каждому процессу назначается базовый приоритет. Приоритет процесса снижается по мере использования им процессора, так же как и по мере использования процессора группой в целом. В случае использования процессора группой среднее значение нормализуется делением на вес группы. Чем больший вес назначен группе, тем меньше использование ею процессора влияет на приоритет. В табл. 9.7 приведен пример, в котором процесс А находится в одной группе, а процессы В и С — в другой; вес каждой группы равен 0.5. Предположим, что все процессы ориентированы на вычисления и всегда готовы к выполнению. Базовый приоритет всех процессов — 60. Степень использования процессора определяется следующим образом: процессор прерывается 60 раз в секунду; при каждом прерывании увеличивается значение счетчика использования процессора текущего процесса, так же как и соответствующего счетчика группы. Один раз в секунду происходит перерасчет приоритетов. В приведенной схеме первым запускается процесс А. Позже его вытесняет Другой. Процессы В и С теперь имеют более высокий по сравнению с А приоритет, и на выполнение передается процесс В. По окончании второй единицы времени наивысший приоритет снова имеет процесс А, который и передается на выполнение. После этого ситуация повторяется с тем отличием, что теперь наивысший приоритет имеет процесс С. Очередность выполнения процессов такова: А, В, А, С, А, В, А, С, .... В результате 50% времени процессор занят выполнением процесса А, и 50% — выполнением процессов В и С Глава 9. Планирование в системах с одним процессором 487
с >> а V о а И •4 С К 0> Я « аз о а й к & {ч S ю О to « ч с о о я х ч tt й> а л Р, с о С а» к & Й «г я- S ч ю аЗ Е- ь К а. о К а. ез С С >> а и, о Ю 5Г О о и СР Я" о а. С ъ я а о я а С с в >> о. U о о OHN о 4D О о ГО .-н ■-) гн • г- С т-\ СЯ • и> г- со о о О rH CM о г- m г- О ГО OHM • • о о у?|го о OHM • о о со ю ^о г- 1Л г- РП СП 1-го со С) in vo г- го о я- о a S I. О r-\ СМ • о о ГО Р с о а, о о СП 1Л Г- г~ го in vo г- _ в ю г— г- го 00 СЛ О ш » r-\ rH CM CD CD CTi О r-t т-н CM 00 г- ■■H ■■*»" СП с см ГО со Г~ J щ £ tfj «4 V * ? Групп полняю 35 « g Ч> 2 ч § А в а 8 *- к -» .= о. -.,s Й - -Т* .-'« ■£f - щ с $ I > ;. % \ 1 <■' # ' "' * ^ -с 1 ■ £v- 9.3. ТРАДИЦИОННОЕ ПЛАНИРОВАНИЕ UNIXil В этом разделе мы рассмотрим традиционное планирование UNIX, используемое как в SVR3, так и в 4.3 BSD UNIX. Эти системы в первую очередь предназначены для работы в интерактивной среде с разделением времени. Алгоритм планирования разработан таким образом, чтобы обеспечить приемлемое время отклика для интерактивных пользователей, в то же время гарантируя отсутствие голодания низкоприоритетных заданий. Хотя описываемый алгоритм и был заменен в более современных версиях UNIX, его изучение как представителя практически используемых алгоритмов с разделением времени не лишено основания. Схема планирования SRV4 соответствует требованиям реального времени, но этот вопрос мы обсудим в главе 10, "Многопроцессорное планирование и планирование реального времени". Традиционный планировщик UNIX использует многоуровневый возврат с применением кругового планирования в пределах очередей каждого приоритета, а также односекундное вытеснение. Таким образом, если текущий процесс не блокируется или не завершается в пределах одной секунды, он вытесняется. Приоритет основан на типе процесса и истории выполнения. Применяются следующие формулы: ,, CPLf.fi-I) CPUJi-l) Р. 0) = Base, + J— - + nice., где CPU j (i) — мера использования процессора процессом ;' на протяжении интервала i; Pj (/) — приоритет процесса / в начале интервала i (меньшее значение соответствует большему приоритету); Base; — базовый приоритет процесса j; nice, — указываемый пользователем коэффициент. Приоритет каждого процесса пересчитывается один раз в секунду, в момент принятия решения о том, какой процесс будет выполняться следующим. Назначение базового приоритета состоит в разделении процессов на фиксированные группы уровней приоритетов. Значения компонентов CPU и nice ограничены требованием того, чтобы процесс не мог выйти из назначенной ему на основании базового приоритета группы. Эти группы используются для оптимизации доступа к блочным устройствам (например, к диску) и обеспечения быстрого отклика операционной системы на системные вызовы. Имеются следующие группы приоритетов (приведены в порядке снижения приоритетов): • программа свопинга; • управление блочными устройствами ввода-вывода; • управление файлами; • управление символьными устройствами ввода-вывода; • пользовательские процессы. Глава 9. Планирование в системах с одним процессором 489 -у-
I. Т "!?& ^» Такая иерархия должна обеспечить наиболее эффективное использование^'!', ройств ввода-вывода. В группе пользовательских процессов использование ис- $ '^ *$. ии исполнения приводит к применению штрафных санкций к процессам, f£ ' ■ ентированным на вычисления, что также должно способствовать повышению ''■'*■ эективности системы. В сочетании с круговой схемой с вытеснением данная атегия неплохо удовлетворяет требованиям к системе общего назначения с делением времени. Пример работы планировщика приведен в табл. 9.8. Процессы А, В и С соз- этся одновременно с одним и тем же базовым приоритетом 60 (мы игнориру- наличие значения параметра nice). Таймер прерывает выполнение процесса раз в секунду и увеличивает значение счетчика текущего процесса. В примере !ДПОлагается, что ни один процесс не блокируется сам по себе и нет никаких тих процессов, готовых к выполнению. Сравните эту таблицу с табл. 9.7. -»3£-- -, %*. 1 " % А- А*. у 1Ш ViJ- -с-'ЛЭ* ■ ■ М гЖ* ■■ч.-: *$ •* •ЙЙ; '0. /•'?* с^1? *> *■>. £ -** ! \ к- л*. -?■ 'ъЛ .'У ■i А . ;.* VI ■'*■■■ г~ ... 3& vS и ft .4. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ ^ И КОНТРОЛЬНЫЕ ВОПРОСЫ ., Операционная система должна принимать во время выполнения процессов i типа решений, связанных с планированием. Долгосрочное планирование опаляет, когда новый процесс должен поступить в систему. Среднесрочное пла- рование является частью свопинга и определяет, когда программа должна ть полностью или частично загружена в основную память, с тем чтобы она ^J гла выполняться. Краткосрочное планирование определяет, какой из готовых | исполнению процессов будет выполняться процессором следующим. .^ При разработке краткосрочного планировщика может использоваться ряд >) ^личных критериев. В соответствии с некоторыми из них поведение системы ;(■ осматривается с точки зрения пользователя, другие же ориентированы на об- 7ю эффективность системы, что отвечает нуждам всех пользователей. Некото- . ' .,/ е из критериев можно легко выразить количественно, другие же по своей * Т ироде в большей степени качественные. С точки зрения пользователя наиболее ^ жным критерием является время отклика, в то время как с позиции системы ■ j ^ лее важна степень использования процессора. -*'*-.■ ^ ' Имеется ряд алгоритмов краткосрочного планирования, осуществляющих .^ - ;бор среди готовых к выполнению процессов. 'jf? ; » Первым поступил — первым обслужен. Выбирается процесс, ожидающий <. ■< ^ *• обслуживания дольше других. Л'! » Круговое планирование. Использует кванты времени для ограничения вре-^ у мени непрерывного выполнения процесса, циклически обслуживая имею- : 1& щиеся процессы. t * Выбор самого короткого процесса. Выбирается процесс с наименьшим ожи- > даемым временем работы; вытеснение процессов не применяется. _''- „ * Наименьшее остающееся время. Выбирается процесс с наименьшим ожи* ■£ Даемым временем оставшейся работы. Процесс может быть вытеснен друтШ*£- готовым к выполнению процессом. -Л$. ЕЮ Часть 4. Планиро "■i .•V Таблица 9.8. Пример традиционного планирования процессов в UNIX Процесс А I Процесс В Время О Приоритет Счетчик 60 75 67 63 76 68 0 1 2 60 30 15 7 8 9 67 33 16 Приоритет Счетчик 60 60 75 67 63 76 0 О 1 60 30 15 7 8 9 67 33 Процесс С Приоритет Счетчик 60 60 60 75 67 63 ^0 1 2 60 30 15 Штриховка указывает выполняющийся процесс • Наивысшее отношение отклика. Принимаемое решение опирается на оценку нормализованного времени оборота. • Снижение приоритета. Определяет множество очередей и распределяет в них процессы, основываясь на истории выполнения и других критериях. Выбор алгоритма планирования зависит от ожидаемой производительности и сложности реализации. Глава 9. Планирование в системах с одним процессором 491
■*1 'к -■> Ski ючевые термины пристрастность Краткосрочное Предсказуемость мя оборота планирование Пропускная способность 1ребывания в системе) Круговое планирование Скорость поступления ^ мя обслуживания Первым поступил — процессов *. ^ * мя ожидания первым обслужен Справедливое планирование ..^,.„' мя отклика Первым вошел — первым Среднесрочное ;gf^ :петчер вышел планирование ;pf: ;госрочное планирование Планирование с учетом Степень использования i? iHt времени приоритетов процессора >нтрольные вопросы 1.1. Кратко опишите три типа планирования процессов. 1.2. Какое требование к производительности системы является критическим в случае использования интерактивной операционной системы? L3. В чем заключается отличие времени оборота от времени отклика? УЛ. Какой приоритет (высокий или низкий) представляет малое значение в случае планирования процессов? ).5. В чем заключается отличие планирования с вытеснением от невытесняющего планирования? ).6. Кратко опишите FCFS-планирование. ).7. Кратко опишите круговое планирование. ).8. Кратко опишите стратегию выбора самого короткого процесса. ).9. Кратко опишите стратегию наименьшего остающегося времени. 10. Кратко опишите стратегию наивысшего отношения отклика. 11. Кратко опишите стратегию со снижением приоритета. *.fc. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА ■ v '. 1 *«■: ■fi 1 J, ; , iv t ! J t !« ■4? fr ^V;^1 * • ' " ..:*>•*■«. Т.-..-- #U Планирование рассматривается почти в каждой книге, посвященной опера- ,v энным системам. Строгий анализ различных стратегий планирования с ис- ^ тьзованием очередей представлен в [STUC85], [KLEI76] и [CONW67]. В - 3WD93] также содержится поучительный анализ производительности различ- ^ х алгоритмов планирования. | ONW67 Conway R., Maxwell W.. Miller L. Theory of Scheduling. -- Reading;1-MA. ^ Addison-Wesley, 1967. хгт ^ OWD93 Dowdy L., Lowery C. P.S. to Operating Systems, — Upper Saddle River, N J: ^ .Prentice Hall, 1993. .. - * «Ц' **' LEI76 Kleinrock L. Queuing Systems. Volume II. Computer Applications..-^rNew i York: Wiley, 1976.1 . . ,-^ .,;- -'.-, ■ _ _-. ; Имеется перевод данной книги: Клейнрок Л. Вычислительные системы с очереДЯ-v . — М.: Мир, 1979. — Прим. ред. % >2 Часть 4. Планирован STUC85 Stuck В., Arthurs E. A Computer and Communications Network Perforhi-Ч ance Analysis Primer, — Englewood Cliffs, NJ: Prentice Hall, 1985. " %$ VtJffi^ 9.1. Рассмотрим следующий набор процессов: Имя процесса А В С D Е Время поступления 0 1 3 9 12 Время обработки 3 5 2 5 5 Выполните для данного множества анализ, аналогичный анализу, представленному на рис. 9.5 и в табл. 9.5. 9.2. Выполните предыдущее задание для следующего набора процессов: Имя процесса А В С D Время поступления Время обработки 0 1 1 9 2 1 3 9 9.3. Докажите, что среди невытесняющих алгоритмов планирования стратегия SPN обеспечивает минимальное среднее время ожидания для пакета одновременно поступивших заданий. Считаем, что планировщик всегда должен выполнять задание, если таковое доступно. 9.4. Предположим, что у нас имеется следующий набор значений времени разрыва: 6, 4, 6, 4, 13, 13, 13, а начальное приближение равно 10. Постройте график, аналогичный графику, приведенному на рис. 9.9. 9.5. Рассмотрим следующую альтернативу формуле (9.3): Sn+l=aTii+(l-aSn) X,,+]=min[t/,max[L,(/3S„+1)]] где U и L представляют собой заранее определенные верхнюю и нижнюю границы оценки значения Т. Значение Хя_, используется в алгоритме SPN вместо значения 5,1+1. Какие функции выполняют параметры а и /3, и какое влияние оказывают высокие и низкие значения данных параметров? 9.6. В невытесняющей однопроцессорной системе очередь готовых процессов содержит три задания в некоторый момент t (непосредственно после завершения предыдущего задания), поступивших в систему в моменты времени tlt t2 и t3, ожидаемое время выполнения которых г1э г2 и г3, соответственно. На рис. 9.16 показано линейное увеличение отношения отклика этих процессов со временем. Используйте данный пример для поиска стратегии планирования, известной как планирование минимакса отношения отклика, которая минимизирует максимальное отношение отклика для данного пакета заданий, игнорируя дру- Глава 9. Планирование в системах с одним процессором 493
гие возможные поступления заданий. Указание: сначала примите решение, том какое задание будет выполняться последним. а *- Время 11 Ч *3 Рис. 9.16. Отношение отклика как функция времени ь \' --$ ?-# /т.ш •*Щ t^H 4" ■ 'щ , -Л ■ и <f 4 % Ш : ■ •Ь. д£ '1& 3 в .Л .* _- -i г-1 . ' 5. i *! ' ■i I *£ ■i ч >. h 4 ч'* ^,- .! f v« Докажите, что минимаксный алгоритм из предыдущей задачи минимизирует \ максимальное время отношения для данного пакета заданий. Указание: рас- ; смотрите задание с максимальным отношением отклика, до которого выпол- - няются все остальные задания. Рассмотрите то же подмножество заданий, * спланированных в другом порядке, и определите отношение отклика задания, р_ выполняющегося последним. Обратите внимание — теперь наряду с заданиями *,, из пакета в системе могут выполняться и другие задания. Определим время пребывания Тг как среднее общее время, затрачиваемое про- , цессом на ожидание и обслуживание. Покажите, что в случае обслуживания "первым вошел — первым вышел" со средним временем обслуживания Ts и степенью загруженности процессора р справедливо соотношение Тг = 7^/(1— Р) • Процессор переключается между готовыми к выполнению процессами с бесконечной скоростью без накладных расходов (это идеализированная модель кругового планирования с использованием квантов времени, которые гораздо меньше време- в ни обслуживания). Покажите, что при распределенных в соответствии с законом Пуассона процессах с экспоненциальным временем обслуживания, входящих из £. бесконечного источника, среднее время отклика Rx процесса со временем обслуживания х задается соотношением Кх = xj[i-p) . Указание: обратитесь к основным^ уравнениям теории очередей, которые можно найти по адресу* nttp://williamStallings.com/StudentSupport.html. Затем примите количе>'=1■■ ство ожидающих процессов в системе перед поступлением данного равным w. ^f О. Большинство круговых планировщиков используют кванты времени фиксиро*| ванного размера. Приведите аргументы в пользу квантов малого размера, «^ затем — в пользу большого размера квантов времени. Сравните типы систем » заданий, для которых применимы те или иные аргументы. Есть ли среди н^г; Г У такие, для которых применимы и те, и другие аргументы? .л Часть 4. Планиров ;И 9.11. В системе с очередями новое задание должно ожидать своей очереди на обслуживание. В то время, когда задание находится в состоянии ожидания, его приоритет линейно возрастает со временем со скоростью а от нулевого значения. Задание находится в состоянии ожидания до тех пор, пока его приоритет не сравняется с приоритетом обслуживаемых заданий, после чего оно будет обслуживаться наравне с другими процессами с использованием кругового планирования (при этом его приоритет возрастает со скоростью Р, меньшей, чем а). Этот алгоритм известен как круговой эгоистичный, поскольку задания пытаются (понапрасну) монополизировать процессор путем постоянного повышения приоритета. Воспользуйтесь рис. 9.17, чтобы показать, что среднее время отклика Rx задания со временем обслуживания х задается формулой R = \-р 1-р" где p = Xs р'- р ( 1-— 0<р<а а в предположении, что время поступления и обслуживания распределено экспоненциально, со средними значениями 1/Я и s соответственно. Указание: рассмотрите систему в целом и две подсистемы в отдельности X а X " р Г L Выход Ожидающие задания Обслуживаемые заданий а> & Время Рис. 9.17. Эгоистичное круговое планирование 9.12. Интерактивная система с использованием кругового планирования и свопинга пытается обеспечить гарантированный отклик на тривиальные запросы следующим образом. После завершения кругового цикла по всем процессам в состоянии готовности система определяет квант времени для каждого готового процесса на следующий цикл посредством деления максимального време- Глава 9. Планирование в системах с одним процессором 495
/ Л*5 и ни отклика на количество процессов, требующих обслуживания. Насколько обоснованна такая стратегия? Какой тип процессов в целом получает преимущества при многоуровневетг . возврате — ориентированные на вычисления или ориентированные на опера» _-$? ции ввода-вывода? Вкратце поясните свой ответ. / При использовании стратегии планирования на основе приоритетов процессов:% ^ планировщик передает управление определенному процессу, если только .$ \ §> состоянии ожидания не находится процесс с более высоким приоритетом. '-ч^; Предположим, что при принятии решения о планировании не используется никакая иная информация. Примем также, что приоритеты процессов определяются при их создании и в дальнейшем не изменяются Почему в такой системе опасно использование алгоритма Деккера для обеспечения взаимоисключений (см. раздел 5.2)? Поясните это, описав, какая нежелательная ситуация может сложиться, и как это может произойти. ,а Пять пакетных заданий, от А до Е, поступают в вычислительный центр одновременно. Их ожидаемое время работы — 15, 9, 3, 6 и 12 минут соответственно. Их приоритеты, определенные при передаче заданий, равны соответственно 6, 3, 7, 9 и 4, причем меньшее значение означает более высокий приоритет. Для каждого из перечисленных ниже алгоритмов определите время оборота каждого процесса и среднее время оборота всех процессов. Накладные расходы, связанные с пере ключением процессов, не учитываются. Поясните, как вы пришли к данному ответу. В трех последних случаях предполагается, что в определенный момент времени работает только один процесс, вытеснения не происходит и все задания ориентированы на вычисления. а. Круговое планирование с размером кванта, равным 1 мин. б. Планирование с учетом приоритетов. в. FCFS при запуске процессов в следующем порядке: 15, 9, 3, 6 и 12. ,, г. Первым выполняется самое короткое задание. Т r**'K?i Xf'-Fr" ^ri;r^v. .«- -v-yv.—^ , ,,-.- ,—~ ;%&££?* &*.ЗЩ [РИЛОЖЕНИЕ А, ВРЕМЯ ОТКЛИКА Время отклика — это время, затрачиваемое системой на реакцию на дая- й ввод. При интерактивных транзакциях его можно определить как время кду последним нажатием клавиши пользователем и началом вывода резуль- а компьютером. Для разных типов приложений, вообще говоря, требуются и, несколько отличающиеся определения времени отклика. В целом можно зать, что это время, требующееся системе для отклика на запрос на выполне- : некоторой задачи. В идеале время отклика любого приложения должно быть как можно 1ьшим, однако практически всегда меньшее время отклика имеет большую имость (в широком смысле этого слова), связанную с необходимостью исполь-. ания более мощных компьютеров (чем быстрее компьютер, тем меньше время :лика) и с тем, что обеспечение быстрого отклика одних процессов неизбежно^. №шает показатели других процессов. Следовательно, необходим поиск коМ*-| >миссного решения. ,К,Г В табл. 9.9 (на основе [MART88]) приведены шесть основных диапазоне*^ !мени отклика. Сложности разработки начинаются со времени отклика, кото-^4 i меньше секунды. Время, составляющее доли секунды, требуется системе^ эавляющей внешними устройствами или каким-либо другим образом взаимен ':*■. •л ^ Часть 4. Планирован^ действующей с ними, например со сборочным конвейером. При рассмотрении взаимодействия человека с компьютером (например, в приложениях ввода данных) мы оказываемся в области отклика в режиме диалога, где также требуется малое время отклика, но его точное значение очень трудно определить. Таблица 9.9. Диапазоны времени отклика Более 15 секунд Непригодно для интерактивных систем. Возможно, найдется очень флегматичный пользователь, который терпеливо будет ждать ответа на один вопрос в течение такого длительного времени, но обычно такое время отклика недопустимо. В этом случае следует предусмотреть для пользователя возможность переключения для работы с другой задачей, пока обрабатывается его запрос Более 4 секунд Обычно это время слишком велико, чтобы информация оставалась в краткосрочной памяти оператора (не компьютера!), и может мешать нормальной комфортной работе при решении задач или работе с данными. Однако в ряде случаев такие задержки допустимы От 2 до 4 секунд Задержка более 2 секунд недопустима при работе, требующей высокой концентрации внимания. Задержка от 2 до 4 секунд может показаться слишком большой, когда пользователь поглощен работой, но в ряде случаев такие задержки вполне допустимы Менее 2 секунд Если при работе за терминалом пользователь должен помнить информацию в течение нескольких циклов запросов-ответов, то время отклика системы должно быть минимальным. Чем большее количество информации должен помнить пользователь, тем меньшее время отклика должно быть у системы. В случае выполнения сложной работы за терминалом 2 секунды представляют собой верхний предел допустимого времени отклика Менее секунды v Ряд приложений, в особенности с графическим интерфейсом, требуют крайне малого времени отклика, для того чтобы поддерживать пользовательский интерес в течение длительного времени. Десятые доли секунды Такое время отклика требуется при работе с клавиатурой (вывод символа на экран после нажатия клавиши) и мышью (начало действия после щелчка на объекте). В особенности важно время отклика на события мыши, если разработчиком не предусмотрены альтернативные возможности управления Зависимость производительности работы пользователя в интерактивных приложениях от времени отклика изучалась в ряде работ (см., например, [SHNE84, THAD81, GUYN88]). Эти исследования показали, что когда темп работы таков, что ни пользователь, ни компьютер не ожидают друг друга, производительность резко возрастает при том же, если не более высоком, качестве работы. Достаточно широко применимо в интерактивных приложениях время отклика до 2 секунд, поскольку обычно человеку требуется небольшое время для Раздумий над следующей задачей. Тем не менее общая тенденция такова, что с взрастанием скорости отклика растет и производительность работы. Эти результаты были получены при анализе транзакций в диалоговом ре- ^Hjvje. Транзакция состоит из команды, вводимой пользователем с терминала, и твета системы, и представляет собой базовую единицу работы пользователя в ДИалОГоВом режиме. Суммарное время отклика можно разделить на две части. ; "лава 9. Планирование в системах с одним процессором 497
• Время отклика пользователя. Интервал времени между полным получен ем ответа компьютера и вводом следующей команды. Зачастую об этом времени говорят как о времени на размышления. , • Время отклика системы. Интервал времени между моментом ввода очередной команды пользователем и моментом завершения вывода ответа на нее на терминал. В качестве примера влияния снижения времени отклика системы на произ- юдительность работы на рис. 9.18 показаны результаты исследований, провеянных с инженерами, использующими системы автоматического проектирова- шя для разработки интегральных схем [SMIT83]. Каждая транзакция представ- 1яет собой команду инженера, вносящего изменения в чертеж на экране компьютера. Как видно из приведенного результата, скорость выполнения тран- $акций возрастает с уменьшением времени отклика системы, причем особенно резкое возрастание происходит при времени отклика, меньшем чем секунда. При jtom снижается время отклика пользователя, что связано с особенностями краткосрочной памяти и концентрации внимания человека. Транзакций за час ——■ Эксперт S\ ' ,-щ Пользователь -1Ш Новичок т м I 1.00 1.25 0.25 0.50 0.75 Время отклика системы (в секундах) :i|i Рис. 9.18. Влияние времени отклика при работе с САПР ф Еще одна область, где время отклика является критическим, - Worl<* с иомптитпмп /лт ТТПГТЛ7ГТЯ 4fiT>e3 Internet или в пределах корпорант*»" Web, независимо от доступа — через Internet или в пределах ти. Время получения страницы из Web существенно варьируется, и столь ,. сильно варьируется степень вовлечения пользователя в работу. Системы с мальь временем отклика обычно больше привлекают пользователя и сильнее удер3*^. вают его внимание. Как показано на рис. 9.19, наиболее высокий уровень п X -:-<.-<1- 5* * 498 Часть 4. Планиро И '<*а& зовательского внимания у систем, время отклика которых меньше 3 секунд. При времени отклика от 3 до 10 секунд внимание пользователя рассеивается, а время, больше 10 секунд, зачастую приводит к потере пользователя, который попросту завершает работу с данным узлом. <*> 5 °= Й ^ О- ф х ге о to =г о Полная Быстро 1 Слабая Средне Отсутствие интереса Медленно i i i i Переключение каналов кабельного телевидения .£3= к а> о. m I I I I Телефонное соединение в пределах США П оверкак -дитнойка«тып»ипокупке Соединение по модему со скоростью 28.8 Кбит/с Сделка на Нью-Йоркской би §же i i 0 3 10 Time (seconds) Рис. 9.19. Требования ко времени отклика [SEVC96] ПРИЛОЖЕНИЕ Б. ОЧЕРЕДИ 30 EF*--.. ЯК В этой главе, как и в ряде последующих глав, используются результаты, полученные в теории очередей. В этом приложении мы представим краткое определение систем очередей и основную терминологию этой области. Для читателей, незнакомых с анализом очередей, будет полезно получить информацию, касающуюся его основ, по адресу: http://WilliamStallings.com/StudentSupport.html. Очередь с одним сервером Простейшая система с очередью изображена на рис. 9.20. Центральным элементом системы является сервер, обеспечивающий некоторый сервис элементам очереди. Элементы поступают в систему для обслуживания из некоторого множества элементов. Если сервер не занят, поступивший элемент обслуживается немедленно; в противном случае он попадает в линию ожидания.2 Когда сервер завершает обслуживание элемента, он покидает систему. При наличии эле- В ряде источников линия ожидания известна как очередь, однако достаточно Распространено применение термина "очередь" ко всей системе в целом. Мы используем тсрмин "очередь" для обозначения линии ожидания, если не оговорено иное. Глава 9. Планирование в системах с одним процессором 499 ~^
A V лентов в очереди один из них немедленно поступает в сервер для обслуживания^ -1' Сервером в этой модели может быть нечто, выполняющее некоторые действия, 1ад множеством элементов (например, процессор, обслуживающий процессы,'"¥ 1иния передач, обеспечивающая передачу пакетов данных, или устройство ввек ($ ;а-вывода, обеспечивающее чтение или запись по запросу). v - Линия ожидания (очередь) Поступление а — скорость поступления Стратегия диспетчеризации Выход w — количество ожидающих элементов Т„—время ожидания Ts — Бремя обслуживания р — загруженность А Й> * г—количество элементов в системе с очередью Тг— время нахождения элемента в системе Рис. 9.20. Структура системы с очередью и параметры очереди с одним сервером В табл. 9.10 приведены основные параметры, связанные с очередями. Элементны -■яг* . '.-. поступают в систему с некоторой скоростью Я. В любой момент времени в очере "щ ожидает обслуживания некоторое количество элементов (может быть нулевым), среднее количество элементов в очереди — w, а среднее время ожидания обслужив^ ния — Т,„. Эта величина усредняется по всем входящим в систему элементам, в Тек числе обслуживаемым немедленно, без ожидания. Сервер обслуживает элементы *о средним временем обслуживания Т„ которое представляет собой интервал между/ диспетчеризацией элемента и его выходом из системы. Загруженность, р, представ ..- ляет собой отношение времени, в течение которого сервер занят, к общему временя» И, наконец, два параметра описывают систему в целом. Это — среднее колич элементов г, находящихся в системе, включая обслуживающиеся и ожидающие (если таковые имеются), и Тг — среднее время, затраченное ими на прохождение системы (мы будем говорить о нем как о времени нахождения в системе).3 Таблица 9.10. Параметры системы с очередью Ч w — скорость поступления; среднее количество элементов, поступающих в систему' за одну секунду. ,. — среднее время обслуживания каждого поступившего элемента; количество времени, затраченное на обслуживание одного поступившего элемента (без учета времени ожидания в очереди). ■* ?. — загруженность; доля времени, в течение которого сервер находится в состоявй занятости. — среднее количество элементов, ожидающих обслуживания. «&* -►:** 3 В ряде литературных источников этот термин применяется к среднему &№ ни ожидания в очереди до момента обслуживания. * 500 Часть 4. Планиро нйр ч Окончание табл. 9.10 Tw _ г Тг — среднее время ожидания (включая как элементы, ожидающие обслуживания, так и элементы, обслуженные немедленно при поступлении в систему (со временем ожидания, равным нулю)). среднее количество элементов, находящихся в системе (ожидающих и обслуживаемых). среднее время нахождения в системе (затраченное на ожидание и обслуживание) Если предположить, что емкость очереди не ограничена, то системой не будет потерян ни один элемент; будет только отложено обслуживание элементов. При таком условии скорость поступления элементов в систему будет равна скорости их выхода из системы. При увеличении потока элементов в системе возрастает загруженность сервера, и при р = 1 достигается насыщение. Таким образом, теоретическая максимальная скорость поступления равна Апах — ~ ' s Однако при приближении к насыщению очередь становится очень большой (и растет неограниченно при р = 1). Практические требования, такие, как требования ко времени отклика или ограничения на размер буферов, обычно ограничивают скорость поступления в систему с одним сервером 70-90% от теоретического максимума. Обычно делаются следующие предположения. • Источник элементов. Как правило, предполагается неограниченный источник. Это означает, что скорость поступления не изменяется со временем. При конечном источнике его емкость со временем снижается за счет обработанных элементов и, как правило,ч пропорционально снижается скорость поступления элементов в систему. • Размер очереди. Обычно предполагается, что очередь не ограничена, т.е. линия ожидания может неограниченно увеличиваться. Если очередь конечна, в системе могут наблюдаться потери элементов. На практике очередь конечна, но в большинстве случаев это не приводит к существенным отличиям в анализе. • Стратегия диспетчеризации. Когда сервер освобождается, а очередь — не пуста, принимается решение о том, какой элемент из очереди будет передан серверу для обслуживания. Простейшим подходом является стратегия "первым вошел — первым вышел". При использовании термина очередь подразумевается именно такая стратегия. Другая возможность — стратегия "последним вошел — первым вышел". На практике можно встретить стратегии, основанные на времени обслуживания. Например, маршрутизатор может обрабатывать сначала как короткие пакеты (для генерации большего количества пакетов), так и длинные (для минимизации времени обработки по отношению ко времени передачи). К сожалению, очень сложно аналитически смоделировать стратегию, основанную на времени обслуживания. 1 лава 9. Планирование в системах с одним процессором 501
Очередь со многими серверами На рис. 9.21 представлено обобщение рассмотренной нами простейшей модели с несколькими серверами, совместно использующими одну очередь. Если в момент поступления элемента доступен хотя бы один сервер, поступивший элемент тут же передается этому серверу. Предполагается, что все серверы идентичны, так что если доступны несколько серверов, то не имеет значения, какой именно из них обслужит поступивший элемент. Если все серверы заняты, элемент попадает в очередь. Когда какой-либо из серверов освобождается, а очередь — не пуста, из нее в соответствии с той или иной стратегией выбирается.. элемент, передающийся освободившемуся серверу. ..£ Все параметры системы, показанные на рис. 9.20, без изменений переносят-*; ся на многосерверную систему, за исключением загруженности сервера. Если у\ нас имеется N идентичных серверов и р — загруженность каждого сервера, то под загруженностью системы мы можем понимать величину Np; иногда для этой величины используется термин интенсивность трафика (traffic intensity). Таким образом, максимальная теоретическая загруженность равна Nxl00%, а теоретическая максимальная скорость поступления у Лгаах ~ " i Ключевые характеристики системы с несколькими серверами обычно те же, что и в случае системы с одним сервером, так что, как правило, предполагается наличи бесконечного источника элементов, очереди неограниченного размера, совместно ис пользуемой всеми серверами. Если не указано иное, предполагается, что при выборе элемента для обслуживания используется стратегия "первым вошел — первым вы шел". Выбор сервера в случае их идентичности значения не имеет. На рис. 9.21,6 показан еще один вариант системы с несколькими сервера ми, в котором каждому серверу соответствует единственная очередь. i I*- 502 Часть 4. Планируй нИ «V : * 3 ^d Поступление Очередь А — скорость поступления Стратегия диспетчеризации А N ir Сервер 1 Сервер 2 N Сервер N а) Очередь с несколькими серверами Выход 1 Поступление /. — скорость поступления А. N N J—~ Сервер 1 Сервер 2 Сервер N Выход 17 -Г *з б) Несколько очередей с серверами Рис. 9.21. Системы с несколькими серверами J А лава 9. Планирование в системах с одним процессором
^~'ч4 ш -J - 1 ■\53Р f j°fc > ft* 41 '1% :t f* = 3* H5 'sV. ..^», , ГЛАВА Многопроцессорное планирование и планирование реального времени 10.1. Многопроцессорное планирование 10.2. Планирование реального времени 10.3. Планирование в Linux 10.4. Планирование в UNIX SVR4 10.5. Планирование Windows 2000 10.6. Резюме, ключевые термины и контрольные вопросы 10.7. Рекомендуемая литература 10.8. Задачи 10
этой главе мы продолжим рассмотрение планирования процессов. Начнем с 3 изучения вопросов, возникающих при наличии в системе нескольких процессоров, после чего во втором разделе главы познакомимся с планировани- [ реального времени. - ц • -■ tJw ЮЛ. МНОГОПРОЦЕССОРНОЕ ПЛАНИРОВАН Е Если вычислительная система содержит более одного процессора, щщ раз- 1ботке планирования встают дополнительные вопросы. Начнем с краткого об- »ра многопроцессорности и разницы в планировании на уровне процессов5^ на ювне потоков. t€f Многопроцессорные системы можно классифицировать следующим образом • Слабосвязанные системы, или кластеры. Состоят из набора относительно автономных систем; каждый процессор имеет собственную основную память и каналы ввода-вывода. Этот тип систем будет рассмотрен в главе 13, "Распределенные вычисления, архитектура клиент/сервер и кластеры**. • Функционально специализированные процессоры. В качестве примера ожно привести процессор ввода-вывода. В такой ситуации у нас имеется ведущий процессор общего назначения; специализированные процессоры, предоставляющие ему свои услуги, являются ведомыми, управляемыми ведущим процессором. Вопросы, связанные с процессорами ввода-вывода, будут затронуты в главе 11, "Управление вводом-выводом и дисковое планирование". • Сильносвязанные системы. Состоят из множества процессоров, совместно использующих общую основную память и находящихся под общим управлением операционной системы. ' Материал, изложенный в данной главе, касается последней категории много- роцессорных систем, а еще точнее — вопросов планирования в таких системах Зернистость ■ Неплохой характеристикой многопроцессорной системы может с, ж ернистость синхронизации (synchronization granularity), которая предстг т обой частоту синхронизации между процессорами в системе. Мы будем; разли- тть пять типов параллельных вычислений по степени их зернИйТ^с » табл. 10.1, построенная на материалах [GEHR87, WOOD89]). Л~* Габлица 10.1. Зернистость синхронизации 'У ?азмер зерна Описание Интервал синхронкза ч_ команды • " _>!, ^1алый Паралтельные вычисления на уровне < 20 отдельных команд "* средний Параллельные вычисления или мно- 20 - 200 гозадачность в пределах одного приложения ■ Большой Многозадачность на уровне процессов 200 - 2000 в многозадачной среде | 506 Часть 4. Планид. 0tl1 Окончание табл. 10.1 Размер зерна Описание Интервал синхронизации, команды Очень большой Распределенная работа в сети для 2000 - 1М формирования единой вычислительной среды Независимые Не связанные друг с другом процессы — процессы Независимые процессы Между независимыми процессами явной синхронизации нет. Каждый из них представляет собой отдельное, независимое приложение или задание. Использование такого типа параллельных вычислений характерно для систем с разделением времени. Каждый пользователь работает со своим приложением, таким, как текстовый редактор или система программирования, а многопроцессорная система обеспечивает для них тот же сервис, что и многозадачный режим в системе с одним процессором. Поскольку при этом доступно несколько процессоров, среднее время отклика будет меньше, чем в системе с одним процессором. Тот же эффект можно получить и при предоставлении каждому конечному пользователю персонального компьютера или рабочей станции. Если пользователи совместно используют какие-то файлы или другую информацию, индивидуальные системы должны быть объединены в распределенную систему, поддерживаемую с помощью сети. Такой подход рассматривается в главе 13, "Распределенные вычисления, архитектура клиент/сервер и кластеры". С другой стороны, по многим параметрам с точки зрения стоимости единая многопроцессорная система по сравнению с распределенной получается более эффективной, позволяя, например, сэкономить на дисках и других периферийных устройствах. Большая и очень большая зернистость В этом случае между процессами наблюдается синхронизация, хотя и весьма редкая. Такую ситуацию можно трактовать как множество параллельно выполняющихся процессов, которые работают в многозадачном режиме на одном процессоре и с минимальным изменением программного обеспечения (или вовсе без изменений) могут поддерживаться многопроцессорной системой. Простой пример приложения, способного использовать наличие нескольких процессоров, приведен в [WOOD89]. Авторы разработали программу, которая получает список файлов, требующих перекомпиляции, и определяет, какие из них Могут компилироваться одновременно (обычно это все файлы). Затем программа запускает по одному процессу для компиляции каждого файла параллельно с другими. Авторы сообщают, что ускорение в многопроцессорной системе превысило ожидаемое (рассчитанное на основе простого добавления процессоров), что связано с совместным использованием дисковых кэшей (об этом подробнее рассказывается в главе 11, "Управление вводом-выводом и дисковое планирование") и кода компилятора, который загружается в основную память только один раз. Вообще говоря, от использования многопроцессорной архитектуры выигры- вает любое множество параллельно выполняющихся процессов, для которых требуется синхронизация или обмен информацией. При очень редком взаимодей- .*ла.ва 10. Многопроцессорное планирование и планирование... 507.
твии процессов целесообразнее использовать распределенную систему, но при олее частом взаимодействии накладные расходы по передаче информации по ети могут привести к снижению производительности, и в этом случае более эф- >ективным решением будет использование многопроцессорной системы. Средняя зернистость В главе 4, "Потоки, симметричная мультипроцессорная обработка и микро- Яра", рассказывалось, что единое приложение может быть эффективно реализо- ано в виде множества потоков в пределах одного процесса. В этом случае по- енциальная параллельность приложения должна быть явно указана програмыи- том. Обычно между потоками одного приложения требуется более высокая тепень координации и взаимодействия, чем между различными процессами, что с приводит к среднему уровню синхронизации. В то время как параллельность независимых процессов, а также процессов с ольшим и очень большим зерном может поддерживаться как многозадачной сис- «мой с одним процессором, так и многопроцессорной системой с минимальным шиянием стратегии планирования, при работе многопоточных приложений пла- [ирование становится важной задачей, требующей пересмотра с учетом новых тре- юваний. В силу частого взаимодействия потоков одного приложения правильное гешение о планировании одного потока может существенно повлиять на произво- [ительность приложения в целом. Позже мы вернемся к этому вопросу. Малая зернистость Малая зернистость представляет более сложное использование возможно- тей параллельных вычислений, чем использование потоков. Это специализиро- »анная область, в которой используется множество различных методов работы. 1еплохой обзор по данной тематике вы найдете в [ALMA89]. Вопросы разработки Планирование в многопроцессорной системе включает три взаимоСвя- 1анных вопроса: • назначение процессов процессорам; • использование многозадачности на отдельном процессоре; • диспетчеризация процесса. % При рассмотрении этих вопросов не следует забывать о том, что конкретики рассматриваемый подход зависит, вообще говоря, от степени зернисто^Г триложения и количества доступных процессоров. Назначение процессов процессорам .* В предположении единообразия архитектуры многопроцессорной системы гом смысле, что ни один процессор физически не отличается от других в плен ■■ уступа к основной памяти или устройствам ввода-вывода) простейший подход; 1ланированию состоит в рассмотрении процессоров как единого ресурса и назна гении процессов процессорам по требованию. При таком подходе возникает о^_. юпрос: должно ли такое назначение быть статическим или динамическим? |Ь. л** 508 Часть 4. Планирой * Если процесс назначается одному процессору постоянно — от момента активации и до его завершения, — то для каждого процессора следует поддерживать отдельную краткосрочную очередь. Такой подход способствует уменьшению накладных расходов планирования процессов (поскольку назначение процесса процессору выполняется только один раз). Кроме того, использование выделенных процессоров обеспечивает возможность применения стратегии, известной как групповое (group), или бригадное (gang), планирование (о нем мы поговорим позже). Недостатком статического распределения является то, что когда один процесс загружен работой, другой может простаивать. Для предотвращения такой ситуации можно использовать очередь, общую для всех процессоров. Все процессы попадают в одну глобальную очередь и передаются для выполнения любому свободному процессору. Таким образом, при этом подходе в течение жизни процесс может в разное время выполняться на разных процессорах. В сильносвязанных системах с общей памятью информация контекста всех процессов доступна всем процессорам и, следовательно, стоимость планирования процесса не зависит от того, какой из процессов оказывается выбранным. Независимо от выбранного типа распределения, используются два основных подхода к назначению процессов процессорам: ведущий/ведомый процессоры и равноправные процессоры. В случае использования архитектуры "ведущий/ведомый" ключевые функции операционной системы всегда выполняются на одном специально выделенном процессоре; все остальные процессоры могут выполнять только пользовательские приложения. Ведущий процессор отвечает за планирование заданий. Когда активный процесс на ведомом процессоре требует определенного обслуживания (например, осуществляет вызов ввода-вывода), он должен послать запрос ведущему процессору и ожидать завершения сервиса. Такой подход достаточно прост и требует внесения небольших дополнений в однопроцессорную многозадачную операционную систему. Упрощается при таком подходе и разрешение конфликтов, поскольку один процессор управляет всей памятью и ресурсами ввода-вывода. Однако у такого подхода имеются два недостатка: (1) сбой ведущего процессора приводит к неработоспособности всей системы в целом, и (2) ведущий процессор превращается в узкое место системы, определяющее ее производительность в целом. При использовании архитектуры равноправных процессоров операционная система может выполняться на любом из процессоров, и каждый процессор самостоятельно планирует свою работу, беря процессы для выполнения из общего пула. Такой подход усложняет операционную систему, которая должна гарантировать, что никакие два процессора не выберут одновременно один и тот же процесс для выполнения и что не будет никаких потерь из очереди. Здесь должна быть применена технология, использующаяся для разрешения конфликтов и синхронизации запросов к ресурсам. Конечно, кроме этих крайностей, имеется ряд других подходов. Например, Для работы операционной системы может быть выделен не один процессор, а несколько; возможно использование системы приоритетов для отделения процессов ядра от прочих процессов. Использование многозадачности отдельных процессоров Когда каждый процесс назначается процессору статически на все время жизни, возникает новый вопрос: должен ли этот процессор быть многозадачным? На первый Взгляд, такой вопрос кажется просто странным: ведь мы уже выяснили, что исполь- Глава 10. Многопроцессорное планирование и планирование... 509,
Wi >вание процессора в однозадачном режиме, при том, что процесс может обращаться устройствам ввода-вывода, является попросту расточительным. При рассмотрении традиционных многопроцессорных систем, работающих с езависимыми процессами или с большим зерном синхронизации (ем* абл. 10.1), очевидно, что каждый отдельный процессор должен иметь возмож- ость переключаться между процессами для повышения загруженности, а следо- ательно, и производительности. Однако в случае использования приложений со редней зернистостью синхронизации ситуация не столь ясна. При доступности ножесгва процессоров правило максимально возможной загруженности процес- эра перестает быть первостепенным; вместо этого первостепенную важность риобретает обеспечение максимальной средней производительности приложе- ий. Приложение, состоящее из множества потоков, может плохо работать до ех пор, пока его потоки не получат возможность одновременного выполнения. Диспетчеризация процессов Последний конструкторский вопрос, связанный с многопроцессорным планиро- анием, является вопросом выбора процесса для выполнения. Мы видели, что в мно- озадачной системе с одним процессором использование приоритетов или сложных лгоритмов, учитывающих время работы процессов, может существенно повыс s гроизводителъность системы по сравнению с использованием стратегии "первым [ришел — первым обслужен". При рассмотрении многопроцессорных систем ее [ростой подход может оказаться более эффективным в силу уменьшения накладных ■асходов. В случае планирования потоков в действие вступают новые характериети- :и, которые могут оказаться более важными, чем приоритеты или история выпол- [ения. Позже мы детально рассмотрим эти вопросы. Тланирование процессов г В большинстве традиционных многопроцессорных систем назначение провесов процессорам отсутствует. Вместо этого используется общая очередь дл $сех процессов, либо — в случае применения схемы с учетом приоритетов —*-, дножество очередей. В любом случае мы можем рассматривать систему как очередь с несколькими серверами. Рассмотрим систему с двумя процессорами, в которой каждый процессор обла- *ает производительностью, в два раза меньшей, чем производительность процессора i однопроцессорной системе. В [SAUE81] проведено сравнение стратегии планирова- ■шя FCFS с круговым планированием и планированием на основе минимального гающегося времени выполнения. При круговом планировании квант времени с гался большим по сравнению с затратами на переключение контекстов задач и а- аым — по сравнению со временем обслуживания, которое и было основны объектом исследования. Полученные результаты в значительной степени зависят гого, насколько велика разница во времени обслуживания разных процессов. Количественно эту разницу можно выразить как коэффициент вариации Cs. Значе СА = 0 соответствует отсутствию вариации времени обслуживания (время обслуживания всех процессов одинаково). Увеличение значения Cs соответствует росту . ш & * l •'Л менчивости времени обслуживания, т.е. чем выше это значение, тем больше отклонения отдельных значений времени обслуживания от среднего. Значения коэффициента вариации, превышающие 5, не являются чем-то необычным для распределения времени обслуживания процессов. На рис. 10.1,а приведено сравнение пропускных способностей кругового планирования и планирования FCFS как функций коэффициента вариации С Обратите внимание, что разница между ними существенно меньше в системах с двумя процессорами. При наличии двух процессоров длинный процесс не так сильно влияет на систему в целом, поскольку другие процессы могут использовать второй процессор. Аналогичные результаты можно увидеть и на рис. 10.1,6. В работе [SAUE81] такой же анализ был проведен для самых разных предположений о степени многозадачности, соотношении количества процессов, ориентированных на вычисления и на ввод-вывод, и использовании приоритетов. Общий вывод, сделанный в этой работе, следующий: влияние выбора стратегии планирования на производительность при наличии двух процессоров существенно меньше, чем при наличии лишь одного. Очевидно, что с ростом количества процессоров рассматриваемое влияние уменьшается. Следовательно, простейшую стратегию FCFS (в том числе и в схеме со статическими приоритетами) можно вполне успешно применять в многопроцессорной системе. Планирование потоков Как мы видели, в случае использования потоков концепция выполнения отделена от остальной части определения процесса. Приложение может быть реализовано как множество взаимодействующих потоков, выполняющихся параллельно в одном адресном пространстве. В однопроцессорной системе потоки могут использоваться для структуризации программы и с целью перекрытия операций ввода-вывода вычислительной работой. Поскольку по сравнению с переключением процессов переключение потоков осуществляется с гораздо меньшими затратами, оно имеет преимущество в стоимости. Однако полная мощь потоков проявляется только в многопроцессорных системах, где потоки могут использоваться для достижения истинно параллельных вычислений в рамках одного приложения. Если различные потоки одного приложения выполняются одновременно на разных процессорах, можно достичь резкого повышения производительности. Однако в приложении с интенсивным взаимодействием потоков (среднезернистая синхронизация) небольшие различия в стратегии управления потоками и их планирования могут привести к существенному изменению производительности LANDE89]. Планирование потоков в многопроцессорных системах является областью интенсивных исследовательских работ; здесь же мы рассмотрим только ключевые вопросы данной темы и основные подходы при их решении. 1 Значение С, вычисляется как ojTi , где 0. — стандартное отклонение врё обслуживания, а Тш — среднее время обслуживания. на :£ 510 Часть 4. Планироя ие Глава 10. Многопроцессорное планирование и планирование... 511
Один процессор • Два процессора Коэффициент вариации а) V i * Один процессор Два процессора Отношение пропускной й способности стратегий SRTnFCFS Ь) одного и двух процессоров Рис. ЮЛ. Сравнение стратегий панирования при наличии яг.**\ *е,,-г; « *ф,-.:,-т?'-«'^К Среди множества вариантов планирования потоков в многопроцессорных систе- мах и назначения процессов процессорам можно выделить четыре основных подхода. • Разделение загрузки. Процессы не назначаются конкретным процессорам. Поддерживается глобальная очередь готовых к выполнению потоков, и ка- ждый процессор в состоянии простоя выбирает поток из этой очереди. Термин разделение загрузки (load sharing) используется, чтобы отличать эту стратегию от схем со сбалансированной загрузкой, в которых работа распределяется на более постоянной основе (см., например, [FEIT90aJ).z • Бригадное планирование. Множество связанных потоков распределяются для одновременной работы среди множества процессоров, по одному потоку на процессор. • Назначение процессоров. В противоположность подходу с разделением нагрузки этот подход обеспечивает неявное планирование путем назначения потоков процессорам. Каждой программе на время ее выполнения выделяется количество процессоров, равное количеству потоков программы. По окончании работы программы процессоры возвращаются в общий пул для распределения другим программам. • Динамическое планирование. Количество потоков процесса может изменяться во время работы. Разделение загрузки Разделение загрузки представляет собой, пожалуй, наиболее простой подход, непосредственно переносимый из однопроцессорной среды в многопроцессорную. Он имеет ряд достоинств, • Загрузка равномерно распределяется между процессорами, обеспечивая отсутствие простоя процессоров при наличии работы. • Не требуется централизованный планировщик; когда процессор становится доступным, он сам выполняет подпрограмму планирования операционной системы для выбора очередного потока. • Глобальная очередь может быть организована с использованием любой из приведенных в главе 9, "Планирование в системах с одним процессором", схем, включая схемы с использованием приоритетов и с учетом истории выполнения, ** В [LEUT90] проанализированы три различные версии разделения загрузки. • Первым пришел — первым обслужен. При поступлении в систему нового задания каждый из его потоков помещается в конец разделяемой очереди. Когда процессор становится свободным, он выбирает очередной готовый к исполнению поток и работает с ним до его завершения или блокирования. В литературе о таком подходе говорят как о самопланироваяяи (aelf-acheduling), поскольку каждый процессор планирует свою работу самостоятельно, независимо от других процессоров. Однако этот термин используется в литературе и для обозначения программ, написанных на-языке, обеспечивающем программисту возможность определить стратегию планирования (см., например, (FOST91J). Глава 10. Многопроцессорное планирование и планирование... 619
& -•'i.' Выбор процесса с наименьшим числом потоков. Разделяемая очередь готовых к выполнению потоков организована как приоритетная, причем наи- ;' ] высший приоритет отдается потокам тех заданий, у которых осталось наи- , ' меньшее число нераспланированных потоков. Задания с одинаковым приоритетом упорядочиваются в соответствии со временем поступления в систему. Как и в случае использования стратегии FCFS, поток выполняется до его завершения или блокирования. Выбор процесса с наименьшим числом потоков с применением вытеснения. I Наивысший приоритет получают задания с наименьшим количеством нераспланированных потоков. Поступившие задания с меньшим, чем у выполняющегося, количеством потоков вытесняют потоки, выполняющиеся в настоящее время. Исследования, проведенные с помощью имитационного моделирования, по- али, что по большому количеству характеристик стратегия FCFS превосходит j остальные стратегии из приведенного списка. Кроме того, авторы обнаружи- что некоторые виды бригадного планирования, обсуждающиеся в следующем разделе, в целом превосходят разделение загрузки, которое имеет, к тому же, -£ недостатков. ,.ь,г .Щ *• ] Центральная очередь занимает область памяти, доступ к которой должен производиться с обеспечением взаимоисключений. Следовательно, это мо- <.$&< б жет стать узким местом, если несколько процессоров одновременно обра- ■.",$/' ч тятся к очереди за порцией работы. При небольшом количестве процессоров эта проблема не является критической, но при наличии в системе Я&'\,-$& сятков, а то и сотен процессоров затор в этом месте представляется;, Д^ совершенно реальным. '&. 4? Низкая вероятность того, что вытесняемые потоки продолжат выполнение на тех же процессорах, снижает эффективность использования локальных ^.| кэшей процессоров. "**> ']р Если все потоки рассматриваются как один общий пул, маловероятно,-Д, чтобы все потоки одной программы получили одновременный доступ *-'Щ-* процессорам. При необходимости высокой степени координации между^ потоками программы это приводит к существенному снижению ее общеЩ^- производительности. -лу '|g* Несмотря на потенциальные недостатки, это одна из наиболее часто исполь-^- !мых в современных многопроцессорных системах схем. |gi Усовершенствованная схема разделения загрузки используется в операштонв^) -^ :теме Mach [BLAC90, WEND89]. Операционная система поддерживает локалыгЯ*^ ;редь для каждого процессора и совместно используемую глобальную очередь. О- ^ тьная очередь используется потоками, которые временно связаны с определенным . эцессором. Процессор сперва исследует локальную очередь, тем самым отд „ норитет связанным с ним потокам перед не связанными. Примером связаННЬ^оЛй сов может служить использование одного или нескольких процессоров для выл тая процессов, являющихся частью операционной системы. Другим примером ^ ются потоки одного приложения, распределенные между рядом процессоровг^- личии соответствующего дополнительного программного обеспечения поддерМОЯ» :я обсуждающееся ниже бригадное планирование. L4 Часть 4. Планиро * е jttBS. . Бригадное планирование Концепция одновременного выполнения множества процессов на множестве процессоров предшествует использованию потоков. В [JONE80] эта концепция названа групповым планированием, и там же перечислены ее основные достоинства. • Если тесно связанные процессы выполняются параллельно, блокирование, вызванное синхронизацией, снижается; кроме того, требуется меньше переключений процессов. В целом это приводит к повышению производительности процесса. • Накладные расходы, связанные с планированием, уменьшаются, поскольку одно решение влияет одновременно на целый ряд процессов и процессоров. В многопроцессорной системе Cm* используется термин сопланирование (coscheduling) [GEHR87]. Сопланирование основано на концепции планирования связанного множества задач, отдельные элементы которого достаточно малы и, следовательно, близки к концепции потоков. Термин бригадное планирование (gang scheduling) применяется к одновременному планированию потоков, составляющих единый процесс [FEIT90b]. Оно необходимо для приложений с синхронизацией от среднезернистой до мелкозернистой, производительность которых резко падает, если какая-то часть приложения не работает, в то время как другие готовы к выполнению. Этот метод вполне применим и к другим приложениям с параллельными вычислениями, которые не настолько чувствительны в плане зависимости общей производительности от синхронизации работы потоков. Бригадное планирование общепризнанно, и его реализации имеются во множестве многопроцессорных операционных систем. Один очевидный путь улучшения производительности отдельного приложения при бригадном планировании заключен в минимизации переключения процессов. Предположим, что один поток процесса выполняется и достигает точки синхронизации с другим потоком того же процесса. Если этот второй поток не выполняется, но готов к выполнению, то первый поток приостанавливается в ожидании, когда некоторым другим процессором не будет выполнено переключение процессов для запуска требующегося потока. В приложении с тесно связанными потоками такие переключения существенно снижают производительность. Одновременное планирование сотрудничающих потоков может также сохранить время на выделение ресурсов. Например, ряд потоков при бригадном планировании может обращаться к файлу без дополнительных расходов на блокирование в процессе операций чтения/записи или позиционирования в файле. Использование бригадного планирования выдвигает требования по распределению процессоров. Предположим, что у нас имеется N процессоров и М приложений, каждое из которых состоит из N или меньшего числа потоков. Тогда каждое приложение при использовании квантования времени может получить ЦМ доступного времени N процессоров. В [FEIT90a] замечено, что такая стратегия может оказаться неэффективной. Рассмотрим пример, в котором имеются два приложения, одно с четырьмя потоками, а второе — с одним. Использование равномерного распределения времени приводит к потере 37.5% вычислительного ресурса, поскольку при выполнении однопоточного приложения три процессора простаивают (см. рис. 10.2). При наличии ряда однопоточных приложений они Могут распределяться совместно для увеличения загрузки процессоров. Если это Глава 10. Многопроцессорное планирование и планирование... 515
зможно вторым решением может стать применение взвешенного планиро- ия с учетом количества потоков каждого процесса. В этом случае приложение •тырьмя потоками из нашего примера может занять 80% (4/5) всего времени, ^нопоточное - только 20% (1/5), что приведет к снижению потерь вычисли- ьного ресурса до 15%. Равномерное планирование Группа 1 Группа 2 Взвешенное планирование Группа 1 Группа 2 РЕ1 РЕ2 РЕЗ РЕ4 Простой Простой Простой РЕ1 РЕ2 РЕЗ РЕ4 Простой Простой Простой у* мя 1/2 1/5 1/2 4/5 37.5% потерь 15% потерь Рис. 10.2. Пример планирования групп, состоящих из четырех потоков и из одного потока [FEIT90a] -Г Й '*& Назначение процессоров Крайней формой бригадного планирования является предложенное LJCK89] назначение приложению групп процессоров на все время работы д -д^| го приложения. Таким образом, когда приложение спланировано, каждый из*- э потоков назначается определенному процессору, на котором он и выполняет-% до завершения работы данного приложения. r ir ■ Щ Такой подход представляется очень неэффективным в плане процессорного''^ емени. Если поток приложения блокируется операцией ввода-вывода или не-. ходимостью синхронизации с другим потоком, то процессор этого потока про "у аивает: многозадачность процессора в этом методе отсутствует. В защиту ДДО-С * ■й стратегии можно привести два соображения. ,*ч- 1. В высокопараллельной системе с десятками или сотнями процессоров, Шй&*;,■ дый из которых представляет собой лишь малую часть стоимости системы»'v загруженность процессора не так важна, как общая эффективность и Д.\ производительность. ;'*# 2. Полное устранение переключений процессов во время работы программ!*^ должно существенно повысить ее скорость работы. t .^и^'1'* В работах [TUCK89, ZAHO90] подтверждено второе высказывание. Н /$ дс. 10.3 показаны результаты экспериментов из [TUCK89]. Авторы запускал v за приложения (умножение матриц и быстрое преобразование Фурье) в системе 16 процессорами. Каждое приложение разбивало свою задачу на ряд задания»,; оторые реализовывались потоками в пределах данного приложения. ПрограМ^ ы были написаны таким образом, что позволяли варьировать количество ИС: ' ользуемых потоков. По существу, количество заданий определялось самим риложением. Если потоков оказывалось меньше, чем заданий, последние сбились в очередь и изымались из нее потоками, завершившими свои зад&нН [онятно, что далеко не все приложения можно структурировать подобным об Д. 16 Часть 4. Планиро Si зом, но многие вычислительные задачи и ряд других приложений вполне могут быть преобразованы таки.м образом. з: х о. Ч о О 3h 2h 1 Быстрое - преобразование Фурье - - Умножение матриц _l х 0 1 2 3 4 5 6 7 В 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Рис. 10.3. Ускорение приложений как функция количества потоков [TUCK89] На рис. 10.3 показано ускорение работы приложений как функция от количества используемых потоков (которое в каждом приложении варьировалось от 1 до 24). Например, если оба приложения с 24 потоками каждое запускались одновременно, то ускорение их работы по сравнению с однопоточными приложениями составляло 2.8 для быстрого преобразования Фурье и 2.4 — для умножения матриц. На рисунке видно, что производительность обоих приложений снижается при количестве потоков, превышающем 8, и что максимальная производительность достигается тогда, когда общее количество потоков равно количеству процессоров. Большее количество потоков снижает производительность за счет необходимости вытеснения потоков и дополнительных операций планирования. Снижение эффективности при этом определяется целым рядом факторов — от времени, затрачиваемого на ожидание, когда приостановленный поток покинет критический раздел, до снижения эффективности кэшей и времени, затраченного на переключение процессов. Авторы приходят к выводу, что эффективная стратегия состоит в ограничении общего количества активных потоков в системе количеством процессоров. Если большинство приложений либо одно поточные, либо могут использовать очереди заданий, то такая стратегия обеспечивает эффективное использование процессоров. Как стратегия назначения процессоров, так и бригадное планирование решают задачу планирования путем распределения процессоров. Однако можно заметить, что распределение процессоров в многопроцессорной системе гораздо больше похоже на задачу распределения памяти в однопроцессорной системе, чем на задачу планирования в однопроцессорной системе. Вопрос о том, сколько процессоров могут быть привлечены к выполнению приложения в конкретный момент времени, аналогичен вопросу о том, сколько кадров страниц может быть предоставлено данному процессу в некоторый момент времени. В [GEHR87] предложен термин рабочее множество активности (activity working set), аналогичный рабочему множеству виртуальной Памяти, как минимальное количество единиц активности (потоков), которое должно Глава 10. Многопроцессорное планирование и планирование... ДЗ-7
одновременно распланировано между процессорами для приемлемого выполне- приложения. Как и в схемах управления памятью, ошибки в планировании ентов рабочего множества активности могут привести к снижению пропускной эбности процессора. Это происходит в тех случаях, когда запускаются потоки, . ркивание которых вызывает приостановку других потоков, чьи услуги понадр- \ п в ближайшее время. Аналогично, фрагментация процессоров означает ситуа- | когда ряд процессоров оказываются распределенными, а оставшихся процессо- яибо недостаточно, либо они не соответствуют требованиям ожидающего прило- 1Я. Бригадное планирование и распределение процессоров предназначено для анения таких проблем. "el t т «■* :Ш' Динамическое планирование В ряде приложений количество потоков динамически изменяется в процессе заботы, что заставляет операционную систему изменять распределение во [я работы приложения. В [ZAHO90] предложен подход, в котором в планирование вовлекаются как *Ш i »ационная система, так и само приложение. Операционная система отвечает '^ * аспределение процессоров между задачами. Каждая задача использует выде- гые ей в настоящий момент процессоры для выполнения некоторого под- жества доступных в настоящий момент для выполнения заданий, распреде- их по потокам. Принятие решения о выделении такого подмножества для &&. 1ты, как и о том, какой поток должен быть приостановлен при вытеснении [Щ jecca, выполняют отдельные приложения (возможно, посредством множеству ||* программ библиотеки времени исполнения). Такой подход применим не для ^ : приложений, однако возможна ситуация, когда некоторые приложения бу- %• работать, как однопоточные, в то время как другие приложения изначально^ \Щ тт создаваться с использованием этой возможности операционной системы, s .^ f/. При таком подходе ответственность операционной системы за планирование "?* 1ничена распределением процессоров и выполняется в соответствии с изло ными далее принципами. Когда задача требует один или несколько процес; >в (неважно, в момент ли поступления в систему или в связи с изменивши. я требованиями), происходит следующее. Если в системе имеются простаивающие процессоры, они используются для удовлетворения этого запроса. '"'"' В противном случае, если запрос подается вновь поступившей в систему задачей, ей выделяется единственный процессор, забираемый у задачи, которая в настоящий момент использует более одного процессора. Если какая-то часть запроса не может быть удовлетворена, он остается не- ^ выполненным до тех пор, пока либо не появится свободный процессор, либо \^ ,.jj задача не снимет свой запрос (например, ей больше не требуется лишний v| j процессор). , Ja^&'f* При освобождении одного или нескольких процессоров сканируется теку? ф ; Щая очередь не удовлетворенных запросов на процессоры. Каждому зад**1 -^ нию в списке, до сих пор не имеющему ни одного процессора (т.е. ожидязо- ( щему поступления в систему), назначается по одному процессору. После \ этого, при наличии свободных процессоров, список сканируется вновь, р*6" пределяя оставшиеся процессы на основе стратегии FCFS. .л & 3 Часть 4. Планирова * t :-Щ Анализ работ [ZAHO90, MAJU88] дает основания полагать, что для приложений, которые могут использовать достоинства динамического планирования, этот подход предпочтительнее бригадного планирования или назначения процессоров. Однако накладные расходы при описываемом подходе могут свести на нет получаемые преимущества, и для доказательства превосходства динамического планирования требуется опыт работы реальных операционных систем. Г10.2: ПЛАНИРОВАНИЕ РЕАЛЬНОГО ВРЕМЕНИ?? Введение Вычисления в реальном времени становятся все более важной отраслью знаний. Операционная система, и в частности планировщик, представляет собой, вероятно, наиболее важный компонент системы реального времени. Примерами приложений систем реального времени могут служить управление лабораторными экспериментами, управление работой цехов, роботы, системы управления воздушным движением, телекоммуникации и многое другое. Следующее поколение систем будет включать автономные системы передвижения, роботов с эластичными суставами, интеллектуальные системы управления, управление космическими и подводными станциями. Вычисления реального времени — тип вычислений, в которых корректность системы зависит не только от логического результата вычислений, но и времени получения этого результата. Мы можем определить систему реального времени путем определения того, что же собой представляет процесс, или задача реального времени.3 Вообще говоря, в системах реального времени часть задач являются задачами реального времени, у каждой из которых своя степень срочности. Такие задачи пытаются управлять событиями или реагировать на события, происходящие во внешнем мире. Поскольку эти события происходят в "реальном времени", то и задачи, связанные с ними, не должны отставать от реальных событий. Следовательно, с каждой задачей можно связать предельный срок, определяющий время начала (или завершения) задачи. Такие задачи можно охарактеризовать как жесткие и мягкие. Жесткие задачи реального времени (hard real-time task) представляют собой задачи, которые должны соответствовать этим предельным срокам; в противном случае неизбежны нежелательные повреждения или фатальные сбои системы. Мягкие задачи реального времени (soft real-time task) также имеют предельные сроки, но их выполнение — скорее пожелание, чем обязанность; если даже такая задача превысила отведенное ей время, ее все равно имеет смысл продолжать планировать и довести до завершения. Как обычно, с терминологией возникают определенные проблемы, поскольку в лите- Рот/дк? разные термины используются в разных значениях. Обычной практикой является бо^Т4*0*"* Природа пР°Чесса- работающего с временными ограничениями - т.е. процесс ра- тает длительное время, выполняя при этом некоторые повторяющиеся функции в ответ ™ события реального времени. В этом разделе об индивидуальной функции мы будем говорить как о задаче. Следовательно, процесс может рассматриваться как продвижение по по- леаовательности задач. В любой конкретный момент процесс занимается одной задачей, и планироваться должны как процессы, так и задачи. Глава 10. Многопроцессорное планирование и планирование... 5}9
Еще одной характеристикой задач реального времени является их перио- ность. Непериодические задачи имеют предельные сроки начала или конца )ты (или и те, и другие); в периодических задач требования могут быть ука- j в виде "один раз за период Т" или "точно за Т единиц времени". рактеристики операционных систем реального времени Операционные системы реального времени должны удовлетворять следуад- л требованиям [MORG92]: детерминизм; чувствительность; :5'- Hfe 4 " ■m i '"■■KS. Щ управление со стороны пользователя; 0|| надежность; *,ф» восстановление после сбоев. Ж.Ш> Операционная система детерминирована, если она выполняет операции в фик- :-"%.-^ ованное, предопределенное время или в пределах предопределенных интервалов ?■;*•; *:| «ени. При конкуренции процессов за обладание ресурсами и временем процессора гема не является полностью детерминированной. В операционных системах ре- -.* ного времени запросы процесса на обслуживание диктуются внешними события- >; t и синхронизацией. Насколько детерминированно система способна удовлетворять i,= - " Л росы, зависит в первую очередь от скорости, с которой она способна реагировать прерывания, а также от того, обладает ли система достаточной пропускной сш- ностью для обработки всех запросов за требуемое время. ' * Мерой способности операционной системы к детерминированному функцио- юванию служит длительность максимальной задержки между поступлением £ тему прерывания от высокоприоритетного устройства и началом его обраб - В операционных системах, не являющихся системами реального времени,1 задержка может составлять от десятков до сотен миллисекунд, в то врейя : в операционной системе реального времени такая задержка должна иметь хнюю границу от нескольких микросекунд до миллисекунды. '""" Сходной с детерминизмом характеристикой является чувствительность сие£ [Ы. Детерминизм сосредоточен на времени задержки перед распознавание» фывания; чувствительность же рассматривает вопрос о том, сколько времени буется операционной системе для обслуживания прерывания после распозна- [ия. Чувствительность включает следующее. i . Количество времени, требующееся для начальной обработки прерывания и начала выполнения подпрограммы обработки прерывания (interrupt service routine — ISR). Если выполнение ISR требует переключения процессов, то 1\ задержка оказывается большей, чем при ISR, которая может выполняться в ,.Ц пределах контекста текущего процесса. ■%* ■'. Количество времени, требующееся для выполнения ISR. Обычно это время зависит от используемой аппаратной платформы. $* '. Влияние вложенных прерываний. Если ISR может быть прервана посту- $ плением нового прерывания, то обслуживание текущего прерывания бу-./. дет отложено. 'Ж.1-' ■ Ч ; Ж? 10 Часть 4. Планирован „е ■■"P&ri ■/;. г ■■*>~ 1 <■%#* 'г/: ' l'k . :*» ■V *" ■'is +. :й- /*V 4:%г W/ ъ- &:- - ...«• .- md ■*'.' ■#• J, > £t" f'M \.' -•?■ I . t ,-" t £ it k/ ; ( ■, i. *■. i \3 4 '^ '1 i ■ % « i Детерминизм и чувствительность в совокупности образуют время отклика на внешнее событие. Требования ко времени отклика являются критическими для систем реального времени, которые должны отвечать временным требованиям со стороны устройств, внешних потоков данных и т.п. Управление со стороны пользователя в системах реального времени обычно значительно шире, чем в обычной операционной системе. В типичной операционной системе, не являющейся системой реального времени, пользователь либо не в состоянии управлять функцией планирования операционной системы, либо может осуществлять только самое общее руководство типа группирования пользователей по нескольким классам приоритетов; однако в системах реального времени важной составляющей является обеспечение возможности тонкой настройки приоритетов задач. Пользователь должен иметь возможность разделять задачи на жесткие и мягкие и определять относительные приоритеты в пределах каждого класса. Кроме того, системы реального времени позволяют пользователю определять и такие характеристики, как использование страничной организации памяти или свопинг процессов, а также определять, какие процессы должны постоянно находиться в основной памяти, какой алгоритм дисковых операций должен использоваться, какие права у процессов из разных групп и многое другое. Надежность в системах реального времени — очень важный вопрос. Случайная ошибка в обычной системе может быть в худшем случае обработана просто посредством перезагрузки системы; сбой одного из процессоров в обычной многопроцессорной системе приведет к снижению уровня обслуживания до замены или починки этого процессора. Но система реального времени работает, как и следует из ее названия, с событиями в реальном времени, и потеря производительности может привести к катастрофическим последствиям — от финансовых потерь до потерь оборудования и человеческих жизней. Но даже система реального времени должна быть разработана таким образом, чтобы уметь отреагировать на ошибки разного тина. Восстановление после сбоев — это характеристика системы, которая описывает способность системы сохранить максимальную функциональность и не потерять данные при сбое. Например, типичные традиционные системы UNIX при обнаружении повреждения данных ядра выводят соответствующее сообщение на системную консоль, сбрасывают дамп памяти на диск для последующего анализа и прекращают работу системы. Система же реального времени будет пытаться либо исправить ситуацию полностью, либо минимизировать ее влияние на продолжающуюся работу системы. Обычно система информирует пользователя или пользовательский процесс о необходимости корректирующих действий и продолжает работу, возможно, со сниженным уровнем обслуживания. Если необходимо выключение системы, она пытается сохранить согласованность файлов и данных. Важным аспектом восстановления после сбоев является стабильность системы. Система стабильна, если в случаях, когда невозможно выдержать предельные сроки всех задач, она выдерживает предельные сроки для наиболее критических, высокоприоритетных задач (даже если не всегда удается выдержать условия работы над некоторыми менее критическими задачами). Для того чтобы соответствовать приведенным требованиям, современная система реального времени обычно включает [STAN89]: • быстрое переключение процессов и/или потоков; Глава 10. Многопроцессорное планирование и планирование... ^521
if I i малый размер (с минимальной функциональностью); •$? > способность быстрого отклика на внешние прерывания; ■■*> i многозадачность со средствами взаимодействия процессов (такими, как семафоры, сигналы, события); "'*■ 4 . . использование специальных последовательных файлов, способных к накоп- .£■' лению данных с высокой скоростью; "^ вытесняющее планирование на основе системы приоритетов; ^; минимизация периодов времени, когда прерывания запрещены; £с наличие примитивов для задержки выполнения задачи на определенное ;;Й& время, а также приостановки и продолжения выполнения; специализированные таймеры и системы тайм-аутов. Сердцем системы реального времени является краткосрочный планировщик ;ач. При разработке такого планировщика беспристрастность и минимизация днего времени отклика первостепенными задачами не являются; зато на пер- й план выходит завершение (или начало) работы всех жестких задач реально- времени в рамках их предельного времени, и по возможности максимального сичества мягких задач. Большинство современных операционных систем реального времени не ра- ают с предельным временем непосредственно. Вместо этого они разработаны им образом, чтобы обеспечить их максимальную чувствительность, с тем что- при наступлении предельного времени задача немедленно поступала на вы- нение. С этой точки зрения приложения реального времени обычно требуют, бы детерминированное время отклика находились в интервале от долей мил- екунд до нескольких миллисекунд при широком диапазоне условий. Некото- : специализированные приложения, например в моделировании военных сайтов, часто налагают ограничение от 10 до 100 микросекунд [ALTA89]. На рис. 10.4 продемонстрирован ряд возможных вариантов планирования ^ дьного времени. В вытесняющем планировщике с использованием круговой .;%$ ^тегии задача реального времени добавляется к очереди готовых к выполне-» '.|. > задач, ожидающих наступления следующего кванта времени (см. '>% . 10.4,а). В этом случае время планирования в целом неприемлемо для при- :ений реального времени. В невытесняющем планировщике мы можем ис- ьзовать механизм приоритетного планирования, дающий заданиям реального лени наивысший приоритет. В этом случае готовые задания реального време- >удут выполняться сразу же после блокирования текущего процесса либо вы- чения его до конца (рис. 10.4,6). Такая методика может привести к большим, (ескольких секунд, задержкам при выполнении в критический момент мед- юй низкоприоритетной задачи, так что этот подход также неприменим. Бо- приемлемый подход состоит в комбинировании приоритетов с прерываниями «ера. При этом точки вытеснения равноудалены друг от друга. При достиже- точки вытеснения выполняющееся в настоящий момент задание вытесняет- *сли в наличии имеется более высокоприоритетное задание в состоянии ожи- 1я; таким образом, вытеснение заданий в этом случае оказывается частью i операционной системы. Здесь задержки могут быть порядка нескольких ^ яисекунд (рис. 10.4,в). Для ряда приложений реального времени задержки^ '■А I ,J£r?*» Г > |.%1 л 11 .>■« Часть 4. Планирован "KR, такого уровня вполне адекватны, но могут оказаться неприемлемыми для более требовательных приложений. В таком случае можно применить подход, иногда именуемый немедленным вытеснением. Он заключается в том, что операционная система отвечает на прерывание практически немедленно, если только она не выполняет код критического раздела, который не может быть прерван. Задержки планирования при этом снижаются до 100 микросекунд и менее. Планирование реального времени Планирование реального времени является одной из областей, в которых ведутся активные исследовательские работы. В этом разделе мы приведем краткий обзор различных подходов к проблеме планирования реального времени и рассмотрим два распространенных класса алгоритмов планирования. В обзоре алгоритмов планирования реального времени [RAMA94] замечено, что различные алгоритмы планирования зависят от того, (1) выполняет ли система анализ планируемости, и если да, то (2) выполняется он статически или динамически и (3) приводит ли он к непосредственному выполнению функции планирования или же к построению расписания, согласно которому в процессе работы осуществляется диспетчеризация заданий. На основе этого автор определяет следующие классы алгоритмов. • Статическое планирование с использованием таблиц. При этом выполняется статический анализ осуществимости планирования; результатом анализа является план, который в процессе работы системы определяет, когда должно начаться выполнение заданий. • Статическое вытесняющее планирование на основе приоритетов. В этом случае также выполняется статический анализ, но расписание не создается. Вместо этого на основе проведенного анализа заданиям назначаются приоритеты, с тем чтобы далее можно было использовать традиционный вытесняющий планировщик, работающий с учетом приоритетов заданий. • Динамическое планирование на основе расписания. Осуществимость планирования определяется в процессе работы (динамически). Поступающее в систему задание принимается только в том случае, если определена возможность его выполнения с учетом всех временных требований. Одним из результатов анализа является расписание, используемое для принятия решения о диспетчеризации задания. • Динамическое планирование наилучшего результата. При этом анализ осуществимости планирования не выполняется; система пытается удовлетворить все предельные сроки и снимает те выполняющиеся процессы, предельные сроки которых нарушены. Глава 10. Многопроцессорное планирование и планирование... 323
Запрос процесса реального времени Clock tick Процесс реального времени добавляется в очередь для ожидания своего кванта времени Процесс 1 Процесс 2 Процесс л Процесс реального времени •^^^^ Время планирования а) Круговое планирование с вытеснением Запрос процесса реального времени Процесс реального времени добавляется в начало очереди 1 г* Текущий процесс Процесс реального времени •^- Время планирования I» б) Невытесняющее планирование на основе приоритетов Текущий процесс блокируется или завершается Точка вытеснения Запрос процесса реального времени 1 Ожидание следующей точки вытеснения Текущий процесс Процесс реального времени I Время плакирования < ► в) Вытесняющее планирование на основе приоритетов с точками вытеснения Запрос процесса реального времени Процесс реального времени немедленно вытесняет текущий процесс и выполняется Текущий процесс т Процесс реального времени г Время планирования г) Планирование с немедленным вытеснением Рис. 10.4. Планирование процессов реального времени Часть 4. Планиро Статическое планирование с использованием таблиц применимо для периодических заданий. Входной информацией для анализа являются время поступления заданий в систему, время выполнения, предельные сроки выполнения и относительный приоритет каждого задания. Планировщик пытается разработать такой план работы, который бы удовлетворял всем временным требованиям заданий. Такой подход является предсказуемым, но абсолютно не гибким, поскольку любое изменение требований любого задания приводит к необходимости пересмотра всего расписания. Типичными представителями этой категории алгоритмов планирования являются планирование наиболее раннего предельного срока и другие, рассматриваемые далее, алгоритмы планирования периодических заданий. Статическое вытесняющее планирование на основе приоритетов использует тот же вытесняющий механизм планирования с приоритетами, что и большинство обычных многозадачных операционных систем. В таких системах для определения приоритетов могут использоваться самые различные факторы. Например, в системе с разделением времени приоритет процесса изменяется в зависимости от того, ориентирован ли этот процесс на вычисления или на операции ввода- вывода. В системах реального времени назначение приоритетов связано с временными ограничениями каждого из заданий. Примером такого подхода может служить частотно-монотонное планирование, рассматриваемое несколько позже в данной главе, которое назначает заданиям статические приоритеты на основе информации об их периоде. В случае использования динамического планирования на основе расписания после поступления задания в систему (но до начала его выполнения) делается попытка создать расписание, которое содержит как все имеющиеся в системе задания, так и вновь поступившее. Если удается создать такое расписание, что при выполнении удовлетворяются временные ограничения как нового задания, так и уже имеющихся в системе заданий, оно принимается планировщиком. Динамическое планирование наилучшего результата используется во многих современных коммерческих системах реального времени. При поступлении нового задания система назначает ему приоритет на основе характеристик этого задания. При этом подходе обычно используется планирование, учитывающее предельные сроки, — наподобие планирования наиболее раннего предельного срока. Как правило, поступающие задания непериодические, а потому неприменим статический анализ планирования. При таком типе планирования мы не знаем, будут ли удовлетворены временные ограничения задания до тех пор, пока задание не будет полностью выполнено (или пока не буду! нарушены временные ограничения). Именно это и является основным недостатком данной схемы; достоинство же динамического планирования наилучшего результата — в простоте реализации. Планирование с предельными сроками Большинство современных операционных систем реального времени разра ботаны таким образом, чтобы задания реального времени начинали работу ка* можно быстрее, а следовательно, особое внимание уделяют вопросам быстрой об работки прерываний и диспетчеризации заданий. На самом деле это не очей практичный критерий оценки операционной системы реального времени. Обыч но приложения реального времени не так интересует абсолютная скорость вы Глава 10. Многопроцессорное планирование и планирование... 52.
полнения заданий, как их своевременное завершение (или начало) — не слишком рано и не слишком поздно, несмотря на любые требования к ресурсам и могущие возникать конфликты, перегрузку процессора или аппаратные или программные сбои. Отсюда следует, что система приоритетов — довольно слабый инструмент, который не может обеспечить гарантированное выполнение заданий в необходимые сроки. За последние годы появился ряд интересных подходов к планированию, более мощных и лучше приспособленных для работы с заданиями реального времени, чем их предшественники. Все они основаны на дополнительной информации о заданиях, которая может включать следующее. • Время готовности. Время, когда задание становится доступным для выполнения. В повторяющемся или периодическом задании время готовности представляет собой последовательность заранее известных времен. В непериодическом задании это время может быть известно заранее, но может быть и так, что операционная система узнает его только в тот момент, когда задание станет действительно готовым к выполнению. • Предельное время начала выполнения. Время, когда должно начаться выполнение задания. • Предельное время завершения выполнения. Время, когда задание должно быть -.; полностью завершено. Обычно задания реального времени имеют ограниче- -■ ние — либо по предельному времени начала выполнения, либо по предельному f времени завершения выполнения, но не оба ограничения одновременно. :/ • Время выполнения. Время, требующееся заданию для полного выполнения. '\ В некоторых случаях это время известно, а в некоторых — система сама У оценивает взвешенное среднее значение. В других системах планирования > эта величина не используется. • Требования к ресурсам. Множество ресурсов (отличных от процессора), тре- »■ бующихся заданию при его выполнении. f • Приоритет. Мера относительной важности задания. Жесткие задания ре- ;.■$■- ального времени имеют "абсолютный" приоритет, приводя к сбою системы при нарушении временных ограничений этих заданий. Если система про- \- должает работу несмотря ни на что, то как жесткие, так и мягкие задания получают относительные приоритеты, использующиеся в качестве указаний -. планировщику. { • Структура подзадач. Задача может быть разбита на обязательные и необя- ^ зательные подзадачи. Жесткие предельные сроки при таком разделении д имеют только обязательные подзадачи. Можно показать, что для заданной стратегии вытеснения и использова- ^ 1Я либо предельного времени начала выполнения, либо предельного време- | г завершения применение планирования, выбирающего для выполнения за- f ние с наиболее ранним предельным временем, минимизирует долю заданий нарушенными временными ограничениями [BUTT99, HONG89, PANW88]. л от вывод справедлив как для однопроцессорных, так и для многопроцес- '. рных систем. 56 Часть 4. Планирование ■ч Еще одним критическим вопросом является вытеснение. Если определяется предельное время начала работы, то имеет смысл применение невытесняющего планирования. В этом случае желательно, чтобы задания реального времени после завершения обязательной или критической части самостоятельно блокировались, позволяя выполняться другим заданиям реального времени с предельным временем начала работы (см. рис. 10.4,6). Для системы с предельным временем завершения более подходит вытесняющая стратегия (рис. 10.4,в, г). Например, если выполняется задание X, а задание Y находится в состоянии готовности, то может возникнуть ситуация, когда единственным путем для удовлетворения ограничений обоих заданий будет вытеснение X, выполнение Y до завершения, и затем возобновление выполнения X. В качестве примера планирования периодических заданий с предельным временем завершения рассмотрим систему, которая собирает и обрабатывает данные от двух датчиков, А и В. Сроки сбора данных от датчика А — каждые 20 ms, датчика В — каждые 50 ms. Процесс снятия данных, включая накладные расходы операционной системы, занимает для датчика А 10 ms, а для датчика В — 25 ms. В табл. 10.2 приведен профиль выполнения этих двух заданий. Таблица 10.2. Профиль выполнения двух периодических заданий Процесс Время поступления Время выполнения Предельное время окончания А(1) 0 Ю 20 А(2) 20 10 40 А(3) 40 10 60 А(4) 60 Ю 80 А(5) 80 Ю 100 f В(1) 0 25 50 В(2) 50 25 100 Компьютер может принимать решение о планировании каждые 10 ms Предположим, что при этих условиях мы используем схему планирования « приоритетами. Результат показан на первых двух временных диаграммах hi рис. 10.5. Если А имеет более высокий приоритет, задание В1 получит тольк< 20 ms процессорного времени в двух смежных интервалах по 10 ms; после этог< будет достигнуто предельное время его выполнения, и задание выполнено не бу дет. Если более высокий приоритет получит задание В, то выполниться в срок hi сможет задание А1. Третья временная диаграмма показывает применение в дан ной ситуации планирования с наиболее ранним предельным сроком. В иомен1 времени t = 0 поступают задания А1 и В1. Поскольку предельный срок А1 на ступает раньше предельного срока В1, сперва выполняется задание А1. Поел* Глава 10. Многопроцессорное планирование и планирование... 521
его завершения начинается выполнение В1. В момент времени t = 20 в систему поступает задание А2, предельный срок которого наступает раньше предельного срока В1. Соответственно, задание В1 прерывается, и начинается выполнение задания А2. Выполнение В1 продолжается, начиная с момента t = 30. В момент f = 40 в систему поступает задание A3, предельный срок которого, однако, более поздний, чем предельный срок задания В1, так что задание В1 продолжает вы- юлнение до завершения в момент времени t = 45. В этот момент начинается шполнение задания A3, завершающееся к моменту t = 55. Время поступления, выполнения и предельное время Предельные сроки В1 А1 А2 а i тэг A3 А4 В2 В2 А5 L 1 10 20 30 40 50 60 70 80 90 100 Время, ms Планирование с фиксированными | А1 | вГ приоритетами; приоритет А выше Планирование с фиксированными приоритетами; приоритет В выше А2 | 81 А1 В1 Т АЗ^ ^2 А4 | В2 А2 В1 A3 (Опоздание) А2| А1 (Опоздание) Ж В2 т А2 В1 A3 А5 |В2| А4 А4 (Опоздание) Г А5.В2 А5.В2 Планирование наиболее раннего | А1 | В1 едельного срока с использованием предельных сроков завершения A? I B1 | A3~g2 t t ' А4 I B2 A1 т ТЖ А2 В1 A3 А4 А5.В2 к. 10.5. Планирование периодических заданий оками завершения реального времени с предельными В этом примере, где в каждой точке вытеснения планировщик дает высший >иоритет тому заданию, предельный срок которого наступает раньше, удовле- оряются все требования к системе. Здесь мы смогли использовать статическое анирование на основе таблиц, поскольку задания периодичны и предсказуемы. Рассмотрим теперь схему для работы с непериодическими заданиями с пресными сроками начала работы. В верхней части рис. 10.6 приведено время ступления и предельные сроки начала работы для примера, состоящего из пя- заданий, время выполнения каждого из которых составляет 20 ms. Профиль полнения этих заданий приведен в табл. 10.3. 18 Часть 4- Планирование I 0 10 20 30 40 50 60 70 80 90 100 110 120 1 I I I I I I I I I I I | Время поступления Требование А ± Наиболее ранний предельный срок* Предельное время начала работы Время поступления Выполнение Предельное время начала работы f Время поступления Выполнение Предельное время начала работы Время поступления i—ч Е ± т Е т D т А f ± А т ш с т Е т D т В (опоздание) т А А В t±± Т с т D т 3=3=2 А т FCFS Выполнение Предельное время начала работы 1 ± к±± В(опоздание) С Т D т Е(опоздание) т D т А Рис. 10.6. Планирование непериодических заданий реального времени с предельными сроками начала работы Таблица 10.3. Профиль выполнения пяти непериодических заданий Процесс А В С D Е Время поступления Время выполнения Предельное время начала работы 10 20 40 50 60 20 20 20 20 20 110 20 50 90 70 Простейшая схема планирования состоит в запуске задания с наиболее ранним предельным сроком и выполнении его до полного завершения. Обратите внимание на рис. 10.6, где при использовании такого подхода несмотря на то, что задание В требует немедленного выполнения, оно отклоняется системой. В этом заключается основной риск работы с непериодическими заданиями, в особенности с предельным временем начала выполнения. Если предельное время заданий известно до того, как задания становятся готовыми к выполнению, можно усовершенствовать эту схему, повысив тем самым производительность системы. Такая стратегия, именуемая стратегией наиболее раннего предельного сРока со свободным временем простоя, работает следующим образом. Планировщик всегда запускает подходящее задание с наиболее ранним предельным сроком, которое выполняется до полного завершения. Подходящее задание может Глава 10. Многопроцессорное планирование и планирование... 63*9
оказаться не готовым, и это может привести к тому, что несмотря на наличие готовых к выполнению заданий процессор простаивает. Обратите внимание, как в нашем примере система воздерживается от выполнения задания А, несмотря на то что это единственное готовое к выполнению задание. В результате, хотя процессор и не используется с максимальной эффективностью, все требования к предельным срокам в нашем примере при такой схеме удовлетворены. И, наконец, для сравнения на рис. 10.6 приведен результат использования стратегии "первым потупил — первым обслужен". Как видно на рисунке, в этом случае '. отклоненными оказываются два задания — ВиЕ. ^ Частотно-монотонное планирование Одним из многообещающих методов разрешения конфликтов многозадачного планирования для периодических задач является частотно-монотонное плани- < рование (rate monotonic scheduling — RMS). Эта схема была впервые предложена в [LIU73], но популярность приобрела только недавно [BRIA99, SHA94]. Схема RMS назначает приоритеты заданиям на основе их периодов. ' * На рис. 10.7 проиллюстрированы параметры периодических заданий. Период задания Т представляет собой интервал времени между поступлениями двух последовательных заданий одного типа. Частота заданий (измеряемая в Hz) представляет собой величину, обратную периоду (в секундах). Например, задание с периодом 50 ms имеет частоту 20 Hz. Обычно окончание периода задания является жестким предельным сроком завершения задания, хотя некоторые задания могут иметь и более ранние предельные сроки. Время выполнения (вычисления) С представляет собой количество процессорного времени, требующегося для каждого задания определенного типа. Очевидно, что в однопроцессорной системе время выполнения не должно превышать период заданий (т.е* цолжно выполняться С<Т). Если периодическое задание всегда выполняется $ полного завершения, т.е. если не имеется отклоненных из-за нехватки вычислив гельного ресурса заданий, то загруженность процессора этим заданием равн U = С/Т. Например, если задание имеет период 80 ms и время выполне 55 ms, то загруженность им процессора составляет 55/80 = 0.6875. _!V В RMS заданием с наивысшим приоритетом является задание с наимень периодом; вторым по приоритетности является задание со вторым по краткости в - риодом и т.д. Соответственно, в случае готовности для выполнения несколькюГзад - аий первым обслуживается задание с наименьшим периодом. Если мы изобраз. приоритеты заданий как функцию их частоты, то получим монотонно возрастаютду рункцию (см. рис. 10.8), откуда и происходит название метода. ф i л «* ■ Цикл1 *~* Цикл 2 *-"' '■*, Выполнение Холостой ход Выполнение -4 ^ В я Задание Р, время выполнения С •щ Задание Р, периодТ ►- п ^ °ис. 10.7. Временная диаграмма периодического задания У 530 .■■-*:..- #*■,-'■«■ ■ Часть 4. Планиро ... н Высокий а. о 5 а. Низкий Высшая частота и высший приоритет задания W & Ф .<* Низшая частота и низший приоритет задания Частота Рис. 10.8. Множество заданий в методе RMS [WARR91] Одной из характеристик эффективности алгоритма периодического планирования является его гарантия соответствия всем жестким предельным срокам. Предположим, что у нас имеется п заданий, каждое из которых имеет свое фиксированное время выполнения и период. Тогда необходимым условием соответствия всем жестким предельным срокам является выполнение следующего неравенства: Тх Тг +.. с +-=-<1. 71 (ЮЛ) Сумма загруженности процессора разными заданиями не может превышать 1, что соответствует полной загрузке процессора. Неравенство (10.1) определяет верхнюю границу количества заданий, которые может успешно обслуживать идеальный алгоритм планирования. Для конкретного реального алгоритма граница может оказаться ниже. Так, можно показать, что для алгоритма RMS справедливо следующее неравенство: С, С2 т т Т. 2"-1 (10.2) В табл. 10.4 приведены некоторые значения верхней границы для метода RMS. При возрастании количества заданий верхняя граница стремится к значению In 2 = 0.693. Таблица 10.4. Значения верхней границы загруженности для метода RMS п 1 2 3 4 1.000 0.828 0.779 0.756 Глава 10. Многопроцессорное планирование и планирование... 5
Окончание табл. 10.4 0.743 0.734 In 2 » 0.693 Б качестве примера рассмотрим три периодических задания. • Задание Р^ Су = 20; Tt = 100; Ux = 0.2. • Задание Р2: С2 = 40; Тг = 150; U2 = 0.267. • Задание Р3: С3 = 100; Г3 = 350; £/3 = 0.286. Общая загруженность процессора этими тремя заданиями составляет 1.2+0.267+0.286 = 0.753. Верхняя граница загруженности этих трех задач при 1спользовании метода RMS составляет ( I Л Тх Тг Тъ з 23-1 = 0.779 ; Поскольку общая загруженность процессора по обработке приведенных заданий ниже верхней границы для метода RMS, можно сделать вывод, что при [IMS-планировании будут успешно выполнены все задания. Можно также показать, что верхняя граница из (10.1) справедлива для метода наиболее раннего предельного срока. Таким образом, при применении планирования : наиболее ранним предельным сроком можно достичь более высокой загрузки прей цессора и, соответственно, обработать большее количество заданий. Тем не менее м ; год RMS широко распространен и используется во многих промышленных приложениях. В работе [SHA91] это поясняется следующими причинами. <$ 1. На практике отличие производительности невелико. Кроме того, неравенств во (10.2) консервативно, и на практике зачастую достигается 90%-ная загрузка процессора. '£. 2. Большинство жестких систем реального времени содержат мягкие компоненты такие, как некритичный вывод на экран или встроенное самотестирование, выполняющееся с низким приоритетом. Эти компоненты используют процессорн ^ время, которое остается после RMS-планирования жестких заданий. 3. При использовании RMS проще обеспечить стабильность. Когда система в состоянии обеспечить все предельные сроки в силу перегруженности или временных ошибок, необходимо гарантировать выполнение предельны* сроков для подмножества обязательных заданий. При статическом назнач нии приоритетов гарантируется только корректность выполнения основ задач с относительно высокими приоритетами. Это может быть достигнуто в RMS-планировании, путем реструктурирования обязательных задач ДД 532 Часть 4- Планирован . повышения их частоты либо посредством изменения приоритетов RMS для подмножества обязательных задач. При планировании с наиболее ранним предельным сроком приоритеты периодических заданий изменяются от одного периода к другому, что усложняет обеспечение корректной работы обязательных заданий с жесткими предельными сроками. ! 10.3. ПЛАНИРОВАНИЕ В LINUX Ш Linux построен на традиционном планировании UNIX, описанном в разделе 9.3, с добавлением двух классов планирования для мягких заданий реального времени. Таким образом, в Linux имеется три класса планирования. • SCHED_FIFO. Потоки реального времени с использованием планирования по принципу "первым вошел — первым вышел". • SCHED_RR. Потоки реального времени с использованием кругового планирования. • SCHED_OTHER. Прочие потоки, не являющиеся потоками реального времени. В пределах каждого класса могут использоваться различные приоритеты, причем приоритеты классов реального времени выше приоритетов класса SCHED_OTHER. Для потоков FIFO применимы следующие правила. 1. Система не прерывает выполняющийся поток этого класса за исключением следующих ситуаций: а) становится готовым другой поток этого же класса с более высоким приоритетом; б) выполнение потока блокируется ожиданием события (например, выполнения операции ввода-вывода); в) выполняющийся поток добровольно отдает процессор посредством вызоэа примитива sched_yield. 2. При прерывании выполняющегося потока FIFO он помещается в очередь, предназначенную для его уровня приоритета. 3. Если поток FIFO приходит в состояние готовности к выполнению и имеет более высокий приоритет, чем выполняющийся, то текущий поток вытесняется и начинает выполняться готовый поток с высшим приоритетом. Если таких потоков несколько, выбирается поток, находившийся в состоянии ожидания дольше других. Стратегия SCHED_RR аналогична стратегии SCHED_FIFO за исключением добавления временной квоты, связанной с каждым потоком. При выполнении потока RR дольше, чем позволяет его квота, он приостанавливается, и для выполнения выбирается поток реального времени с равным или более высоким приоритетом. На рис. 10.9 ([СОМР98]) приведен пример, иллюстрирующий отличия использования стратегий FIFO и RR, Предположим, что программа содержит четыре потока с относительными приоритетами, показанными на рис. 10.9,а. Предположим также, что все ожидающие потоки готовы к выполнению, когда текущий поток завершается или переходит в состояние ожидания, и что в про- Глава 10. Многопроцессорное планирование и планирование... 633
«. его выполнения не появляются потоки с более высоким приоритетом. На Цессе его выполнен ВЫПолнения потоков, если они принадлежат Е^-йгзьо. потодк D -•--zz^^ttzzzzz "П* завершенияили состояния ожидания, после чего то же происходит с потоком С И, ™°™=^ГГв^полнения потоков в случае их пРинад: н™ассSC™R. W до перехода в состояние ожидания или завер^ "ТьГл^Г^к D. Затем, чередуясь С-кольку °ни и= одинаков^ ^ритет). вь-полшпо™ пот™, Б,«С:, а послах з=н„я -_ £ _ ^ Последним классом планирования является ЬЬН ^^ _ класса может выполняться только в та* сл^'*C™ ™a SCHED OTHER ис^ „олненик, потоков реального времени В ^^„^^разделе 9.3. пользуется традиционное планирование UNIX, описанное в разд * •Л ' А В С D Минимальный Средний Средний Максимальный а) Относительные приоритеты потоков 6) Выполнение при FIFO-планировании * 4- » в) Выполнение при RR-планировании Рис. 10.9. Пример планирования Linux -ТОГ** & :*№ ?ИЪ ■Ц-Г"®!^^ зй|&*> £ АЙ, WS&& ? 5** i*4 .-' ша. планированием одх&шшг Алгоритм планирования в UNIX SVR4 представляет собой преобразований алгоритм из ранних систем UNIX (описанный в разделе 9.3). Новый алгорит разработан таким образом, что дает наивысший приоритет процессам реальн" времени, приоритет следующего уровня присваивается процессам ядра, а польч - вательские процессы (известные как процессы с разделением времени) получ т низший приоритет. В SVR4 реализованы два основных изменения традиционного алгоритма.^ 1. Добавлено вытесняющее планирование на основе статических приорит в систему введено множество из 160 уровней приоритетов, разделенных: три класса. V 2. Внесены точки вытеснения. Поскольку базовое ядро не вытесняемо, его в полнение может быть разделено на небольшие части, выполняемые до з вершения без прерывания. В промежутках между выполнением этих фЦ. г ментов размещены точки вытеснения, в которых ядро может быть безоп CQi< Часть 4, Планиров но прервано и в которых может начаться выполнение нового процесса. Точка вытеснения может быть определена как область кода, где все структуры данных ядра либо обновлены и согласованы, либо заблокированы при помощи семафора. На рис. 10.10 показаны 160 уровней приоритетов, определенные в SVR4. Каждый процесс принадлежит одному из трех классов приоритетов и получает свой уровень приоритета в пределах данного класса. Вот краткое описание каждого класса приоритетов. • Реального времени (159—100). Процессы этих уровней приоритета гарантированно выбираются для выполнения прежде любых процессов ядра и процессов с разделением времени. Кроме того, процессы реального времени могут использовать точки вытеснения для прерывания выполнения процессов ядра и пользовательских процессов. • Ядра (99—60). Процессы с этими уровнями приоритета гарантированно выбираются для выполнения прежде всех процессов с разделением времени, но уступают процессам реального времени. • Разделения времени (59-0). Процессы с низшим приоритетом, принадлежащие пользовательским приложениям (кроме приложений реального времени). Класс Глобальное Последовательность приоритетов значение планирования Реальное время Ядро Разделение времени 159 » • • 100 99 • • 60 59 * • • ■ 0 Первый ▼ Последний Рис. 10.10. Классы приоритетов SVR4 На рис. 10.11 показано, как реализовано планирование в SVR4. С каждым Ровнем приоритета связана своя очередь, и процессы одного уровня приоритета анируются с использованием круговой стратегии. Битовый вектор dqactmap ^Держит по одному биту для каждого уровня приоритета; этот бит устанавлива- НяЯ' 6СЛИ соответствУЮ1Чая данному приоритету очередь не пуста. Когда выпол- Щийся процесс блокируется или вытесняется, диспетчер обращается к век- с и ^actmaP и запускает готовый к выполнению процесс из непустой очереди Чро ВЫСШИМ приоритетом. Кроме того, по достижении точки вытеснения ядро еРяет состояние флага kprunrun. Если данный флаг установлен, это означали .- к Ва Ю. Многопроцессорное планирование и планирование... 585
'# что в состоянии готовности имеется как минимум один процесс реального ,рмени и в этом случае ядро вытесняет текущий процесс (если его приоритет иже, чем у готового к выполнению процесса реального времени с наивысшим риоритетом). qactmap 1 0 | и 1 I 1 I О I dispq [159 2 11191 ii Рис. 10.11. Очереди диспетчера SRV4 Приоритет процесса в классе разделяемого времени является величиной перегенной. Планировщик снижает приоритет процесса всякий раз при использовании ем очередного кванта времени и повышает — при блокировке процесса в ожидании [екоторого события или ресурса. Квант времени, выделяемый процессу с разделени- м времени, зависит от его приоритета и изменяется от 100 ms для приоритета 0 до .0 ms для приоритета 59. Для сравнения — каждый процесс реального времени 1меет фиксированный приоритет и фиксированный квант времени. ОХУ. 10.етЛАНЙРОвШиЕ WINDOWS 2000 ■At Операционная система Windows 2000 (W2K) разработана таким образом, чтобы|. 5ыть по возможности максимально чувствительной либо к нуждам отдельного поль^ ювателя в интерактивной среде, либо в роли сервера. В W2K реализован планиров^ щик с вытеснением и гибкой системой уровней приоритетов, включающий круговое, планирование на каждом уровне, а для некоторых уровней - динамическое изменение приоритета на основе текущей активности потоков. > ■ Приоритеты процессов и потоков Приоритеты в W2K организованы в виде двух групп, или классов^реально . го времени и переменные. Каждая из этих групп состоит из 16 уровней прио и тета. Потоки, требующие немедленного внимания, находятся в классе реально времени, который включает такие функции, как осуществление коммуникаци, и задачи реального времени. ^,-кго В целом, поскольку W2K использует вытесняющий планировщик с учетд^ приоритетов, потоки с приоритетами реального времени имеют пРеимУщест^| отношению к прочим потокам. В однопроцессорной системе, когда станов^ ^ готовым к выполнению поток с приоритетом более высоким, чем у выполн _ щегося в настоящий момент, низкоприоритетный поток вытесняется и начш* ^ выполняться более высокоприоритетный поток. мяпму Приоритеты из разных классов обрабатываются несколько no-PWW (рис. 10.12). В классе приоритетов реального времени все потоки имеют <ри ^ рованный приоритет, который никогда не изменяется, и все активные лото* определенным уровнем приоритета располагаются в круговой очереди дан уровня. В классе переменных приоритетов поток начинает работу с некото м W лае Часть 4. Планиров ние изначально присвоенным ему приоритетом, который затем может изменяться как в большую, так и в меньшую сторону. Таким образом, на каждом уровне приоритета имеется своя очередь, но процессы могут переходить из одной очереди в другую в пределах одного класса переменных приоритетов. Поток с приоритетом 15 не может получить приоритет 16, как и какой-либо другой приоритет из класса реального времени. Наивысший (31) Класс приоритетов реального времени Наинизший (16) } Наивысший (15) Класс переменных приоритетов Наинизший (0) т—- D—| .—► Э-» — D-» Рис. 10.12. Приоритеты потоков Windows NT Начальный приоритет потока в классе переменных приоритетов определяется двумя величинами: базовым приоритетом процесса и базовым приоритетом потока. Одним из атрибутов процесса является его базовый приоритет, который может принимать значение от 0 до 15. Каждый объект по- Глава 10. Многопроцессорное планирование и планирование... >>f|7
гока, связанный с объектом процесса, имеет собственный базовый приоритет, который указывает базовый приоритет потока по отношению к приоритету процесса, и может отличаться от базового приоритета процесса не более~чем на 2 уровня в большую или меньшую сторону. Так, например, если базовый приоритет процесса равен 4, а базовый приоритет одного из его потоков равен -1, то начальный приоритет этого потока равен 3. После активации потока из класса переменных приоритетов его действительный приоритет (именуемый динамическим приоритетом потока) может колебаться в определенных пределах — он не может упасть ниже наименьшего базового приоритета потока или подняться выше максимально возможного значения приоритета данного класса, т.е. 15. На рис. 10.13 приведен пример процесса с базовым приоритетом, равным 4. Каждый поток, связанный с данным процессом, должен иметь начальный приоритет от 2 до 6, и в процессе работы значения динамических приоритетов потоков могут колебаться в диапазоне от 2 до 15. Если поток прерывается в связи с тем, что он полностью использовал отпущенный ему квант времени, исполнительная система W2K снижает его приоритет; если же поток прерван в связи с ожиданием завершения операции ввода-вывода, его приоритет повышается. Таким образом, име- v ется тенденция повышения приоритетов, ориентированных на ввод-вывод, и, ---> снижения приоритетов, ориентированных на вычисления. В потоках, ориенти- i$ рованных на ввод-вывод, приоритет потоков, ожидающих завершения инте- щ рактивной операции (например, вывод на экран или ввод с клавиатуры) по- i вышается больше, чем для других операций ввода-вывода (например, диско вых). Следовательно, в пределах класса переменных приоритетов =| интерактивные потоки стремятся к получению наивысшего приоритета. ж % i » % Ш 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 I I I I I I I I I I I I I I I I I | Базовый приоритет Приоритет процесса Наивысший Повышенный Обычный Пониженный Наинизший Базовый приоритет потока Динамический приоритет потока Рис. 10.13. Пример отношения приоритетов в Windows NT -■№- Jap '$■ -.if 1 j& .'if* ■tf 538 Часть 4. Планиров * Многопроцессорное планирование При работе W2K в системе с одним процессором поток с наивысшим приот™ том всегда активен (если только не ожидает наступления какого-либо события) Е^ имеется несколько потоков с наивысшим приоритетом, то процессор работает с ш^ с использованием кругового планирования. В многопроцессорной системе с А/тГ цессорами всегда активны AM потоков с наивысшими приоритетами, работающие на дополнительных AM процессора. С остальными потоками с более низким m оритетом. работает единственный оставшийся процессор. Например, если в сигамё три процессора, то два потока с наивысшими приоритетами будут выполняться м двух процессорах, в то время как третий процессор будет работать со всеми осталГ ными потоками с более низкими приоритетами. Описанный принцип управляется свидетельством сродства потока с пронес' сором. Если поток готов к выполнению, но доступные процессоры не находятся во множестве сродства потока, такой поток вынужден находиться в состоянии ожидания, в то время как планировщик запускает другой доступный поток ГГгТЯЯЙл- 10.6. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ^ И КОНТРОЛЬНЫЕ ВОПРОСЫ В сильносвязанной многопроцессорной системе доступ к одной и той же основной памяти получают несколько процессоров. В такой конфигурации структура планирования должна быть несколько более сложной, чем в однопроцессорной системе. Изучение производительности многопроцессорных систем показывает, что отличия в производительности при использовании различных стратегии планирования в многопроцессорных системах не так значительны, как в однопроцессорной системе. Процессами реального времени являются такие процессы, которые выполняются в связи с некоторыми процессами, функциями или множествами событии, внешних по отношению к вычислительной системе, и для которых с целью эффективного и корректного взаимодействия с внешней средой заданы сдельные сроки начала или окончания работы. Операционная система реального вре^ мени представляет собой операционную систему, которая способна управлять процессами реального времени. В этом случае традиционные критерии алгоритмовi планирования неприменимы, и ключевым фактором для системы планиро- ания становятся предельные сроки, что приводит к использованию специализированных алгоритмов планирования. Ключевые термины Лет^Н°е Ш1анирошшие Непериодическое задание Планирование реального Детерминированная Операционная система времени Же>сПткиЦИ0ННаЯ СИСТеМа Реального времени Разделение загрузки ие задания Периодическое задание Частотно-монотонное Зевни™0™ ВреМ6НИ Планирование потоков планирование Мяг^^Т°СТЬ Планирование Чувствительность мягкие задания предельных сроков реального времени лава 10. Многопроцессорное планирование и планирование... 539
(нтрольные вопросы L0.1. Перечислите и кратко опишите пять категорий зернистости синхронизации. L0.2. Перечислите и кратко опишите четыре метода планирования потоков. L0.3. Перечислите и кратко опишите три версии разделения загрузки. L0.4. В чем заключается отличие между жесткими и мягкими заданиями реального времени? L0.5. В чем заключается отличие между периодическими и непериодическими заданиями реального времени? L0.6. Перечислите и кратко опишите пять общих типов требований к операционным системам реального времени. 10.7. Перечислите и кратко опишите четыре класса алгоритмов планирования реального времени. 10.8. Какая информация о задании может использоваться в планировании реального времени? 0.7. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА" В [WEND89] представлено интересное обсуждение различных подходов к огопроцессорному планированию. В работах [KRIS94, STAN93, LEE93, LB91] содержится важный материал, посвященный операционным системам и анированию реального времени. В [ZEAD97] выполнен анализ производитель- сти планировщика реального времени SVR4. Ж -ы i: LRIS94 Krishna С, Lee Y., eds. Special Issue on Real-Time Systems. — Proceeding» of IEEE, January 1994. EE93 Lee Y., Krishna C, eds. Readings in Real-Time Systems. — Los Alamitos, CA: IEEE Computer Society Press, 1993. ITAN93 Stankovic J., Ramamritham K., eds. Advances in Real-Time Systems. — Los Alamitos, CA: IEEE Computer Society Press, 1993. - *~ 1LB91 Tilborg A., Koob G., eds. Foundations of Real-Time Computing: Scheduling ^ and Resource Management. — Boston: Kluwer Academic Publishers, 1991. VEND89 Wendorf J., Wendorf R., Tokuda, H. Scheduling Operating System Process ing on Small-Scale Microprocessors. — Proceedings. 22nd Annual Hawaii Interna tional Conference on System Science, January 1989. IEAD97 Zeadally S. An Evaluation of the Real-Time Performance of SVR4.0 and SVR4.2. — Operating Systems Review, January 1977. -.«■ V-..4 L0.8. ЗАДАЧИ *^р*гт***я*> ).l. Рассмотрим множество из трех периодических заданий, профили выпол «_ ния которых приведены в табл. 10.5. Разработайте для этого множества Диграмму планирования, аналогичную диаграмме, приведенной на рис. lU.o. |- ' *4 Часть 4. Планирова t Таблица 10.5. Профили выполнения процессов из задачи 10 1 Процесс А(1) А(2) • • • ВЦ) В(2) • • • С(1) С(2) • • • Таблица 10.6. Процесс А В С D Е Время поступления 0 20 • • • 0 50 • • • 0 50 • • • Время выполнения 10 10 • • • 10 10 • • • 15 15 • • • Профили выполнения процессов Время поступления 10 20 40 50 60 Время из выполнения 20 20 20 20 20 Предельный срок завершения задачи 20 40 • • • 50 100 • • • 50 100 • • • 10 2 Предельный срок завершения 100 30 60 80 70 10.2. Рассмотрим множество из пяти непериодических заданий, профили выполнения которых приведены в табл. 10.6. Разработайте для этого множества диаграмму планирования, аналогичную той, которая приведена на рис. 10.6. 10.3. Эта задача демонстрирует, что формула (10.2) является достаточным, но не необходимым условием — т.е. иногда успешное планирование возможно в ситуации, когда условие (10.2) не выполняется. а. Рассмотрим множество следующих непериодических заданий: • задание Рг: Сх = 20; Тх = 100; • задание Р2: С2 - 30; Т2 - 145. Могут ли эти задания быть успешно выполнены с использованием частотно- монотонного планирования? б. Добавим к рассматриваемому множеству еще одно задание: • задание Р3: С3 - 68; Т3 - 150. Удовлетворяется ли при этом условие (10.2)? в. Предположим, что первые задания рассмотренных трех типов поступают в систему в момент t = 0, а первые предельные сроки заданий Dx - 100; D2 = 145; Ds = 150. Будут ли выполнены все три ограничения при исполь- Глава 10. Многопроцессорное планирование и планирование... 54%
зовании частотно-монотонного планирования? Что можно сказать о пре» дельных сроках последующих повторений заданий? К многопроцессорной системе с 8 процессорами подключены 20 лентопротяжных устройств. В систему поступает большое количество заданий, причем для завершения каждого из них требуется максимум 4 лентопротяжных устройства. Предположим, что каждое задание начинает выполняться с требованием лишь трех устройств; четвертое ему потребуется только через довольно большой срок, причем будет использоваться очень недолго. Предположим также, что источник заданий бесконечен. а. Предположим, что планировщик операционной системы не запускает задание до тех пор, пока не становятся доступными четыре устройства. В начале работы задания за ним закрепляются четыре устройства, которые освобождаются только по завершении задания. Чему равно максимальное количество заданий, которое может одновременно выполняться в такой системе? Чему равно минимальное и максимальное количество лентопротяжных устройств, которое может оказаться простаивающим при такой стратегии? б. Предложите альтернативную стратегию для повышения степени использования лентопротяжных устройств, которая в то же время позволяет избежать взаимоблокировок. Чему равно максимальное количество одновременно выполняющихся заданий? Какой величиной ограничено количество простаивающих лентопротяжных устройств? ^ ' .!"'V":S у. * ■s-J Часть 4. Планиров **е часть 5 Операции ввода-вывода и файлы При создании операционной системы важное место занимают средства ввода-вывода и система управления файлами. При рассмотрении ввода-вывода ключевым вопросом является производительность. От удачного проектирования средств ввода-вывода во многом зависит производительность всей вычислительной системы. Если обратить внимание на функционирование компьютерных систем, то можно увидеть, что скорость работы процессора непрерывно возрастает, а если один процессор работает недостаточно быстро, то повысить производительность можно путем использования SMP-конфигурации. Скорость доступа к основной памяти также возрастает, хотя и медленнее, чем скорость работы процессора. При разумном использовании одного, двух или более уровней внутренней кэш-памяти возможно ускорить доступ к основной памяти, компенсируя этим отставание скорости работы основной памяти от скорости работы процессора. Заметим, однако, что производительность при операциях ввода-вывода остается существенной проблемой, особенно при работе с дисковой памятью. Производительность важна и при рассмотрении файловых систем. Здесь на первый план выступают также такие требования, как надежность и безопасность. С точки зрения пользователя, файловая система является, возможно, самым важным аспектом операционной системы: пользователю необходим не только быстрый доступ к файлам, но и гарантия того, что файлы останутся неповрежденными и будут защищены от несанкционированного доступа.
ПУТЕВОДИТЕЛЬ ПО ЧАСТИ 5 'Л.- . I Глава 11. Управление вводом-выводом и дисковое планирование Эта глава начинается с обзора запоминающих устройств ввода-вывода и организации выполнения операций ввода-вывода в операционной системе. Далее Jj мы рассмотрим различные стратегии буферизации, способные повысить произво- -1 дительность. Остальная часть главы посвящена дисковым операциям ввода- вывода. Мы попытаемся найти способ упорядочения многочисленных запросов к диску, что позволит использовать преимущества физических характеристик дос- «< тупа к диску, необходимые для уменьшения времени отклика. И, наконец, мы *fM рассмотрим повышение производительности и надежности за счет применения '£л дисковых массивов и использования дискового кэша. *! Глава 12. Управление файлами В этой главе обсуждаются различные методы организации файлов, а также анализируются проблемы, связанные с управлением файлами и доступом к ним в операционной системе. Большое внимание уделяется физической и логической организации данных. Здесь описаны сервисные средства управления файлами, предоставляемые пользователю операционной системой. Кроме того, в главе рассмотрены специфические устройства и структуры данных, входящие в систему управления файлами. ;,г Ж if 544 Часть 5. Операции ввода-вывода и фай ГЛАВА Управление вводом- выводом и дисковое планирование 11.1. Устройства ввода-вывода 11.2. Организация функций ввода-вывода 11.3. Вопросы проектирования операционных систем 11.4. Буферизация операций ввода-вывода 11.5. Дисковое планирование 11.6. RAID 11.7. Дисковый кэш 11.8. Ввод-вывод в UNIX SVR4 11.9. Ввод-вывод в Windows 2000 11.10. Резюме, ключевые термины и контрольные вопросы 11.11. Рекомендуемая литература 11.12. Задачи Приложение. Дисковые устройства 11
О. УСТРОЙСТВА ВВОДА-ВЫВОДА 1 " Как было сказано в главе 1, "Обзор компьютерных систем", внешние устройст- сопровождающие операции ввода-вывода, могут быть объединены в три группы. Работающие с пользователем. Используются для связи с пользователем компьютера. В качестве примера можно привести принтеры и видеотерминалы, состоящие из дисплея, клавиатуры, а также другие устройства — на- . Работающие с компьютером. Используются для связи с электронным обе рудованием. К ним можно отнести дисковые устройства и устройства с магнитной лентой, датчики, контроллеры и преобразователи. . Коммуникации. Используются для связи с удаленными устройствами. К ним относятся модемы и драйверы цифровых линий. Имеются существенные различия как между устройствами ввоДа"выв^ «надлежащими к разным классам, так и в рамках каждого класса. Отметим едующие из этих различий. . Скорость передачи данных. Скорость передачи данных может отличаться на несколько порядков (рис. 11.1). • Применение. Каждое действие, поддерживаемое устройством, оказывает влияние на программное обеспечение и стратегии операционной системы. 1ак* пример, использующийся для хранения файлов диск требует ны*™^ граммного обеспечения для управления файлами. Диск, используемый в кд стве внешнего запоминающего устройства для страниц виртуальной памят, зависит от программных и аппаратных- средств виртуальной памяти. Кроме .л .1 вод-вывод является, пожалуй, самым значимым аспектом при создании * операционных систем. Вследствие широкого разнообразия запоминающих * устройств и приложений разработать общее согласованное решение, ка- щееся их организации, очень сложно. Мы начнем главу с краткого обсуждения устройств и организации функций щ-вывода. Эти вопросы, обычно относящиеся к области архитектуры компь- .§ pa, приводят к необходимости изучения ввода-вывода с точки зрения опера- ^ иной системы. & В следующем разделе рассматриваются вопросы разработки операционных $ гем, включающие вопросы организации ввода-вывода. После этого рассмат- ается буферизация — один из основных предоставляемых операционной сис- ой сервисов ввода-вывода, повышающий общую производительность системы. Остальные разделы главы посвящены операциям ввода-вывода, связанным с ■нитным диском. В современных системах этот вид операций ввода-вывода — ый важный, а с пользовательской точки зрения он является ключом к по- пению производительности. Мы начнем с описания разработки модели пронзительности дисковых операций ввода-вывода, а затем рассмотрим несколько 4Щ юдов повышения этой производительности. ЩШ Приложение к данной главе завершает анализ характеристик внешних заломи- )$ЬЩ эщих устройств, включая магнитный диск и оптические устройства памяти. х-Ф :К % 1 ' . ■-ф"»а. пример, манипулятор "мышь". Щ ?Чг ' "ас-- 46 Часть 5. Операции ввода-вывода и файл. го, данные приложения оказывают воздействие и на алгоритмы дискового планирования (этот вопрос рассматривается в настоящей главе позже). В качестве еще одного примера можно привести терминал, который может использоваться как обычным пользователем, так и системным администратором — при этом требуются не только различные уровни привилегий, но и, вероятно, различные уровни приоритетов операционной системы. Сложность управления. Для принтера требуется относительно простой интерфейс управления, диску же необходим намного более сложный интерфейс. Влияние этих отличий на операционную систему сглаживается усложнением контроллеров ввода-вывода. Единицы передачи данных. Данные могут передаваться как поток байтов или символов (например, при терминальном вводе-выводе), и блоками (например, при выполнении дисковых операций ввода-вывода). Представление данных. Различные устройства используют разные схемы кодирования данных, включая разную кодировку символов и контроль четности. Условия ошибок. Природа ошибок, способ сообщения о них, их последствия и возможные ответы резко отличаются при переходе от одного устройства к другому. Gigabit Ethernet Графический монитор Жесткий диск Ethernet Оптический диск Сканер Лазерный принтер Гибкий диск Модем Мышь Клавиатура 101 102 103 10' ю8 104 105 106 Скорость передачи данных, bps Рис. 11.1. Скорость передачи данных типичных устройств ввода-вывода 109 Такое разнообразие приводит тому, что, по сути, невозможна разработка единого и согласованного подхода к проблеме ввода-вывода как с точки зрения операционной системы, так и с точки зрения пользовательских процессов Глава 11. Управление вводом-выводом и дисковое планирование 547
.2. ОРГАНИЗАЦИЯ ФУНКЦИЙ ВВОДА-ВЫВОДА В разделе 1.7 рассмотрены три способа осуществления ввода-вывода. Программируемый ввод-вывод. Процессор посылает необходимые команды контроллеру ввода-вывода; после этого процесс находится в состоянии ожидания завершения операции ввода-вывода. Ввод-вывод, управляемый прерываниями. Процессор посылает необходимые команды контроллеру ввода-вывода и продолжает выполнение следующих команд. Выполнение процесса прерывается контроллером ввода- вывода, когда последний выполнит свое задание. Выполняющийся процессором код может быть кодом процесса, обратившегося к устройству ввода- вывода, если нет необходимости в ожидании выполнения операции ввода- вывода. В противном случае процесс приостанавливается до получения прерывания, и процессор переключается на выполнение другого процесса. Прямой доступ к памяти. Модуль прямого доступа к памяти управляет обменом данных между основной памятью и контроллером ввода-вывода. Процессор посылает запрос на передачу блока данных модулю прямого доступа к памяти, а прерывание происходит только после передачи всего блока данных. В табл. 11.1 показана связь между перечисленными способами. В болыпин- ie компьютерных систем основным способом передачи данных, поддерживае- [М операционной системой, является прямой доступ к памяти. блица 11.1. Способы ввода-вывода Без использования С использованием преры- прерываний ваний ередача данных из устройства Программируемый Ввод-вывод, управляемый вода-вывода в память с исполъ- ввод-вывод прерыванием званием процессора [рямая передача данных из уст- Прямой доступ к памяти ойства ввода-вывода в память (DMA) Эволюция функций ввода-вывода Параллельно с развитием компьютерных систем возрастает сложность и ин- \ ллектуальность их отдельных компонентов, что заметнее всего в области вво- ч- ьвывода. Этапы развития функциональности устройств ввода-вывода можно характеризовать следующим образом. 1. Процессор непосредственно управляет периферийным устройством. i 2. К устройству добавляется контроллер или модуль ввода-вывода. Процессор ,■, использует программируемый ввод-вывод без прерываний. На этом этапе jf процессор становится в некоторой степени отделенным от конкретных дета- лей интерфейсов внешних устройств. ^ ■% f * £ \ ■С # : > V :* Л ■г'. %1 S-" .? '( А i' _? ■\ i 48 Часть 5. Операции ввода-вывода и файл, 3. Применяется та же конфигурация, что и в пункте 2, только с использованием прерываний. В результате процессору нет необходимости расходовать время на ожидание выполнения операций ввода-вывода, что приводит к увеличению производительности. 4. Модуль ввода-вывода получает возможность непосредственной работы с памятью с использованием DMA. Появляется возможность перемещения блока данных в память или из нее без использования процессора (за исключением моментов начала и окончания передачи данных). 5. Модуль ввода-вывода совершенствуется и становится отдельным процессором, обладающим специализированной системой команд, предназначенных для ввода-вывода. Центральный процессор дает задание процессору ввода- вывода выполнить программу ввода-вывода, находящуюся в основной памяти. Процессор ввода-вывода производит выборку и выполнение соответствующих команд без участия центрального процессора. Такая процедура позволяет центральному процессору определить последовательность выполняемых функций ввода-вывода и быть прерванным только при выполнении всей последовательности. 6. Модуль ввода-вывода обладает своей локальной памятью и является, по сути, отдельным компьютером. При такой архитектуре управление многочисленными устройствами ввода-вывода может осуществляться при минимальном вмешательстве центрального процессора. Обычно такая архитектура используется для управления связью с интерактивными терминалами. Процессор ввода-вывода берет на себя большинство задач, связанных с управлением терминалами. Если проследить описанный выше путь развития устройств ввода-вывода, то можно заметить, что вмешательство процессора в функции ввода-вывода становится все менее заметным. Центральный процессор все больше и больше освобождается от задач, связанных с вводом-выводом, что приводит к повышению общей производительности» Этапы 5 и 6 отражают изменение концепции устройства ввода-вывода — отныне он способен к самостоятельному выполнению программы. Обратите внимание на терминологию. Для всех модулей, описанных в пунктах 4-6, вполне применим термин "прямой доступ к памяти", поскольку каждый из них использует непосредственное управление основной памятью модулем ввода- вывода. Модуль ввода-вывода, описанный в пункте 5, часто называется также каналом ввода-вывода, а модуль, описанный в пункте 6, — процессором ввода-вывода. Впрочем, иногда в литературе каждый из этих терминов используется и для описания другого типа устройств. В оставшейся части главы мы используем термин "канал ввода-вывода" для обоих типов модулей ввода-вывода. Прямой доступ к памяти На рис. 11.2 представлена логическая схема прямого доступа к памяти. Устройство прямого доступа к памяти способно дублировать функции процессора, в частности получать от процессора управление системой. Эта возможность необходима ему Для передачи данных по системной шине — как в память, так и из нее. Обычно модуль DMA использует системную шину лишь в том случае, когда процессор не нуждается в ней (в противном случае ему придется вынудить процессор временно приос- Глава 11. Управление вводом-выводом и дисковое планирование 549
,ВИть свою работу). Этот способ наиболее распространен и именуется захватом яа так как модуль DMA выполняет захват цикла шины. Линии 4- передач и данных Адресные линии -4- Запрос DMA 4- Подтверждение DMA — Прерывание -4- Чтение — Запись — Счетчик данных Регистр данных Адресный регистр Управляющая схема ■.f* Рис. 11.2. Блок-схема прямого доступа к памяти Рассмотрим работу схемы прямого доступа к памяти. В тот момент, когда f1 щессору необходимо произвести считывание или запись блока данных, он вышлет запрос к модулю DMA, передавая ему следующую информацию. Какая из операций — чтения или записи — запрашивается. В зависимости от этого будет использоваться либо управляющая линия чтения, либо записи между процессором и модулем DMA. 1 Адрес используемого устройства ввода-вывода, подключенного к данных. ^ 1 Начальный адрес считываемой (или записываемой) области памяти, храня- ■;.;' щийся в адресном регистре модуля DMA. -^ » Какое количество слов необходимо прочесть или записать. Эта величин*. .:; хранится в регистре счетчика данных модуля DMA. \ После этого процессор продолжает свою работу с другим заданием, передав ^ равление операцией ввода-вывода модулю DMA. В свою очередь модуль DMA, Л шуя процессор, передает весь блок данных непосредственно в память (или ,*» итывает данные из нее). После выполнения передачи данных модуль DMA по-. ^ [лает процессору сигнал прерывания. Таким образом, процессор включается в '■' от процесс лишь в начале и в конце передачи данных (рис. 1.19,в). .Л На рис. 11.3 показаны позиции цикла команд, в которых работа процессор»^ >жет быть приостановлена. В любом случае приостановка работы процессора про '* ходит только при необходимости использования шины. После этого устройство, Ж 50 Часть 5. Операции ввода-вывода и ф , ,ы DMA выполняет передачу одного слова и возвращает управление процессору. Обратите внимание на то, что это не прерывание: процессор не сохраняет контекст с переходом к выполнению другого задания. Процессор просто делает паузу на время одного цикла шины. Общее влияние DMA состоит в несколько более замедленной работе процессора. Тем не менее для передачи большого блока данных модулем ввода-вывода метод прямого доступа к памяти более эффективен, чем метод с использованием прерываний или программируемый ввод-вывод Время Ы Цикл процессора ч w Выборка команды Цикл процессора Ч Р- Декодирование команды Цикл команды Цикл процессора я ► Выборка операнда Цикл процессора 4 ► Выполнение команды Цикл процессора 4\ ► Сохранение результата ► Цикл процессора 4 Ь Прерывание процесса Точки прерывания DMA Точка / прерывания Рис. 11.3. DMA и точки прерывания цикла команд Конфигурирование прямого доступа к памяти может быть выполнено различными способами; некоторые из них представлены на рис. 11.4. В первом примере все модули подключены к одной и той же системной шине. Модуль DMA, выступающий в качестве дублера процессора, использует программируемый ввод-вывод для обмена данными между памятью и устройством ввода- вывода с участием модуля DMA. Несмотря на достоинство такой конфигурации, заключающееся в относительной дешевизне, она малоэффективна. Поскольку используется программируемый ввод-вывод под управлением процессора, на передачу каждого слова затрачиваются два цикла шины (после запроса на передачу следует передача данных). Число необходимых циклов шины может быть в значительной степени уменьшено путем интегрирования DMA и функций ввода-вывода. При этом подразумевается (как показано на рис. 11.4,6) наличие магистрали между модулем DMA и одним или несколькими устройствами ввода-вывода без подключения системной шины. Логический узел DMA на самом деле может быть как частью модуля ввода-вывода, так и отдельным модулем, контролирующим один или несколько устройств ввода-вывода. Эту идею можно развивать путем добавления модулей ввода-вывода к модулю DMA с использованием шины ввода-вывода (рис. 11.4,в). Такая схема позволяет свести количество интерфейсов ввода- Глава 11. Управление вводом-выводом и дисковое планирование 551
да в модуле DMA к одному и предусматривает легкое расширение этой кон- рации. Во всех представленных случаях (рис. 11.4,6 и в) совместно исполь- ая модулем DMA, процессором и основной памятью системная шина служит лю DMA только для обмена данными с памятью и обмена управляющими алами — с процессором. Обмен данными между DMA и модулями ввода- |да происходит вне системной шины. Процессор DMA I/O I/O а) Одиночная шина, обособленный DMA Память /.4 '?»■ ф - jy ? ;Ц : б) Одиночная шина интегрированный DMA-I/0 Системная шина Процессор »rwa DMA Память Шина ввода-вывода С I/O I/O I/O ?•■] „■.-I $* X .л в) Шина ввода-вывода Рис. 11.4. Альтернативные конфигурации прямого доступа к памяти * ; ' if". -" 52 Л ■V -Л Часть 5. Операции вводачвывода и фай ■#;■• 11.3. ВОПРОСЫ ПРОЕКТИРОВАНИЯ i .. ОПЕРАЦИОННЫХ СИСТЕМ Цели проектирования При проектировании средства ввода-вывода разработчики руководствуются двумя целями: достижением высокой эффективности и универсальности. Эффективность очень важна в силу того, что операции ввода-вывода часто способствуют возникновению "заторов" в компьютерной системе. Взгляните еще раз на рис. 11.1 — большинство устройств ввода-вывода работают по сравнению с основной памятью и процессором чрезвычайно медленно. Одним из способов решения этой проблемы является многозадачный режим, который позволяет процессору во время выполнения операций ввода-вывода одного процесса работать над выполнением других. Однако даже при наличии большого объема основной памяти в современных компьютерах зачастую будет возникать ситуация, когда операции ввода-вывода отстают от процессора. Для сохранения высокой загруженности процессора применяется подкачка, которая загружает в память готовые к выполнению процессы, но сама она представляет собой не что иное, как операцию ввода-вывода. Таким образом, основное внимание при создании операционной системы направлено на поиск эффективной схемы выполнения операций ввода-вывода. В силу своей важности дисковые операции ввода-вывода являются областью, заслуживающей особого внимания, и большая часть этой главы посвящена именно изучению производительности дисковых операций ввода-вывода. Другой важной задачей является универсальность. Чтобы упростить работу с устройствами ввода-вывода и снизить вероятность возникновения ошибок, желательно иметь возможность одинакового управления различными устройствами. Это относится как к управлению устройствами ввода-вывода со стороны пользовательских процессов, так и со стороны операционной системы. Достичь реальной универсальности на практике, по сути, невозможно в силу огромного разнообразия характеристик устройств ввода-вывода, и самое большее, что можно сделать в подобной ситуации, — это применить модульный подход при разработке функций ввода-вывода. Такой подход позволяет скрыть детали устройства, так что пользовательские процессы обращаются к устройству только с высокоуровневыми вызовами: чтение и запись, открытие и закрытие, блокирование и разблокирование. Логическая структура функций ввода-вывода В главе 2, "Обзор операционных систем", при обсуждении структуры системы мы придавали особое значение иерархической природе современных операционных систем. Философия иерархии состоит в том, что функции операционной системы следует разделять в соответствии с их сложностью, характерной временной шкалой и уровнем абстракции. Следуя этому подходу, можно прийти к такой организации операционной системы, при которой она будет представлена серией уровней. Каждый уровень представляет связанное подмножество функций, необходимых операционной системе. Выполнение примитивных функций передается более низкому уровню; при этом более высокий Глава IX. Управление вводом-выводом и дисковое планирование 553
>" & ровень не знает никаких деталей выполнения поставленных задач более низ- им уровнем. Со своей стороны любой из уровней обеспечивает обслуживание педующего верхнего уровня. В идеале уровни нужно организовывать таким бразом, чтобы изменения в одном уровне не приводили к необходимости вне- вния изменений в остальных уровнях. Вообще говоря, чем ниже уровень, тем более короткой оказывается его вре- сенная шкала. Некоторые части операционной системы должны непосредствен- :о взаимодействовать с аппаратным оборудованием компьютера, где продолжи- ельность различных событий может оказаться на уровне нескольких микросе- ;унд; другие части операционной системы работают с пользователем, ввод :оманд которым может осуществляться со скоростью один раз в несколько се- сунд. Использование множества уровней идеально подходит для этих условий. Такая философия по отношению к средствам ввода-вывода определяет орга- шзацию, приведенную на рис. 11.5. Детали организации будут зависеть от типа устройства и его применения. На рисунке представлены три наиболее важные югические схемы. Естественно, что конкретная операционная система может и не соответствовать в точности этим схемам, но общие положения остаются справедливыми в любом случае, и большинство операционных систем используют ввод-вывод приблизительно таким образом. Рассмотрим в первую очередь самый простой случай, когда локальное периферийное устройство осуществляет связь посредством потока байтов или запи-^. сей (рис. 11.5,а). В этом случае уровни будут следующими. *й,' • Логический ввод-вывод. Модуль логического ввода-вывода обращается с^ устройством как с логическим ресурсом и не обращает внимания на детали С фактического управления устройством. Логический модуль ввода-вывода * работает посредником между пользовательскими процессами (предоставлял■""" им набор высокоуровневых функций) и устройством. .;г,,Г • Устройство ввода-вывода. Запрошенные операции и данные (буферизированньщ^, символы, записи и т.п.) конвертируются в соответствующие последовательности^ инструкций ввода-вывода, команды управления каналом и команды контроле лера. Для более эффективного использования устройства может быть применена» буферизация. fe* • Планирование и контроль. На этом уровне происходит реальная организа-д/ ция очередей и планирование операций ввода-вывода, а также управление* выполнением операций. Осуществляется работа с прерываниями, получение- . и передача информации о состоянии устройства. Это уровень программного ,; обеспечения, которое непосредственно взаимодействует с контроллером вво-' да-вывода, а следовательно, с аппаратным обеспечением устройства. '_•■« Для устройств связи структура ввода-вывода (рис. 11.5,60 выглядит почти, так же, как и рассмотренная выше. Принципиальное отличие состоит в том, чт^' логический модуль ввода-вывода заменяется коммуникационной архитектурой*" которая, в свою очередь, может состоять из некоторого количества уровней. N\" На рис. 11.5,в представлена характерная структура управления вводом* выводом во внешнее запоминающее устройство, поддерживающее файловую сйс--. тему. Здесь имеется три уровня, с которыми мы не сталкивались ранее. > "Ф* •л К^А Часть 5. Операции ввода-вывода и фай , * • Управление каталогами. На этом уровне происходит преобразование символьных имен файлов в идентификаторы, указывающие на файл — непосредственно или косвенно, с использованием файлового дескриптора или индексной таблицы. Этот уровень также связан с такими пользовательскими операциями с каталогами файлов, как их добавление, удаление или реорганизация. Пользовательские процессы Логический ввод-вывод С Устройство ввода-вывода Q Планирование управление ■Аппаратное ■ обеспечение Щ а) Локальное периферийное устройство Пользовательские процессы С Архитектура] связи Устройство вода-вывода 0 Планирование управление ■Аппаратное ■ обеспечение Щ б) Коммуникационный порт Рис. 11.5. Модель организации ввода-вывода Пользовательские процессы I Управление каталогами I Э Файловая система % I Физическая организация I ] Устройство ввода-вывода I Планирование и управление ■ Аппаратное ■ обеспечение Щ в) Файловая система Файловая система. Этот уровень работает с логической структурой файлов и операциями с ними, такими, как открытие, закрытие чтение и запись. Кроме того, управление правами доступа также происходит на этом уровне. Глава 11. Управление вводом-выводом и дисковое планирование 555
• физическая организация. Как адреса виртуальной памяти должны быть преоб- '':ц^ разованы в физические адреса основной памяти с учетом сегментации и стра- jf*? ничной организации, так и логические ссылки на файлы и записи должны быть конвертированы в физические адреса конкретного внешнего запоминающего ? устройства с учетом физической структуры дорожек и секторов внешнего запоминающего устройства. На этом же уровне происходит общее управление распределением пространства внешней памяти и буферов основной памяти. Учитывая значимость файловой системы, в этой и следующей главе мы остановимся на рассмотрении ее различных компонентов. В данной главе обсуждаются три нижних уровня; два верхних уровня рассматриваются в главе 12, "Управление файлами". 11.4. БУФЕРИЗАЦИЯ ОПЕРАЦИЙ 1 ВВОДА-ВЫВОДА ь¥ t * £. f .if- Предположим, что пользовательскому процессу необходимо выполнить счи- ^ 11 тывание блоков данных длиной по 512 байт по одному с магнитной ленты. Дан- .}f ные будут считаны в область внутри адресного пространства пользовательского .-, Г'1 процесса с виртуальным адресом от 1000 до 1511. Наиболее простой путь реше- ^ ния этой задачи — выполнение команды ввода-вывода (что-то наподобие Й Read_Block[ 1000, tape]) и ожидание того момента, когда данные станут дос- :&"'' тупными. Ожидание может быть либо активным, т.е. будет происходить непрерывное тестирование состояния устройства, либо, что более практично, процесс будет приостановлен до прерывания. При таком подходе имеются две проблемы. Первая представляет собой приостановку программы для ожидания выполнения относительно медленного ввода- вывода. Вторая проблема состоит в том, что такой подход к вводу-выводу мешает свопингу. Виртуальные адреса с 1000 по 1511 должны находиться в основной памя- ^ ти при считывании блока (в противном случае часть данных будет утеряна). При ис- •$ f пользовании страничной организации памяти по крайней мере одна страница ;$ ■ (содержащая целевой адрес) должна быть заблокирована в основной памяти. Поэто- -■ . -'. му, несмотря на то что часть задания может быть выгружена на диск, полный сво- [^ ;? пинг процесса окажется невозможным, даже если это необходимо для операционной .Д •; системы. Следует также учесть возможность взаимоблокировки. При генерации про- .|| цессом команды ввода-вывода он приостанавливается и выгружается на диск до на^ | чала выполнения операции ввода-вывода. Далее процесс ожидает, когда будет вы- У полнена запрошенная им операция ввода-вывода, которая, в свою очередь, ожидает, .: - ?*ч когда процесс будет возвращен в основную память, поскольку место в основной па- ;^ ^ мяти для считывания данных попросту отсутствует. Для того чтобы избежать взаи-^. . моблокировки, пользовательская память, вовлеченная в операцию ввода-вывода, ^ # должна быть заблокирована в основной памяти сразу же после выдачи запроса на -.-.■ ^ ввод-вывод, даже если операция ввода-вывода ставится в очередь и может быть вы- -, i. ^ полнена только через некоторое время. ^ То же рассуждение применимо и к операции вывода. Если блок пересы^ лается из адресного пространства пользовательского процесса в модуль вво-^ да-вывода, то на время этой передачи процесс блокируется и не может бытв^ выгружен на диск. '^ ш 556 Часть 5. Операции ввода-вывода и фа : Чтобы уменьшить накладные расходы и увеличить эффективность, иног,а удобно выполнить чтение данных заранее, до реального запроса (а запись да! ных — немного позже реального запроса). Эта методика известна как буфериз! ция. В данном разделе мы рассмотрим некоторые схемы буферизации, поддег живаемые операционными системами для повышения производительности. При рассмотрении различных методов буферизации важно учитывать, чт существуют устройства ввода-вывода двух типов: блочно-ориентированные поточно-ориентированного. Блочно-ориентированные устройства сохраняю информацию блоками, обычно фиксированного размера, и выполняют передг чу данных поблочно. Как правило, при этом можно ссылаться на данные с ш пользованием номера блока. Диски и магнитные ленты относятся к блочнс ориентированным устройствам ввода-вывода. Поточно-ориентированные yci ройства выполняют передачу данных в виде неструктурированных потоко байтов. К этой группе устройств относятся терминалы, принтеры, коммуниш ционные порты, манипулятор "мышь" и другие указывающие устройства, также большинство устройств, не являющихся внешними запоминающим устройствами. Одинарный буфер Простейшим типом поддержки со стороны операционной системы являете одинарный буфер (рис. 11.6,6). В тот момент, когда пользовательский процес выполняет запрос ввода-вывода, операционная система назначает ему буфер системной части основной памяти. Схема одинарного буфера для блочно-ориентированных устройств може быть описана следующим образом. Сначала осуществляется передача входны: данных в системный буфер. Когда она завершается, процесс перемещает блок пользовательское пространство и немедленно производит запрос следующее блока. Такая процедура называется опережающим считыванием, или упреж дающим вводом; она выполняется в предположении, что этот блок со временет будет затребован. Для многих типов задач этот метод в большинстве случаев не плохо работает, поскольку доступ к данным обычно осуществляется последова тельно (только при окончании последовательности обработки считывание блок будет излишним). i Такой подход, по сравнению с отсутствием буферизации, обеспечивает по вышение быстродействия. Пользовательский процесс может обрабатывать оди] блок данных в то время, когда происходит считывание следующего блока. One рационная система при этом может осуществить выгрузку процесса, поскольку выполняется операция считывания данных в системную память, а не в памят: пользовательского процесса. Однако такая технология усложняет функциониро вание операционной системы, которая должна следить за назначением систем ных буферов пользовательским процессам. Влияет буферизация и на схему под качки: когда операция ввода-вывода работает с тем же диском, который исполь зуется и для свопинга, теряется смысл в организации очереди операций записи Выгрузка процесса и освобождение основной памяти не начнется до тех пор, по ка не завершится запрошенная операция ввода-вывода — * тогда выгрузка про Цесса больше не будет иметь смысла. Глава 11. Управление вводом-выводом и дисковое планирование 55*3
Устройство - ввода-вывода Ввод Устройство - ввода-вывода Ввод Операционная система а) Без буферизации Операционная система Перемещение б) Одинарная буферизация Пользовательский процесс Пользовательский процесс /■ ч .i ,k ■••■?, . v. I & Устройство ■ ввода-вывода Устройство - ввода-вывода Ввод Ввод Операционная система Пользовательский процесс в) Двойная буферизация Операционная система Пользовательский процесс г) Циклическая буферизация Рис. 11JB. Схемы буферизации ввода вывода (ввод) '■:>■ i & # ;V,i .■' '.< ш W Похожие рассуждения применимы и к блочно-ориентированному выводу. Если данные передаются на устройство, то сначала они копируются из пользовательского пространства в системный буфер, из которого они в конечном счете будут записаны на устройство. В этой ситуации выводящий данные процесс может продолжать работу сразу же после передачи данных в системный W- В книге [KNUT97] приводится грубое, но очень показательное фьжевяе процессов при использовании одинарной буферизации и при ее отсутствии. ,.■ Предположим, что Г - это время, необходимое для ввода одного блока а с 5 для вычислений выполняющихся между запросами на ввод данных. Ьез оуфе ризации общее время выполнения, приходящееся на один блок, будет равно Г + С. При использовании одинарной буферизации время выполнения равной тах[С Т] + М, где М - время, необходимое для перемещения данных из сие- -, 558 Часть б. Операции ввода-вывода и ф иль темного буфера в пользовательскую память. В большинстве случаев это врем; значительно меньше времени работы без буферизации. Схема одинарного буфера может быть применена и при поточно ориентированном вводе-выводе — построчно или побайтово. Построчная буфери зация применима, например, в неинтеллектуальных терминалах, где пользова тель вводит данные построчно, завершая строки символом возврата каретки сигнализируя об окончании строки; вывод на терминал происходит таким ж« образом — построчно. Другим примером может служить строчный принтер. По байтовые операции применяются при использовании терминалов с формами, j также многих других периферийных устройств, когда каждое нажатие клавиш! является значимым. В случае построчного ввода-вывода буфер может быть использован для хра нения одной строки. Пользовательский процесс приостанавливается на врем* ввода, ожидая поступления целой строки. При операции вывода пользователь ский процесс может разместить строку в буфере и продолжить работу. Необхо димость приостановления этого процесса возникает только в том случае, есл* требуется вывод второй строки, в то время как первая еще не покинула буфер При побайтовом вводе-выводе, взаимодействие операционной системы и пользо вательского процесса следует модели производителя/потребителя, рассмотренное в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность". Двойной буфер Улучшить схему одинарной буферизации можно путем использования двуз системных буферов (рис. 11.6,в). Теперь процесс выполняет передачу данных j один буфер (или считывание из него), в то время как операционная система ос вобождает (или заполняет) другой. Эта технология известна как двойная буфе ризация или сменный буфер. Время выполнения при блочно-ориентированной передаче данных можно груб\ оценить как тах[С, Т\. Таким образом, если С < Т, то бл очно-ориентированное уст ройство может работать с максимальной скоростью. Если же С > Т, то двойная бу феризация избавляет процесс от необходимости ожидания завершения ввода-вывода В любом случае достигается преимущество перед одинАрной буферизацией. Эт< улучшение буферизации осуществляется за счет увеличения ее сложности. При поточно-ориентированном вводе мы снова обращаемся к двум альтер нативным режимам работы. Необходимость приостановления процесса при по строчном выводе возникает только в том случае, если при выводе очередно! строки оба буфера не пусты. При побайтовых операциях двойной буфер не имев' никакого преимущества перед одинарным буфером двойной длины. В обоих слу чаях используется модель производителя/потребителя. Циклический буфер Схема двойного буфера призвана выровнять поток данных между устройст вом ввода-вывода и процессом. Если нас интересует производительность некото рого процесса, то в первую очередь требуется, чтобы операции ввода-вывода н< тормозили его работу. Двойная буферизация может оказаться недостаточной, ее ли процесс часто выполняет ввод или вывод. Зачастую в таком случае решит] проблему помогает наращивание количества буферов. Глава 11. Управление вводом-выводом и дисковое планирование 55(
При использовании множества буферов, состоящего более чем из двух элементов, схема именуется циклической буферизацией (рис. 11.6,?). В ней каждый индивидуальный буфер представляет собой модуль циклического буфера. Такая буферизация описывается моделью производителя/потребителя с ограниченным буфером, которая рассматривалась в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность". Использование буферизации Буферизация представляет собой метод сглаживания всплесков количества запросов ввода-вывода. Однако никакое количество буферов не позволит устройству ввода-вывода работать наравне с процессом в течение неограниченного времени в ситуации, когда средняя скорость запросов процесса превышает возможности их обработки устройством ввода-вывода. Даже при наличии большого количества буферов в конечном счете все они будут заполнены, и процесс будет вынужден приостановиться в ожидании обработки порции данных устройством ввода-вывода. Однако в многозадачной среде при наличии разнообразных процессов с запросами ввода-вывода и такого же разнообразия устройств буферизация оказывается инструментом, способным увеличить как производительность операционной системы в целом, так и производительность отдельных процессов. Й.1.5. ДИСКОВОЕ ПЛАНИРОВАНИЕ *% На протяжении последних 30 лет увеличение скорости процессоров и основной памяти осуществляется с большим опережением по сравнению со скоростью доступа к диску. Приблизительно можно сказать, что рост скорости работы процессора и основной памяти на два порядка соответствует росту скорости работы диска на один порядок. В результате скорость обращения к дискам сейчас X по меньшей мере на четыре порядка меньше скорости обращения к основной ■ьЩ ш вопросом, и множество исследовательских работ направлено на поиск схем ее ;^|^f] улучшения. В этом разделе мы рассмотрим некоторые ключевые вопросы и нал более важные подходы в этой области. Поскольку производительность дисковой :| 4- системы тесно связана с вопросами файловой системы, рассмотрение продолжится в главе 12, "Управление файлами". памяти, и разрыв этот, похоже, в обозримом будущем будет только увеличивать- л^;, ся. Поэтому производительность дисковой системы является жизненно важным "-■'*" к*- ■у- ■*- .* *■■ Параметры производительности диска Конкретные детали дисковой операции ввода-вывода зависят от компьютер ной системы, операционной системы, природы канала ввода-вывода и аппарат- J^ ного обеспечения контроллера диска. Обобщенная временная диаграмма передачи данных дисковым устройством ввода-вывода представлена на рис. 11.7. При работе диска его скорость вращения постоянна. Для того чтобы выполнить чтение или запись, головка должна находиться над искомой дорожкой, а кроме того — над началом искомого сектора на этой дорожке. Процедура выбора | дорожки включает в себя перемещение головки (в системе с подвижными голов- ^ь ками) или электронный выбор нужной головки (в системе с неподвижными rP^-.L' ловками). В системе с подвижными головками на позиционирование головки над 560 »■ Часть 5. Операции ввода-вывода и файл . & с А»- •ri дорожкой затрачивается время, известное как время поиска. В любом случае после выбора дорожки контроллер диска ожидает момент, когда начало искомого сектора достигнет головки. Время, необходимое для достижения головки началом сектора, известно как время задержки из-за вращения, или время ожидания вращения. Сумма времен поиска (если таковой выполняется) и времени задержки из-за вращения составляет время доступа — время, которое требуется для позиционирования для чтения или записи. Как только головка попадает в искомую позицию, выполняется операция чтения или записи, осуществляемая во время движения сектора под головкой, — это и есть непосредственная передача данных при выполнении операции ввода-вывода. Ожидание Ожидание Поиск Задержка Передача устройства канала из-за вращения данных 11111 м 11111 г т -I—i 4 Устройство ► занято Рис. 11.7s Временная диаграмма работы диска Кроме этого, существует ряд других задержек, обычно присутствующих в дисковой операции ввода-вывода. Когда процесс выполняет запрос на ввод- вывод, последний должен быть размещен в очереди устройства. После этого выполняется назначение устройства процессу. Если устройство использует каналы ввода-вывода совместно с другими дисками, необходимо дополнительное ожидание доступности канала. И только после этого осуществляется непосредственный доступ к диску, рассмотренный ранее. В некоторых мейнфреймах используется методика, известная как вращательное позиционное считывание (rotational positional sensing — RPS), работающая следующим образом. При выполнении команды поиска происходит освобождение канала для обработки других операций ввода-вывода. После выполнения поиска устройстве определяет момент, когда данные окажутся под головкой. Как только этот сектор подходит к головке, устройство пытается восстановить связь с узлом. Если либо контроллер, либо канал заняты другой операцией ввода-вывода, то попытка восстановления связи оказывается неуспешной и диск совершает полный оборот перед повторной попыткой. Это дополнительный элемент, который следует добавить к полному времени ожидания (рис. 11.7). Время поиска Время поиска представляет собой время, необходимое для перемещения головки к нужной дорожке; к сожалению, очень трудно установить этот параметр количественно. Время поиска состоит из двух ключевых компонентов: времен» начального запуска и времени, необходимого на пересечение дорожек в процессе поиска. К сожалению, время пересечения дорожек не является линейной функ цией от их количества, но при этом включает время начальной установки * принятия решения для каждой пересекаемой дорожки (время, прошедшее поел* установления головки над искомой дорожкой до идентификации последней). Значительно улучшает характеристики диска уменьшение и облегчение егс компонентов. Не так давно типичный диск имел в диаметре 14 дюймов (36 см) Глава 11. Управление вводомгвыводом и дисковое планирование 561
.IT 'Й- з то время как сегодня самый распространенный размер составляет 3.5 дюйма '8.9 см), что существенно уменьшает расстояния перемещения головок. Типичное среднее время поиска в современных дисках составляет от 5 до 10 ms. Задержка из-за вращения Жесткие магнитные диски, в отличие от гибких, имеют скорость вращения в диапазоне от 5400 до 10000 об/мин (последнее значение соответствует одному обороту за 6 ms). Поэтому при скорости вращения 10000 об/мин средняя задержка из-за вращения составляет 3 ms. Гибкие диски обычно имеют скорость вращения в пределах 300-600 об/мин, что соответствует средней задержке от 100 до 200 ms. Время передачи данных Время передачи данных на диск или считывания с него зависит от скорости вращения диска следующим образом: г-А. WV t где Т — время передачи данных; Ь — количество передаваемых байтов; N — количество байтов в дорожке; г — скорость вращения (об/с). Таким образом, итоговое среднее время доступа можно выразить как где Г, — среднее время поиска. Оценка времени Рассмотрим теперь две операции ввода-вывода, показывающие, как опасно полагаться на средние значения. Пусть у нас имеется обычный диск, у которого среднее время поиска составляет 10 ms, скорость вращения — 10000 об/мин, и диск разбит на сектора по 512 байт, с 320 секторами на одной дорожке. Предположим, что нам необходимо выполнить чтение файла, состоящего из 2560 секторов, общим размером 1.3 Мбайт. Мы хотим оценить общее время передачи данных. Сначала предположим, что файл сохранен настолько компактно, насколько это возможно, — т.е. файл занимает все секторы на 8 соседних дорожках (8 дорожек х 320 секторов на дорожке = 2560 секторов). Такое размещение называется последовательным. В этом случае время, необходимое для чтения первой дорожки, определяется следующим образом: Среднее время поиска Задержка на вращение Чтение 320 секторов 10 ms 3 ms 6 ms V* .-г.. h 19 ms 562 Часть 5. Операции ввода-вывода и файлы Предположим, что остальные дорожки могут быть считаны последовательно, без затраты времени на поиск. Другими словами, операция ввода-вывода не отстает от потока данных с диска. Значит, для каждой последующей дорожки остается только задержка из-за вращения; соответственно, каждая дорожка счи- тывается за 3 + 6 = 9 ms. Итак, для чтения всего файла нам потребуется Общее время = 19 + 7 х 9 = 82 ms = 0.082 s Теперь рассчитаем время, необходимое для чтения тех же данных, но при случайном, а не последовательном доступе — т.е. секторы с содержимым файла распределены на диске случайным образом. Тогда для каждого сектора: Среднее время поиска 10 ms Задержка на вращение 3 ms Чтение 1 сектора 0.01875 ms 13.01875 ms Общее время = 2560 х 13.01875 = 33 328 ms = 33.328 s Очевидно, что порядок чтения секторов с диска оказывает огромное влияние на производительность дискового ввода-вывода. Если.при доступе к файлу с диска считывается (или записывается на него) несколько секторов, имеется возможность определенного контроля над использованием секторов с данными, но об этом мы поговорим в следующей главе. Однако в многозадачной среде всегда будут в наличии конкурирующие между собой запросы на операции ввода- вывода с одним и тем же диском, так что избежать случайного доступа не удастся. Таким образом, следует изучить способы повышения производительности дискового ввода-вывода при случайном доступе. Стратегии дискового планирования В только что рассмотренном примере причина разницы в производительности может быть объяснена продолжительностью поиска. Если выполнение обращений к секторам включает выбор дорожек случайным образом, производительность дискового ввода-вывода окажется чрезвычайно низкой. Для ее повышения нам необходимо уменьшить время, затрачиваемое на поиск дорожки. Рассмотрим типичную ситуацию в многозадачной среде, когда операционная система поддерживает очередь запросов для каждого устройства ввода- вывода. Соответственно, в очереди одного диска будет находиться некоторое количество запросов на ввод-вывод (чтение или запись) от различных процессов, Если выбирать запросы из очереди случайным образом, то следует ожидать, чтс искомые дорожки будут располагаться в произвольном порядке, это приведет * очень низкой производительности. Такое случайное распределение может слу жить точкой отсчета для оценки других методик. .Простейшей формой планирования является планирование "первым во шел — первым вышел" (FIFO), что просто означает обработку запросов из очере Ди в порядке их поступления. Преимущество такой стратегии — в ее беспри страстности. На рис. 11.8,а показано перемещение головки при использование стратегии FIFO (в этом примере мы полагаем, что на диске имеется 200 доро экек, а в очереди находятся запросы к дорожкам поступившие случайным обра зом: 55, 58, 39, 18, 90, 160, 150, 38, 184). В табл. 11.2,а приведены количест венные результаты. Глава 11. Управление вводом-выводом и дисковое планирование 565
&ы a) FIFO Время i$ ч ■ ■:■• 1 3- ■w 'л* A - * '■,. ■ ?i >i r)C-SCAN Puc. 11.8. Сравнение различных алгоритмов дискового планирования При использовании стратегии FIFO надеяться на высокую производительность можно только при небольшом количестве процессов и запросах в основном к близ-', ким группам секторов. Однако при работе большого количества процессов произвол дительность будет почти такой же, как и при случайном планировании. Поэтому следует обратиться к более интеллектуальным стратегиям планирования (табл. 11.3)*'; rjiti. Часть б. Операции ввода-вывода и файлы к X в ее 05 о е. X в Л ч в о и о в о * X п т о S н X о. о ч са 0J а В в ее е. се Я" X ч <о ев Е-* и* 8 \о И Р" К О QJ О РЗ "-1 >",->. 03 о О, Е- О " ее и к о 9 ч А CQ О Е- О. ев Е- и со о К И 0J Ч о. о СО ft S О td 3 И О о »—( СО К S. О ч « да а о Е- О. СО £- U ft Б! И ^^ о о I—I со О м Е- V О V X ч о ьй о a о ее с? со cq О Е- ft СО Е- СО w о а Е- «и •<ч ч о a в В ш в* си О 0) ft ft О) о с ее о о k-О .-ч см СО со о г-« СМ .-( 00 СО СМ Ю i-l СО СО СО к Сб и ч о а> л, Ч о О 5 О О тг Л (О СО 00 00 О) 1-й .—( —1 1—I СО СО ю ю 00 ю о ел о С ft Б в о ш •а * 3 К С в 5 ч 8 е. § о ч ев и и К о с X S Щ ш ш в* ф и ft о> С о ft ,-, О т)" ■* -н СМ О СМ СО СО СО О 1-н 1—I СМ 00 см о ю 1-^ о СО •ч те 00 1—< о ел со ю ю ю СЛ 00 00 СО СО 1-н о т Е" 0) В" s ч о И се 3 х 3 н в о В" са о ш \ ft ft с ч см со со со -н см О СО ем 1-ч ю о -ч* i> i-t СМ СМ 2 - £ ft Ч 0 о ч о оо ю ел со ел in о со со 00 £ £ ее В * X О О ТР * ч К ю со оо ft e о I-1 —* r-t О П В Л в а о> в* о и & а В еб I * S * ч о £ ft Ч о О ЕС о ft о ч о ел i-l см со ^н см t- см со п. О О i-t -Ч* Ю 1> ,—| ^н ^н щ •в Ю 00 СЛ СО О ю to со »-н ел о ft в к в § о о ^ 2 СО »Л 00 00 ft i-н »-i CO iH О в ч ej ч 5 о о ч в .1 Is
';>'. аблица 11.3. Алгоритмы дискового планирования [WIED87] Название Описание Примечания Выбор в соответствии с источником запроса RSS FIFO PRI LIFO 3STF 3CAN 2-SCAN N-step-SCAN FSCAN Случайное планирование "Первым вошел — первым вышел Приоритет процесса Для анализа и моделирования Наиболее беспристрастный метод Очередь запросов к диску управляется извне Максимизация локализации и использования ресурса Выбор в соответствии с содержимым запроса "Последним вошел — первым вышел" Выбор самого короткого времени обслуживания Перемещение вперед и назад по диску Однонаправленное перемещение с быстрым возвратом SCAN с N записями в одном пакете N-step-SCAN, где N — размер очереди в начале цикла SCAN Высокая степень использования, малые очереди Лучшее распределение обслуживания Низкая изменчивость обслуживания Гарантия обслуживания Чувствительный к загрузке « Л*? Гриоритеты V I * гг В системе с использованием приоритета (PRI) управление планированием явля- гся внешним по отношению к программному обеспечению управления диском. Та- ой подход не имеет отношения к оптимизации использования диска, но зато удов- Етворяет некоторым другим целям операционной системы. Коротким пакетным за- аниям, а также интерактивным заданиям часто присваивается более высокий "|г риоритет, чем длинным заданиям, требующим более длительных вычислений. Эта ,;;;^ кема позволяет быстро завершить большое количество коротких заданий в системе '. ;j»| обеспечивает малое время отклика. Однако при использовании этого метода у элыпих заданий оказывается слишком длительным ожидание выполнения диско- ых операций. Кроме того, такая стратегия может привести к противодействию со гороны пользователей, которые будут разделять свои задания на малые подзадания. [е подходит эта стратегия и для работы с базами данных. •*> !& 1оследним вошел — первым вышел Как это ни удивительно, но стратегия выполнения первым самого последне- о запроса имеет свои преимущества. В системах обработки транзакций при пре- оставлении устройства для последнего пользователя должно выполняться лишь еболылое перемещение указателя последовательного файла. Использование реимуществ локализации позволяет повысить пропускную способность и менылить длину очереди. К сожалению, если нагрузка на диск велика, сущест- ует очевидная возможность голодания процесса. .я Три рассмотренные стратегии планирования — FIFO, PRI и LIFO — основа- ;> ы исключительно на атрибутах очереди или запрашивающего процесса. Однако ^Д • С ': I № Часть 5. Операции ввода-вывода и файл если планировщику известна текущая дорожка, то появляется возможность использования стратегии планирования, основанной на содержимом запроса. SSTF Стратегия выбора наименьшего времени обслуживания (Shortest Service Time First — SSTF) заключается в выборе того дискового запроса на ввод-вывод, который требует наименьшего перемещения головок из текущей позиции. Следовательно, мы минимизируем время поиска. Естественно, постоянный выбор минимального времени поиска не дает гарантии, что среднее время поиска при всех перемещениях будет минимальным, но тем не менее эта стратегия обеспечивает лучшую по сравнению с FIFO производительность дисковой системы. Поскольку головки могут перемещаться в двух направлениях, то при равных расстояниях для принятия решения может быть использован случайный выбор направления. На рис. 11.8,6 и в табл. 11.2,6 показана производительность стратегии SSTF для той же последовательности запросов, что и при рассмотрении стратегии FIFO. SCAN Все стратегии, описанные к настоящему времени (за исключением FIFO), могут оставить некоторый запрос невыполненным до тех пор, пока не освободится вся очередь — т.е. при работе всегда могут иметься новые запросы, которые будут выбраны до уже имеющегося в очереди. Избежать такого рода голодания можно при использовании стратегии SCAN. При использовании этого алгоритма перемещение головки происходит только в одном направлении, удовлетворяя те запросы, которые соответствуют выбранному направлению. После достижения последней дорожки в выбранном направлении (или когда исчерпаются возможные запросы), направление изменится на противоположное. Стратегия SCAN представлена на рис. 11.8,в и в табл. 11.2,е. Как видите, стратегия SCAN ведет себя почти так же, как и стратегия SSTF. Фактически, если предположить, что изначально головка перемещается в сторону меньших номеров дорожек, то схема планирования окажется идентичной для SSTF и SCAN. Однако это статический пример, в котором в очередь не добавляется ни один запрос. Однако даже при динамическом изменении очереди стратегии SCAN и SSTF выглядят, как правило, очень похоже. Нетрудно увидеть, что стратегия SCAN оказывает предпочтение тем заданиям, чьи запросы относятся к дорожкам, находящимся ближе всего к центру либо наиболее удаленным от него, а также отдает предпочтение запросам, поступившим последними. Первой проблемы можно избежать путем применения стратегии C-SCAN; вторая же проблема решается с помощью стратегии N-step-SCAN. C-SCAN Стратегия C-SCAN (циклическое сканирование) ограничивает сканирование только одним направлением. Когда обнаруживается последняя дорожка в задач- ном направлении, головка возвращается в противоположный конец диска, и сканирование начинается снова. Это уменьшает максимальную задержку, вызванную новыми запросами. Если при использовании стратегии SCAN ожидае- Глава 11. Управление вводом-выводом и дисковое планирование 567
ж >е время сканирования от внутренней к внешней дорожке равно t, то ожидавши интервал обслуживания секторов, находящихся на периферии, будет равен При использовании стратегии C-SCAN этот интервал будет порядка *+smlut, е Smax — максимальное время поиска. Поведение стратегии C-SCAN показано на рис. 11.8,2 и в табл. 11.2,г. -step-SCAN и FSCAN При использовании стратегий SSTF, SCAN и C-SCAN может оказаться возмсок- * (й ситуация, когда один или несколько процессов с высокой частотой обращений к $ ;ной дорожке монополизируют устройство за счет многочисленных повторений за- Jr*. кэсов к одной и той же дорожке. Наиболее характерна эта особенность для много- "Ш >верхностных дисков с большой плотностью записи. Для предотвращения такого Й % алипания головки" очередь дисковых запросов может быть сегментирована, при- ^''^ ;м за один прием полностью выполняется весь сегмент заданий. Примерами такого _»- .;. щхода являются стратегии N-step-SCAN и FSCAN. ^•< ; Стратегия N-step-SCAN позволяет произвести сегментацию очереди диско- >■' -: jx запросов на подочереди длиной N. Каждая подочередь обрабатывается за ,h *. (ин прием с использованием стратегии SCAN. В ходе обработки очереди к не- Щ v >торой другой очереди могут добавляться новые запросы. Если в конце текуще- %* ■' i сканирования доступными оказываются менее N запросов, то все они обраба- лваются в следующем цикле сканирования. При больших значениях N выцол- шие алгоритма N-step-SCAN похоже на выполнение SCAN; предельный случай =1 соответствует стратегии FIFO. * FSCAN — стратегия, использующая две подочереди. С началом сканировали все запросы находятся в одной из очередей; другая при этом остается пус- >й. Во время сканирования первой очереди все новые запросы попадают во вго- : по очередь. Таким образом, обслуживание новых очередей откладывается, Пока j будут обработаны все старые запросы. Ь# .• •- - «_■*»» <•■*>•* : - '*■ ■ % >J'v-4 ft?"*,-S» .l&^h -i-'-А'ч '. ML6. RAID ^-ф**4- ^^ | ** -j irr" ,лс^ ч. Как упоминалось ранее, рост производительности вторичных запомиваЮ- ;их устройств значительно отстает от роста производительности процессоров и шовной памяти. Такое несоответствие вынуждает обращать особое внимание ял исковую систему при повышении уровня общей производительности. Как и в других областях, дополнительное повышение эффективности может ^ лть достигнуто путем параллельного использования нескольких устройств. В ^_ гучае с дисками это означает использование массивов независимо и параллель- .;. э работающих дисков. При наличии множества дисков различные запросы в^о- ^г i-вывода могут обрабатываться параллельно, если блок данных, к которому Л роизводится обращение, распределен по множеству дисков. V* В случае применения множества дисков имеется большое количество вари- итов организации данных и добавления избыточности для повышения наденсйо ги (а это может создать трудности при разработке схем.баз данных, способе*!* ■ аботать на разных платформах под управлением разных операционных систем*) счастью, имеется промышленный стандарт RAID (Redundant Array of Indf*J? sndent Disks — избыточный массив независимых дисков). RAID-схема состой ■■5<" 68 Часть 5. Операции ввода-вывода и фай *.»^ 'W из 7 уровней1 — от нулевого до шестого. Эти уровни не имеют иерархической структуры, но определяют различные архитектуры со следующими общими характеристиками. 1. RAID — это набор физических дисков, рассматриваемых операционной системой как единый логический диск 2. Данные распределены по физическим дискам массива. 3. Избыточная емкость дисков используется для хранения контрольной информации, гарантирующей восстановление данных в случае отказа одного из дисков. Вторая и третья характеристики различны для разных уровней RAID. RAID нулевого уровня не поддерживает третью характеристику вовсе. Термин RAID первоначально был употреблен в научном докладе группы разработчиков Университета Калифорния в Беркли [РАТТ88]2. В докладе в общих чертах были рассмотрены различные конфигурации и применение RAID, a также определения уровней RAID. Эта стратегия заменяет диски с большой плотностью записи множеством дисков с малой плотностью и распределяет данные таким образом, что обеспечивает возможность одновременного доступа к данным из разных дисков. Это существенно повышает эффективность ввода- вывода и дает возможность постепенного наращивания емкости массива Уникальность предложенной технологии заключается в эффективном использовании избыточности. Благодаря наличию большого количества дисков повышается производительность, но увеличивается вероятность сбоев. В связи с этим RAID предусматривает хранение дополнительной информации, позволяющей восстанавливать данные, утерянные вследствие сбойной ситуации. В табл. 11.4 представлены все 7 уровней RAID. Отметим, что уровни 2 и 4 не подходят для промышленного применения, но, тем не менее, описание этих уровней помогает определиться с выбором схем проектирования некоторых других уровней. Некоторыми исследователями и производителями определены дополнительные уровни, однако семь описанных в этом разделе уровней наиболее распространены и универсальны. В этом докладе аббревиатура RAID расшифровывается как "избыточный массив недорогих дисков". Термин "недорогой" был использован для различения малых и относительно недорогих дисков, составляющих массив, и их альтернативы — одиночного большого и дорогого диска (single large expensive disk — SLED). Поскольку теперь в разных дисках используются одни и те же технологии, естественно, что термин недорогие" был заменен термином "независимые", который подчеркивает повышение производительности и надежности при использовании RAID. Глава 11. Управление вводом-выводом и дисковое планирование 569
1блица 11.4. Уровни RAID 1Тегория Уровень Описание 1сщепление О гражение^ лраллельный оступ 1езависимьш кктуп 5 Скорость обработки запросов Скорость передачи данных Типичное применение Без избыточности Большие полосы: отлично Отражение Избыточность с кодами Хэмминга Четность с чередующимися битами Хорошо/удовлетворительно Плохо Плохо Четность с чередующимися блоками Распределенная четность с чередующимися блоками Двойная распределенная четность с чередующимися блоками Отлично/ удовлетворительно Отлично/ удовлетворительно Отлично/ плохо Малые полосы: отлично тельно/удовлетворительно Отлично Отлично Приложения с некритическими данными, требующие высокой призводи- тельности Системные диски, важные файлы Приложения с большими запросами ввода-вывода; такие, как графические ■ редакторы или САПР Удовлетворительно/плохо Удовлетворительно/плохо Удовлетворительно/плохо :■;■*• v ■? Г' V&.l .■.м-- е- '•-i- ::-т "i - ' я -. Г7" ■\1 Высокая скорость запросов, интенсивное чтение, поиск данных Приложения» требующие исключительно высокой на- дежности На рис. 11.9 показано использование семи схем RAID для поддержки того, же объема данных, который требует четырех дисков без применения избыточн -. сти Рисунок показывает размещение пользовательских и избыточных Д«™«' также указывает относительные требования уровней к дисковому пространству. . Л1-' ■г - 3 Иногда в литературе можно встретить перевод mirroring как "зеркалирование у Прим. перев. ;-/' 670 Часть 5. Операции ввода-вывода и ф _ Ы RAID О Уровень О не является настоящим RAID-уровнем, поскольку он не использует избыточность для повышения эффективности. Тем не менее существует ряд применений, таких, как некоторые суперкомпьютеры, где доминируют вопросы производительности и емкости, а снижение стоимости более важно, чем надежность. В схеме RAID О пользовательские и системные данные распределяются по всем дискам массива. Это дает заметное преимущество перед использованием одного большого диска: если два различных запроса ввода-вывода обращаются к двум различным блокам данных, то имеется немалая вероятность того, что эти блоки размещены на различных дисках, и два запроса могут быть обработаны, уменьшая тем самым время ожидания в очереди ввода-вывода. Заметим, однако, что RAID О идет дальше простого распределения данных по массиву дисков: данные расщеплены (stripped) по всем имеющимся дискам (см. рис. 11.10). Все пользовательские и системные данные рассматриваются как хранящиеся на одном логическом диске. Диск делится на полосы, которые могут быть физическими блоками, секторами или другими единицами хранения. Полосы циклически размещаются на последовательных дисках массива. В n-дисковом массиве первые п логических полос физически располагаются как первые полосы каждого из п дисков; вторые п полос располагаются как вторые полосы каждого из дисков и т.д. Преимущество такой компоновки состоит в том, что если один запрос ввода-вывода обращается к множеству логически последовательных полос, то параллельно может быть обработано до п полос, и намного уменьшается тем самым время обработки запроса. На рис. 11.10 показано, что для отображения логического и физического дисковых пространств используется соответствующее программное обеспечение, которое может быть реализовано как в дисковой подсистеме, так и в компьютере. RAID О и передача большого объема данных Эффективность любого из уровней RAID непосредственно зависит от запросов компьютера и способа размещения данных. Наиболее очевидна адресация этих запросов в RAID 0, где анализу не препятствует избыточность. Прежде всего рассмотрим использование RAID 0 для получения высокой скорости передачи данных. Приложения с высокими требованиями к скорости передачи данных должны удовлетворять двум условиям. Первое состоит в том, что на протяжении всего маршрута между главной памятью компьютера и отдельными дисководами должна быть большая пропускная способность передачи данных. Сюда включаются внутренние шины контроллера, шины ввода-вывода компьютера, адаптеры ввода-вывода, шины основной памяти. Второе условие заключается в создании приложением таких запросов ввода- вывода, которые бы эффективно управляли дисковым массивом. Это условие выполняется, если типичный запрос адресован большому по сравнению с размером полосы объему логически непрерывных данных. В этом случае один запрос ввода-вывода включает параллельную передачу данных из нескольких дисков, увеличивая производительность передачи данных по сравнению с передачей при одном диске. Глава 11. Управление вводом-выводом и дисковое планирование 571
¥■; полоса О полоса 4 полоса 8 полоса 12 полоса 1 полоса 5 полоса 9 полоса 13 полоса 2 полоса 6 полоса 10 полоса 14 полоса 3 полоса 7 полоса 11 полоса 15 a) RAID 0 (без избыточности) полоса 0 полоса 4 полоса 8 полоса 12 полоса 1 полоса 5 полоса 9 полоса 13 полоса 2 полоса 6 полоса 10 полоса 14 полоса 3 полоса 7 полоса 11 полоса 15 полоса 0 полоса 4 полоса 8 полоса 12 полоса 1 полоса 5 полоса 9 полоса 13 полоса 2 полоса 6 полоса 10 полоса 14 полоса3 полоса7 полоса11 полоса 15 * б) RAID 1 (отражение) ^■$&: в) RAID 2 (избыточность с кодами Хэмминга) Рис. 11.9. Уровни RAID »,(Ь) Ш #' «. -.',"„1 ■ % -' % ■г, .$• ■Л ■-У .е ■ V • .Л 672 Часть 5. Операции ввода-вывода и ф . м г) RAID 3 (четность с чередующимися битами) блокЗ д) RAID 4 (четность с чередующимися блоками) е) RAID 5 (распределенная четность с чередующимися блоками) ж) RAID 6 (двойная избыточность) Рис. 11.9. Уровни RAID (продолжение) RAID О и высокая частота запросов ввода-вывода В среде, ориентированной на транзакции, пользователя обычно больше интересует время отклика, чем скорость передачи данных. При индивидуальном запросе ввода-вывода для небольшого объема данных преобладающее время операции затрачивается на перемещение дисковых головок (время поиска) и на вращение диска. В транзакционной среде могут происходить сотни запросов ввода-вывода в секунду. Дисковый массив может обеспечить высокую скорость выполнения операций ввода-вывода путем выравнивания загрузки нескольких дисков. Эффективное выравнивание загрузки достигается только при наличии большого множества ожидающих обработки запросов ввода-вывода. Под этим, по сути, подра- *..«.. Глава 11. Управление вводом-выводом и дисковое планирование 573
„„„яется существование нескольких независимых приложений (или одного, Повинного на выполнение транзакций, способного выполнять множество РХонны" за™Р«ов ввода-вывода). На эффективность будет оказывать влияли размер полосы. Если размер полосы сравнительно большой, такой, что „„запрос вВОда.вывода требует доступа только к одному диску, то множество Годящихся в режиме ожидания запросов может быть обработано параллельно, тем Гмым уменьшается время ожидания в очереди каждого запроса. Логический диск полоса О полоса 1 полоса 2 полоса 3 полоса 4 полоса 5 полоса 6 полоса 7 полоса 8 полоса 9 полоса 10 полоса 11 полоса 12 полоса 13 полоса 14 полоса 15 физический диск 0 полоса 0 полоса 4 полоса 8 полоса 12 Программное обеспечение управления массивом Физический ДИСК1 полоса 1 полоса 5 полоса 9 полоса 13 Физический диск 2 полоса 2 полоса 6 полоса 10 полоса 14 Рис. 11.10. Размещение данных в массиве PAID О [MASS97J Физический дискЗ полоса 3 полоса 7 полоса 11 полоса 15 ■ft л: I ■V ■*i.. •'Л*, J*. RAID 1 RAID 1 отличается от RAID 2-RAID 6 способом достижения ™6"™™*™s ^ Во верстальных RAID-схемах используется какой-либо ™»£™£%^ i то время как в RAID 1 избыточность достигается простым ^л^В^"п. >1 данных. Как показано на рис. 11.9,6, в этой схеме используется ™™**™**& - ление данных, что и в RAID О, но каждая логическая полоса **™^а*™*\ двух разных физических дисках, так что для каждого диска массива зеркальный диск, содержащий точно такие же данные. .' RAID 1 обладает следующими положительными характеристиками. , •. 1. Запрос на чтение может быть обслужен любым из ^\^C^TZ^ необходимые данные; для обслуживания выбирается тот диск, у которо ^ минимальное время поиска. «-«гь'.''1 2. Для запроса на запись необходимо обновление обеих полос, что «*«££• выполнено в параллельном режиме. Поэтому скорость «^^ЕЕЗ более медленной из них (т.е. той, для которой время поиска оказывается 574 Часть 5. Операции ввода-вывода и файл i большим). Однако никаких дополнительных расходов на запись при применении RAID 1 не требуется. На уровнях со второго по шестой операция записи требует вычисления контрольных битов. 3. Простота восстановления данных в случае сбоя — при сбое одного диска данные могут быть доступны из второго. Принципиальной отрицательной характеристикой RAID 1 является стоимость, связанная с необходимостью двойного дискового пространства для логического диска. По этой причине использование RAID 1 ограничено дисками с системным программным обеспечением и данными, а также другими очень важными файлами. В этих случаях RAID 1 обеспечивает создание резервных копий всех файлов в режиме реального времени, так что в случае аварийной ситуации на диске все критические данные могут быть немедленно извлечены. В среде, ориентированной на транзакции, RAID 1 может достичь высокой частоты запросов ввода-вывода, если основная масса запросов — на чтение диска. В этой ситуации производительность RAID 1 может приблизиться к двойной производительности RAID 0. Тем не менее если большая часть запросов — на запись, существенного повышения производительности по сравнению с RAID О достичь не удастся. RAID 1 может также обеспечить повышенную производительность для приложений с интенсивным считыванием с диска. RAID 2 Уровни 2 и 3 используют технологию параллельного доступа. В таком массиве все диски, являющиеся элементами массива, участвуют в выполнении каждого запроса ввода-вывода. Обычно шпиндели индивидуальных дисководов синхронизируются таким образом, что все головки дисков располагаются в одной и той же позиции в любой момент времени. Как и в других схемах, здесь также используется разделение данных на полосы. В схемах RAID 2 и RAID 3 полосы оказываются очень малыми; нередко они соответствуют одному байту или слову. В схеме RAID 2 код с коррекцией ошибок рассчитывается по соответствующим битам каждого диска и хранится в соответствующих местах дискового массива. Обычно в этом случае используется код Хэмминга (Hamming), который способен исправлять одинарные и выявлять двойные ошибки. Несмотря на то что для RAID 2 необходимо меньшее количество дисков, чем для RAID 1, эта схема все еще весьма дорога. Количество резервных дисков пропорционально количеству дисков данных. При одиночном считывании осуществляется одновременный доступ ко всем дискам. Данные запроса и код коррекции ошибок передаются контроллеру массива. При наличии однобитовой ошибки контроллер способен быстро ее откорректировать, так что доступ для чтения в этой схеме не замедляется. При одиночной записи происходит одновременное обращение ко всем дискам массива. Схема RAID 2 могла бы использоваться в среде с многочисленными ошибками дисков. Однако в силу высокой надежности дисков RAID 2 не была реализована. RAID 3 Схема RAID 3 организована аналогично схеме RAID 2. Отличие состоит в том, что для RAID 3 требуется только один резервный диск, независимо от раз- Глава 11. Управление вводом-выводом и дисковое планирование 575
мера дискового массива. В RAID 3 применяется параллельный доступ с распределенными по небольшим полосам данными. Вместо кода с исправлением ошибок для всех битов в одной и той же позиции на всех дисках, размещается рассчитанный простой бит четности. Избыточность При сбое дисковода происходит обращение к дисководу четности, и данные восстанавливаются на основе информации из оставшихся устройств. Как только сбойный диск будет заменен, отсутствующие данные могут быть заново сохранены на новом4 диске, после чего продолжается штатная работа системы. Восстановить данные довольно просто. Рассмотрим массив из пяти дисков, в которых ХО-ХЗ — данные на дисках 0-3, а Х4 — данные диска четности. Четность для £-го бита вычисляется следующим образом4: X4(i) = X3(i)eX2(i)©Xl(i)©X0(i) Предположим, что произошел сбой диска XI. Если мы добавим Х4(/')©Х1(/') к обеим частям предыдущего уравнения, то получим Xl(i) = X4(i)®X3(i)eX2(i)©X0(i) J Таким образом, содержимое каждой полосы данных XI может быть восста- | новлено по содержимому соответствующих полос остальных дисков массива. ? ' Этот принцип работает во всех RAID-уровнях с третьего по шестой. ^ В случае сбоя диска все данные остаются доступными в так называемом co-f^ кращенном режиме. В этом режиме для операций чтения отсутствующие данные? восстанавливаются "на лету", с применением описанного способа. При сокращенной записи данных должна поддерживаться согласованность по четности дл позднейшего восстановления информации. Возврат к штатному функционирова нию требует замены сбойного диска и полного восстановления его содержимого. <?■ Производительность ■'Л' ■г- Поскольку данные разбиваются на очень малые полосы, RAID 3 может?^ обеспечить высокую скорость передачи данных. Любой запрос ввода-вывода*;. включает параллельную передачу данных из всех дисков массива. "" Особенно заметна повышенная производительность при передаче боль-' ;..t шого объема данных. Однако за один раз может быть выполнен только один v запрос ввода-вывода, поэтому в ориентированной на транзакции среде произ- . водительность падает. i RAID 4 - RAID-уровни с 4-го по 6-й используют технологию независимого доступа. В V массиве с независимым доступом каждый диск функционирует независимо от дру- { гих, так что отдельные запросы ввода-вывода могут выполняться параллельно. Соот- ■* ветственно, массивы с независимым доступом могут использоваться в тех приложе- , 4 Здесь Ф обозначает операцию "исключающее или". — Прим. перев. 576 Часть 5. Операции ввода-вывода и файлы ниях, которым необходима высокая частота запросов ввода-вывода, и менее пригодны для приложений, требующих большой скорости передачи данных. Как и в других RAID-схемах, здесь применяется расщепление данных на полосы. В схемах RAID 4-6 полосы сравнительно большие. В RAID 4 по соответствующим полосам на каждом диске данных вычисляется полоса четности хранящаяся на дополнительном избыточном диске. В схеме RAID 4 имеются дополнительные расходы при выполнении операции записи небольшого блока данных. При каждой записи программное обеспечение управления массивом должно обновить не только пользовательские данные, но и соответствующие биты четности. Рассмотрим массив, состоящий из пяти дисков, в котором устройства ХО-ХЗ содержат данные, а Х4 представляет собой диск четности. Предположим, что выполняется запись, которая включает только полосу на диске XI. Изначально для каждого i-ro бита выполняется следующее соотношение: X4(*-)=X3(i)ex2(;)exi(i)$xo(t) После обновления (измененные биты отмечены штрихом) получаем: x4'(() = x3(i)®x2(i)exr(r)exo(/) = x3mex2(nexi'mexo(i)exi(/)exi(i) = Х4(/)ФХ1(г)ФХ1'(/) Итак, для вычисления новой четности программное обеспечение управления массивом должно прочитать старую пользовательскую полосу и старую полосу четности. После этого программное обеспечение может обновить эти две полосы новыми данными и вновь рассчитанной четностью. Таким образом, запись каждой полосы включает два чтения и две записи. При большом размере записи ввода-вывода, которая включает полосы на всех дисковых накопителях, четность легко вычисляется путем расчета с использованием только новых битов данных. Таким образом, информация на диске четности может быть обновлена параллельно с обновлением пользовательских данных, без лишних операций чтения и записи. Тем не менее в любом случае каждая операция записи должна обновлять информацию на диске четности, что может стать узким местом системы. RAID 5 RAID 5 организован подобно RAID 4, но с тем отличием, что RAID 5 распределяет полосы четности по всем дискам. Распространенное размещение полос четности — в соответствии с циклической схемой, как показано на рис. 11.9,е. Распределение полос четности по всем накопителям позволяет избежать снижения производительности, связанного с операциями ввода-вывода с одним Диском четности (с чем мы столкнулись при рассмотрении RAID 4). RAID 6 Схема RAID 6 была представлена в работе [KATZ89] разработчиками из Беркли. В этой схеме выполняются два различных расчета четности, результаты которых хранятся в разных блоках на разных дисках. Поэтому массивы Глава 11. Управление вводом-выводом и дисковое планирование 577
RAID 6 с объемом пользовательских данных, требующих N дисков, состоят из N+2 дисков. На рис. 11.9,ж показана схема RAID 6. На этом рисунке Р и Q представляют результаты применения двух различных алгоритмов проверки данных. Один из них — применение операции "исключающего или", используемой в RAID 4 и RAID 5, другой представляет собой более сложную схему вычислений. Это дает возможность восстановления данных даже в случае сбоя двух дисков массива. Преимущество RAID 6 состоит в том, что эта схема обеспечивает чрезвычайно высокую надежность хранения данных. Потери данных возможны лишь при одновременном выходе из строя трех дисков массива. С другой стороны, у RAID 6 высокие накладные расходы при операциях записи, поскольку каждая запись затрагивает два блока четности. J8#* ■■■•* И.7. дисковый кэш ; , В разделе 1.6 и приложении А к главе 1, "Обзор компьютерных систем", мы рассмотрели принципы работы кэш-памяти. Термин кэш-память обычно применяется к памяти, которая меньше и быстрее основной памяти и которая располагается между основной памятью и процессором. Кэш-память уменьшает среднее время доступа к памяти благодаря принципу локализации. Этот же принцип может быть применен и к дисковой памяти. Кэш диска представляет собой буфер в основной памяти для содержимого некоторых секторов диска. Если запрос ввода-вывода обращается к отдельному сектору, то сначала производится проверка на наличие этого сектора в кэше. Если сектор имеется в кэше, то запрос удовлетворяется из кэша. В противном случае запрошенный сектор считывается в кэш с диска. Если блок данных потребовался для выполнения одиночного запроса ввода-вывода, то, исходя из принципа локализации, весьма вероятно, что он вновь потребуется в ближайшем будущем. Вопросы разработки Некоторые вопросы разработки представляют особый интерес. Первый из них связан с тем, что если запрос ввода-вывода удовлетворяется кэшем, то данные из кэша должны быть переданы запросившему процессу. Это может быть выполнено как путем пересылки блока данных в основной памяти из кэша в область пользовательского процесса, так и посредством совместного использования памяти кэша (в этом случае запросившему процессу можно передать указатель на соответствующий слот кэша). Последний подход экономит время, использовавшееся для пересылки данных из памяти в память, и разрешает совместный доступ к кэшу другим процессам (в соответствии с рассмотренной в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность", моделью читателей/писателей). Второй вопрос связан со стратегией замещения. Когда в кэш поступает новый сектор, он должен заменить один из содержащихся в кэше секторов. Эта проблема аналогична рассмотренной в главе 8, "Виртуальная память", проблеме замещения страниц. При изучении этого вопроса был опробован ряд алгоритмов, и в результате наиболее подходящим (и, соответственно, распространенным) оказался алгоритм замены блока, к которому дольше всего не было обращений КГ7Л г Часть 5. Операции ввода-вывода и файлы (least recently used — LRU). Логически кэш состоит из стека блоков, причем н вершине стека располагается блок, к которому было последнее обращение. Пр: обращении к блоку в кэше он перемещается из текущей позиции на вершин стека. Если блок поступает с диска, то самый нижний блок стека удаляется, вновь поступивший блок размещается на вершине стека. Естественно, необходр мости в реальном перемещении блоков по основной памяти нет — с кэшем мс жет быть связан стек указателей на блоки. Другой возможностью является алгоритм замены тех блоков, обращение которым происходит наименее часто (least frequently used — LFU). Этот алгс ритм может быть реализован посредством назначения счетчика каждому блок кэша. При поступлении блока его счетчику присваивается значение 1; с кажды: новым обращением значение счетчика увеличивается на 1. При необходимост замены выбирается блок с наименьшим значением счетчика. Может показаться что LFU является более подходящей по сравнению с LRU стратегией, поскольк LFU использует более существенную информацию о блоках. Однако у простог LFU-алгоритма имеется следующая проблема. Может возникнуть ситуация, кс гда обращение к некоторым блокам выполняется относительно редко, но за! при обращении интервалы между повторными обращениями оказываются кс роткими вследствие локализации. Тем самым значение счетчика резко увелич! вается и не отражает реальной вероятности использования данного блока в бл! жайшее время. Так эффект локализации может стать причиной того, что алп ритм LFU произведет неверный выбор замещаемого блока. Для преодоления этого недостатка алгоритма LFU предлагается технологго известная как замещение, основанное на частоте обращений [ROBI90]. Для ясю сти рассмотрим упрощенную версию, представленную на рис. 11.11,а. Блоки л< гически организованы в виде стека, как в алгоритме LRU. Ряд блоков в верхнё части стека отделяется как новый раздел. При успешном обращении к кэшу с< ответствующий блок перемещается на вершину стека. Если блок к этому врем< ни уже находился в новом разделе, то его счетчик обращений не увеличиваете! в противном случае его значение увеличивается на 1. Из-за того что размер н< вого раздела достаточно большой, счетчики блоков, к которым происходит мн< гократное обращение за короткий период времени, останутся неизменными. Ei ли же выполняется обращение к блоку, отсутствующему в кэше, для замещении выбирается блок с наименьшим значением счетчика, расположенный вне h'oboi раздела; в случае наличия нескольких таких блоков выбирается тот, к которол! дольше всего не было обращений. Авторы сообщают, что такая стратегия приводит лишь к незначительной улучшению стратегии LRU. Проблема заключается в следующем. 1. При отсутствии блока в кэше блок загружается в новый раздел со значен] ем счетчика, равным 1. 2. Значение счетчика остается равным 1 все время пребывания блока в ново разделе. 3. В конечном счете блоки покидают новый раздел, значение счетчика nj этом остается равным 1. 4. Если к такому блоку не происходит обращения за достаточно коротка промежуток времени, то вполне вероятно, что он будет заменен, посколы значение его счетчика — наименьшее среди всех блоков вне нового раздел* Глава 11. Управление вводом-выводом и дисковое планирование
Новый раздел MRU Старый раздел • т т ill ,i Повторное обращение; счетчик не изменяется • т л Повторное обращение; счетчик увеличивается на 1 Отсутствие блока (загружается новый блок; счетчик равен 1) LRU a) FIFO Новый раздел Средний раздел Старый раздел MRU • • ■ '" л* й- • • • -Й , • • • LRU б) Использование трех разделов Рис. 11.11. Замещение, основанное на частоте обращений Внесение еще одного улучшения в алгоритм позволяет решить эту проблему. Разобьем стек на три раздела — новый, средний и старый (рис. 11.11,6). Как и прежде, счетчик обращений у блоков нового раздела не увеличивается. Для замещения, как и ранее, выбираются только блоки из старого раздела. Если средний раздел имеет достаточно большой размер, то это позволяет блокам с относительно частыми обращениями успеть увеличить значение счетчика до того, как они могут оказаться замещены. При имитационном моделировании авторы обнаружили, что такая усовершенствованная стратегия работает значительно лучше, чем простой алгоритм LRU или LFU. Независимо от конкретной стратегии замещение может выполняться по требованию или предварительно. В первом случае сектор замещается только тогда, когда требуется свободный слот; при втором подходе одновременно освобождается несколько слотов. Обоснование такого подхода заключается в необходимости записи секторов из кэша на диск. Если сектор, загруженный в кэш, использовался только для чтения, то нет необходимости в его записи на диск; однако если содержимое сектора было изменено, то перед замещением сектор необходимо записать на диск. В этом случае имеет смысл кластеризация для достижения минимального времени поиска. Анализ проектирования В данном случае применимы все рассуждения из приложения А к главе 1, "Обзор компьютерных систем". Проблема производительности кэша сводится к вопросу о том, можно ли достичь заданной результативности поиска. Ответ на этот вопрос зависит от локализации дисковых обращений, алгоритма замещения и других факторов проектирования. В первую очередь результативность поиска, 580 'И'ГЦ/:;. Часть 5,гОцерадиц ввод ^вывода и файлы конечно, зависит от размера дискового кэша. На рис. 11.12 приведены итоги ряда исследований с использованием LRU (одно для операционной системы UNIX работающей на платформе VAX [OUST85], а два других — для операционных систем мэйнфреймов IBM [SMIT85]). На рис. 11.13 показаны результаты имитационного моделирования алгоритма замещения на основе частоты обращений. Сравнение этих двух графиков указывает на одну из опасностей такой оценки эффективности. Из графиков следует, что LRU выигрывает у алгоритма замещения на основе частоты обращений. Однако при сравнении идентичных последовательностей обращений с использованием одной и той же структуры кэша выясняется, что алгоритм замещения с учетом частоты обращений оказывается лучшим. Следовательно, влияние на достигаемую производительность, кроме прочего, оказывает конкретная последовательность обращений. 60 50 3? I 40 т СО X 3 X X га | 30 m ^- о fc о *— о -О I— о о X *— ее о а. ш со 20 - 10 - VAX UNIX IBM MVS IBM SVS 4*< _L 10 15 20 Размер кэша (Мбайт) 25 30 Рис. 11.12. Производительность дискового кэша при использовании LRU Глава 11. Управление вводом^выводом и дисковое планирование I
70 Г 60 - 50 <п 1С СО ж X X то d ее аз &. о *— о л> i- о о о о. ш CD 40 30 £ 20 10 IBMVM IBM MVS VAX UNIX 10 15 20 Размер кэша (Мбайт) 25 30 II п. .' v _ I У .$ Рис. 11.13. Производительность дискового кэша при использовании алгоритма замещения с учетом частоты обращений [ROBI90] 11.8. ВВОД-ВЫВОД В UNIX SVR4 '.-£ *ftb iS. Л. is В UNIX каждое устройство ввода-вывода рассматривается как специальный >айл. Эти файлы управляются файловой системой, и чтение и запись осуществляют- н так же, как и чтение и запись обычных пользовательских файлов данных. Тем амым обеспечивается ясный и однородный интерфейс для пользователей и процес- эв. Для осуществления чтения из устройства или записи в него соответствующие апросы направляются к специальному файлу, связанному с устройством. На рис. 11.14 показана логическая схема средств обслуживания ввода- ывода. Файловая подсистема управляет файлами на устройствах вторичной па- яти, а кроме того, она служит интерфейсом процесса к устройствам, поскольку ни рассматриваются как файлы. В UNIX существуют два вида ввода-вывода: с буферизацией и без нее. Бу- «ризированный ввод-вывод выполняется через системные буфера, в то время ак небуферизированный ввод-вывод обычно включает средства DMA, которые беспечивают передачу данных между устройством ввода-вывода и областью вво- а-вывода процесса. При буферизированном вводе-выводе используются два вида уферов: системные буфера и очереди символов. ' Й . i V] ■' ' 1 * i 82 - '.V: Часть 5. Операции ввода-вывода и фаЙлЦ^' 1 t^; "Г Файловая подсистема .1 '', .. Символ 1' Буфер кэша 1' Блок Драйверы устройств Рис. 11.14. Структура ввода-вывода в UNIX Буфер кэша Буфер кэша в UNIX является, по сути, кэшем диска. Дисковые операции ввода- вывода работают через этот буфер. Передача данных между буфером и пространством пользовательского процесса всегда происходит с использованием DMA Поскольку и буфер, и область ввода-вывода процесса размещены в основной памяти, DMA используется для осуществления копирования "память-память". В этом случае процессор не используется, но расходуются циклы шины. Для управления буфером кэша поддерживаются три списка. • Список свободных слотов. Список всех слотов кэша (в UNIX слот рассматривается как буфер; каждый слот хранит один сектор диска), доступных для распределения. • Список устройств. Список всех буферов, связанных в данный момент с каждым диском. • Очередь драйвера ввода-вывода. Список буферов, участвующих в операциях ввода-вывода конкретного устройства (или находящихся в состоянии ожидания операций). Каждый буфер должен находиться либо в списке свободных слотов, либо в списке очереди драйвера ввода-вывода. Буфер, однажды назначенный устройству, остается назначенным ему, даже если он попадает в свободный список, — до тех пор, пока он не будет реально востребован и назначен другому устройству. Реально эти списки представляют собой списки указателей на буфера. При обращении к номеру физического блока определенного устройства операционная система прежде всего выполняет проверку наличия этого блока в буфере кэша. Для минимизации времени поиска список устройства организован в виде хэш- таблицы с использованием методики, аналогичной методу переполнения с цепочками, рассматривавшемуся в приложении к главе 8 (рис. 8.24,6). Общая организация буфера кэша показана на рис. 11.15. Хэш-таблица фиксированной длины содержит указатели на буфер кэша. Каждая ссылка на {устройство^, блок#) отображается в определенную запись хэш-таблицы. Указатель в этой записи указывает на первый Глава 11. Управление вводом-выводом и дисковое планирование 583
я «. -о в цепочке. Указатель, связанный с каждым буфером, указывает ва следую- S 6v^P в "«очке. Следовательно, для всех обращений вида (устройство* «Т^оответствующих одной записи хэш-таблицы, искомый блок окажется в це- °ЧКе'это'Х^Голя хэш-таблицы, если, конечно, данный блок имеется в кэше^ I^XZ при использовании хэш-таблицы длиной N длительность поиска в »ше снижается в N раз. &1 з>. стройство#, Блок# Хэш-таблица списка устройства * " - Указатель — >■ — > ' свободного списка Буфер кэша * • • • .- '"% 1 Указатели свободного спис 1 Хэш-указатели 1' S -.4» J V * I; 9 А? *г В Рис. 11.15. Организация буфера кэша в UNIX Для замещения блоков используется алгоритм LRU. После того*«К£ .J вому блоку выделяется буфер, он не может быть использован Р»^го™"м ■: до тех пор, пока все остальные буфера не окажутся занятыми, причем поздне ,; рассматриваемого. Список свободных слотов сохраняет этот порядок. ,; Очередь символов Кэш способен эффективно обслуживать такие блочно-ориеитированные уст-,, ройства, как диск и магнитная лента. Для ™ьн°^^Х^а«^. f Ройств, таких, как терминалы и принтеры, требуется "»a?*^**^S« *1 Информация либо записывается в очередь символов У**°<%™™^£^ считывается процессом, либо записывается процессом и считываете» устроис чял ■•г. Часть 5. Операции ввода-вывода и фай ^ вом. В обоих случаях используется модель производителя/потребителя, изучавшаяся нами в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность". Следовательно, символы из очереди могут быть считаны только один раз: прочитанный из очереди символ уничтожается. В этом и состоит отличие от буфера кэша, где процедура чтения может выполняться неоднократно и, следовательно, применима модель читателей/писателей (которая также рассматривалась в главе 5). Небуферизированный ввод-вывод Небуферизированный ввод-вывод, представляющий собой простой DMA- обмен между устройством и областью памяти процесса, всегда оказывается самым быстрым методом выполнения ввода-вывода. Процесс, выполняющий небуферизированный ввод-вывод, блокируется в основной памяти и не может быть выгруженным. Тем самым снижается возможность выполнения выгрузки процесса на диск и, как следствие, уменьшается общая производительность системы. Кроме того, устройство ввода-вывода оказывается связанным с процессом на все время выполнения данных, при этом оно недоступно для других процессов. Устройства UNIX UNIX распознает 5 типов устройств. • Дисководы. • Лентопротяжные устройства. • Терминалы. • Линии связи. • Принтеры. В табл. 11.5 показаны типы ввода-вывода, соответствующие каждому виду устройств. Широко используемые UNIX дисководы являются блочно- ориентированными устройствами и обладают высокой пропускной способностью. Соответственно, ввод-вывод для этих устройств обычно либо небуферизированный, либо осуществляется через буфер кэша. Лентопротяжные устройства функционально подобны дисководам и используют похожие схемы ввода-вывода. Таблица 11.5. Устройства ввода-вывода UNIX Небуферизированный ввод-вывод Буфер кэша Очередь символов Дисковод х х Лентопротяжное х х устройство Терминалы х Линии связи х Принтеры х х Поскольку обмен информацией у терминалов относительно медленный, они обычно используют очередь символов. Линии связи также требуют последовательной передачи байтов данных и лучше всего обрабатываются с использовани- Глава 11. Управление вводом-выводом и дисковое планирование 585
*~щ очередей символов. И, наконец, тип ввода-вывода для принтера, вообще гово- я будет зависеть от его скорости. Медленнодействующие принтеры обычно ис- юльзуют очередь символов, в то время как быстродействующий принтер может использоваться небуферизированным вводом-выводом. Для скоростных принтеров в принципе возможно использование кэша. Однако в силу того что данные, юступающие на принтер, никогда не используются повторно, в использовании сэша нет никакого смысла. 11.9. ВВОД-ВЫВОД В WINDOWS 2000^ На рис. 11.16 показан диспетчер ввода-вывода операционной системы Win- lows 2000 (W2K). Диспетчер отвечает за весь ввод и вывод операционной системы и обеспечивает однородный интерфейс, который может быть вызван драйве- эом любого типа. Диспетчер ввода-вывода Диспетчер кэша Драйверы файловой системы Драйверы сети Драйверы аппаратных устройств Рис. 11.16. Диспетчер ввода-вывода Windows 2000 Основные модули ввода-вывода Диспетчер ввода-вывода состоит из 4 модулей. • Диспетчер кэша. Управляет кэшированием всей подсистемы ввода-вывода. Диспетчер кэша обеспечивает кэширование в основной памяти для всех файловых систем и сетевых компонентов. Он способен динамически увеличивать и уменьшать размер кэша, связанного с определенной деятельностью, в соответствии с изменением объема доступной физической памяти. Для повышения общей производительности диспетчер кэша включает следующее. • Отложенная запись. Системные записи обновляются только в кэше, но не на диске. Позже, когда загрузка процессора станет меньшей, диспетчер кэша произведет запись внесенных изменений на диск. Если за это время будут выполнены дополнительные обновления, то на диск будет записана последняя версия. • Отложенное подтверждение. Похожая на отложенную запись функция для обработки транзакций. Вместо немедленной пометки транзакции как У-> ■>« I r I ;* ■ t 1* - yl ■:->* 586 Часть 5. Операции ввода-вывода и файл успешно завершенной, система кэширует информацию и выполняет е< фоновую запись позже. • Драйверы файловой системы. Диспетчер ввода-вывода рассматривает драй вер как обычный драйвер устройства и направляет сообщения для томов со ответствующему программному драйверу адаптера этого устройства. • Драйверы сети. W2K включает интегрированные сетевые возможности i поддержку распределенных приложений. • Драйверы аппаратных устройств. Эти драйверы обращаются к регистрам, периферийных устройств через точки входа в динамически компонуемы? библиотеках исполнительной системы W2K. Множество этих программ раз работано для каждой поддерживаемой W2K платформы. Поскольку имеш программ одинаковы для всех платформ, то исходные тексты драйвере! устройств W2K переносимы на различные типы процессоров. Асинхронный и синхронный ввод-вывод W2K предоставляет два режима выполнения ввода-вывода — асинхронны* и синхронный. Асинхронный ввод-вывод используется там, где можно оптими зировать производительность приложения. При асинхронном вводе-выводе при ложение инициирует операцию ввода-вывода, а затем может продолжить свок работу (во время выполнения этого запроса). При синхронном вводе-выводе при ложение блокируется до завершения выполнения операции ввода-вывода. С точки зрения вызывающего потока асинхронный ввод-вывод более эффек тивен, поскольку позволяет продолжать выполнение, в то время как операции ввода-вывода ставится диспетчером ввода-вывода в очередь и впоследствии вы полняется. Однако приложение, использующее асинхронный ввод-вывод, требуе-: механизма определения завершенности этой операции. W2K предоставляет че тыре различных способа извещения о завершении ввода-вывода. • Сигнал объекту устройства ядра. При завершении операции ввода-вывод* устанавливается индикатор, связанный с объектом устройства. Поток, вы звавший операцию ввода-вывода, может продолжить свое выполнение д< тех пор, пока не достигнет точки, в которой он должен дождаться завер шения выполнения операции ввода-вывода. В этой точке поток может на ходиться в состоянии ожидания до завершения операции ввода-вывода после чего продолжить свою работу. Эта технология проста и легка в ис пользовании, но не подходит для обработки множественных запросов вво да-вывода. Например, если потоку необходимо выполнить множество од новременных операций над одним файлом (таких, как чтение одной и за пись другой части в файл), то при описанной методике поток будет не i состоянии отличить завершение операции чтения от завершения операцш записи. Он будет просто знать о том, что завершена некоторая операцш ввода-вывода для этого файла. • Сигнал объекту события ядра. Эта методика допускает одновременные за просы ввода-вывода к единственному устройству или файлу. Для каждой запроса поток создает событие; позже поток может ожидать завершения од ного из этих запросов (или завершения серии запросов). Глава 11. Управление вводом-выводом и дисковое планирование 58^3
• Оповещение о вводе-выводе. При этом методе используется очередь, связанная с потоком и известная как очередь вызовов асинхронных процедур (asynchronous procedure call — АРС). Поток создает запросы ввода-вывода, а диспетчер ввода-вывода размещает результаты этих запросов в очереди АРС вызывающего потока. • Порты завершения ввода-вывода. Эта технология используется в W2K Server для оптимизации использования потоков. По сути, для использования доступен пул потоков, так что нет необходимости в создании нового потока для обработки нового запроса. Программное обеспечение RAID W2K поддерживает две разновидности конфигураций RAID, определенные в MS96] следующим образом. • Аппаратный RAID. Раздельные физические диски скомбинированы контроллером в один или несколько логических дисков. • Программный RAID. Дисковое пространство, состоящее из несмежных участков, скомбинировано в один или несколько логических разделов посредством отказоустойчивого программного драйвера диска (fault-tolerance disk driver — FTDISK). В аппаратном RAID созданием и восстановлением резервной информации руководит интерфейс контроллера. Программный RAID, доступный в W2K server, реализует функциональность RAID как часть операционной системы и может использоваться с любым множеством дисков. Программный RAID реали- > зует уровни RAID 1 и RAID 5. При RAID 1 (зеркальное дублирование дисков) j цва диска, содержащие первичный и зеркальный разделы, могут располагаться как на одном, так и на разных контроллерах дисков (последний случай известен как дуплексирование диска). ,■■ 11.10. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ 5 - и контрол .ны вопрос л По отношению к внешнему окружению интерфейс компьютерной системы ,-, представляет собой архитектуру ввода-вывода. Эта архитектура разработана для обеспечения систематических средств контролируемого взаимодействия с окружающим миром и снабжает операционную систему информацией, необходимой ей для эффективного управления вводом-выводом. Ввод-вывод, вообще говоря, разделяется на уровни, причем нижние уровни '■■ имеют дело с деталями физического функционирования устройств, а верхние — работают с вводом-выводом на логическом уровне. В результате изменения па- '■. раметров аппаратных средств не влияют на большинство программ, использую- ?■ щих ввод-вывод. Ключевым аспектом ввода-вывода является использование буферов, управ- ^ ляемых утилитами ввода-вывода, а не прикладными процессами. Буферизация сглаживает различия между внутренними скоростями компьютерной системы и скоростями устройств ввода-вывода. Использование буферов, кроме того, отделя- 588 Часть 5. Операции ввода-вывода и файлы ет реальную передачу данных от адресного пространства прикладного процесса что придает операционной системе большую гибкость при управлении памятью. ' Наибольшее влияние на общую производительность системы оказывает дисковый ввод-вывод. Соответственно, в этой области сосредоточены гораздо большие исследовательские усилия, чем в какой-либо другой, связанной с вводом-выводом. Два основных подхода, направленных на повышение производительности дискового ввода-вывода, — это дисковое планирование и кэширование. В любой момент времени может существовать очередь запросов ввода- вывода к одному и тому же диску. Целью дискового планирования является удовлетворение всех запросов таким образом, чтобы минимизировать время механического поиска дорожек на диске и тем самым повысить производительность диска. Здесь учитываются физическое размещение целей отложенных запросов и принцип локализации. , Дисковый кэш представляет собой буфер, обычно содержащийся в основной памяти и функционирующий как кэш блоков диска между дисковой памятью и остальной частью основной памяти. В соответствии с принципом локализации использование дискового кэша существенно уменьшает количество блоков, передаваемых от диска в основную память. Ключевые термины CD-R CD-ROM CD-RW DVD RAID Блок Блочно-ориентированное устройство Буфер ввода-вывода Ввод-вывод Ввод-вывод, управляемый прерываниями Время доступа к диску Время поиска Гибкий диск Головка чтения/записи Диск с неподвижными головками Диск с подвижными головками Дисковый кэш Дорожка Жесткий диск Задержка из-за вращения Канал ввода-вывода Логический ввод-вывод Магнитный диск Магнитооптический диск Несменяемый диск Полоса Поточно -ориентированное устройство Программируемый ввод-вывод Процессор ввода-вывода Прямой доступ к памяти Сектор Сменный диск Устройство ввода-вывода Циклический буфер Цилиндр Контрольные вопросы 11.1. Перечислите и кратко охарактеризуйте три способа выполнения ввода- вывода. 11.2. В чем состоит различие между логическим вводом-выводом и устройством ввода-вывода? 11.3. В чем состоит различие между блочно-ориентированными устройствами и поточно-ориентированными устройствами? Приведите несколько примеров каждого из них. 11.4. Почему при использовании двойного буфера ожидается большая производительность, чем при одинарном буфере ввода-вывода? Глава 11. Управление вводом-выводом и дисковое планирование 589
11.5. Какие элементы задержки сопутствуют процедурам дискового считывания или записи? 11.6. Вкратце опишите стратегии дискового планирования, приведенные на рис. 11.8. 11.7. Вкратце опишите семь уровней RAID. 11.8. Какой типичный размер сектора диска? 11.11. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА f. *-.jijr r *- -. Общие описания компьютерного ввода-вывода можно найти в большинстве книг, посвященных компьютерной архитектуре, например [STALOO] и [РАТТ98]. В [МЕЕ96а] представлен неплохой обзор физических основ технологии записи на диски и магнитные ленты, а в [МЕЕ9бЬ] — технологий хранения данных в этих системах. В [WIED87] рассматриваются вопросы, связанные с производительностью дисков, включая дисковое планирование. Работа [NG98] посвящена вопросам производительности аппаратных устройств дисков. В [СА096] анализируется кэширование и планирование дисков. В [ROSC00] подробно изучены все типы систем внешней памяти и рассмотрены многочисленные технические характеристики каждой из них. Заслуживающим внимания обзором, в котором всесторонне описан интерфейс ввода-вывода и менее подробно — технические детали, является [SCHW96]. В [РАЮО] представлена интересная информация об интегрированной схеме буферизации ввода-вывода и кэширования. В [DELLO0] приведен детальный анализ драйверов устройств Windows NT, a также рассмотрена вся архитектура ввода-вывода W2K. [CHEN94] представляет собой превосходное руководство по технологии RAID от ее создателей. Более детально технология RAID обсуждается в издании экспертной комиссии RAID, ассоциации поставщиков и потребителей продуктов на основе RAID [MASS97]. В [CHEN96] проанализирована производительность RAID. Интерес представляет статья на эту тему — [FRIE96]. В [DALT96] детально описано программное обеспечение для устройств RAID в Windows NT. СА096 Cao P., Felten E., Li К. Implementation and Performance of Integrated Application-Controlled File Caching, Prefetching, and Disk Scheduling. — ACM.: Transactions on Computer Systems, November 1996. CHEN94 Chen P., Lee E., Gibson G.r Katz R„ Patterson D. RAID: High-Performance,. Reliable Secondary Storage. — ACM Computing Surveys, June 1994. CHEN96 Chen S., Towsley D. A Performance Evaluation of RAID Architectures. — IEEE Transactions on Computers, October 1996. DALT96 Dalton W. et al. Windows NT Server 4: Security. Troubleshooting, and Optimization. — Indianapolis, IN: New Riders Publishing, 1996. DELLOO Dekker E., Newcomer J. Developing Windows NT Device Drivers: A Programmer's Handbook. — Reading, MA: Addison Wesley, 2000. FRIE96 Friedman M. RAID Keeps Going and Going and... — IEEE Spectrum, April 1996. MASS97 Massiglia P. (editor). The RAID Book: A Storage System Technology Hand-} book. — St. Peter, MN: The Raid Advisory Board, 1997. 590 Часть 5. Операции ввода-вывода и файлы МЕЕЭба Мее С, Daniel E., eds. Magnetic Recording Technology. — New York,; McGraw Hill, 1996. MEE96b Mee C, Daniel E., eds. Magnetic Storage Handbook. — New York- McGraw Hill, 1996, NG98 Ng S. Advances in Disk Technology: Performance Issues. — Computer Mav 1989. ' .*_ У PAI00 Pai V., Druschei P., Zwaenepoel W. IO-Lite: A Unified I/O Buffering and Caching System. — ACM Transactions on Computer Systems, February 2000. PATT98 Patterson D., Hennessy J. Computer Organization and Design: The Hardware/Software Interface. — San Mateo, CA: Morgan Kaufmann, 1998. - - - jr ROSCOO Rosch W. The Winn L. Rosch Hardware Bible. — Indianapolis, IN: Sams 2000. SCHW96 Schwaderer W., Wilson A. Understanding I/O Subsystems. — Milpitas, CA: Adaptec Press, 1996. | STALOO Stallings W. Computer Organization and Architecture. 5th ed. — Upper Saddle River, NJ: Prentice Hall, 2000. \ - ' \ WIED87 Wiederhold G. File Organization for Database Design. — New York- McGraw Hill, 1987. \ \ 11.12. ЗАДАЧИ £&> SSS^Ss'k 11.1. Проанализируйте программу, обращающуюся к устройству ввода-вывода, i сравните небуферизированный ввод-вывод с использованием буфера. Пока жите, что использование буфера позволяет уменьшить время выполнения » более чем в два раза. 11.2. Обобщите результат задачи 11.1 на случай обращения программы к я уст ройствам. 11.3. Выполните такой же анализ, что и в табл. 11.2, для указанной последова тельности запросов к дорожкам диска: 27, 129, 110, 186, 147, 41, 10, 64 120. Предположим, что головка диска изначально расположена над дорож кой 100 и перемещение головки происходит в направлении уменьшения не меров дорожек. Произведите тот же анализ, предполагая, что головка диск перемещается по направлению увеличения номеров дорожек. 11.4. Предположим, что N дорожек диска пронумерованы от 0 до N-1 и что за прашиваемые сектора распределены по диску случайно и равномерно. Необ ходимо вычислить среднее количество дорожек, которые головка пересекае при поиске. а. Сначала рассчитайте вероятность поиска длиной /", если головка находите, над дорожкой t. Указание. Определите общее количество комбинаций учетом предположения, что все целевые дорожки равновероятны. б. Рассчитайте вероятность поиска длиной К. Указание. Сюда входит сумми рование всех возможных комбинаций перемещений через К дорожек. в. Рассчитайте среднее количество дорожек, пересеченных при поиске, ис пользуя для ожидаемого значения формулу /V-I £[.*] = 5>рг[л = ;] 1=0 г. Покажите, что для больших значений N среднее количество пересекаемы при поиске дорожек приблизительно равно N/3. Глава 11. Управление вводом-выводом и дисковое планирование 59:
11.5. Приведенное ниже уравнение предложено как для кэш-памяти, так и для дискового кэша: Ts =Tc + MxTD Обобщите это уравнение для иерархической памяти с N уровнями вместо двух. 11.6. Для алгоритма замещения, основанного на частоте обращений (рис. 11.11), определите FHOB, FcpcRt FCTap как доли кэша, входящие в новый, средний и старый разделы соответственно. Очевидно, что FKOb + Fcpeja + F^^ = 1. Опишите стратегию, если 3- -Гетер * " "ков б. FCTap = 1/(размер кэша) Ц.7. Чему равна скорость передачи данных при использовании 9-дорожечного лентопротяжного устройства со скоростью 300 см/с, если плотность записи составляет 600 бит/см. 11.8. Предположим, что у нас имеется катушка с 720 м ленты, интервал между записями на которой составляет 1.5 см (лента останавливается посередине этого интервала между операциями считывания). Ускорение ленты при прохождении интервала между записями постоянно; предположим, что и остальные характеристики ленты такие же, как и в задаче 11.7. Данные на ленте организованы в виде физических записей, причем каждая физическая запись содержит фиксированное количество логических записей. а. Сколько времени будет затрачено на считывание всей ленты, содержащей 120-байтовые логические записи (по 10 логических записей в одной физической)? б. То же, но по 30 логических записей в одной физической. в. Сколько логических записей может содержаться на ленте при каждом из рассмотренных количеств логических записей в одной физической? г. Какая средняя скорость передачи данных при каждом из рассмотренных количеств логических записей в одной физической? д. Чему равна емкость магнитной ленты? 11.9. Рассчитайте количество дискового пространства (в секторах, дорожках и поверхностях), необходимого для хранения логических записей, считанных в задаче 11.8,6, если диск разбит на секторы размером 512 байт, с 96 секторами на дорожке, 110 дорожками на поверхности и 8 используемыми поверхностями. Служебные записи о файле во внимание не принимайте; считайте также, что запись не может быть разбита и размещена на двух секторах. 11.10. Рассмотрим дисковую систему, описанную в задаче 11.9, и предположим, что диск вращается со скоростью 360 об/мин. Процессор производит чтение одного сектора диска с использованием ввода-вывода, управляемого прерыванием, причем на каждый байт приходится одно прерывание. Если для обработки каждого прерывания требуется 2.5 \х$, то какую часть времени процессор затратит на ввод-вывод (временем поиска пренебрегаем). 11.11. Повторите задание 11.10 при использовании DMA, при условии, что одно прерывание приходится на один сектор. 11-12. Должно быть очевидно, что разбивка диска на полосы может привести к повышению скорости передачи данных, если размер полосы мал по сравнению с размером запросов ввода-вывода. Должно быть ясно также, что RAID 0 обеспечивает повышенную производительность по сравнению с одним большим диском, поскольку запросы могут обрабатываться параллельно. Однако )92 Часть б. Операции ввода-вывода и файлы есть ли необходимость в разбивке диска на полосы в последнем случае? Действительно ли разбивка диска повышает производительность по сравнению с таким же дисковым массивом, но без разбивки? ПРИЛОЖЕНИЕ. ДИСКОВШ^СТЙОЙСТМ Магнитный диск Диск представляет собой круглую пластину, выполненную из металла или пластика с магнитным покрытием. Данные записываются, а впоследствии счи- тываются с диска посредством проводящей катушки индуктивности, входящей в конструкцию головки (head). При операции считывания или записи головка находится в стационарном положении, в то время как диск вращается под ней. Механизм записи основан на том, что электрический ток, проходящий через катушку, создает магнитное поле. Электрические импульсы, посылаемые головке, превращаются в намагниченные участки поверхности. Механизм считывания использует то, что магнитное поле, движущееся относительно катушки, генерирует в ней электрический ток. Кс(гда поверхность диска движется под головкой, происходит генерация тока той же полярности, что и при выполнении записи. Организация данных и форматирование Головка представляет собой относительно небольшое устройство, предназначенное для считывания или записи участка диска, вращающегося под ней. Данные на диске организуются в виде набора концентрических колец, называемых дорожками (tracks). Каждая дорожка имеет ту же ширину, что и головка. На поверхности могут быть размещены тысячи дорожек. На рис. 11.17 представлена схема размещения данных. Соседние дорожки разделены промежутками (gaps). Это предотвращает (или, по крайней мере, минимизирует) возникновение ошибок, вызванных некорректным положением головки или простой интерференцией магнитных полей Для упрощения электронной схемы обычно на каждой дорожке сохраняется одинаковое количество битов. Следовательно, плотность записи, в битах на единицу длины, возрастает при переходе от внешней дорожки ко внутренней (такое явление происходит и при записи звука на пластинку). Данные пересылаются на диск и из него блоками (blocks). Обычно размер блока меньше, чем емкость дорожки. Соответственно, данные сохраняются в областях, имеющих размер, равный размеру блока; они называются секторами (sectors). Обычно на одной дорожке располагается несколько сотен секторов, и они могут быть либо фиксированной, либо переменной длины. Для большинства дисков используется фиксированный размер сектора — 512 байт. Во избежание ошибок соседние секторы также разделены интервалами. Глава 11. Управление вводом^выводом и дисковое планирование Я9Я
Секторы Д°Р°ЖКИ Рис. 11.17. Размещение данных на диске Для определения позиций секторов на дорожке требуются специальные "■'■ средства. Ясно, что на дорожке должна существовать некая начальная точка, и у должен быть способ идентификации начала и конца каждого сектора. Эти требо- '\ вания удовлетворяются посредством контроля за записанными на диск данными. ( Так, диск форматируется с некоторыми дополнительными данными, используе- '"\ мыми только дисководом и недоступными пользователю. Физические характеристики В табл. 11.6 приведены основные характеристики, отличающие один тип ;"' дисков от другого. Головка диска может быть либо фиксирована, либо переме-!? щаема (в радиальном направлении пластины диска). В дисках с фиксированной головкой на одну дорожку приходится одна головка. Все головки смонтированы ;! на жестком кронштейне, который располагается над всеми дорожками. В диске с перемещающейся головкой имеется только одна головка, закрепленная на кронштейне. Поскольку головка должна быть способна размещаться над любой '* дорожкой, кронштейн должен обеспечивать ее перемещение над диском. Сам же диск смонтирован в дисководе, состоящем из кронштейна, шпинделя, вращающего диск, и электронной схемы, необходимой для осуществления ввода и вывода бинарных данных. Стационарный диск зафиксирован в дисковод де, в то время как переносной диск может быть удален или заменен другим. Преимущество дисков последнего типа состоит в том, что при ограниченном ко-.: личестве дисковых систем доступен неограниченный объем данных. Кроме того, t-вывода и файлы такой диск может быть перенесен из одной компьютерной системы в другую (при условии их совместимости). Таблица 11.6. Физические характеристики дисковых систем Движение головки Фиксированная головка (одна на дорожку) Перемещаемая головка (одна на поверхность) Переносимость диска Стационарный диск Переносной (съемный) диск Стороны Односторонние Двусторонние Дисковые пластины Одна пластина Множество пластин Механизм головки Контактный (флоппи-диск) С фиксированным зазором Аэродинамический зазор i В большинстве дисков магнитное покрытие наносится на обе стороны дисковой пластины (такой диск называется двусторонним). Некоторые, менее дорогие системы используют односторонние диски. Некоторые дисководы содержат несколько дисковых пластин, размещенных на вертикальной оси с интервалом в несколько дюймов. При этом предусматривается наличие нескольких кронштейнов. Набор дисковых пластин называется пакетом дисков (рис. 11.18). Многопластинчатые диски снабжены перемещаемыми головками, по одной на одну поверхность пластины. Головки механически зафиксированы таким образом, что все они находятся на одинаковом расстоянии от центра диска и перемещаются одновременно. Таким образом, в любой момент времени все головки оказываются расположенными над дорожками, равноудаленными от центра диска. Множество дорожек, находящихся в одной и той же позиции по отношению к пластине, называется цилиндром (cylinder). Например, все закрашенные дорожки, показанные на рис. 11.19, являются частью одного цилиндра. Возможна еще одна классификация дисков по типам головок. Обычно головка чтения/записи располагается на фиксированном расстоянии над дисковой пластиной. В головках второго типа при считывании или записи осуществляется реальный физический контакт с поверхностью. Такой механизм используется в гибких дисках, имеющих небольшой размер, гибкую пластину и являющихся самыми дешевыми из всех типов дисков. Чтобы объяснить принцип работы дисков третьего типа, необходимо прокомментировать соотношение между плотностью данных и размером воздушного промежутка. Головка должна генерировать или улавливать электромагнитное поле достаточной для нормального считывания или записи величины. Чем уже головка, тем ближе она должна быть расположена к поверхности пластины. Сужение головки предполагает сужение дорожки и, естественно, увеличение плотности записи, что очень желательно. Однако чем ближе головка расположена к поверхности пластины, тем больше вероятность возникновения ошибок, вызванных загрязнениями или физическими дефектами. Дальнейшее развитие технологии привело к появлению вин- Глава 11. Управление вводоие-выводом и дисковое планирование 695
честерных дисков, головки которых используются в герметичных дисководах, защищенных от загрязнений. Они сконструированы для работы на расстоянии от поверхности пластины, меньшем, чем расстояние при работе с обычными жестко фиксированными головками, что приводит к более высокой плотности записи данных. Головка представляет собой своеобразную аэродинамическую фольгу, парящую над поверхностью пластины при вращении диска. Воздушное давление, создаваемое при вращении диска, достаточно для создания зазора между поверхностью и головкой. Такая бесконтактная схема обеспечивает работу очень узких, близко расположенных к поверхности головок1. Головка чтения/записи (1 на поверхность) Поверхность 9 - Дисковая »~ пластина Поверхность 8 Поверхность? - Поверхность 6 Поверхность 5 - Поверхность 4 Поверхность 3 - Поверхность 2 Поверхность 1 - Поверхность О I ■£ £ I £ Направление перемещения кронштейна Шпиндель Рис. 11.18. Компоненты магнитного диска Стрела 1 Термин "винчестер" был впервые применен компанией IBM как кодовое название, диска модели 3340 перед ее анонсом. Модель 3340 представляла собой съемный дисковы пакет с головками, закрепленными внутри него. Сейчас этот термин применяется к любому герметичному диску с аэродинамической конструкцией головки. Диски этог типа нашли свое применение в персональных компьютерах и рабочих станциях, где ом именуются жесткими дисками. S06 Часть 5. Операции ввода-вывода и файлы Рис. 11.19. Дорожки и цилиндры В табл. 11.7 приведены параметры типичных современных высокопроизводительных дисков с движущимися головками. Таблица 11.7. Параметры типичных дисков Характеристики Seagate Cheetah 36 Western Digital Enterprise WDE18300 36.4 Гбайт 0.6 мс 6 мс 10000 об/мин 3 мс Емкость Минимальное время поиска от дорожки к дорожке Среднее время поиска Скорость вращения шпинделя Средняя задержка из-за вращения Максимальная скорость передачи 313 Мбит/с данных Количество байтов в секторе 512 Количество секторов в дорожке 300 Количество дорожек в цилиндре 24 Количество цилиндров 9801 18.3 Гбайт 0.6 мс 5.2 мс 10000 об/мин 3 мс 360 Мбит/с 512 320 8 13614 Оптическая память В 1983 году был представлен один из самых удачных потребительских продуктов всех времен — компактная дисковая (CD) цифровая аудиосистема CD Глава 11. Управление вводом-выводом и дисковое планирование 597 . ■ &
вляется "нестираемым" диском, который может хранить более 60 минут аудио- нформации на одной стороне. Огромный коммерческий успех CD позволил разить недорогую технологию хранения данных на оптических дисках, что стало еволюционным шагом в компьютерном хранении данных. Разнообразные сис- емы оптических дисков представлены в табл. 11.8. 'аблица 11.8. Продукты на основе оптической технологии дисков 'Г> Компакт-диск. Нестираемый диск, хранящий аудиоинформацию в цифровом виде. Стандартная система использует 12-сантиметровые диски и может записать более 60 минут непрерывного времени звучания Компакт-диск с постоянной памятью. Нестираемый диск, используемый для хранения компьютерных данных. Стандартная система использует 12-сантиметровые диски и способна содержать более 650 Мбайт информации CD с возможностью записи. Подобен CD-ROM. Пользователь может записать информацию на диск только один раз CD с возможностью перезаписи. Подобен CD-ROM. Пользователь может стирать и производить перезапись данных на диске до 1000 раз Универсальный цифровой диск. Технология для хранения как цифрового сжатого представления видеоинформации, так и больших объемов других цифровых данных. Используются как 8-, так и 12- сантиметровые диски, с двусторонней записью объемом до 15,9 Гбайт. Базовый DVD — с постоянной памятью (DVD-ROM) DVD с возможностью записи. Подобен DVD-ROM. Пользователь может записать информацию на такой диск только один раз DVD с возможностью перезаписи. Подобен DVD-ROM. Пользователь может стирать и перезаписывать информацию на диске до 1000 раз Диск, использующий оптическую технологию для считывания и технологию магнитной записи при содействии оптической фокусировки. Используются как 3.25-дюймовые, так и 5.25-дюймовые диски. Общий объем хранимой информации — более 5 Гбайт & :d-rom :d-r ;d-rw dvd ;£* DVD-R DVD-RW Магнитооптический диск ■4 CD-ROM Аудио-CD и CD-ROM (постоянное запоминающее устройство на компакт- диске) используют одну и ту же технологию. Главное различие зак^^ в том, что дисководы CD-ROM являются более грубыми и ™от воа""™^. сти коррекции ошибок для гарантии корректности данных. Оба типа №««* изготавливаются одинаково. Диск выполняется на пластиковой ^f^.; пример поликарбонате, и имеет поверхность с хорошим 0^^™™£^*°?. алюминиевую). Информация, записанная в цифровом виде <МУ8*"^£* или компьютерные данные), отпечатывается в виде серии ^^ОСК^^С^ ■ впадин на отражающей поверхности. Это может быть выполнено точно сфо, кусированным лазером высокой интенсивности для создания ™™**™*%: ка, называемого мастер-диском. Мастер-диск, в свою очередь, ^^е^ для производства штампа, на основе которого изготавливаЮТСЯг^Хазно верхность дисков-копий защищена от пыли и царапин своеобразно^. "рубашкой" из чистого лака. « 598 Часть 5. Операции ввода-вывода и фай Извлечь информацию из CD или CD-ROM можно с помощью маломощного лазера, размещенного в дисководе. Луч лазера проходит сквозь чистое защищенное покрытие при вращении диска. Интенсивность отраженного луча лазера изменяется при попадании на впадину. Это изменение фиксируется фотодатчиком и преобразовывается в цифровой сигнал. Впадина вблизи центра вращения диска проходит мимо зафиксированной точки (такой, как лазерный луч) медленнее, чем впадина на внешнем краю диска, так что нужно найти способ компенсации изменения линейной скорости, необходимый для возможности сканирования информации с одинаковой частотой. Это может быть достигнуто, как и на магнитных дисках, посредством увеличения пространства между битами информации, записанной в сегментах диска. После этого информация может быть сканирована с одинаковой частотой при постоянной угловой скорости. На рис. 11.20,а приведена схема распределения данных на диске при использовании постоянной угловой скорости. Диск делится на концентрические дорожки с определенным количеством секторов. Преимущество использования постоянной угловой скорости заключается в возможности непосредственной адресации отдельных блоков путем указания их дорожки и сектора. Неудобство такой схемы заключается в том, что суммарное количество данных, которые хранятся на внешней дорожке, такое же, как и на внутренней. \ Постоянная угловая скорость Постоянная линейная скорость Рис. 11.20. Способы размещения данных на диске Поскольку при размещении малого количества информации на участке внешней дорожки неэкономно расходуется пространство, метод постоянной Угловой скорости не используется в CD и CD-ROM. Вместо этого информация Равномерно распределяется по всем дисковым сегментам одинакового размера, которые впоследствии сканируются с одной и той же скоростью путем вРащения диска с переменной скоростью. Впадины сканируются лазером при Постоянной линейной скорости. При обращении ко внешним дорожкам диск вРащается медленнее, чем при обращении ко внутренним. Поэтому емкость Дорожки и задержка из-за вращения увеличиваются для дорожек вблизи внешнего края диска. > | лава Ц. Управление вводом-выводом и дисковое планирование 599
Производятся CD-ROM с различной плотностью записи. Далее представлены ^ ипичные величины. Расстояние между дорожками составляет 1.6 цт. Ширина .к аписи CD-ROM — 32.55 цт, поэтому общее количество дорожек равно 20 344. )днако фактически мы имеем дело с одной спиральной дорожкой, вычислить v шину которой можно путем умножения средней длины окружности на количе- ?' :тво витков спирали (эта длина приблизительно равна 5.27 km). Постоянная ли- > 1ейная скорость CD-ROM равна 1.2 m/s, в итоге получается 4391 с (или 73.2 С, «ин), что приблизительно равно стандартному максимальному времени звучания ;, аудио компакт-диска. Поскольку данные пересылаются из диска со скоростью *'' 176.4 Кбайт/с, емкость CD-ROM составляет 774.57 Мбайт. :;* На рис. 11.20,6 показана схема размещения данных для CD и CD-ROM при ■:;'. работе с постоянной линейной скоростью. Случайный доступ при этом становит- -\' ся более сложным. Перемещение к определенному адресу включает перемещение ;.'; головки в требуемую область, регулирование скорости вращения и чтение адре- ■" са, а после этого выполнение легкой регулировки для поиска и доступа к опре- Д "Ч деленному сектору. •;> CD-ROM пригоден для распространения большого количества данных среди \., большого количества пользователей. Он обладает тремя главными преимущест- -V, вами по сравнению с традиционными магнитными дисками. \ъ • Объем хранимой информации намного больше у оптического диска. v • Оптический диск вместе с сохраненной на нем информацией может быть массо-.'■£ во тиражирован при небольших денежных затратах, в отличие от магнитного^: диска. База данных на магнитном диске может быть воспроизведена путем ю>Д-' пирования одного диска за один раз с использованием двух дисководов. ^у • Оптический диск является переносным, что позволяет использовать его для\> архивного хранения. 7; • К недостаткам CD-ROM относятся следующее. • Режим "только для чтения" не позволяет обновлять информацию. • Время доступа к диску намного больше, чем у магнитного накопителя. ,'. CD с возможностью записи f Для тех случаев, когда требуется только одна копия диска или небольшое количество копий, можно использовать CD с возможностью записи (CD-R). CD-R подготавливается таким образом, чтобы он мог быть один раз последовательно записан лазерным лучом умеренной интенсивности. С помощью такого, немного более дорогого, чем CD-ROM, дисковода покупатель может один раз записать сколько угодно раз прочитать диск. ? Физическая структура CD-R схожа со структурой CD или CD-ROM, но Я идентична ей. В CD и CD-ROM информация записывается с помощью впадин поверхности пластины, что приводит к изменению отражающей способности. CD-R добавлен окрашенный слой. Краска используется для изменения отрй, жающей способности и активизируется высоко интенсивным лазером. Получив шийся диск может быть считан приводом CD-R или CD-ROM. Оптический диск CD-R удобен для архивного хранения документов и файлов. Он обеспечивает постоянную запись больших объемов пользовательских данных. v.. Часть б^Операции ввода-вывода и фа CD-R с возможностью перезаписи Оптический диск CD-RW может быть повторно записан и перезаписан, как и магнитный диск. Несмотря на то что было опробовано большое количество подходов, достоин внимания только чисто оптический подход, вызывающий фазовые изменения. Такой диск использует материал, имеющий отражательную способность, значительно отличающуюся в двух различных фазовых состояниях: аморфном состоянии, в котором молекулы ориентированы случайно и отражение луча света слабое, и кристаллическом состоянии, хорошо отражающем свет. Лазерный луч может изменить фазу материала с одной на другую. Основной недостаток оптических дисков с переменной фазой состоит в том, что материал в конечном счете теряет свои свойства. Материалы, используемые в настоящее время, могут выдержать от 500000 до 1000000 циклов стирания информации. CD-RW обладает очевидным преимуществом перед CD-ROM и CD-R, которое состоит в том, что информация на нем может быть перезаписана, и поэтому он может использоваться как устройство для вспомогательного хранения данных. Поэтому CD- RW вполне может конкурировать с магнитными дисками. Основные преимущества стираемого оптического диска — большая емкость, портативность и надежность. DVD В образе DVD электронная промышленность наконец-то нашла достойную замену аналоговым видеолентам VHS. Однако DVD заменит не только видеоленты, но и, что более важно для нас, CD-ROM в персональных компьютерах. DVD — это наступление века цифрового видео. Он позволяет получать фильмы с превосходным качеством, и при этом доступ к информации может осуществляться случайным образом — как у аудио CD, которые DVD-устройства также могут проигрывать. Объем DVD-диска на сегодня приблизительно в семь раз больше объема обычного CD-ROM. Магнитооптические диски В магнитооптическом дисковом накопителе для увеличения емкости обычной магнитной системы применяется лазер, обеспечивающий фокусировку магнитной головки для достижения большей емкости хранения. Диск покрывают материалом, полярность которого может быть изменена только при высоких температурах. Информация записывается с помощью магнитной головки на диск в точку, прогретую лазерным лучом. Поскольку этот процесс не вызывает физических изменений на диске, он может быть многократно повторен. Операция чтения — чисто оптическая. Магнитное поле фиксируется посредством поляризации лазерного луча (меньшей мощности, чем при записи). Глава 11. Управление вводом-выводом и дисковое планирование 601^
a-' % i.«""4 ,..l; '«.»' ГЛАВА Управление файлами 12.1. Обзор 12.2. Организация файлов и доступ к ним 12.3. Каталоги файлов 12.4. Совместное использование файлов 12.5. Записи и блоки 12.6. Управление внешней памятью 12.7. Управление файлами в UNIX 12.8. Файловая система WINDOWS 2000 12.9. Резюме, ключевые термины и контрольные вопросы 12.10. Рекомендуемая литература 12.11. Задачи 12
Для большинства приложений центральным элементом является файл. За исключением приложений реального времени и некоторых других специализированных приложений, ввод данных в приложение осуществляется посредством файлов; выходные данные почти всех приложений также сохраняются в виде файлов для долговременного хранения и последующего обращения к ним пользователей и других программ. Файлы существуют отдельно от индивидуальных приложений, использующих их для ввода и/или вывода. Пользователям необходима возможность доступа к файлам, их сохранения, поддержки целостности их содержимого. Для выполнения этих требований практически все операционные системы обеспечивают системы управления файлами. Обычно система управления файлами состоит из системных утилит, функционирующих как привилегированные приложения. Как минимум система управления файлами нуждается в специальных сервисах операционной системы, а как максимум — вся система управления файлами является составной частью операционной системы. Следовательно, вопросы управления файлами вполне можно рассматривать в данной книге. Мы начнем с небольшого обзора, после чего остановимся на различных способах организации файлов. Несмотря на то что этот вопрос не рассматривается в рамках операционной системы, все же необходимо иметь общее представление об основных вариантах организации файлов для понимания природы определенных компромиссов, на которые приходится идти при разработке систем управления файлами. Оставшаяся часть главы посвящена прочим вопросам, связанным с управлением файлами. О Р&^ЩЩ^р1?' '' £12.1. ОБЗОР Файлы При рассмотрении файлов мы используем четыре термина. • Поле. • Запись. • Файл. • База данных. Поле (field) является основным элементом данных. Индивидуальное поле содержит в себе единственное значение, такое, как имя служащего, дату, или значе- т ■ ние, полученное от некоторого датчика. Поле характеризуется длиной и типом данных (например, строка ASCII, десятичное число и т.п.). В зависимости от структуры * файла поля могут быть либо фиксированной, либо переменной длины. В последнем ; случае поле часто состоит из двух или трех подполей: действительного значения, \ имени поля и, иногда, длины поля (поля переменной длины могут также отделяться .. друг от друга специальными разграничительными символами). Запись (record) является набором связанных между собой полей, которые,/;' могут быть обработаны как единое целое некоторой прикладной программой. .■• Например, запись данных о служащем может содержать такие поля, как имя, *» номер социального страхования, оклад, дату принятия на работу и т.п. В зави- '. симости от структуры записи могут быть фиксированной или переменной длины. 604 Часть 5. Операции ввода-вывода и файлы \ ■й Запись имеет переменную длину, если некоторые из ее полей — переменной длины или если переменно количество полей в записи. В любом случае вся запись обычно включает длину полей. Файл (file) представляет собой набор однородных записей. Файл рассматривается пользователями и приложениями как единое целое, и обращение к нему осуществляется по его имени. Файлы можно создавать и удалять; каждый из них имеет свое собственное уникальное имя. Ограничения доступа обычно осуществляются на уровне файла. Другими словами, пользователи и программы, работающие в системах общего пользования, могут обладать правом доступа (или лишены его) к файлу как единому целому. В некоторых более сложных системах управление доступом осуществляется на уровне записи, а иногда даже и на уровне поля. База данных (database) представляет собой набор связанных между собой данных. К наиболее существенным аспектам базы данных можно отнести то, что отношения между данными выражены явно, а сама база данных спроектирована специально для использования большим количеством разных приложений. База данных может содержать в себе всю информацию, связанную с организацией или проектом, например результаты бизнес-проекта или научного исследования. База данных состоит из файлов одного или нескольких типов. Обычно существует отдельная система управления базой данных (СУБД), независимая от операционной системы, но, тем не менее, она почти всегда использует некоторые программы управления файлами. Как правило, при использовании файлов, которое необходимо пользователям и приложениям, поддерживаются следующие операции [LJTVA90]. • Выбрать_Все. Выборка всех записей из файла. Эта операция необходима тем приложениям, которые обрабатывают всю содержащуюся в файле информацию целиком. Например, приложение, производящее анализ информации в файле, должно выбрать для этого все записи. Этой операции часто соответствует термин последовательная обработка, поскольку доступ ко всем записям осуществляется в последовательном порядке. • Выбрать_Одну. Выборка только одной записи. Используется диалоговыми приложениями, ориентированными на выполнение транзакций. • Выбрать_Следующук). Выборка записи, которая является "следующей" в некоторой логической последовательности по отношению к последней ранее выбранной записи. Эта операция будет необходима, например, приложениям с заполнением форм. Ее могут использовать и приложения, выполняющие поиск. • Выбрать_Предыдущую. Подобна только что рассмотренной операции, однако в этом случае выбирается запись, являющаяся "предыдущей" по отношению к доступной в данный момент записи. • Вставить_Одну. Вставка записи в файл. Может быть необходима, если новая запись помещается в определенную позицию для сохранения логики связей между записями файла. • Удалить_Одну. Удаление существующей записи. Для сохранения логики связей между записями файла может возникнуть необходимость в обновлении некоторых связей или других структур данных. Глава 12. Управление файлами 605
• Обновить_0дну. Выборка записи, обновление одного или более ее полей и перезапись обновленной записи обратно в файл. Эта операция также может потребовать выполнения дополнительных действий для сохранения последовательности файла. Если длина записи претерпела изменения, то процедура обновления становится более сложной. • Выбрать_Несколько. Выборка некоторого количества записей. Выполняется, например, когда приложению или пользователю необходимо выбрать записи, удовлетворяющие определенному установленному набору критериев. Вид операций, которые чаще всего будут выполняться с файлом, влияет на способ организации файла, что обсуждается в разделе 12.2. Системы управления файлами Систему управления файлами составляет программное обеспечение, предоставляющее сервисные функции при работе пользователей и приложений с файлами. Обычно единственным способом работы с файлами является использование системы управления файлами. Ее применение позволяет избавиться от необходимости разработки специальных программ работы с файлами для каждого отдельного приложения, а также обеспечивает систему средствами управления ее наиболее важными компонентами. В [GROSS86] перечислены следующие задачи системы управления файлами. • Соответствие требованиям управления данными и требованиям со стороны *,| пользователей, включающим возможность хранения данных и выполнения рассмотренных ранее операций с ними. • Гарантирование корректности данных, содержащихся в файле. • Оптимизация производительности, как с точки зрения системы (пропускная способность), так и с точки зрения пользователя (время отклика). • Поддержка ввода-вывода для различных типов устройств хранения информации. • Минимизация или исключение возможных потерь или повреждений данных. • Обеспечение стандартизированного набора подпрограмм интерфейса ввода- вывода. • Обеспечение поддержки коллективного использования несколькими пользователями многопользовательской системы. Что касается первого пункта — соответствия пользовательским требованиям, — то спектр этих требований зависит от разнообразия приложений и от среды, в которой используется компьютерная система. Ниже приведен минимальный набор требований для диалоговой системы общего назначения. Каждый пользователь должен иметь следующие возможности. 1. Создавать, удалять, читать и изменять файлы. 2. Иметь контролируемый доступ к файлам других пользователей. 3. Управлять доступом к своим файлам. i V | >'-' .' ■■/■•'с ■ ■> ' ел . г 1 ■ •:'* т jl . * р ■ £,, 606 Часть 5. Операции ввода-вывода и файлы 4. Реструктуризировать файлы таким способом, который наиболее подходит для решения стоящих перед ним задач. " б. Перемещать данные между файлами. 6. Резервировать и восстанавливать файлы в случае повреждения. 7. Иметь доступ к файлам по символьным именам. Мы будем учитывать эти задачи при нашем дальнейшем рассмотрении систем управления файлами. Архитектура файловой системы Чтобы хоть как-то представить себе спектр действий при управлении файлами, можно обратиться к рис. 12.1, где представлена типичная схема организации программного обеспечения. Естественно, что различные системы организованы по-разному, однако приведенная организация типична. На нижнем уровне драйверы устройств непосредственно связаны с периферийными устройствами или их контроллерами либо каналами. Драйвер устройства отвечает за начальные операции ввода-вывода устройства и за обработку завершения запроса ввода- вывода. При файловых операциях контролируемыми устройствами являются дисковод и накопитель на магнитной ленте. Драйверы устройств обычно рассматриваются как часть операционной системы. Пользовательская программа Смешанный файл Последовательный Индексно- последовательный Индексированный Хэшированный Логический ввод/вывод Диспетчер базового ввода/вывода Базовая файловая система Драйвер диска Драйвер стримера Рис. 12.1. Архитектура программного обеспечения файловой системы [GROS86] Следующий уровень называется базовой файловой системой, или уровнем физического ввода-вывода. Это первичный интерфейс с окружением компьютерной системы. Он оперирует блоками данных, которыми обменивается с дисковой системой, магнитной лентой или другим носителем. Поэтому он связан с размещением и буферизацией блоков в оперативной памяти. На этом уровне не выполняется работа с содержимым блоков данных или структурой файлов. Базовая файловая система часто рассматривается как часть операционной системы Глава 12. Управление файлами 607
Супервизор базового ввода-вывода отвечает за начало и завершение файлового ввода-вывода. На этом уровне поддерживаются управляющие структуры, связанные с устройством ввода-вывода, планированием и статусом файлов. Супервизор базового ввода-вывода осуществляет выбор устройства, на котором будет выполняться операция файлового ввода-вывода, исходя из выбранного файла. Кроме того, он осуществляет планирование обращения к носителю (лентам, диску и др.) с целью повышения производительности. На этом уровне происходит назначение буферов ввода-вывода и распределение внешней памяти. Супервизор базового ввода-вывода является частью операционной системы. Логический ввод-вывод предоставляет пользователям и приложениям доступ к записям. Таким образом, базовая файловая система оперирует блоками данных, а модуль логического ввода-вывода — файловыми записями. Логический ввод-вывод обеспечивает возможности общего назначения по вводу-выводу записей и поддерживает информацию о файлах. Наиболее близкий к пользователю уровень файловой системы часто называется методом доступа. Он обеспечивает стандартный интерфейс между приложениями и файловыми системами и устройствами, содержащими данные. Различные методы доступа отражают различные структуры файлов и различные пути доступа и обработки данных. Некоторые из наиболее общих методов доступа представлены на рис. 12.1 и вкратце описаны в разделе 12.2. Функции управления файлами Еще одно представление о функциях файловой системы дает рис. 12.2. Рассмотрим эту диаграмму слева направо. Пользователи и прикладные программы взаимодействуют с файловой системой посредством команд для создания и уда- \ ления файлов, а также для выполнения операций над ними. Перед выполнением ', любой операции файловая система должна идентифицировать выбранный файл и j определить его местоположение. Это требует использования каталогов опреде- .= ленного типа, которые служат для описания местоположения файлов и их характеристик. Кроме того, большинство систем с совместным использованием ; включают управление доступом пользователей (только авторизованным пользо- ^ вателям разрешен доступ к определенным файлам определенными способами). Базовые операции, которые могут быть выполнены пользователем или приложе- ■';. нием над файлами, выполняются на уровне записей. С точки зрения пользователя или прикладной программы, файл имеет некоторую последовательную струк- .'"■ туру, организующую записи (например, записи о персонале хранятся в алфавит- , ном порядке). Поэтому для преобразования команд пользователя в конкретные "''< команды управления файлом должен использоваться метод доступа, соответст- , вующий структуре данного файла. В то время как пользователи и приложения оперируют с записями, низ- . коуровневый ввод-вывод выполняется блоками. Следовательно, записи файла требуется сблокировать для вывода и разблокировать после ввода. Для поддержки блочного ввода-вывода файлов необходимо несколько функций. Со- ' хранение на внешних запоминающих устройствах должно быть управляемым. К функциям управления относятся распределение файлов по свобод- ; ным блокам при сохранении на внешних устройствах и управление свободной памятью таким образом, чтобы знать, какие блоки являются доступными для создания новых файлов и наращивания существующих. Кроме 608 Часть 5. Операции ввода-вывода и файлы того, индивидуальные запросы блочного ввода-вывода должны планироваться (этот вопрос был рассмотрен в главе 11, "Управление вводом-выводом и дисковое планирование"). И распределение файлов, и дисковое планирование тесно связаны с оптимизацией производительности системы. Поэтому как и следовало ожидать, эти функции необходимо рассматривать вместе. Более того, оптимизация будет зависеть от структуры файлов и схем доступа. Соответственно, разработка оптимальной системы управления файлами с точки зрения эффективности является чрезвычайно сложной задачей. Управление каталогом Структура файла 1' Команды пользователя Операция,' и программы MMAaMI1a Метод доступа Записи |jj£r-'."t | Физические блоки Физические блоки в буферах во вторичной оперативной памяти памяти (диск) I I ЕЗЗ 1 Группирование Функции управления файлами Дисковое планирование л Ввод-вывод а Управление свободным пространством Размещение! файлов Контроль за доступом пользователя Область ответственности управления файлами Область ответственности операционной системы Рис. 12.2. Элементы управления файлами На рисунке предложено разделение между системой управления файлами и операционной системой; точка пересечения представляет собой обработку записей. Такое разделение достаточно произвольно, поскольку различные системы применяют различные подходы. В оставшейся части этой главы мы остановимся на некоторых вопросах проектирования, предложенных на рис. 12.2. Начнем с описания организации файлов и методов доступа к ним. Хотя эта тема обычно не рассматривается при изучении операционных систем, невозможно перейти к другим вопросам проектирования, связанного с файлами, не разобравшись в файловой организации и предоставлении доступа. Далее мы познакомимся с концепцией файловых каталогов. Зачастую управление ими осуществляется операционной системой от имени системы управления файлами. Остальные вопросы относятся к физическим аспектам управления файловым вводом-выводом и рассматриваются как аспекты проектирования операционной системы. Одним из вопросов является способ организации логических записей в физические блоки. В заключение остановимся на вопросах распределения файлов при сохранении данных на внешних устройствах и вопросах управления свободной вторичной памятью. Глава 12. Управление файлами 609
Г 12.2. ОРГАНИЗАЦИЯ ФАЙЛОВ И ДОСТУП I t ..К НИМ ' • », В этом разделе используемый нами термин организация файла относится к логической структуре записей, определяющей способ доступа к ним. Физическая организация файла на устройстве вторичной памяти зависит от стратегий объединения записей в блоки и размещения файла, что будет рассмотрено в этой главе немного позже. При выборе способа организации файла важно учитывать несколько критериев. • Быстрота доступа. • Легкость обновления. • Экономность хранения. • Простота обслуживания. • Надежность. Относительный уровень приоритета этих критериев зависит от приложений, которые будут работать с файлом. Например, если файл предназначен только для обработки в пакетном режиме, когда одновременно выбираются несколько записей, быстрый доступ для выборки одной записи заинтересует нас менее всего. Файл, сохраненный на CD-ROM, никогда не будет обновлен, поэтому вопрос легкости в обновлении не имеет смысла. Перечисленные критерии могут конфликтовать между собой. Так, для экономии при сохранении необходима минимальная избыточность данных. С другой стороны, избыточность является главным фактором увеличения скорости доступа к данным. В качестве примера можно привести использование индексов. Количество разных способов организации файлов, которые уже реализованы на практике или только предложены, слишком велико и их рассмотрение даже в книге, посвященной файловым системам, невозможно. В нашем кратком обзоре в общих чертах описаны пять фундаментальных способов организации. Большинство структур, используемых в реальных системах, либо подпадают под одну из этих категорий, либо могут быть реализованы как комбинация этих способов организации. Ниже приводятся пять способов организации файла (первые четыре из них изображены на рис. 12.3). • Смешанный файл. • Последовательный файл. • Индексно-последовательный файл. • Индексированный файл. • Файл прямого доступа (хешированный). 610 Часть 5 Операции ввода-вывода и файлы 1 . ..| 1 Ч + !*? 1. 1 Записи переменной длины Переменный набор полей Хронологический порядок а) Смешанный файл • & Р*» Записи постоянной длины Фиксированный набор полей в фиксированном порядке Последовательный порядок, основанный на ключевом по б) Последовательный файл Уровни индексов Файл переполнения в) Индексно-последовательный файл Полный индекс i Полный индекс Частичный индекс Основной файл (записи переменной длины) г) Индексированный файл Рис. 12.3. Основные способы организации файлов В табл. 12.1 приведены сравнительные аспекты производительности этр пяти способов организации. Глава 12. Управление файлами 61
Таблица 12.1. Производительность различных способов организации файлов [WIED87] Метод Смешанный Последовательный Индексно- последовательный Индексированный Хешированный Пространство Атрибуты Пере- Фиксиро- менное ванное - Обновление А F F В F А В С В Размер записи Равный Больший А D В С В Е F D С F Выборка Одной Подмно- Полная записи жества Е F В А В D D D В А В В F D Е А — отлично подходит для этой цели О (г) В-хорошо О (ох г) С — удовлетворительно О (г log л) D — требует дополнительных усилий О(п) Е — возможно с большими усилиями OirXn) F — не подходит для этой цели q I >\ \ здесь: г — размер результата о — количество переполняющих записей п — количество записей в файле Смешанный файл Наименее сложная форма организации файла может быть названа смешанной. Данные накапливаются в порядке своего поступления. Каждая запись состоит из одного пакета данных. Такая форма упрощает накопление всей массы данных и их хранение. Записи могут иметь как различные поля, так и одинаковые поля, расположенные в различном порядке. Поэтому каждое поле должно описывать само себя, включая как значение, так и имя. Длина каждого поля должна быть либо указана неявным образом посредством применения разделителя, либо явно включена как подполе (или известна для данного типа файла заранее). Поскольку смешанный файл не имеет никакой структуры, то доступ к записи осуществляется путем полного перебора всех записей файла. Т.е. если необходимо найти запись, содержащую определенное поле с определенным значением, проверяется каждая запись до тех пор, пока не будет найдена искомая или пока весь файл не будет пересмотрен. Если необходимо найти все записи, содержащие определенное поле, или все записи, содержащие поле с определенным значением, то поиск должен производиться по всему файлу. Смешанные файлы встречаются тогда, когда данные накапливаются и сохраняются перед обработкой, или если данные неудобны для организации. Файлы этого типа рационально использует дисковое пространство при работе с дан- 612 Часть 5. Oil адии ввода-выэода и файлы ными различного размера и структуры; он хорошо подходит для полного пере бора, но недостаточно прост при обновлении данных. В большинстве других слу чаев этот тип файла непригоден. Последовательный файл Наиболее распространенным видом файловой структуры является последовг тельный файл. В нем для записей используется фиксированный формат. Все запис! имеют одинаковую длину и состоят из одинакового количества полей фиксированно! длины, организованных в определенном порядке. Поскольку длина и позиция каж дого поля известны, то сохранению подлежат только значения полей; атрибутам! файловой структуры являются имя и длина каждого поля. Одно определенное поле, обычно — первое поле в каждой записи, называв! ся ключевым полем, которое идентифицирует запись уникальным образом, та! что ключевые значения различных записей всегда различны1. Более того, запис! сохраняются в "ключевой" последовательности: в алфавитном порядке для тек стового ключа и в числовом порядке для числового ключа. Последовательные файлы часто используются пакетными приложениями ] обычно являются оптимальным вариантом, если эти приложения выполняют об работку всех записей (например, программы составления счетов или расчет платежных ведомостей). Только файл с последовательной организацией може быть одинаково легко сохранен как на магнитной ленте, так и на диске или дру гом носителе. Для диалоговых приложений, которые работают с запросами и/или выпол няют обновление индивидуальных записей, последовательный файл являете: малоэффективным. Для нахождения необходимой записи нужно произвести пс следовательный перебор записей файла. Если в основную память может быт внесен весь файл целиком или большая его часть, то возможно использовани более эффективных методов поиска. Тем не менее обращение к записи в боль шом последовательном файле занимает, как правило, относительно много време ни. Дополнения к файлу также создают проблемы. Обычно последовательны! файл сохраняется с последовательной организацией записей внутри блоков. Дру гими словами, физическая организация файла на магнитной ленте или на диск в точности соответствует логической организации файла. В этом случае обычн выполняется размещение новых записей в отдельном смешанном файле, назы ваемом журнальным файлом или файлом транзакции. Периодически в пакетно] режиме выполняется слияние основного и журнального файлов в новый файл корректной последовательностью ключей. Альтернативной организацией может служить физическая организация пс следовательного файла в виде списка с использованием указателей. В каждоз физическом блоке сохраняется одна или несколько записей. Каждый блок н диске содержит указатель на следующий блок. Для вставки новых записей дос таточно изменить указатели, и нет необходимости в том, чтобы новые записи з£ нимали определенную физическую позицию. Это удобство достигается за сче определенных накладных расходов и дополнительной работы. Возможна ситуация, когда ключ составляют несколько таких полей. — Прим. перев Глава 12. Управление файлами 6i:
Йндексно-последовательный файл Популярным методом преодоления недостатков последовательного файла явля- >тся индексно-последовательная организация файла. Индексно-последовательный Ьайл сохраняет главную особенность последовательного файла: записи организованы ^следовательно на основании значений ключевого поля. Но при описываемой организации добавлены две особенности: индекс файла для поддержки произвольного доступа и файл (или область) переполнения. Индекс обеспечивает возможность быст- [>ого поиска требуемой записи. Файл переполнения подобен журнальному файлу, используемому файлом последовательного доступа, однако организован таким образом, что записи в нем размещаются, следуя указателю предшествующей записи. В простейшей индексированно-последовательной структуре используется единственный уровень индексации, и индекс в этом случае представляет собой простой последовательный файл. Каждая запись в индексном файле состоит из двух полей: ключевого поля, идентичного ключевому полю в основном файле, и указателя в основной файл с ключами. Для обнаружения определенного поля сперва выполняется поиск в индексном файле. После того как в нем найдено наибольшее значение ключа, которое не превышает искомое, продолжается поиск в основном файле в позиции, определенной указателем из индексного файла. Чтобы убедиться в эффективности этого подхода, можно в качестве примера рассмотреть последовательный файл, содержащий 1 миллион записей. Для поиска определенного ключевого значения необходимо в среднем полмиллиона операций доступа к записям. Предположим, что создается индекс, содержащий 1000 элементов2, со значениями ключей индекса, более или менее равномерно распределенными в главном файле. Теперь потребуется около 500 операций доступа к индексному файлу, после чего нужно еще около 500 операций доступа к главному файлу для нахождения требуемой записи. Итак, средняя длина поиска уменьшилась с 500000 до 1000. Дополнения к файлу обрабатываются следующим образом. В каждой записи ,, главного файла содержится дополнительное поле, невидимое для приложения и являющееся указателем на файл переполнения. Если в файл производится вставка ' новой записи, она добавляется в файл переполнения. Запись в главном файле, не- \, посредственно предшествующая новой записи в логической последовательности, обновляется и указывает на новую запись в файле переполнения. Если запись, непосредственно предшествующая новой, сама оказывается в файле переполнения, то обновляется указатель этой записи. Как и в случае с последовательным файлом, \ время от времени выполняется слияние индексно-последовательного файла с фай- '.■ лом переполнения. Индексно-последовательная организация намного сокращает время, необходимое для доступа к записи, не изменяя при этом последовательную природу файла. Для последовательной обработки всего файла записи в главном файле об- ■ рабатываются до тех пор, пока не будет обнаружена ссылка на файл переполне- ' ния. После этого выполняются операции с цепочкой записей в файле переполнения до тех пор, пока не встретится нулевой указатель, свидетельствующий о завершении цепочки. Затем продолжится обработка записей основного файла с .: того места, на котором произошло обращение к файлу переполнения. г Их иногда называют точками входа. — Прим. перев. 614 Часть 5. Операции ввода-вывода и файлы Для обеспечения большей производительности при обращениях может использоваться многоуровневая индексация. При этом нижний уровень индексного файла рассматривается как последовательный файл, для которого создается индексный файл верхнего уровня. Рассмотрим снова файл с 1 миллионом записей. Для него создается индекс нижнего уровня с 10000 элементами, после чего может быть создан индекс верхнего уровня из 100 элементов для индекса нижнего уровня. Поиск начинается с индекса верхнего уровня (средняя длина равна 50 обращениям) для нахождения точки входа в индексе нижнего уровня. Затем производится поиск в этом индексе (средняя длина равна 50 обращениям) для нахождения точки входа в главный файл, поиск в котором также требует в среднем 50 обращений. Таким образом, средняя длина поиска уменьшилась с 500000 до 1000 при одноуровневом индексе и до 150 — при двухуровневом. Индексированный файл Индексно-последовательный файл сохраняет одно ограничение последовательного файла: эффективная работа с файлом ограничена работой с ключевым полем. Если необходимо производить поиск записи по какой-либо иной характеристике, отличной от ключевого поля, то оказываются непригодными обе организации последовательного файла, в то время как в некоторых приложениях эта гибкость крайне желательна. Для достижения гибкости необходимо использование большего количества индексов, по одному для каждого типа поля, которое может быть объектом поиска. В обобщенном индексированном файле доступ к записям осуществляется только по их индексам. В результате в размещении записей нет никаких ограничений до тех пор, пока указатель по крайней мере в одном индексе ссылается на эту запись. Кроме того, в таком файле легко реализуются записи переменной длины. Используются два типа индексов. Полный индекс содержит по одному элементу для каждой записи главного файла. Сам по себе индекс организовывается в виде последовательного файла для облегчения поиска. Частный индекс содержит элементы для записей, в которых имеется интересующее нас поле. (Некоторые записи переменной длины могут не содержать всех полей.) При добавлении новой записи в главный файл необходимо обновлять все индексные файлы. Индексированные файлы используются прежде всего теми приложениями, в которых время доступа к информации является критической характеристикой и редко требуется обработка всех записей в файле. Примерами могут служить системы заказа авиабилетов или системы инвентаризации. Файл прямого доступа Файл прямого доступа, или хешированный файл, использует возможность прямого доступа к блоку с известным адресом при хранении файлов на диске. Как в последовательных файлах и файлах индексно-последовательного доступа, в каждой записи должно иметься ключевое поле. Однако концепция последовательного размещения данных здесь не используется. Файл прямого доступа применяет хеширование ключевых значений (подробнее хеширование описано в приложении к главе 8, "Виртуальная память"). На рис. 8.24,0" показано хеширование с таблицей переполнения, которое обычно используется при организации хеш-файле. Глава 12. Управление файлами 615
Файлы прямого доступа используются, когда необходим очень быстрый дос- уп, при записях фиксированной длины, а также в случаях, когда доступ осуще- твляется ко всем записям. Примерами могут служить каталоги, прайс-листы, ^списания и списки имен. 12.3. КАТАЛОГИ ФАЙЛОВ !»*КЛ?#Р'Г1 Содержимое Связующим звеном между системой управления файлами и набором файлов лужит файловый каталог. Каталог содержит информацию о файлах, включая 1трибуты, местоположение, принадлежность. Большая часть этой информации, >собенно та, которая связана с хранением, находится под управлением операци- >нной системы. Сам по себе каталог является файлом (владельцем которого яв- 1яется операционная система), доступным для различных подпрограмм управле- шя файлами. Хотя некоторая часть информации в каталогах доступна пользо- аателям и приложениям, эта доступность косвенная (посредством системных тодпрограмм). Таким образом, прямого доступа к каталогу у пользователей нет даже в режиме только для чтения). В табл. 12.2 приведена информация о файлах, которая обычно хранится в каталоге. С точки зрения пользователя, каталог отображает имена файлов, известные пользователям и приложениям, на собственно файлы. Таким образом, каждая запись в каталоге содержит имя файла. Практически все системы рабо- гают с файлами различных типов и способов организации, и эта информация также предоставляется каталогом. Важной категорией информации о каждом файле является информация, связанная с его хранением на диске, включая размер файла и его местоположение. В системах с совместным использованием очень важно обеспечить информацию для управления доступом к файлам. Обычно у файла имеется один владелец, а остальным пользователям могут быть предоставлены определенные права доступа. И, наконец, информация по использованию файла необходима как для текущего управления файлом, так и для записи истории работы с ним. Таблица 12.2. Элементы информации файлового каталога Основная информация Имя файла Имя, выбранное создателем (пользователем или программой). Должно быть единственным внутри определенного каталога Тип файла Например, текстовый, двоичный, загружаемый модуль и т.п. Организация файла Для систем, поддерживающих различные типы организации Адресная информация Том (носитель) Определяет устройство, на котором хранится файл Начальный адрес Начальный физический адрес в устройстве внешней памяти (например, цилиндр, дорожка, номер блока на диске) Занимаемый Текущий размер файла в байтах, словах или блоках размер <?16 Часть 5. Операции ввода-вывода и файлы Окончание табл. 12 2 Выделенный размер Владелец Информация о доступе Допустимые действия Дата создания Создатель Дата последнего чтения Дата последнего изменения Последний читатель Дата последнего резервного хранения Текущее использование Максимальный размер файла Информация об управлении доступом Пользователь, которому передано управление этим файлом. Пользователь может разрешить доступ или отказать в нем остальным пользователям, а также изменить их привилегии доступа В простейшем варианте может включать имя и пароль каждого авторизованного пользователя Управление чтением, записью, пересылкой данных по сети Информация об использовании Дата первоначального размещения файла в каталоге Обычно (но не обязательно) текущий владелец Дата последнего чтения данных из файла Дата последних процедур обновления, вставки или удаления Пользователь, который последним обращался к файлу для чтения Дата последнего резервного хранения файла на другом устройстве Информация о текущих действиях с файлом, например о процессе или процессах, открывших файл, о том, заблокирован ли файл процессом, обновлен ли файл в оперативной памяти, но еще не обновлен на диске Структура Способы хранения информации, предложенной в табл. 12.2, различны у разных систем. Часть информации может храниться в заголовочной записи, связанной с файлом. Это снижает количество информации в каталоге, вследствие чего каталог может быть полностью загружен в основную память (и, соответственно, при этом резко вырастает скорость работы с ним). Естественно, что некоторые ключевые элементы должны храниться в каталоге. Обычно к таковым относятся имя, адрес, размер и организация. Простейшей структурой каталога является список записей, по одной для каждого файла. Эту структуру можно представить в виде простого последовательного файла, в котором ключевым полем служит имя файла. В некоторых ранних однопользовательских системах использовалась именно такая технология, но она не подходит ни для многопользовательской системы, ни даже для одиночных пользователей со многими файлами. Чтобы понять требования, предъявляемые к файловой структуре, полезно рассмотреть типы операций, которые могут быть выполнены над каталогом. • Поиск. При обращении пользователя или приложения к файлу требуется выполнение поиска записи об этом файле в каталоге. • Создание файла. При создании нового файла необходимо добавить соответствующий элемент в каталог. Глава 12- Управление файлами 617
• Удаление файла. При удалении файла из каталога должен быть удален соответствующий элемент. • Список файлов в каталоге. При работе может оказаться необходимым запрос всего содержимого каталога (или его части). Обычно на этот запрос пользователя возвращается список всех файлов, принадлежащих данному пользователю, а также некоторые атрибуты каждого файла (например, его тип, информация о доступе, информация об использовании). • Обновление каталога. Поскольку в каталоге хранятся некоторые атрибуты файла, изменение хотя бы одного из них требует внесения изменения в соответствующий элемент каталога. Для поддержки всех этих операций простой список не пригоден. Рассмотрим требования одного пользователя. Пользователь может иметь несколько типов файлов, таких, как текстовые файлы, графические файлы, электронные таблицы и т.д. Пользователю может понадобиться хранение файлов, организованных в соответствии с проектом, над которым он работает, в соответствии с типом или какими-то другими характеристиками. Если каталог представлен простым последовательным списком, он не способен оказать помощь в организации файлов, и пользователю нужно быть предельно осторожным и не использовать одинаковые имена для разных файлов. Ситуация усложняется в многопользовательских системах, где необходимость присвоения уникальных имен становится серьезной проблемой. Кроме того, если каталог не структурирован, сложно скрывать части общего каталога от пользователей. Решением этих проблем в первом приближении может служить двухуровневая схема, в которой помимо главного каталога имеются каталоги для каждого пользователя. Главный каталог содержит записи для каждого каталога пользователя, обеспечивая его информацией об адресе и управлении доступом. Каждый пользовательский каталог представляет собой простой список файлов этого пользователя. Такая структура означает, что имена должны быть уникальными только внутри набора файлов одного пользователя, а также то, что файловая система может легко обеспечить ограничение доступа к каталогам. Однако эта система все еще не способна оказать помощь пользователю при структурировании наборов файлов. Более мощным и гибким (и широко распространенным) подходом является использование иерархической, или древовидной, структуры (рис. 12.4). В ней также существует главный каталог, внутри которого размещены каталоги пользователей. В свою очередь, каждый из этих пользовательских каталогов (любого уровня) может содержать подкаталоги и файлы. Остается сказать о том, как организованы каталоги и подкаталоги. Естественно, самым простым решением является хранение каждого каталога в виде последовательного файла. Однако если каталоги могут содержать очень большое количество элементов, то такая организация может привести к непозволительно продолжительному времени поиска. В этом случае более удобной оказывается хеш-структура. Присвоение имен Пользователю необходима возможность обращения к файлу по его символьному имени. Очевидно, что каждый файл в системе должен иметь уникальное имя, для того чтобы обращение к файлу не оказалось неоднозначным. 1 Часть б. Операции вво а-вывода и файлы Главный каталог Подкаталог Подкаталог Подкаталог Файл Файл Файл Рис. 12.4. Древовидная структура каталогов Ъ"' Использование древовидного каталога минимизирует сложность назначения уникальных имен. К любому файлу в системе можно добраться по пути от корневого каталога вниз по ветвям подкаталогов. Серия имен подкаталогов, завершающаяся собственно именем файла, определяет полное имя файла. Например, файл в левом нижнем углу на рис. 12.5 имеет полное имя /User B/Word/Unit A/ABC. Наклонная черта используется для разделения имен каталогов. Имя главного каталога указано неявно, поскольку все пути начинаются именно от него. Заметим, что в связи с этим в системе допускается наличие файлов с одинаковыми именами, поскольку каждый из них имеет уникальное полное имя. Как показано на рис. 12.5, в системе есть еще один файл с именем ABC, но его полное имя — /Users B/Draw/ABC. Хотя полное имя и облегчает выбор имен файлов, указывать его каждый раз при обращении к файлу не совсем удобно. Обычно интерактивный пользователь или процесс связаны с текущим каталогом, называемым также рабочим. Таким образом, обращение к файлам можно осуществлять, указывая их имена относительно рабочего каталога. Например, если рабочий каталог пользователя В — "Word", то имени Unit A/ABC достаточно для идентификации файла, показанного в нижнем левом углу рис. 12.5. При входе интерактивного пользователя в систему, как и при создании процесса, рабочим каталогом по умолчанию является пользовательский каталог. Во время работы пользователь может перемещаться по дереву каталогов вниз или вверх, определяя иной рабочий каталог. Глава 12. Управление файлами (Ц9
Главный каталог System User А- User В- - — User С Каталог "User С" Каталог "Word" ^ Каталог "User В" Draw Word Каталог "Unit A" Каталог "User A" 1 Каталог "Draw" Полное имя:/User B/Word/Unit A/ABC Рис. 12.5. Пример древовидной структуры каталога 620 Часть б. Операции ввода-вывода й файлы 12.4. СОВМЕСТНОЕ ИСПОЛЬЗОВАНИЕ Г * ФАЙЛОВ , , \ [ В многопользовательской системе практически всегда необходима возмож ность совместного использования файлов пользователями. При этом возникаю* два вопроса: права доступа и управление одновременным доступом. Права доступа Файловая система должна обеспечить возможность управляемого доступа i файлу со стороны множества пользователей. Обычно права доступа к файлу пре доставляются пользователям или группам пользователей. Используется широки* диапазон прав доступа. В приведенном списке указаны права доступа, которьи могут быть предоставлены определенному пользователю по отношению к неко торому файлу. • Отсутствие. Пользователь не может обнаружить даже существование файла не говоря уже о доступе к нему. Для обеспечения такого ограничения нуж но запретить пользователю чтение пользовательского каталога, содержаще го этот файл. • Знание. Пользователь может обнаружить существование файла и устано вить его владельца. После этого пользователь может обратиться к владель цу для получения дополнительных прав доступа к файлу. • Выполнение. Пользователь может загрузить и выполнить программу, одна ко выполнить копирование файла не может. Пользовательские программь часто бывают доступны с таким ограничением. • Чтение. Пользователь может осуществить чтение файла для любой цели, включая копирование и выполнение. Некоторые системы могут разли чать чтение и копирование. В таком случае содержимое файла можеп быть выведено на дисплей, однако выполнить копирование файла пользователю не удастся. • Добавление. Пользователь может добавить данные в файл, часто только в eix конец, но произвести изменение или удаление содержимого файла ему не уда стся. Это право полезно при накоплении данных из различных источников. • Обновление. Пользователь может выполнять изменение, удаление или добавле ние данных в файле. Обычно сюда относятся операции начальной записи i файл, полной или частичной перезаписи, полного или частичного удаление данных. Некоторые системы различают разные степени обновления. • Изменение защиты. Пользователь может изменять права доступа, предоставленные другим пользователям. Обычно это право принадлежит толькс владельцу файла. В некоторых системах пользователь может распространить это право на других пользователей. Для защиты от злоупотребление этим механизмом владелец файла может определять, какие права могу! быть изменены. • Удаление. Пользователь может удалить файл из файловой системы. Глава 12. Управление файлами 621
Эти права могут рассматриваться как определенная иерархия, где обладание одним правом доступа влечет за собой обладание всеми предшествующими ему в иерархии правами. Так, если конкретный пользователь обладает правом- обновления файла, то этому пользователю принадлежат также права знания, выполнения, чтения и добавления. Владелец данного файла обычно создает этот файл. Владелец обладает всеми перечисленными правами и может предоставлять права остальным пользователям. Доступ может быть предоставлен различным классам пользователей. • Конкретный пользователь. Индивидуальные пользователи, определяемые посредством своих идентификаторов. • Группы пользователей. Множество пользователей, не определенных индивидуально. Система должна обладать некоторым способом отслеживания членства пользователей в группе. • Все. Все пользователи, имеющие доступ к системе. Файлы общего пользования доступны для всех пользователей. Одновременный доступ Если права доступа позволяют добавлять или обновлять файл более чем одному пользователю, то в этом случае операционной системой или системой управления файлами должен быть организован определенный порядок работы пользователей с файлом. Грубый подход дает возможность пользователю заблокировать весь файл на время его обновления. Более тонкий подход управления заключается в блокировании индивидуальных записей при обновлении. Эта задача читателей/писателей рассматривалась в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность". На этапе проектирования совместно используемого доступа необходимо решать вопросы взаимного исключения и взаимоблокировки. ШМ Шшиси и блоки *&г -&J Как показано на рис. 12.2, записи представляют собой логическую единицу доступа к файлу, в то время как единицами ввода-вывода при сохранении во внешней памяти являются блоки. Для выполнения операций ввода-вывода необходимо организовать записи в блоки. При этом возникают два вопроса. Первый из них: какой длины должны быть блоки — фиксированной или переменной. В большинстве систем блоки имеют фиксированную длину. Это упрощает ввод-вывод, размещение буфера в основной памяти и организацию блоков при хранении на внешних носителях. Второй вопрос: каким должен быть размер блоков относительно среднего размера записи. Дело в том, что чем больше размер блока, тем большее количество записей будет передано одной операцией ввода/вывода. Это является преимуществом при последовательной обработке или последовательном поиске в файле, поскольку с использованием блоков большого размера количество операций ввода-вывода уменьшается, что приводит к увеличению скорости обработки. С другой стороны, если доступ к записям происходит произвольно, использование блоков больших размеров приведет к нежелательной пересылке неиспользуемых 5. Операции ввода-вывода и файлы записей. Однако в целом можно утверждать, что использование блоков больше1 размера уменьшает время передачи данных при вводе-выводе. Тем не менее бл< кам большого размера необходимы большие буфера ввода/вывода, что привод» к усложнению управления ими. Для данного размера блока могут использоваться три метода группирования. • Фиксированное группирование. Используются записи фиксированно длины, и в блоке хранится целое количество записей. При этом в кбнп каждого блока может появиться неиспользуемое пространств (внутренняя фрагментация). • Сцепленное группирование переменной длины. Используются запис переменной длины, причем их упаковка в блоки происходит без нал* чия неиспользуемого пространства. Так, некоторые записи должны сщ плять два блока. • Группирование переменной длины без сцепления. Используются запис переменной длины без сцепления. В большинстве блоков имеются пу< тые пространства, что вызвано невозможностью использования част блока, когда размер следующей записи больше, чем оставшееся неи( пользуемое пространство. Эти методы показаны на рис. 12.6. Предполагается, что файл сохраняете на диске в виде последовательности блоков. При использовании иной схем] размещения файлов эффект группирования не изменится (см. раздел 12.6). ■ Группирование фиксированной длины — самый распространенный режи] для последовательных файлов с записями фиксированной длины. Группировани переменной длины со сцеплением эффективно в плане экономии места при хрг нении и не ограничивает размер записей. Однако эта технология сложна в рег лизации. Записи, сцепляющие два блока, требуют две операции ввода-вывод£ что вызывает сложности при обновлении независимо от используемой организг ции файла. Группирование переменной длины без сцепления приводит к появл* нию пустого пространства и ограничению размера записи размером блока. Технология группирования записей может взаимодействовать с аппаратныз обеспечением виртуальной памяти, если таковое применяется. В среде с вирт> альной памятью желательно, чтобы единицей пересылки данных была етранищ Страницы обычно довольно малы, поэтому практически нет возможности рас сматривать страницу в качестве блока для группирования без сцепления. Cooi ветственно, некоторые системы объединяют несколько страниц для создани блока большего размера, предназначенного для файлового ввода-вывода. Тако: подход используется в файлах VSAM мэйнфреймов IBM. Глава 12. Управление файлами $2?
,:-,v - R1 R2 R3 R4 -J Дорожка 1 Ь*У R5 R6 R7 Фиксированное группирование R8 Дорожка 2 R1 R2 R3 R4 R4 R5 R6 Дорожка 1 R6 R7 R8 R9 R9 R10 R11 R12 R13 Дорожка 2 Переменное группирование: сцепленное R1 R2 R3 R4 R5 Дорожка 1 R6 R7 R8 R9 R10 Дорожка 2 Переменное группирование: без сцепления □ Данные СУ Пустая область при размещении записи в блоке Интервалы, связанные с аппаратным обеспечением Пустая область при размещении блока на дорожке Рис. 12.6. Методы группирования записей [WIED87] Пустая область при размещении в блоке записей фиксированной длины &*ч :*т^Ш 12.6. УПРАВЛЕНИЕ ВНЕШНЕЙ |ШЛ5ШЬЩ Файл, хранящийся в устройстве внешней памяти, состоит из набора блоков. За выделение блоков файлам отвечает либо операционная система, либо система управления файлами, что порождает две проблемы, связанные с управлением. Первая проблема — пространство вторичной памяти должно распределяться между файлами, а вторая — при этом необходим контроль за доступным для распределения пространством. Само собой, эти задачи тесно связаны между собой. Другими словами, метод, используемый при размеще- 624 Часть 5. Операции ввода-вывода и файлы нии файла, может оказывать влияние на метод управления свободным пространством. Этот раздел мы начнем с описания различных способов размещения файла на диске. После этого мы рассмотрим вопрос управления свободным пространством, а в завершение обсудим вопросы надежности. Размещение файлов При размещении файлов возникает ряд вопросов. 1. Необходимо ли сразу выделять файлу максимальное пространство при его создании? 2. Для файла отводится пространство в виде одного или нескольких непрерывных единиц, которые мы будем называть порциями. Размер такой порции может варьироваться от одного блока до целого файла. Какой размер порции следует использовать при размещении файла? 3. Какой тип структур данных или таблиц используется для учета порций файла? Такая таблица обычно называется таблицей размещения файлов (file allocation table — FAT). Теперь рассмотрим эти вопросы подробнее. Предварительное и динамическое размещение Стратегия предварительного размещения файла при запросе на его создание требует, чтобы заранее был известен максимальный размер файла. В ряде случаев, таких, как компиляция программ, получение файлов сводных данных или пересылка файла из другой системы по сети, эта величина ЙО- жет быть надежно оценена. Однако для большинства приложений такая оценка оказывается сложной, а то и попросту невозможной. В подобных случаях пользователям и разработчикам прикладных программ приходится преувеличивать оцениваемый размер файла, чтобы не оказаться в ситуации, когда заказанного размера будет недостаточно. Очевидно, что такая стратегия приводит к перерасходу дискового пространства, и предпочтительнее использовать динамическое размещение, при котором выделение пространства под порции файлов происходит по мере необходимости. Размер порции Другой вопрос касается размера порции, выделяемой файлу. Один предельный случай — выделение порции, достаточно большой для размещения всего файла. Другой предельный случай — распределение пространства на диске происходит по одному блоку. При выборе размера порции требуется компромисс между эффективностью работы с одним файлом и общей эффективностью системы. При анализе альтернативных вариантов рассматриваются следующие соображения [WIED87]. 1. Непрерывность пространства увеличивает производительность, в частности при выполнении операций типа Выбратъ_Следующую, а особенно транзакций, выполняемых в транзакционно-ориентированной операционной системе. Глава 12. Управление файлами 625
2. Наличие большого количества маленьких порций увеличивает размер таблиц, необходимых для управления информацией о размещении. 3. Наличие порций фиксированного размера (например, блоков) упрощает перераспределение пространства. 4. Наличие порций переменной длины или малого размера минимизирует распределенное, но неиспользуемое пространство. Естественно, что эти условия взаимосвязаны и должны рассматриваться вместе. В итоге мы получаем два основных варианта. • Большие непрерывные порции переменной длины. Обеспечивают лучшую производительность. Переменный размер помогает избежать наличия неис- ( пользуемых участков, а таблицы размещения файлов имеют небольшой размер. Однако при этом трудно организовать повторное использование дискового пространства. • Блоки. Небольшие порции фиксированного размера обеспечивают большую гибкость. При этом могут потребоваться таблицы, имеющие больший размер или сложную структуру. Непрерывность отсутствует, а блоки для файла выделяются по необходимости. Любой из вариантов совместим как с предварительным размещением, так и с динамическим. При использовании первого варианта файл размеща- , ется предварительно, как одна непрерывная группа блоков. Необходимость в таблице размещения файлов отпадает. Нужно лишь указать на первый блок ,* и количество размещаемых блоков. При выборе блочной структуры все необходимые порции размещаются одновременно. Это означает, что FAT файла имеет фиксированный размер. Используя порции переменного размера, придется иметь дело с фрагмента- ■ цией свободного пространства. Этот вопрос был затронут при рассмотрении распределения основной памяти в главе 7, "Управление памятью". Возможны еле- 1 дующие стратегии распределения. • Первый подходящий. Выбор первой неиспользуемой непрерывной группы - блоков подходящего размера из списка свободных блоков. '■ • Наилучший подходящий. Выбор наименьшей неиспользуемой группы, размер которой является достаточным. • Ближайший подходящий. Выбор неиспользуемой группы подходящего раз- v мера, которая ближе всех расположена к последнему размещенному файлу -i для увеличения локализации. Какая же из приведенных стратегий лучше? Сложность моделирования этих стратегий заключается в том, что необходимо учитывать множество факто- { ров, таких, как типы файлов, схемы доступа к ним, степень многозадачности, ., кэширование диска, дисковое планирование и другие. Методы размещения файлов Рассмотрев вопросы предварительного и динамического размещения . файлов, мы можем провести сравнительный анализ различных методов раз- ; мещения файлов. Наиболее широко используются три метода: непрерывный, .; 5. Оп раций ввода-вывода и файлы цепочечный и индексированный. В табл. 12.3 приведены некоторые характеристики каждого метода. *i Таблица 12.3. Методы размещения файлов Предварительное размещение Фиксированный или переменный размер порции Размер порции Частота размещения Время размещения Размер таблицы размещения файла Непрерывный Необходимо Переменный Большой Одинарное размещение Среднее Одна запись Цепочечный Возможно Фиксированы ые блоки Малый От низкой до высокой Длительное Одна запись Индексированный Возможно Фиксированные блоки Малый Высокая Короткое Большой Переменный Средний Низкая Среднее Средний При непрерывном размещении создаваемому файлу выделяется отдельное непрерывное множество блоков (рис. 12.7). Таким образом, это стратегия предварительного размещения с порциями переменного размера. Для каждого файла таблице размещения необходим только один элемент, определяющий начальный блок и длину файла. Непрерывное размещение является наилучшим с точки зрения индивидуального файла последовательного доступа. Для повышения производительности ввода-вывода при последовательной обработке одновременно может обрабатываться большое 'количество блоков. Выборка одиночного блока осуществляется очень просто. Например, если файл начинается с блока Ь, а искомый блок — i-й, то его местоположение на внешнем запоминающем устройстве определяется как b+i-l. Непрерывное размещение файла вызывает некоторые проблемы. Так, появляется внешняя фрагментация, что усложняет поиск непрерывных блоков подходящего раз* мера. Время от времени возникает потребность в выполнении упаковки для освобождения необходимого пространства на диске (рис. 12.8). Кроме того, как уже упоминалось, при предварительном размещении в момент создания файла следует объявлять его размер. Глава 12. Удравл ние файлами5 62
Таблица размещения файлов о| 1 '.| 1 «П «□ АУЛ *'//, i 30 %$ •1 1 «1 1 11s -* ,6| 1 «У/А 2б| | :ileD 31^ 2^ 'I 1 File В 12 ^ "I l File С АУЛ FileE 27| | 32| | File A 3r\Nl •I I 13 *V// kY/a A" ) зз| | *KSS 9: Л I *VA аул A I 34| | Рис. 12.7. Непрерывное размещение файлов os\\ 5 ю£а *v/, АШ A 1 зо| | Re A it^i File В 6 «Ш 1б| <^| 21| | A I 3,| | 2^| 7 :ileC FileE ,7| | 22| | 27| | 32| | w »У/ 13|^3 1o|"* Ц A 1 28| | зз| I t W/ Ш FileD A 1 29| | 34| | Имя файла File A File В File С FileD FileE Начальный блок 2 9 18 30 26 Длина 3 5 8 2 3 Таблица размещения файлов Имя файла File A File В File С FileD FileE Начальный блок 0 3 8 19 16 Длина 3 5 8 2 3 Рис. 12.8. Непрерывное размещение файлов (после уплотнения) 628 Часть 5. Он рации ввода-вывода it файлы Таблица размещения файлов Имя файла • • * File В • а а Начальный блок а ■ ■ 1 • ■ а Длина • « • 5 • • • " 4 -..$■ ■'-, it .*" :■-■ -V ■■i" Как противоположность непрерывному размещению разработан метод ей - чечного размещения файла (рис. 12.9). Обычно размещение выполняется о о - ному блоку. Каждый блок содержит указатель на следующий блок в цепо . В этой схеме таблице размещения файлов необходим только один элемент дл к - ждого файла, указывающий начальный блок и длину файла. Несмотря на т что в этой схеме возможно использование предварительного распределения блоко , все же обычно проще выделять блоки для файла при необходимости. Выбор л - ков происходит очень просто — в цепочку может быть добавлен любой с о - ный блок. Заботиться о внешней фрагментации при этом не надо, поск ль у блоки выделяются по одному. Такой тип физической организации лучше с подходит для файлов последовательного доступа, обработка данных в ко , рых выполняется последовательно. Для выбора отдельного блока файла необхо I о отследить всю цепочку до достижения искомого блока. ■< *■ Приведенная цепочечная методика имеет одну особенность — к ней непр е- ним принцип локализации. Поэтому при необходимости одновременной загрузки нескольких блоков файла (довольно обычная операция при последовательной обработке) требуется серия обращений к различным участкам диска. Пожалуй, наиболее ощутим этот эффект в однопользовательской системе, но может существенно влиять и на совместно используемую систему. Для решения данной проблемы некоторые системы периодически производят уплотнение файлов (рис. 12.10). Индексированное размещение решает ряд проблем непрерывного и цепочечного размещения файлов. В этом случае в таблице размещения файлов имеется отдельный одноуровневый индекс для каждого файла. Индекс содержит по одной записи для каждой порции файла. Обычно индексы файла физически не хранятся в виде части таблицы размещения файлов; вместо этого индексы файла сохраняются в отдельном блоке, и в элементе таблицы размещения файла имеется указатель на этот блок. Размещение может основываться как на блоках фиксированного размера (рис. 12.11), так и на блоках переменного размера Глава 12. Управление файл МИ . v9 о| I 5| 1 ю| | 15| | 20| | 25J | зо| | File В 1 е| 1 "1 1 16| 1 211 | 2б| | 311 | 2| | ?! 1 12'| | 1У| | 22| | 27| | 32| | 3 -л 8 . ,з| | 4 1 9| 1 14 18| | 19| | 23|—1 28 зз| | И | 29| | А I Рис. 12.9. Цепочечное размещение файлов
рис. 12.12). Поблочное расположение исключает внешнюю фрагментацию, в то Зремя как размещение по порциям переменного размера повышает степень локализации. В любом случае время от времени может выполняться уплотнение Ьайлов, которое позволяет уменьшить размер индекса при размещении с порциями переменной длины (но не при блочном распределении). Индексированное размещение поддерживает как последовательный, так и прямой доступ к файлу н потому является наиболее популярным видом файлового размещения. File В €3 «Q «а »\— 15| | 1б| 20| | 211 25| | 2б| 30| | 31| О «С 12| | 13| itO «С 22| | 23| 27| | 28| 1 32| | 33| 1 «1 J 1-4 .1 Н 1 Н J N J Н J Таблица размещения файлов Имя файла Начальный блок Длина ■ • • File В • а • Рис. 12.10. Цепочечное размещение файлов (после дефрагментации) о| 5| ю| 15| 20| А зо| RleB 1 «г2! 1 лЛ 1 1 п| 1 J«LJ 7| I 12| | 17| 1 лп\ 1 - 13| | 18| I \а Ul I | 211 | 22| | 23| | 24 | 2б| | 27| | 28 29| | Пз,ГЛ 321 1 зз| | 34П Имя файла • • • File В > • • ^ * * 1 8 з 14 28 Блок индекса ■ • • 24 • • • Таблица размещения файлов Рис. 12.11. Индексированное размещение с порциями блоков 6 Часть 5. Операции; ввода-вывода и файлы Таблица размещения файлов File В О 5 ю| 15 20 25 30 )| 1 1 I I 6| I I I п| I I I 16| I I | 21| | 1 1 2б| | 31 2 7| 121 171 22| 27l зг| 3 «I 13| ,в| 23IZ 28 33^ <U I 4 1 |,4 Н I \» 29 N 1 Имя файла Блок индекса File В • » t 24 • • « Рис. 12.12. Индексированное размещение с порциями переменного размера Управление свободным пространством Так же, как требуется управление пространством, выделяемым файлам, должно быть управляемым и пространство, которое в текущий момент не выделено ни одному файлу. Применяя любую из описанных выше технологий размещения файлов, нужно знать, какие блоки на диске доступны. Для этого в дополнение к таблице размещения файлов нам необходима таблица дискового размещения. Рассмотрим ее возможные реализации. Битовые таблицы ^ Этот метод использует вектор, содержащий по одному биту для каждого блока диска. Каждый ноль соответствует свободному блоку, а каждая единица — используемому. Например, для представленной на рис. 12.7 схемы необходим вектор длиной 35 бит, имеющий значение < 00111000011111000011111111111011000 Одно из преимуществ битовой таблицы состоит в относительной простоте поиска одного свободного блока или непрерывной группы свободных блоков. Второе преимущество — ее наименьший размер из всех возможных представлений. Однако даже такая таблица может оказаться внушительного размера. Объем памяти в байтах, необходимой для битовой карты, определяется следующим образом: Размер диска в байтах 8 х Размер блока файловой системы Так, для диска объемом 16 Гбайт с блоками размером 512 байт битовая таблица займет около 4 Мбайт. Можем ли мы выделить под битовую таблицу 4 Мбайт основной памяти? Если да, то поиск в таблице может осуществляться без обращений к диску. Однако даже при современных объемах памяти Глав*'1&. Управление файлами" 6131
4 Мбайт — это слишком много для одной функции. Альтернативой является перенесение битовой таблицы на диск. Однако на диске для 4-Мбайтовой битовой таблицы понадобится около 8000 дисковых блоков. Мы не можем затрачивать усилия на поиск в таком объеме дискового пространства всякий раз при необходимости найти один блок. Но даже если битовая таблица размещена в основной памяти, то полный поиск в таблице может снизить производительность файловой системы до недопустимого уровня. Это особенно проявляется в случаях, когда диск практически заполнен, и свободными на нем остаются лишь несколько блоков. Соответственно, большинство файловых систем, использующих битовые таблицы, поддерживают вспомогательные структуры данных, резюмирующие содержимое поддиапазонов битовой таблицы. Например, таблицу можно логически разделить на несколько поддиапазонов одинакового размера. Сводная таблица может включать информацию о количестве свободных блоков для каждого поддиапазона и наибольшем непрерывном блоке. При потребности в некотором количестве последовательных блоков файловая система может просканировать сводную таблицу для поиска соответствующего поддиапазона, а затем произвести конкретный поиск в нем. Цепочки свободных порций Свободные порции могут быть связаны в цепочки с использованием указателей и значений длины каждой свободной порции. Этот метод приводит к не- ■ значительным накладным расходам, поскольку нет необходимости в таблице дискового размещения — требуется только указать начало цепочки и длину первой порции. Этот способ подходит для всех методов файлового размещения. Если размещение происходит поблочно, то осуществляется выбор свободного блока в вершине цепочки и соответствующее изменение указателя на начало цепочки и ... значения длины. При размещении порциями переменной длины можно использовать алгоритм первого подходящего — извлекая по одному из цепочки заго- -■■ ловки порций до нахождения подходящей для нас. v Описанный метод обладает и недостатками. После использования в течение некоторого времени диск становится довольно фрагментированным и ■ большое число порций может иметь длину, сравнимую с одиночным блоком. .:. Заметьте также, что при каждом размещении блока до того, как записывать в него данные, требуется произвести чтение блока для определения указате- ; ля на следующий за ним свободный блок, который теперь будет первым в ; цепочке. Если при файловой операции необходимо сразу разместить большое ; количество отдельных блоков, это значительно замедлит процедуру создания , файла. Точно так же расходуется очень много времени и при удалении высо- кофрагментированных файлов. Индексирование При индексировании свободное пространство рассматривается как файл ; (как и при размещении файлов, здесь используется индексная таблица). Для эффективной работы индексы должны базироваться на порциях переменного размера, а не на блоках. Поэтому каждой свободной порции на диске соответст- ,; вует один элемент в таблице. Такой подход обеспечивает эффективную поддерж- \ ку всех методов размещения файлов. 632 Часть 5 Операции ввода-вывода и файлы Список свободных блоков В этом методе каждому блоку присваивается порядковый номер, а список номеров всех свободных блоков содержится в зарезервированной области диска. В зависимости от размера диска для сохранения одного номера блока требуется 24 или 32 бит. Поэтому размер списка свободного блока в 24 или 32 раза больше размера соответствующей битовой таблицы и, таким образом, он должен храниться на диске, а не содержаться в основной памяти. Несмотря на это, предложенный метод довольно неплох. Рассмотрим следующие положения. 1. Дисковое пространство, отводимое под список свободных блоков, занимает меньше 1% общего пространства диска. При использовании 32-битовой нумерации блоков расход составляет 4 байт на каждый 512-байтовый блок. 2. Несмотря на то что список свободных блоков слишком велик для хранения в основной памяти, есть два эффективных метода хранения небольшой части списка в основной памяти. а. Список может рассматриваться как стек, первые несколько тысяч элементов которого содержатся в основной памяти. При размещении нового блока он извлекается из вершины стека (содержащейся в основной памяти). Аналогично, при освобождении блока его номер возвращается в стек. Передача данных между частями стека в основной памяти и на диске происходит только тогда, когда часть стека в основной памяти становится либо переполненной, либо пустой. Поэтому число обращений к диску сведено к минимуму. б. Список может быть организован в виде очереди; в основной памяти находится несколько тысяч ее элементов — как из вершины, так и из хвоста очереди. Блок размещается путем извлечения первой записи из вершины очереди, а освобождается путем добавления его номера в конец очереди. Передача данных между диском и основной памятью происходит только в том случае, когда размещенная в основной памяти часть вершины очереди освобождается или когда хвост очереди в основной памяти переполняется. В любой из описанных стратегий можно использовать фоновый поток, который будет заниматься сортировкой списка в основной памяти с целью облегчения непрерывного распределения. Надежность Рассмотрим следующий сценарий. 1. Пользователь А производит запрос на размещение для добавления информации к существующему файлу. 2. Запрос принимается, и таблицы дискового и файлового размещения записей обновляются в основной памяти, но не на диске. 3. В системе происходит сбой и последующая перезагрузка 4. Пользователь Б производит запрос на размещение файла, и файл размещается в пространстве, перекрывающемся с последним размещением по запросу пользователя А. Глава 12. Управление.файлавд, - 633
Пользователь А обращается к выделенной ему ранее (а теперь занятой пользователем Б) порции с использованием ссылки, сохраненной в файле пользователя А. Проблема возникает из-за того, что для повышения эффективности система ;ржала копию таблицы дискового размещения в основной памяти. Чтобы цотвратить ошибки такого типа, при запросе на размещение файла следует [олнить ряд действий. Заблокировать таблицу дискового размещения на диске. Это предотвратит внесение изменений в таблицу другими пользователями до завершения обработки данного запроса. , Выполнить поиск доступного пространства в таблице дискового размещения. Предполагается, что копия таблицы дискового размещения всегда содержится в основной памяти. Если это не так, то сначала таблица должна быть считана в основную память. . Распределить пространство, обновить таблицу дискового размещения в памяти и на диске. При цепочечном дисковом размещении следует также обновить указатели на диске. . Обновить таблицу размещения файлов в основной памяти и на диске. i . Деблокировать таблицу дискового размещения. Этот метод предохраняет от ошибок, но при частом распределении малень- £ к порций приводит к существенному снижению производительности. Чтобы ? зныыить этот эффект, можно использовать пакетную схему размещения. В ?■ м случае для размещения выделяется пакет свободных порций на диске. Со- \ ютствующие порции на диске помечаются как используемые. Пакетное раз- д сцение может происходить в основной памяти. При исчерпании пакета обнов- '"■ гтся таблица размещения файлов на диске и происходит выделение нового па-1 га. При сбое системы порции диска, помеченные как используемые, должныД ть очищены перед их повторным размещением (метод очистки зависит от нкретных характеристик файловой системы). £7. УПРАВЛЕНИЕ ФАЙЛАМИJfrUNIX jggfa fti-4^iSR~«- a*iw Ядро системы UNIX рассматривает файлы как потоки (последовательности) f' йтов. Любая внутренняя логическая структура файлов связана с конкретными \, иложениями. UNIX же работает с физической структурой файлов. Различают четыре типа файлов. L. Обычные— файлы, содержащие информацию, введенную пользователем,"/ прикладной программой или системной утилитой. £ 2. Каталоги — содержат списки имен файлов и указатели на индексные узлы 'е (index node — inode), рассматривающиеся позже. Каталоги имеют иерархи- . ческую структуру (см. рис. 12.4). Каталоги файлов представляют собой] обычные файлы, обладающие особыми привилегиями защиты от записи,-. так что запись в них может произвести только файловая система, в то вре- .* мя как программам пользователя разрешен доступ для чтения. ^ и Часть 5. Операции ввода-вывода и файлы 3. Специальные — используются для доступа к периферийным устройствам, таким, как терминалы или принтеры. Как упоминалось в разделе 11.8, каждое устройство ввода-вывода связано с определенным файлом. 4. Именованные — именованные каналы, рассматривавшиеся в разделе 6.7. Здесь мы рассмотрим работу с обычными файлами. Индексные узлы Управление всеми типами файлов операционной системы UNIX осуществляется посредством индексных узлов (inode). Узел является управляющей структурой, содержащей ключевую информацию, необходимую операционной системе для работы с определенным файлом. С одним узлом может быть связано несколько имен файлов, однако активный узел связан исключительно с одним файлом, и каждый файл управляется исключительно одним узлом. В узле сохраняются атрибуты файла и права доступа к нему, а также другая управляющая информация. В табл. 12.4 перечислено содержимое узла. Таблица 12.4. Информация, содержащаяся в индексном узле на диске UNIX Режим файла Счетчик связей ID владельца ID группы Размер файла Адреса файла Последнее обращение Последнее изменение Изменение узла 16-битовый флаг, хранящий права доступа и выполнения, связанные с файлом: 12-14 Тип файла (обычный, каталог, специальный символьный или блочный, канал FIFO) 9-11 Флаги выполнения 8 Права владельца на чтение 7 Права владельца на запись 6 Права владельца на выполнение 5 Права группы на чтение 4 Права группы на запись 3 Права группы на выполнение 2 Права остальных на чтение 1 Права остальных на запись О Права остальных на выполнение Количество ссылок каталога на этот узел Владелец файла Группа, владеющая файлом Количество байтов в файле 39 байт адресной информации Время последнего обращения к файлу Время последней модификации файла Время последней модификации узла Размещение файлов Размещение файлов выполняется поблочно, динамически, по мере необходимости. Следовательно, блоки файла на диске не обязательно образуют непрерывную область. Для отслеживания файлов используется индексный метод; часть индекса хранится в узле файла. Узел включает 39 байт адресной информа- Глава 12. Управление файлами 635
I ции, организованной как тринадцать 3-байтовых адресов, или указателей. Первые 10 адресов указывают на первые 10 блоков данных файла. Если файл длиннее 10 блоков, то используется один или несколько уровней косвенности. • Одиннадцатый адрес узла указывает на блок на диске (блок первого уровня косвенности), содержащий следующую часть индекса. Этот блок содержит указатели на последующие блоки файла. • Если файл содержит еще большее количество блоков, то двенадцатый адрес уз па укажет блок второго уровня косвенности- Этот блок содержит список адресов дополнительных блоков первого уровня косвенности. В свою очередь, каждый из них содержит указатели на файловые блоки. • Если файл содержит еще больше блоков, для которых не хватает косвенности второго уровня, то тринадцатый адрес в узле указывает на блок третьего уровня косвенности. Этот блок указывает на дополнительные косвенные блоки второго уровня. Таблица 12.5. Емкость UNIX-файла Уровень Количество блоков Количество байтов ^ Прямой 10 10 Кбайт ;.' Один уровень косвенности 256 256 Кбайт >) Два уровня косвенности 256х256=65К 65 Мбайт Три уровня косвенности 256х65К=16М 16 Гбайт ■' I' Эта схема показана на рис. 12.13. Общее количество блоков данных в файле '■■■' зависит от емкости блоков фиксированного размера в системе. В UNIX System V:*' длина блоков равна 1 Кбайт, и каждый блок может содержать до 256 адресов ■ блоков. Следовательно, максимальный размер файла в этой схеме превышает 16 Гбайт (табл. 12.5). Л Такая схема обладает рядом преимуществ. ? 1. Узел имеет фиксированный относительно небольшой размер и потому мо-,Ч жет длительное время содержаться в основной памяти. ;,,. 2. Доступ к небольшим файлам осуществляется с малым уровнем косвен^- ности (или и вовсе без него), что сокращает время обработки запроса li доступа к диску. -.'К 3. Теоретический максимальный размер файла достаточно велик для удовле-', творения практически всех приложений 636 Часть 5. Операции ввода-вывода и файлы Прямой указатель (0) Прямой указатель(1) Прямой указатель (2) Прямой указатель(3) Прямой указатель(4) Прямой указатель(5) Прямой указатель (6) Прямой указатель(7) Прямой указатель(8) Прямой указатель (9) Указатель первого уровня косвенности Указатель второго уровня косвенности Указатель ретьего уровня косвенности Поля адресов индексного узла Блоки на диске Рис. 12.13. Схема адресации блоков в UNIX Глава 12. Управление файлами 637
• i '- 12.8. ФАЙЛОВАЯ СИСТЕМА WINDOWS 2000 S Windows 2000 (W2K) поддерживает несколько файловых систем, включая ?АТ, которая поддерживается Windows 95, MS-DOS и OS/2. Однако разработчики W2K спроектировали новую файловую систему, W2K File System (NTFS3), которая предназначена для удовлетворения высоких требований рабочих станций и серверов. Примерами приложений такого уровня могут служить: I | • клиент-серверные приложения, такие, как файловые серверы, вычисли тельные серверы и серверы баз данных; -ь - ""£ ■%' • • инженерные и научные приложения с интенсивным использованием ресурсов; \- • сетевые приложения больших корпоративных систем. \-> В этом разделе приведен обзор NTFS. ,Vf Г. "■ J Ключевые возможности NTFS л NTFS представляет собой гибкую и мощную файловую систему, которая, % как мы увидим, построена на простой и элегантной модели. К наиболее достой- ^\ ным внимания особенностям NTFS относятся следующие. f !• • Способность восстановления данных. Первой в списке требований к новой :,•>. файловой системе W2K была способность восстановления данных при пол-? ном отказе системы и сбоях дисков. В таких случаях NTFS способна рекон-| струировать дисковые тома и вернуть их к согласованному состоянию. Это/" достигается посредством использования модели обработки транзакций для:-/ операций обмена в файловой системе; каждый значительный обмен рас-£ сматривается как атомарное действие, которое либо выполняется полно-\: стью, либо не выполняется вовсе. Кроме того, NTFS использует избыточное, хранение критических данных файловой системы. • Безопасность. Для обеспечения безопасности NTFS использует объектную? модель W2K. Открытый файл реализуется как файловый объект с дескрип-f тором, определяющим атрибуты безопасности. ■»... • Диски и файлы больших объемов. NTFS поддерживает очень большие дис-,^ ки и файлы более эффективно по сравнению с другими файловыми систе-';. мами, включая FAT. ■'Ж'' • Множественные потоки данных. Содержимое файла рассматривается как поток байтов. В NTFS можно определить несколько потоков данных для од- £ ного файла. Примером использования этой особенности служит использова-;^ ние W2K удаленными системами Macintosh для хранения и получения;? файлов. В компьютерах Macintosh каждый файл состоит из двух компонен- • тов: данных файла и ветви ресурса, которая содержит информацию о фай--», ле. NTFS рассматривает эти компоненты как два потока данных. -f 3 Данная файловая система успешно применялась в Windows NT. откуда и пере?- шла о W2K. — Прим. перев. ц 638 Часть 5. Операции ввода-вывода и файлы • Обобщенная индексация. NTFS связывает с каждым файлом набор атрибутов. Набор описаний файлов в системе управления файлами организован как реляционная база данных, поэтому файлы могут быть индексированы по любому атрибуту. Том NTFS и файловая структура NTFS использует следующие концепции дискового хранения. • Сектор. Наименьшая единица физического хранения на диске. Размер данных в байтах является степенью двойки и почти всегда равен 512 байт. • Кластер. Один или несколько последовательных секторов на одной дорожке. Размер кластера в секторах является степенью двойки. • Том. Логический раздел диска, состоящий из некоторого количества кластеров и используемый файловой системой для распределения пространства. В любой момент времени том состоит из информации файловой системы, набора файлов и нераспределенного пространства, оставшегося в томе, которое может быть выделено файлам. Том может занимать как весь диск, так и его часть или охватывать несколько дисков. При использовании RAID 5 том состоит из полос, охватывающих несколько дисков. Максимальный размер тома NTFS составляет 264 байт. Кластер является фундаментальной единицей размещения в файловой системе NTFS, которая не распознает секторы. Предположим, например, что размер каждого сектора составляет 512 байт и что система настроена так, что в одном кластере содержатся по два сектора (один кластер = 1 Кбайт). При создании пользователем файла размером 1600 байт файлу отводятся два кластера. Если впоследствии пользователь обновляет файл и он увеличивается до 3200 байт, то ему выделяются еще два кластера. Кластеры, выделяемые файлу, не обязательно должны образовывать непрерывный блок; в NTFS допускается фрагментация файла на диске. В настоящее время максимальный размер файла, поддерживаемый NTFS, составляет 232 кластеров, что эквивалентно максимум 248 байт. Использование кластеров при размещении файлов делает систему NTFS независимой от размеров физических секторов. Это позволяет системе NTFS без препятствий поддерживать нестандартные диски с размером сектора, не равным 512 байт, а также эффективно поддерживать диски очень большой емкости и файлы больших размеров посредством большего размера кластера. Эффективность обеспечивается тем, что файловая система должна отслеживать каждый кластер, выделенный файлу; использование кластеров большего размера облегчает эту задачу. В табл. 12.6 приведены размеры по умолчанию кластеров системы NTFS. Эти размеры зависят от размера тома. Размер кластера, используемого в конкретном томе, устанавливается системой NTFS при форматировании. Глава 12. Управление файлами 639
блица 12.6. Разделы NTFS и размеры кластеров змер тома 512 Мбайт 512 Мбайт - 1 Гбайт 1 Гбайт - 2 Гбайт 2 Гбайт - 4 Гбайт 4 Гбайт - 8 Гбайт 8 Гбайт - 16 Гбайт 16 Гбайт - 32 Гбайт > 32 Гбайт Количество секторов в кластере Размер кластера 1 2 4 8 16 32 64 128 512 байт 1 Кбайт 2 Кбайт 4 Кбайт 8 Кбайт 16 Кбайт 32 Кбайт 64 Кбайт хема тома NTFS NTFS использует простой и в то же время мощный подход в организации нформации на томе диска. Каждый элемент тома представляет собой файл, и аждый файл состоит из набора атрибутов (даже данные, хранящиеся в файле, осматриваются как атрибут). При такой простой структуре достаточно не- эльшого количества функций общего назначения для организации и управле- ия файловой системой. Загрузочный сектор раздела Главная файловая таблица Рис. 12.14. Схема тома NTFS На рис 12 14 показана схема тома NTFS. состоящего из четырех областей. Тервы ™2ько секторов любого тома занимает загрузочный<~ *££ несмотря на название, размер этой области может быть до 16 секторе^°**_ кащий информацию о схеме тома и структурах файловой ^^стьГслеДует гальная загрузочная информация и код загрузки. За этой ^м™ **^* л^вная файловая таблица (master file table - MFT), содержащая информацию б всех № и папках (каталогах) этого тома NTFS а также^ ин^Рмацию- свободном пространстве. По сути, MFT представляет собой списо* В^™ С^_ жимого тома NTFS, организованный в виде множества строк в структуре реля ЦИТа^аЫстьюНМ^ следует область, обычно длиной 1 Мбайт, содержащая системные файлы. Среди файлов этой области находятся следующие. . MFT2. Зеркальное отображение первых трех строк MFT, используемых для гарантированного доступа к MFT в случае сбоя одного сектора. . Системный журнал. Список щагов транзакций, используемый при восста- новлении данных в NTFS. . Битовая карта кластеров. Представление тома, указывающее используемые кластеры. I I V.I 640 Часть 5. Операции ввода-вывода и файлы • Таблица определения атрибутов. Определяет типы атрибутов, поддерживаемых в этом томе, и показывает, могут ли они быть проиндексированы, а также могут ли они быть восстановлены во время системной операции восстановления Главная файловая таблица Сердцем файловой системы в W2K является MFT. MFT организована в виде таблицы строк переменной длины, именуемых записями. Каждая строка описывает файл или папку этого тома, включая MFT, которая рассматривается как файл. Если содержимое файла достаточно мало, то он полностью размещается в строке MFT. В противном случае строка для этого файла будет содержать частичную информацию, а оставшаяся часть файла будет распределена среди доступных кластеров тома с указателями на эти кластеры в строке MFT для данного файла. Каждая запись MFT состоит из набора атрибутов, служащих для определения характеристик файла (или папки), а также для определения содержимого файла. В табл. 12.7 перечислены атрибуты, которые могут находиться в строке MFT (обязательные атрибуты выделены темным фоном). Таблица 12.7. Типы атрибутов файлов и каталогов в Windows NTFS Тип атрибута Описание Стандартная Включает атрибуты доступа (только для чтения, чтение/запись и т.д.); информация временные метки, включая время создания и последней модификации файла; количество каталогов, указывающих на файл (счетчик связей) Список Список атрибутов, составляющих файл, и ссылка на другую запись атрибутов MFT, в которой размещены атрибуты. Используется, когда все атрибуты не помещаются в одну запись MFT Имя файла Файл (или каталог) должен иметь одно или несколько имен Дескриптор Определяет владельца файла и пользователей, которым разрешен дос- безопасностн туп к файлу Данные Содержимое файла. Файл содержит один неименованный атрибут данных по умолчанию, и может иметь один или несколько именованных атрибутов данных Корневой Используется для реализации папок индекс Размещение Используется для реализации папок индекса Информация о Включает информацию, относящуюся к тому, например версия томе имя тома Битовая Карта, предоставляющая записи, используемые MFT или каталогом ' .; карта Способность восстановления данных NTFS позволяет восстанавливать согласованное состояние файловой си мы после краха системы или сбоя диска. Ключевыми элементами, поддер и" вающими восстановление, являются следующие (рис. 12.15). - , Глава 12. Управление файлами
Диспетчер ввода-вывода. Включает драйвер NTFS, обрабатывающий основные функции NTFS — открытие и закрытие файла, чтение, запись. Кроме того, может использоваться программный модуль RAID (FTDISK). Сервис системного журнала. Обеспечивает регистрацию дисковых записей. Системный журнал используется для восстановления тома NTFS при сбое в системе. Диспетчер кэш-памяти. Отвечает за кэширование чтения и записи файлов для улучшения производительности. Диспетчер кэша оптимизирует дисковый ввод-вывод путем использования методов отложенной записи и отложенного подтверждения, описанных в разделе 11.7. Диспетчер виртуальной памяти. NTFS обращается к кэшированным файлам путем отображения файловых ссылок в ссылки виртуальной памяти и чтения и записи виртуальной памяти. Служба системного журнала Запись транзакции I Чтение/запись файла Сброс журнала Запись на диск кэша Диспетчер кэша Загрузка данных из диска в память Диспетчер ввода-вывода Драйвер NTFS Драйвер отказоустойчивости Драйвер диска Чтение/запись томов RAID Чтение/запись диска Обращение к отображенному файлу или сброс кэша I Диспетчер виртуальной памяти 13- Е Рис. 12Л5. Компоненты NTFS [CUST94] М Важно обратить внимание на то, что используемые системой NTFS проце- <уры восстановления созданы для восстановления системных данных а не со <ержимого файлов. Поэтому пользователь не должен потерять том ИЛИ СТ^е >у каталогов и файлов после сбоя системы. Тем не менее полное »°™—«™ данных пользователей файловой системой не гарантируется. Для полноговое становления, включая данные пользователей, необходимы более мощные и ре гурсоемкие средства восстановления. _„гнгт. Суть процедуры восстановления данных в NFTS заключается в регист рации Каждая операция, изменяющая файловую систему, <»™™™ как транзакция. Каждая подоперация транзакции. *™°изменя3?„„рует"я структуры данных файловой системы, перед записью на диск РегистР"Р^ТСЯ в системном журнале. При сбое в системе он позволяет частичнс—лее* ной транзакции при восстановлении быть либо выполненной повторно, либо оказаться отмененной. 642 Часть 5. Операции ввода-вывода и файлы В общих чертах эти этапы описаны в [CUST94]. 1. NTFS сначала вызывает системный журнал для записи в него в кэш-памяти всех транзакций, модифицирующих структуру тома. 2. NTFS модифицирует том (в кэш-памяти) 3. Диспетчер кэш-памяти сбрасывает системный журнал на диск. 4. После того как обновленный системный журнал успешно сброшен на диск, диспетчер кэш-памяти перемещает изменения тома на диск. [12.9. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ ' И КОНТРОЛЬНЫЕ ВОПРОСЫ Система управления файлами представляет собой набор системных программ, которые предоставляют пользователям и прикладным программам возможность использования файлов, включая работу с файлами, обслуживание каталогов и управление правами доступа. Система управления файлами обычно рассматривается как системный сервис, обслуживаемый операционной системой, а не как часть операционной системы. Тем не менее в любой системе как минимум часть функций управления файлами выполняется операционной системой. Файл представляет собой набор записей. Способ доступа к записям файла определяется его логической организацией и в некоторой степени — физической организацией на диске. Когда изначально предполагается обрабатывать файл целиком, наиболее простым и подходящим способом оказывается последовательная организация файла. Если необходим как последовательный, так и произвольный доступ к файлу, то в этом случае наилучшим решением будет индексированный последовательный файл. Если же доступ к файлу предполагается осуществлять исключительно случайным образом, то наиболее подходящей организацией файла является индексированная или хешированная организация. Какой бы тип файлов не был выбран, для полноценной работы необходима возможность использовать каталоги, позволяющая иерархически организовывать файлы. Такая организация облегчает как управление файлами, так и управление правами доступа и другими сервисами. Файловые записи, даже если они имеют фиксированный размер, обычно не соответствуют размерам физических блоков диска. Поэтому, естественно, необходима некоторая стратегия группирования записей. Компромисс между сложностью, производительностью и использованием дискового пространства определяет используемую стратегию группирования. Ключевой функцией любой схемы управления файлами является управление дисковым пространством. Для управления размещением файлов могут использоваться разные методы и структуры данных. Помимо размещения файлов требуется управление свободным дисковым пространством. Ключевые термины База данных Запись Индексированный файл Битовая таблица Индексно- Имя файла Блок последовательный файл Каталог файлов Глава 12. Управление файлами 643
Слючевое поле Размещение файла Таблица размещения Детод доступа Система управления файла jo4e файлами Хешированный файл 1олное имя файла Таблица дискового Файл Тоследовательный файл размещения Рабочий каталог Контрольные вопросы 12.1. В чем различие между полем и записью? 12.2. В чем различие между файлом и базой данных? 12.3. Что представляет собой система управления файлами? 12.4. Какие критерии следует учитывать при выборе организации файла? 12.5. Перечислите и кратко опишите пять типов организации файлов. 12.6. Почему среднее время поиска записи в индексно-последовательном файле меньше, чем в последовательном файле? 12.7. Какие типичные операции могут выполняться с каталогом? 12.8. Как связаны полное имя файла и рабочий каталог? 12.9. Какие типичные права доступа могут быть предоставлены (или в которых может быть отказано) определенному пользователю по отношению к некоторому файлу? 12.10. Перечислите и кратко опишите три метода группирования. 12.11. Перечислите и кратко опишите три метода размещения файлов. 12.10. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА . Издано много хороших книг по управлению файлами. Возможно, наиболее полезной из них является [WIED87], описывающая многочисленные подходы к управлению файлами и охватывающая все вопросы, проиллюстрированные на рис. 12.2, начиная с дискового планирования и заканчивая файловой структурой. [LIVA90] содержит качественный обзор и сравнительньГй анализ производительности файловых структур. В [GROS86] представлены вопросы, относящиеся как к файловому вводу-выводу, так и к методам доступа. Здесь содержится также общее описание всех структур управления, необходимых файловой системе. Книга [FOLK98] посвящена обработке файлов, и рассматривает такие вопросы, как поддержка, поиск, сортировка и совместное использование файлов. В [CUST94] представлен обзор файловой системы NT; детали можно найти в [NAGA97]. CUST94 Custer H. Inside the Windows NT File System. — Redmond, WA: Microsoft. Press, 1994. FOLK.98 Folk M., Zoellick B. File structures: An Object-Oriented Approach with ■ C++. — Reading, MA: Addison-Wesley, 1998. GROS86 Grosshans D. File Systems: Design and Implementation. — Englewood Cliffs, N J: Prentice Hall, 1986. i/t^... . ,"- *. .* 644 Часть 5. Операции ввода-вывода и файлы | LIVA90 Livadas P. File Structures: Theory and Practice. — Englewood Cliffs, NJ- ! Prentice Hall, 1990. ■ NAGA97 Nagar R. Windows NT File Internals. — Sebastopol, CA; O'Reilly, 1997. WIED87 Wiederhold G. File Organization for Database Design. — New York- McGraw-Hill, 1987. 12.11. ЗАДАЧИ ■sr Ш£ъ - Л.Г*- Ж1ЙХЯЛ ^yei. 12.1. Обозначим: В — размер блока; R — размер записи; Р — размер указателя блока; F — коэффициент группирования (ожидаемое количество записей в блоке). Выведите формулу для F для всех методов группирования, показанных ъ рис. 12.6. 12.2. Одно из решений проблемы потери непрерывности расположения фай/, на диске при распределении по требованию заключается в увеличени размера выделяемых порций при увеличении файла. Например, начнем размера порции, равного одному блоку, и для каждого последующе1 размещения будем удваивать этот размер. Рассмотрим файл с п записям с коэффициентом группирования F и предположим, что в качестве та1 лицы размещения файлов используется простой одноуровневый индекс. а. Определите верхний предел количества элементов в таблице размещена файлов как функцию F и п. б. Чему равно максимальное количество никогда не используемого прострао ства, выделенного файлу? 12.3. Какую организацию файла следует выбрать для получения максимально эффективности (в плане скорости доступа, использования дискового пр< странства и простоты обновления), если данные: а. обновляются не часто, при частом обращении в произвольном порядке; б. обновляются часто, при относительно частом доступе; в. обновляются часто, при частом обращении в произвольном порядке. 12.4. Каталоги могут быть реализованы либо как "специальные файлы" с огран! ченным количеством способов доступа, либр как обычные файлы данных. чем достоинства и недостатки каждого подхода? 12.5. Некоторые операционные системы имеют древовидную файловую структуру достаточно сильно ограниченной высотой дерева. Как это влияет на работ пользователей? Насколько это упрощает проектирование файловой систем (если такое упрощение имеет место)? 12.6. Рассмотрим иерархическую файловую систему, в которой свободное дисков* пространство содержится в списке свободного пространства. а. Предположим, что утерян указатель на свободное пространство. Способ* ли система воспроизвести список свободного пространства? б. Предложите схему, гарантирующую, что при однократном сбое памят этот указатель никогда не будет утерян. 12.7. Рассмотрим организацию файлов UNIX, представленную на рис. 12.1 J Пусть в каждом узле содержится 12 прямых указателей блоков и пр< стой, двойной и тройной указатели. Далее положим, что размер систел Глава 12. Управление файлами 64
ного блока и размер дискового сектора равны 8 Кбайт. Допустим, что размер указателя дискового блока — 32 бит (8 бит для указания физического диска и 24 байт для указания физического блока). а. Какой максимальный размер файла, поддерживаемый в этой системе? б. Какой максимальный размер раздела файловой системы, поддерживаемого в этой системе? в. Предположим, что в основной памяти не содержится ничего, кроме индексного узла. Сколько обращений к диску потребуется для доступа к байту в позиции 13423956? 16 Часть 5. Операции ввода-вывода и файлы часть б Распределенные системы Традиционно функция обработки данных организуется централизованно. В централизованной архитектуре поддержка обработки данных может обеспечиваться как одним компьютером, так и кластером компьютеров. Множество задач использует результаты обработки данных там же, где они были получены — т.е. на том же компьютере или в пределах того же кластера. Имеется и другой класс задач, когда результаты обработки данных должны использоваться где-то в совершенно ином месте, не там, где они были получены. Примером может служить система, в которой функция ввода данных (скажем, о продажах или о наличии товара на складах) выполняется персоналом, физически расположенным в разных частях организации (может быть, даже в разных частях земного шара). При применении централизованной архитектуры каждый пользователь снабжен локальным терминалом, подключенным к центральной системе обработки данных. В такой централизованной архитектуре имеется ряд привлекательных черт. Такой подход экономичен как с точки зрения используемого программного и аппаратного обеспечения, так и с точки зрения квалифицированного обслуживающего персонала, который отвечает за работу одного центра обработки данных. Распределенная обработка данных, при которой процессоры, данные и другие составляющие систем обработки данных могут быть рассредоточены по всей организации, включает разделение функций компьютеров и обладает такими достоинствами, как малое время отклика, высокая доступность, совместное использование дорогостоящих ресурсов, возможность инкрементального наращивания мощности системы. Для полного раскрытия всех перечисленных достоинств распределенной обработки данных операционная система должна обеспечивать поддержку ряда функций распределенной обработки данных. Сюда входит обмен данными среди машин, возможность кластеризации компьютеров и управления процессами в распределенной среде.
ЩЖВОДИТЕЛЬ ПО ЧАСТИ 6 «***'£■ ■---ч?^*** i^:*sa»"-3u-K - шва 13. Распределенные вычисления, архитектура шент/сервер и кластеры Эта глава рассматривает требования, предъявляемые к операционной сис- «е для поддержки сотрудничества ряда вычислительных систем. Здесь рас- атривается такая важная концепция, как архитектура клиент/сервер и требо- ния данной архитектуры к современным операционным системам, а также ос- вные механизмы ее реализации — передача сообщений и вызов удаленных оцедур. В этой же главе рассматривается и концепция кластеров. лава 14. Управление распределенными процессами Эта глава предоставляет читателю обзор ключевых вопросов, встающих при [зработке распределенных операционных систем. Здесь рассматриваются вопро- i миграции процессов, концепция распределенного глобального состояния, а 1кже взаимоисключения и блокировки в распределенной среде. 8 Часть 6- Распределенные системы ГЛАВА Распределенные вычисления, архитектура клиент/сервер и кластеры 13.1. Вычисления в архитектуре клиент/сервер 13.2. Распределенная передача сообщений 13.3. Вызов удаленных процедур 13.4. Кластеры 13.5. Windows 2000 Cluster Server 13.6. SUN Cluster 13.7. Кластеры Beowulf и Linux 13.8. Резюме, ключевые термины и контрольные вопросы 13.9. Рекомендуемая литература 13.10. Задачи 13
возрастанием доступности недорогих, но достаточно мощных персональных компьютеров и серверов усиливается тенденция к использованию распреде- _У ленной обработки данных (distributed data processing — DDP), при которой юцессоры, данные и другие составляющие систем обработки данных могут [ть рассредоточены по всей организации. Системы DDP включают разделение гнкций компьютеров и могут также включать распределенную организацию з данных, управления устройствами и управление сетевым взаимодействием. Во многих организациях широко используются персональные компьютеры, единенные с сервером. Персональные компьютеры используются для поддерж- [ различных пользовательских приложений, таких, как текстовые процессоры, ектронные таблицы или презентационная графика. Сервер хранит базы дан- ix корпорации вместе со сложными системами управления базами данных и ограммным обеспечением информационных систем. При этом необходимо еспечить соединения как среди персональных компьютеров, так и между каж- [м персональным компьютером и сервером. Для этого могут использоваться зличные подходы — от рассмотрения персонального компьютера как простого рминала до высокой степени интегрированности между приложениями персо- льного компьютера и базой данных сервера. Это направление опирается на развитие возможностей операционных систем организации распределенных вычислений. Имеется ряд уровней поддержки спределенных вычислений операционными системами. » Сетевая архитектура. Это программное обеспечение, которое поддерживает сеть независимых компьютеров и обеспечивает работоспособность таких распределенных приложений, как электронная почта, передача файлов или доступ через удаленные терминалы. Компьютеры при этом, с точки зрения пользователя и приложений, остаются отдельными сущностями, взаимодействующими с другими компьютерами путем явного обращения к ним. Каждый компьютер имеет собственную операционную систему, что не исключает возможности использовать различные операционные системы и типы компьютеров при условии, что все машины в сети поддерживают одну и ту же сетевую архитектуру. Наиболее широко известным и используемым примером архитектуры может служить комплект протоколов TCP/IP. » Сетевая операционная система. Это конфигурация, состоящая из сети прикладных машин, обычно однопользовательских рабочих станций, и одного или нескольких серверов. Серверы обеспечивают сервис и приложения на уровне сети, например хранение файлов или управление принтером. Каждый компьютер имеет собственную операционную систему; сетевая операционная система представляет собой просто дополнение к локальной операционной системе, позволяющее пользовательской машине взаимодействовать с серверами. Пользователь осведомлен о наличии в сети независимых компьютеров и при необходимости работы с ними должен явно к ним обращаться. Как правило, для поддержки таких сетевых приложений используется обычная сетевая архитектура. » Распределенная операционная система. Сеть компьютеров совместно использует общую операционную систему. С точки зрения пользователя, это выглядит как обычная централизованная операционная система. Распределенная операционная система обеспечивает прозрачный для пользователя доступ к ресурсам различных машин; для обеспечения основных сетевых ю Часть 6. Распределенные системы функций эти системы могут использовать сетевую архитектуру, но обычно с целью повышения эффективности сокращенный набор сетевых функций встраивается в саму распределенную операционную систему. Сетевые архитектуры хорошо разработаны и поддерживаются всеми производителями. Несмотря на то что сетевые операционные системы появились относительно недавно, в этой области имеется ряд коммерческих продуктов. Распределенные операционные системы представляют собой область интенсивного изучения и развития, и хотя имеются попытки создания коммерческих распределенных систем, полнофункциональные распределенные системы все еще находятся на стадии экспериментов. В этой и следующей главе представлен обзор возможностей распределенных вычислений. Мы начнем с рассмотрения некоторых ключевых концепций распределенного программного обеспечения, включая архитектуру клиент/сервер, передачу сообщений и удаленный вызов процедур. После этого мы обратимся к архитектуре кластеров. В главе 14, "Управление распределенными процессами", рассматривается ряд ключевых аспектов распределенных операционных систем. WMТВЙьМЙШйейИЯ В АРХИТЕКТУРЕ к* ^КЛИЕНТ/СЕРВЕР Пожалуй, наиболее значительной тенденцией в развитии информационных систем за последние годы стал рост клиент-серверных систем, быстро вытесняющих как централизованные вычислительные системы с использованием мейнфреймов, так и другие подходы к распределенной обработке данных. Этот раздел начинается с описания природы вычислений клиент/сервер, после чего мы рассмотрим различные пути организации клиент-серверных функций, а также вопросы согласованности кэшей, возникающие при использовании файловых серверов. И, наконец, в этом разделе будет введено понятие связующего программного обеспечения (middleware). Что такое архитектура клиент/сервер Как и прочие новинки в области компьютеров, клиент-серверные вычисления имеют собственную терминологию. В табл. 13.1 перечислены некоторые термины, обычно употребляемые при описании продуктов и приложений, в которых используется архитектура клиент/сервер. Таблица 13.1. Терминология архитектуры клиент/сервер Интерфейс прикладного программирования (Application Programming Interface — API) Набор функций и вызовов процедур, который обеспечивает взаимодействие между клиентами и серверами. Клиент (Client) Машина, обычно персональный компьютер или рабочая станция, запрашивающая информацию по сети. Как правило, это запрос к базе данных, но могут выполняться и за- просы к серверу для получения другой информации. . Глава 13. Распределенные вычисления, архитектура... 651
Окончание табл. 13.1 !вязующее программное обеспечение (middleware) Множество драйверов, API и другое программное обеспечение, которое улучшает связь между приложением-клиентом и сервером. 'еляиионная база данных (Relational Database) База данных, организация информации в которой использует таблицы и соответствующие операции для поиска данных. :ервер (Server) Компьютер (обычно мощная рабочая станция, мини-компьютер или мейнфрейм), хранящий информацию, с которой работают сетевые клиенты. [зык структурированных запросов (Structured Query Language — SQL) Язык, разработанный в IBM и стандартизованный ANSI для адресации, создания, обновления или выполнения запросов к реляционным базам данных. На рис. 13.1 сделана попытка изобразить суть концепции клиент/сервер. !ак можно предположить из самого термина, среда клиент/сервер заполнена лиентами и серверами. В роли клиентов, как правило, выступают однопользо- ательские персональные компьютеры или рабочие станции, обеспечивающие ружественный интерфейс для конечного пользователя (обычно это удобный рафический интерфейс, включающий использование окон и мыши). Основная ель клиента — обеспечить простоту использования и возможность работы со накомым инструментарием (например, электронными таблицами). Каждый сервер в среде клиент/сервер обеспечивает для клиентов множество совместно используемых сервисов. Наиболее распространенный в на- гоящее время тип сервера — сервер базы данных, обычно реляционной, ервер обеспечивает одновременный доступ к базе данных многих клиентов позволяет использовать для управления базой данных высокопроизводи- эльную вычислительную систему. В дополнение к клиентам и серверам третьим важным компонентом среды лиент/сервер является сеть. Вычисления клиент/сервер — это распределенные ычисления. Пользователи, приложения и ресурсы распределены, например, в ютветствии с корпоративными требованиями и связаны между собой единой окальной или глобальной вычислительной сетью. Чем архитектура клиент/сервер отличается от других решений распреде- гнной обработки данных? Имеется ряд характеристик, которыми система кли- гг/сервер отличается от обычной распределенной обработки данных. • Особый упор делается на дружественные приложения, работающие на компьютере пользователя. Это удобно для пользователя и позволяет менеджерам на уровне отделов более гибко и быстро реагировать на локальные нужды своих отделов. • Хотя приложения и разнесены по разным системам, особое внимание в архитектуре клиент/сервер обращается на централизацию корпоративных баз данных и функций управления сетью. Это позволяет управленческому персоналу на уровне корпорации управлять системой в целом, начиная от капиталовложений в вычислительную технику и информационные системы и заканчивая обеспечением взаимодействия центральных систем для совместной эффективной работы. Такая организация освобождает отдельные под- 52 Часть 6. Распределенные системы разделения от накладных расходов на поддержку сложных вычислительных систем и предоставляет им свободу выбора типов компьютеров и интерфейсов для доступа к необходимым данным. Л- —«уК-^ Сервер Рабочая станция (клиент) Рис. 13.1. Архитектура клиент/сервер • Архитектура клиент/сервер обеспечивает открытость и модульность систем. Это означает, что пользователь имеет большую возможность выбора программного обеспечения, а также возможность использовать в одной системе оборудование разных производителей. • Обязательным условием корректной работы системы является корректная работа сети, поэтому при организации информационных систем и их работе управлению сетью и ее безопасности должно быть уделено особое внимание. Приложения клиент/сервер Основной возможностью архитектуры клиент/сервер является распределение задач уровня приложения между клиентом и сервером. На рис. 13.2 проиллюстрировано обычно использующееся разделение. Как у клиента, так и у сервера, разумеется, базовое программное обеспечение — это операционная система, работающая на конкретной аппаратной платформе. Платформы и операционные системы клиента и сервера могут быть различны; более того, в одной среде клиент/сервер может работать целый ряд различных платформ клиентов и серверов. При условии, что конкретные клиенты и серверы используют одни и те же протоколы связи и поддерживают одни и те же приложения, их низкоуровневън отличия не играют никакой роли. Глава 13. Распределенные вычисления, архитектура... 65£
Клиент Службы представления Логика приложений на стороне клиента Сервер Коммуникационное программное обеспечение Операционная система клиента Аппаратная платформа Запрос 71 Ответ "*' Ложка приложений на стороне сервера Взаимодействие на уровне протоколов Коммуникационное программное обеспечение Операционная система сервера Аппаратная платформа Рис. 13.2. Обобщенная архитектура клиент/сервер Взаимодействие клиентов и серверов обеспечивают разнообразные програм- . Одним из ярчайших примеров такого программного обеспечения служат темы, поддерживающие работу с TCP/IP. Естественно, главная цель такого •граммного обеспечения (как коммуникационного, так и операционных сис- :) состоит в предоставлении базы для распределенных приложений. В идеале функции, выполняемые приложением, могут быть разделены между клиен- [ и сервером так, чтобы оптимизировать использование компьютеров и сете- i ресурсов, а также возможности пользователей по выполнению различных ач и кооперации друг с другом при использовании разделяемых ресурсов. В ;е случаев такие требования обуславливают выполнение основных вычислений сервере; тем не менее основная логика других приложений может размещать- ка машине-клиенте. Определяющим фактором в успешной деятельности среды клиент/сервер яется способ взаимодействия пользователя с системой в целом. Соответствен- критическим является дизайн пользовательского интерфейса на клиентской иине. В большинстве систем клиент/сервер применяется графический интерес пользователя (graphical user interface — GUI), мощность и гибкость кото- о сочетается с простотой при использовании и обучении. Таким образом, на пине клиента мы можем использовать модуль представления, который явля- я частью распределенного приложения и обеспечивает дружественный поль- ательский интерфейс. Приложения баз данных Рассмотрим в качестве примера, иллюстрирующего концепцию разделения ики приложения между клиентом и сервером, использование реляционных Данных. В этой среде сервером является, по сути, сервер баз данных. Взаи- 1еиствие между клиентом и сервером осуществляется в виде транзакций, в орых клиент выполняет запрос к базе данных и получает от нее ответ. На рис. 13.3 показана архитектура такой системы в общем виде. Сервер от- ает за поддержку базы данных, для чего требуется сложное программное i Часть 6. Распределенные системы обеспечение СУБД. Ряд приложений используют эту базу данных, работая на клиентских машинах. Связующим звеном между клиентом и сервером служит программное обеспечение, позволяющее клиенту обращаться с запросами к базе данных сервера Широко распространенным примером такой логики может служить язык структурированных запросов (structured query language — SQL). Службы представления Логика приложения Логика базы данных Логика базы данных j«T Коммуникационное программное обеспечение Операционная система клиента Аппаратная платформа Взаимодействие протоколов Коммуникационное программное обеспечение СУБД Операционная система сервера Аппаратная платформа ■ Рабочая станция клиента Сервер Рис. 13.3. Архитектура клиент/сервер для приложений баз данных Предполагается, что вся логика приложения — программное обеспечение для обработки и анализа данных — размещена на стороне клиента, в то время как задача сервера состоит только в управлении базой данных (см. рис. 13.3). Насколько такая конфигурация подходит для конкретной задачи, зависит от ее стиля и предназначения. Предположим, например, что основная цель состоит в обеспечении оперативного доступа для поиска записей. На рис. 13.4,а показан пример того, как может работать описываемая система. Допустим, сервером поддерживается база данных, включающая миллион записей (в терминах реляционных баз данных именуемых строками), и пользователь намерен выполнить поиск, который в результате должен вернуть одну или несколько (или ни одной) записей. Поиск записей может производиться по множеству различных критериев. Первоначальный запрос может привести к ответу сервера, гласящему, что указанному клиентом критерию соответствует 100000 записей. Добавив дополнительные критерии, пользователь повторяет запрос. Допустим, что на этот раз сервер сообщает о наличии 1000 записей, удовлетворяющих новому запросу. И, наконец, клиент выполняет третий запрос с еще одним дополнительным критерием. В ответ на этот уточненный запрос сервер возвращает клиенту единственную запись. Описанное приложение подходит для архитектуры клиент/сервер по двум причинам. 1. Требуется выполнение большого объема работы по сортировке и поиску е базе данных. Для этого необходимо большое дисковое пространство, высо- Глава 13. Распределенные вычисления, архитектура... 655
коскоростные процессор и устройства ввода-вывода. Такая мощность слишком дорога, да и не нужна для клиентских машин. Передача миллиона записей клиенту для выполнения им поиска перегрузит сеть. Следовательно, недостаточно, чтобы сервер мог только возвращать данные по запросу клиента; он должен быть способен выполнять поиск и производить другие действия по запросу клиента. Клиент Начальный запрос 100 000 возможных записей Очередной запрос 1 000 возможных записей Окончательный запрос Одна возвращаемая запись Сервер База данных с 1 000 000 записей а) Верное использование архитектуры клиент/сервер Сервер Клиент Запрос 300 000 возвращаемых записей База данных с 1000 000 записей б) Неверное использование архитектуры клиент/сервер Рис. 13.4. Использование базы данных в системе клиент/сервер Теперь рассмотрим приведенный на рис. 13.4,6 сценарий, в котором участ- ет та же база данных с миллионом записей. В этом случае один запрос приво- :т к передаче по сети 300000 записей. Такое может произойти, например, если :иент хочет вычислить среднее значение некоторого поля среди множества за- [сей (а то и базы данных целиком). Понятно, что такой метод неприменим, и но из решений данной задачи — перенесение части логики приложения на рвер, с тем чтобы он был способен производить не только поиск в базе данных, > и выполнять частичный или полный анализ данных. Классы приложений клиент/сервер В рамках общей схемы клиент/сервер имеется широкий спектр реализаций, окдая из которых по-своему разделяет работу между клиентом и сервером. На [с. 13.5 показано, как может быть выполнено это разделение. Здесь приведены лько его основные варианты; на практике могут быть реализованы и другие :особы разделения. 56 Часть 6. Распределенные системы Клиент Сервер Логика представлений Логика приложения Логика базы данных СУБД а) Обработка на одном узле Логика приложения Логика базы данных СУБД б) Обработка на сервере Логика представления Логика приложения Логика приложения Логика базы данных СУБД в) Обработка при сотрудничестве Логика представления Логика приложения Логика базы данных Логика базы данных СУБД г) Обработка у клиента Рис. 13.5. Классы приложений клиент/сервер На рисунке представлены четыре класса приложений. Обработка на одном узле. По сути такая обработка не является вариантом среды клиент/сервер в обычном смысле. Такая обработка традиционно использовалась на мейнфреймах, когда практически вся обработка выполнялась центральным узлом, а пользовательский интерфейс осуществлялся посредством неинтеллектуальных терминалов. Даже если пользователь оснащен мощным микрокомпьютером, последний играет роль всего лишь эмулятора терминала. Обработка на сервере. Одна из основных конфигураций клиент/сервер, в которой клиент отвечает за обеспечение графического интерфейса пользователя, а практически вся обработка выполняется на сервере. Такая конфигурация типична для ранних систем клиент/сервер, в особенности для бизнес- систем уровня отделов. Обоснование использования таких систем заключается в том, что пользовательские машины лучше всего подходят для реали- Глава 13. Распределенные вычисления, архитектура... 657.
зации графического интерфейса пользователя, а поддержку приложений и баз данных легче организовать на центральном сервере. Однако, хотя пользователь и получает более удобный и дружественный интерфейс, эта конфигурация принципиально не отличается от предыдущей, поэтому не происходит значительного увеличения производительности или существенных изменений поддерживаемых системой бизнес-функций. • Обработка у клиента. В другом предельном случае практически вся обработка может осуществляться на машине клиента; на сервере выполняются только программы проверки корректности данных и подобные функции, которые лучше выполнять на сервере. В целом же более сложные функции логики базы данных выполняются на машине клиента. Такая архитектура позволяет пользователю работать с приложениями, приспособленными для его конкретных нужд, и в настоящее время, пожалуй, наиболее распространена. • Обработка при сотрудничестве. В этой конфигурации приложение выполняется оптимальным образом, используя сильные стороны машин клиента и Щ сервера и распределенности данных. Эта конфигурация несколько сложнее :?■ предыдущих, ее труднее поддерживать, но она обеспечивает более высокую ..'*. производительность и эффективность работы сети по сравнению с осталь- ^\ ными вариантами конфигураций. ], На рис. 13.5,в и г представлены конфигурации, в которых значительная часть .р работы передана клиенту. Эта так называемая модель толстого клиента (fat client1) /,.. получила распространение благодаря такому инструментарию разработки приложе- i ний, как PowerBuilder от Powersoft Corp. и SQL Windows от Gupta Corp. Разрабатываемые с помощью этих инструментов приложения, как правило, применимы на уровне отделов и поддерживают от 25 до 150 пользователей [ЕСКЕ95]. Основное достоинство модели толстого клиента заключается в использовании всей мощи настольной системы и переносе вычислений с сервера, что делает его работу более эффективной (не позволяя ему стать узким местом в работе среды). Однако у такого подхода имеется ряд недостатков. Увеличение функциональности вызывает излишнюю загрузку пользовательских машин, что приводит ^ к необходимости дорогостоящего обновления всей клиентской техники. При уве- * личении количества пользователей компании приходится раскошелиться и на высокоскоростную сеть, которая сможет выдержать интенсивные потоки данных между сервером и толстыми клиентами. И, наконец, проще и дешевле поддер*^ живать и обновлять приложения на одном сервере, чем на десятках или сотнях ■■; пользовательских машин. "« На рис. 13.5,6 показан подход тонкого клиента (thin client). Этот подход ближе j к традиционной обработке на сервере и часто становится первым шагом при перехо-; де корпорации от использования метафреймов к распределенной среде. ^ Трехуровневая архитектура клиент/сервер % Традиционная архитектура клиент/сервер включает два уровня, или слоя: уровень клиента и уровень сервера. В последние годы становится популярной ' трехуровневая архитектура (рис. 13.6). Приложение в ней распределено между 1 В русскоязычной литературе встречается также перевод "жирный клиент". —V?. Прим. дерев. ■г- xjann^ « Рясттпеделенные системы Ш .*i 'i '5 Vt машинами трех типов: пользовательской машиной, промежуточным сервером и конечным сервером. Пользовательская машина представляет собой уже рассматривавшуюся ранее машину клиента, который в трехуровневой модели обычно является тонким клиентом. Машины промежуточного уровня, по сути, являются воротами между тонкими клиентами и различными конечными серверами баз данных, преобразуя протоколы и отображая один тип запросов к базам данных в другой. Кроме того, они способны собирать и обрабатывать данные из разных источников. Взаимодействие между промежуточными и конечными серверами также осуществляется по модели клиент/сервер, так что система промежуточного уровня одновременно выступает в роли сервера и клиента. Клиент Промежуточный сервер (сервер приложений) б) < > Конечные серверы (серверы данных) % Рис. 13.6. Трехуровневая архитектура клиент/сервер Согласованность файлового кэша При использовании файлового сервера производительность операций ввода- вывода может в связи с передачей информации по сети оказаться гораздо более низкой по сравнению с локальным доступом к файлам. Чтобы уменьшить этот эффект, отдельные системы могут использовать файловые кэши для хранения файловых записей, к которым недавно выполнялось обращение. В соответствии с принципом локализации использование локального файлового кэша должно снизить количество обращений к удаленному серверу. На рис. 13.7 показан типичный распределенный механизм кэширования файлов в системе, состоящей из множества рабочих станций, объединенных сетью. Когда процесс осуществляет обращение к файлу, то сперва запрос идет к локальному файловому кэшу (файловый трафик). Если локальный кэш не в состоянии удовлетворить этот запрос, последний передается либо локальному диску, если файл хранится на нем (дисковый трафик), либо файловому серверу, на котором хранится интересующий нас файл (серверный трафик). На сервере спер- Глава 13. Распределенные вычисления, архитектура... 659
ва происходит обращение к локальному кэшу сервера, а если такое обращение окажется неуспешным — к диску. Технология двойного кэширования используется как для снижения сетевого трафика, так и для уменьшения количества дисковых операций ввода-вывода. Сеть Файловый трафик < *> Кэш клиента Серверный трафик Кэш сервера * Серверный трафик Дисковый трафик Кэш клиента Файловый трафик « ► Дисковый трафик Диск сервера Диск клиента Рис. 13.7. Распределенное файловое кэширование Если кэши всегда содержат точные копии удаленных данных, мы говорим о согласованности (consistent) кэшей. Кэши могут стать несогласованными, если удаленные данные оказались изменены, а соответствующий локальный кэш — не сброшен. Это может произойти, например, когда один из клиентов модифицирует файл, кэшированный другими клиентами. В действительности мы сталкиваемся здесь с двумя уровнями проблемы. Если клиент немедленно передает внесенные им в файл изменения на сервер, то кэши других клиентов оказываются содержащими неверные устаревшие данные. Ситуация становится еще более сложной, если клиентом используется кэширование с отложенной записью. В этом случае даже версия файла на сервере оказывается устаревшей, и другие клиенты при чтении с сервера получают неверные данные. Задача поддержки актуальности локальных кэшей и удаленных данных получила название задачи согласованности кэшей. Простейший подход к согласованности кэшей состоит в использовании блокирования файлов для предотвращения одновременного доступа к ним нескольких клиентов. Этот подход гарантирует согласованность ценой потери производительности и гибкости. Более мощный подход реализован в сетевой операционной системе Sprite [NELS88, OUST88]. Файл может быть открыт для чтения (и создания локальных кэшей) любым количеством клиентов. Однако когда осуществляется запрос к серверу на открытие файла с правом записи в него, а другие процессы открыли этот файл для чтения, сервер предпринимает следующие действия. Во-первых, он уведомляет записывающий процесс о том, что несмотря на свой локальный кэш этот процесс должен немедленно выполнять запись изме- а п Часть 6. Распределенные системы ненного блока данных на сервер. Такой клиент с правом записи может быть только один. Во-вторых, сервер уведомляет все читающие файл процессы о том что этот файл более не может кэшироваться. Промежуточное программное обеспечение Разработка и распространение клиент-серверных продуктов опережает стандартизацию всех аспектов распределенных вычислений, от физического уровня до уровня приложений. Недостаток стандартов усложняет реализацию интегрированных систем корпоративного уровня с использованием продукции разных производителей. Однако поскольку основные достоинства архитектуры клиент/сервер заключаются именно в возможности совместного использования различных аппаратных платформ и приложений, эта проблема должна быть решена. Для полного раскрытия достоинств архитектуры клиент/сервер разработчикам требуется набор инструментов, обеспечивающих одинаковый стиль системны ресурсов на разных платформах и одинаковые средства доступа к ним. Это позволит программистам создавать приложения, которые не только одинаково выгля на различных пользовательских рабочих станциях, но и используют одинако щ методы обращения к данным независимо от их реального размещения. v Наиболее простой путь удовлетворения этих требований состоит в испол ва» нии стандартных программных интерфейсов и протоколов, располагающихся м приложением и операционной системой и коммуникационным программным с п чением. Такие стандартизованные интерфейсы и протоколы именуют промеж ч ным программным обеспечением (middleware). При наличии стандартного прогр мм ного интерфейса упрощается реализация одного и того же приложения на серве i рабочих станциях разных типов. Очевидно, что это выгодно в первую очередь' дл потребителя, однако и производители заинтересованы в предоставлении таких ш • терфейсов. Причина заключается в том, что потребители покупают не серверы, а приложения; соответственно, при покупке они будут выбирать только те серверны, продукты, которые позволяют работать с интересующими их приложениями. Стан*' дартизованные протоколы необходимы для связи различных серверных интерфе сов^ с клиентами, которым необходим доступ к ним. ■:■ J Имеется большое количество пакетов промежуточного программного о - печения — от самых простых до очень сложных. Однако объединяет их то/ они способны скрыть сложности и отличия различных сетевых протоколов' и операционных систем. Разработчики клиентского и серверного программного обеспечения обычно предоставляют возможность выбора при работе одного из нескольких наиболее популярных пакетов промежуточного программного обеспечения. Таким образом, пользователь может решить, какая из промежуточных стратегий будет применена в корпорации, и затем использовать программное обеспечение разных производителей, поддерживающих выбранную стратегию. Архитектура промежуточного программного обеспечения На рис. 13.8 показана предполагаемая роль промежуточного программного обеспечения в архитектуре клиент/сервер. Точная роль используемых компонентов зависит от стиля используемых клиент-серверных вычислений. Вернитесь к рис. 13.5, чтобы вспомнить о различных классах приложений клиент/сервер, определяемых способом разделения функциональности между клиентом и сервером. В любом случае рис. 13.8 дает общее представление об используемой архитектуре. Глава 13. Распределенные вычисления, архитектура... 661v
Клиент Службы представления Логика приложения Промежуточное ПО ~ Коммуникационное ПО Операционная система клиента Аппаратная платформа Взаимодействие на уровне промежуточного ПО Взаимодействие на уровне протоколов Сервер ~'"'! Промежуточное ПО Коммуникационное ПО Прикладные сервисы Операционная система сервера Аппаратная платформа Рис. 13.8. Роль промежуточного программного обеспечения в архитектуре клиент/сервер Обратите внимание на наличие как серверного, так и клиентского промежуточного программного обеспечения. Его основная цель — позволить приложению или пользователю на клиентской машине получить доступ к различным серверным сервисам, не беспокоясь о различиях между серверами. Рассмотрим SQL, , предложенный с целью стандартизации доступа к локальным базам данных, не- ; зависимо от того, локальный это доступ или удаленный. Хотя многие производители реляционных баз данных и поддерживают SQL, но добавляют к нему : собственные расширения. Это позволяет производителям выделить свой продукт ■■ среди прочих, однако создает проблемы потенциальной несовместимости. Рассмотрим, например, распределенную систему, использующуюся, кроме прочего, для поддержки работы отдела кадров. Основные данные о персонале, такие, как имена, фамилии, адреса и т.п., могут храниться в базе данных Gupta, в то время как информация о продажах хранится в базе данных Oracle. Когда пользователю из ^ отдела кадров нужна какая-то запись, его мало интересует, в базе данных какого именно производителя она находится. Промежуточное программное обеспечение позволяет совершенно одинаково обращаться к различным системам. Интересно рассмотреть роль промежуточного программного обеспечения не с точки зрения реализации, а с точки зрения логики (показанной на рис. 13.9). По- ' средством промежуточного программного обеспечения реализуются обещанные клиент-серверные вычисления. Распределенная система в целом может рассматриваться как множество доступных пользователю приложений и ресурсов. Пользователя не ; должно интересовать физическое размещение данных и приложений. Все приложе- ■; ния работают посредством однотипного API. Промежуточное программное обеспече- ■. ние, охватывающее все платформы и сети клиентов и серверов, отвечает за маршру- тизацию запросов клиентов соответствующему серверу. 662 Часть 6. Распределенные системы Приложение Приложение 3 API ^;.^w Промежуточное программное обеспечение (распределенные системные сервисы) Интерфейсы платформ <* Платформа: • Операционная система • Аппаратное обеспечение ^ S t • • У* Платформа: • Операционная система • Аппаратное обеспечение v> S Рис. 13.9. Логическая точка зрения на промежуточное программное обеспечение [BERN96] Хотя имеется большое количество различных вариантов промежуточного программного обеспечения, обычно все они используют один из двух базовых механизмов — передачу сообщений или вызов удаленных процедур. Оба эти метода будут рассмотрены нами в следующих разделах. 13.2. РАСПРЕДЕЛЕННАЯ ПЕРЕДАЧА СООБЩЕНИЙ Jm k Обычно в распределенной системе компьютеры, представляя собой изолированные компьютерные системы, не используют общую основную память. Таким образом, в распределенных системах неприменимы методы, связанные с совместным использованием памяти, например семафоры. Вместо них используется передача сообщений. В этом и следующем разделах мы рассмотрим два основных подхода к данному вопросу. Первый из них — простое использование сообщений, такое же, как и в единой вычислительной системе. Второй подход — вызов удаленных процедур — представляет собой технологию, опирающуюся на передачу сообщений как базовую функцию. На рис. 13.10,с показано использование распределенной передачи сообщений для реализации функциональности клиент/сервер. Процесс-клиент запрашивает некоторый сервис (например, чтение файла или печать) и посылает сообщение, содержащее запрос к процессу- серверу. Сервер выполняет запрос и отправляет клиенту сообщение, содержащее ответ. В простейшей реализации для такого взаимодействия нужны всего две функции: Send и Receive. Функция Send определяет получателя сообщения и Глава 13. Распределенные вычисления, архитектура... 663
включает содержимое в отправляемое сообщение- Функция Receive уведомляется о том, от кого следует принимать сообщение (включая "от всех"), и сохраняет содержимое сообщения в предоставченном ей для этого буфере. Клиент Сервер «Г * t 'l - ■i '- ь J ; * 0? < ние 05 Прило -1*..ч«-ЛТ „. *g Ш-—- - 5*s О *й -^ ноеП наш юбще омежуточ рованноеi ередью ее а^т с |о S о. о ■пгт\ 5 1 X го мех 3 спортн X Тра 1— О Сообщения приложений а) Промежуточное ПО ориентированное на сообщения Клиент Сервер Приложение Заглушка RPC 8 Вызовы и возвраты из процедур приложения ц ' V ^*.« .-■ -i-WV rf & 2 ГО X го X <1> 3t JS Транспорта L. Приложение Заглушка RPC ^ш^ б) Вызов удаленных процедур Клиент Приложение Запрос [удаленного! объекта Запросы и ответы объектов Брокер объектных запросов Транспортный механизм Сеть Сервер Запросы и ответы объектов ^ Сервер объектов в) Брокер объектных запросов Рис. 13.10. Механизмы промежуточного ПО [STEI95J На рис. 13.11 показана реализация передачи сообщений. Процессы пользуются .; сервисами, предоставляемыми модулями передачи сообщений. Запрос к модулю | можно выразить в терминах примитивов и параметров. Примитив определяет вы- :?. полняемую функцию, а параметры — передаваемые данные и управляющую инфор- мадию. Фактический вид примитива зависит от программного обеспечения, исполь- ^ зующегося для передачи сообщений. Это может быть вызов процедуры либо сообще- л ние для процесса, являющегося частью операционной системы. 664 Часть 6. Распределенные системы Процесс- отправитель Процесс- получатель Модуль передачи сообщений Модуль передачи сообщений Идентификатор процесса Сообщение Рис. 13.11. Основные примитивы передачи сообщении Прилштив Send используется процессом, намеревающимся передать сообщение. Его параметрами являются идентификатор процесса-получателя и содержимое сообщения. Модуль передачи сообщений создает единую структуру данных, содержащую переданную информацию, и отправляет ее на машину, где работает процесс- получатель, при помощи некоторых средств коммуникации, например, используя протоколы TCP/IP. По достижении системы-получателя данные пересылаются ее средствами коммуникации модулю передачи сообщений этой системы. Тот определяет (по содержимому поля идентификатора процесса) получателя данного сообщения и помещает полученную информацию в буфер этого процесса. В данном сценарии процесс-получатель должен объявить о своей готовности получать сообщения путем создания принимающего буфера и уведомления об этом модуля передачи сообщений вызовом примитива Receive. При альтернативном подходе такого оповещения не требуется. Вместо этого, получив сообщение, модуль передачи сообщений каким-то предопределенным образом сигнализирует об этом процессу-получателю и помещает полученное сообщение в совместно используемый буфер, С распределенной передачей сообщений связан целый ряд вопросов, которые и будут рассмотрены нами в оставшейся части этого раздела. Вопросы надежности Благодаря надежности средств передачи сообщений доставка сообщения гарантируется, если только она возможна. Эти средства используют надежный транспортный протокол или аналогичную функциональность и должны выполнять проверку корректности, подтверждение, при необходимости — повторное отправление, а также упорядочение разупорядоченных сообщений. В связи с тем, что доставка гарантирована, подтверждения получения сообщения не требуется, однако в случае его получения отправитель знает, что в настоящий момент доставка уже завершена. Если доставка сообщения невозможна (постоянный Глава 13. Распределенные вычисления, архитектура... 665
•бой сети, неработоспособность системы-получателя и т.п.), отправитель обяза- Ш гелыю должен быть уведомлен об этом. I Другой предельный случай — когда система передачи сообщений просто 1 этгфавляет сообщение в сеть, не сообщая ни об успешности, ни о неудаче от- * правления сообщения. Сложность системы и накладные расходы при этом зна- ,:'■ чительно ниже. В том случае, когда приложения требуют подтверждения получения сообщения, таким подтверждением в принципе может быть само со- ибь ние — ответ на запрос. ]-', Вопросы блокировки 'г'". При использовании неблокирующих, или асинхронных, примитивов про- ?> цесс в результате вызовов Send или Receive не приостанавливается, и операци- ?, онная система возвращает управление процессу, как только сообщение поставле- * но в очередь для передачи или сделана его копия. Если копия не делается, то все ••' >' изменения, вносимые в сообщение процессом до (и даже во время) отправки, ос- : -г таются на ответственности процесса. Когда сообщение передано или скопировано .*' } в безопасное место для последующей передачи, процесс-отправитель прерывает- г\ ., ся, получая уведомление о том, что буфер может использоваться для следующего -^ сообщения. Соответственно, после неблокирующего вызова Receive выполнение ; >■ г процесса продолжается. Когда приходит сообщение, процесс получает уведомле- .-> '» ние об этом посредством прерывания (возможен также периодический опрос со- Щ' ■; стояния системы сообщений процессом). '|\й к Неблокирующие примитивы обеспечивают эффективное и гибкое использо- > •; вание процессом средств передачи сообщений. Недостатком данного подхода яв- ..-»■; Г ляется сложность тестирования и отладки программ, использующих указанные ■■%. примитивы. Невоспроизводимость результатов и их зависимость от временных !г ;. последовательностей могут создать трудноразрешимые проблемы. '/у Альтернативный подход состоит в применении блокирующих, или синхрон- £ ных, примитивов. Блокирующий вызов Send не возвращает управление процессу (- -1 до тех пор, пока письмо не будет отправлено (ненадежный сервис), или до тех -[j пор, пока сообщение не будет доставлено адресату и не будет получено подтвер- -,.' 1 ждение получения (надежный сервис). Блокирующий Receive не возвращает } управление до тех пор, пока сообщение не будет помещено в буфер-приемник. £%, \ 13.3. ВЫЗОВ УДАЛЕННЫХ ПРОЦЕДУР Ш-- Вариацией базовой модели передачи сообщений является вызов УД^*Ы*; процедур (remote procedure call - RPC). В настоящее время это ^щеп^^ метод инкапсуляции коммуникаций в распределенных системах. Суть этого м тода состоит в том, чтобы позволить программам, находящимся на разных^ма^. . шинах, взаимодействовать с использованием семантики вызова и возврата , процедур, так же, как если бы программы располагались на одной машине 1^ кнм образом, обращение к сервису на удаленной машине ВЫПОЛНЯеТС* ^* *^ стой вызов процедуры. Популярность этого подхода обусловлена рядом дос«И- инств метода. '<? 666 Часть 6. Распределенные систем 1. Вызов процедуры — широко распространенная, используемая и понятная абстракция. 2. Использование вызова удаленных процедур позволяет задавать удаленный интерфейс как множество именованных операций определенного типа. Таким образом, интерфейс можно точно документировать, и распределенные программы смогут выполнять статическую проверку типов. 3. Поскольку интерфейсы стандартизованы и точно определены, коммуникационный код может генерироваться автоматически. 4. Поскольку интерфейсы стандартизованы и точно определены, разработчики могут создавать клиентские и серверные модули, которые требуют минимальных доработок при переносе между различными компьютерными платформами и операционными системами. Локальный ответ Локальный ответ Локальный ответ Локальное приложение или операционная система Локальная заглушка Механизм RPC Вызов удаленной процедуры Вызов удаленной процедуры Вызов локальной процедуры Локальная заглушка Механизм RPC Рис. 13.12. Механизм вызова удаленных процедур Механизм вызова удаленных процедур может рассматриваться как усовершенствованная надежная блокирующая передача сообщений. Набросок архитектуры RPC представлен на рис. 13.10,6; более детально она приведена на рис. 13.12. Вызывающая программа осуществляет обычный вызов процедуры с параметрами на своей машине, например CALL P(X, Y), где Р — имя процедуры, X — передаваемые аргументы, a Y — возвращаемые значения. Этот вызов может приводить к прозрачному для пользователя выполнению удаленной процедуры на другой машине. В адресное пространство пользователя должна быть включена процедура-заглушка Р (которая также может быть динамически подключена в момент вызова). Эта процедура создает сообщение, которое идентифицирует вызываемую процедуру и включает передаваемые ей параметры. Затем процедура-заглушка пересылает это сообщение удаленной системе и ожидает от нее ответ. Когда ответ получен, заглушка возвращает управление вызывающей программе, передавая ей возвращаемые значения. Глава 13. Распределенные вычисления, архитектура... 667
На удаленной машине с вызываемой процедурой связана другая программа- заглушка. Когда поступает сообщение, заглушка обрабатывает его и генерирует локальный вызов CALL Р(Х, Y). Таким образом, эта удаленная процедура вызывается * локально, так что не надо специально заботиться о передаче параметров, состоянии |. стека и т.п. — вызов абсолютно идентичен вызову обычной локальной процедуры. i С вызовом удаленных процедур связан ряд вопросов, которые мы рассмот- | рим в оставшейся части данного раздела. | I Передача параметров | Большинство языков программирования позволяют использовать передачу параметров по значению либо как указатель на ячейки памяти, содержащие значение (передача параметров по ссылке). Передача параметров по значению идеально подходит для вызова удаленной процедуры: параметры при этом просто копируются в сообщение и пересылаются удаленной системе. Реализовать передачу параметров по ссылке сложнее — при этом для каждого объекта потребуется свой, уникальный в пределах системы, указатель. Накладные расходы при реализации возможности передачи параметров по ссылке обычно настолько велики, что овчинка выделки не стоит. Представление параметров Еще один вопрос заключается в способе представления параметров и результата работы процедуры в сообщении. Если вызывающая и вызываемая программы написаны на одном языке программирования для одного типа машин, находящихся под управлением одной и той же операционной системы, то представление параметров проблем не вызывает. Однако если перечисленные характеристики различны, то немедленно возникают вопросы представления чисел (и даже текста) в различных системах. Использование архитектуры, в которой эти вопросы решаются на уровне представления, приводит к высоким накладным расходам, так что зачастую ответст- ! венность за преобразование передаваемых параметров ложится на средства вызова удаленных процедур (см., например, [GIBB87]). <■ Наилучший подход к решению этой проблемы заключается в использовании vi стандартизованного формата для распространенных объектов, таких, как целые числа, числа с плавающей запятой, символы и строки. В таком случае при пере- ,, даче данные конвертируются из представления в данной конкретной машине в стандартное представление. ^ Связывание клиент/сервер Связывание (binding) определяет, каким образом будет установлена взаимосвязь между удаленной процедурой и вызывающей программой. Связывание / формируется, когда два приложения устанавливают логическую связь и готовят-- ся к обмену командами и данными. Непостоянное связывание (nonpersistent binding) означает, что логическая связь между двумя процессами устанавливается во время вызова удаленной процедуры и немедленно уничтожается после получения возвращаемого значения. :'. Поскольку соединение требует поддержки информации о состоянии на обоих . концах, оно потребляет ресурсы. Соответственно, непостоянное связывание по- г зволяет эти ресурсы сэкономить. Но, с другой стороны, при этом мы получаем;- СЙО Част* 6. Раейредейенные системы ' излишние накладные расходы по установлению связывания при каждом вызове процедуры, так что этот метод плохо подходит в случае частого вызова удаленных процедур одной и той же вызывающей программой. При постоянном связывании (persistent binding) связь устанавливается при вызове удаленной процедуры, но по окончании вызова не уничтожается. Эта же связь может использоваться и для других вызовов удаленных процедур. Если в течение предопределенного промежутка времени не осуществляется ни один вызов, такая связь с целью экономии ресурсов разрывается. Этот метод хорошо подходит для интенсивного вызова удаленных процедур, позволяя множеству вызовов использовать одно и то же соединение. Синхронный и асинхронный вызовы Концепция синхронных и асинхронных вызовов удаленных процедур аналогична концепции блокирующих и неблокирующих сообщений. Традиционный вызов удаленных процедур — синхронный, при котором вызывающий процесс ожидает, пока вызываемый процесс не вернет результирующее значение; синхронный RPC ведет себя так же, как и обычный вызов процедуры. Синхронный RPC прост для понимания и программирования, поскольку его поведение предсказуемо. Однако такой вызов не позволяет в полной мере использовать возможность параллельных вычислений в распределенных приложениях, что приводит к ограничению видов взаимодействия в распределенных приложениях и может привести к снижению производительности. Для обеспечения большей гибкости и большей степени параллельности реализованы различные варианты асинхронного RPC, сохраняющие простоту и удобство традиционных вызовов удаленных процедур [ANAN92]. Асинхронные вызовы не блокируют вызывающую программу; ответ может быть получен вызывающей программой тогда, когда он ей потребуется, так что клиент может продолжать работу параллельно с обработкой его запроса сервером. Обычно асинхронный RPC используется для того, чтобы позволить клиенту сделать несколько запросов к серверу, каждый со своим набором данных, не дожидаясь его ответов. Синхронизация клиента и сервера при этом может быть выполнена одним из двух способов. 1. Приложение-клиент дожидается ответа на все отправленные запросы. 2. По окончании выполнения последовательности асинхронных RPC клиент выполняет синхронный вызов удаленной процедуры. Сервер ответит на синхронный вызов только по окончании обработки всех предшествующих асинхронных вызовов. В некоторых схемах асинхронные вызовы не требуют ответа от сервера, к сервер не может послать сообщение в ответ. В других схемах ответ требуете* (или позволяется), но клиент его не ожидает, выполняя другие действия. Объектно-ориентированный механизм Объектно-ориентированные технологии становятся все более распространен ными как при создании операционных систем, так и при разработке систем кли ент/сервер. При таком подходе клиент и сервер обмениваются сообщениями ме жду объектами. Связь между объектами может как осуществляться на основ* Глава 13. Распределенные вычисления, архитектура... 66$
»-_- 13.4. КЛАСТЕРШРи.*» '!S '. . .Й* i- [стем обмена сообщениями или вызова удаленных процедур, так и быть разра- J пана в качестве надстройки над объектно-ориентированными возможностями | шрашюнной системы. | Требующий обслуживания клиент посылает запрос брокеру объектных запросов hject request broker), который служит каталогом всех удаленных сервисов, доступах в сети (см. рис. 13.10,в). Брокер вызывает соответствующий объект и передает f .iy необходимые данные. После этого удаленный объект обслуживает запрос и воз- I хшшет ответ брокеру, который, в свою очередь, возвращает ответ клиенту. 1 Успешность объектно-ориентированного подхода зависит от стандарти- 1 тип объектного механизма. К сожалению, в этой области имеется несколь- 8 о конкурирующих разработок. Одной из них является единая объектная Щ одель (Common Object Model — COM) Microsoft, служащая основой для щ недрения и связывания объектов (Object Linking and Embedding — OLE). Jg тот подход поддержан Digital Equipment Corporation, которая разработала JI ОМ для UNIX. Конкурирующий подход, разработанный Object Management ж roup, — общая архитектура брокера объектных запросов (Common Object .щ Request Broker Architecture — CORBA) — также имеет большую промыш- г енную поддержку: CORBA поддерживают IBM, Apple, Sun и многие другие 'Ь' роизводители. .'_. Одной из новейших областей в разработке компьютерных систем являет- я кластеризация, которая представляет собой альтернативу симметричной многопроцессорной обработке в качестве подхода, сочетающего высокую фоизводительность и доступность и особенно привлекательного для серверных приложений. Мы можем определить кластер как группу взаимосвязанных совместно работающих компьютеров, представляющих собой единый ресурс и способных создавать иллюзию работы единой вычислительной системы. Все компьютеры кластера могут работать самостоятельно, отдельно от ,f кластера; в литературе компьютеры, составляющие кластер, обычно называют узлами (node). В [BREW97] перечислены четыре преимущества, получаемые при работе с кластерами. Их можно также рассматривать как цели, или требования к разра- и . i эотке таких систем. 4е' л ft* Л л - • Абсолютная масштабируемость. Можно создавать кластеры любых разме- ■» ров, которые превысят по суммарной производительности любой самый «£ мощный компьютер. Кластер может состоять из десятков или даже сотен \. машин, каждая из которых может быть многопроцессорной системой. •" • Инкрементальная масштабируемость. Кластер конфигурируется таким образом, чтобы можно было добавлять новые системы малыми порциями. Поэтому пользователь может начать с небольшого кластера, постепенно наращивая его мощность по мере необходимости, без кардинальной замены компьютеров. • Высокая доступность. Поскольку каждая машина кластера представляет собой отдельный компьютер, сбой в работе или выход из строя одного 670 * Часть 6. Распределенные системы; узла не приводят к снижению уровня обслуживания. Во многих системах такие отказы автоматически обрабатываются аппаратным и программным обеспечением. • Отношение цена/производительность. Использование широко распространенных компьютеров в качестве строительных блоков кластера позволяет создать высокопроизводительную систему, стоимость которой меньше, чем стоимость компьютера с такой же мощностью. Конфигурации кластеров В литературе кластеры классифицируются несколькими различными способами. Простейшая классификация, вероятно, основана на том, используют ли компьютеры кластера разделяемые диски. На рис. 13.13,а показан кластер, состоящий из двух узлов, взаимодействие которых осуществляется при помощи высокоскоростной линии связи, использующейся для передачи сообщений с целью координации действий кластера. Эта связь может представлять собой ЛВС, используемую совместно с другими компьютерами, не входящими в состав кластера, либо быть средством связи, выделенным исключительно для нужд кластера. В последнем случае один или несколько компьютеров кластера должны быть подключены к локальной или глобальной сети, чтобы обеспечить возможность работы с ними клиентов. Заметим вскользь, что на рисунке каждый компьютер изображен как многопроцессорная система. Это не обязательно так, но многопроцессорность повышает как производительность, так и доступность кластера. При простейшей классификации, показанной на рис. 13.13, вторым вариантом является кластер с совместным использованием дисков. В этом случае между узлами, вообще говоря, остается высокоскоростная линия связи для обмена сообщениями. Кроме того, имеется дисковая подсистема, непосредственно связанная с несколькими компьютерами кластера. На приведенном рисунке дисковая подсистема представляет собой RAID-систему. Использование RAID или другой аналогичной избыточной дисковой технологии типично для кластеров, оно обеспечивает независимость высокой доступности кластера от надежности одного диска. Еще один способ классификации связан с функциональностью кластеров. В докладе Hewlett Packard [HP96] приведен один из вариантов такой классификации (табл. 13.2), которую мы сейчас и рассмотрим. Глава 13. Распределенные вычисления, архитектура... 671
Высокоскоростной обмен сообщениями : -иг '.V а) Резервный сервер без разделения дисков Высокоскоростной обмен сообщениями щ I/O I/O RAID М б) Разделяемые диски Р — процессор М —память I/O — устройство ввода-вывода Рис. 13.13. Конфигурации кластеров Таблица 13.2. Методы кластеризации: достоинства и ограничения Метод Описание Достоинства Пассивное резервирование Активный вторичный сервер Отдечьные серверы Вторичный сервер включается только при сбое первичного Вторичный сервер используется как для резервирования, так и для решения других задач Отдельные серверы, имеющие собственные диски. Данные постоянно копируются с первичного сервера на вторичный Простая реализация Снижение цены, поскольку вторичный сервер также используется для работы Высокая доступность Ограничения Высокая стоимость, поскольку вторичный сервер недоступен для выполнения других задач Возрастающая сложность Высокие накладные расходы сетевых ресурсов и серверов, связанные с операциями копирования 672 Часть 6. Распределенные системы. Окончание табл 13& Метод Описание Достоинства Ограничения Серверы соединены с дисками Серверы совместно используют диски Серверы соединены с одними и теми же дисками, но каждый сервер владеет собственными дисками В случае выхода из строя сервера доступ к его дискам осуществляется через другой сервер Несколько серверов совместно используют диски Низкие накладные расходы сетевых ресурсов и серверов благодаря устранению операций копирования Обычно требуется применение технологии RAJD или отображения дисков для снижения риска возможных сбоев Низкие сетевые и серверные накладные расходы. Снижается риск простоя, вызванный сбоем диска Требуется программное обеспечение диспетчеризации дисков. Обычно требуется применение технологии RAID или отображения дисков При старом распространенном методе пассивного резервирования вен работу выполнял один компьютер, в то время как второй компьютер оста вался не активным, и был предназначен для замены активного в случае еп сбоя или неисправности. Для координации деятельности машин активный или первичный, сервер периодически посылал контрольное сообщение ре зервному компьютеру. Если поток этих сообщений прекращался, считалось что первичный сервер прекратил свою деятельность, и его функции брал н. себя резервный компьютер. Такой подход увеличивает доступность системы но никак не ее производительность. Кроме того, единственная информация которой обмениваются рассматриваемые компьютеры, — это контрольны сообщения, так что если обе системы не используют одни и те же диски, т резервный компьютер обеспечивает функциональное резервирование, но н доступ к управляемым активным компьютером базам данных. Пассивное резервирование, по сути, кластером не является. Термин кле стер (cluster) обозначает несколько взаимосвязанных компьютеров, кажды из которых принимает активное участие в обработке данных и которые вм< сте поддерживают впечатление единой системы с точки зрения внешнего м* ра. Термин активный вторичный сервер зачастую используется для описани именно такой конфигурации. Можно указать три метода кластеризации: от дельные серверы, серверы без совместного использования и серверы с совм< стным использованием дисков. Первый подход характеризуется тем, что каждый компьютер представлж собой отдельный сервер со своими собственными дисками; при этом совместь используемых дисков в системе нет (рис. 13.13,а). Такой подход обеспечивав как высокую производительность, так и высокую доступность системы. В да] ном случае требуется наличие дополнительного планирующего программно! обеспечения для назначения серверов для обработки запросов клиентов, которс обеспечивает сбалансированность загрузки и высокую степень использована серверов. Требуется также обеспечить обработку корректной ситуации выхода i строя одного из серверов, с тем чтобы при сбое однЪго из компьютеров работа! Глава 13. Распределенные вычисления, архитектура... 67
1 цее с ним приложение продолжало корректно выполняться. Для того чтобы это (ыло возможно, требуется постоянное копирование данных между серверами с ;елью обеспечения каждой системе доступа к текущим данным других систем. Высокая доступность достигается за счет увеличения накладных расходов, выданных таким обменом данными, и некоторого снижения производительности. Уменьшить эти накладные расходы позволяет подключение к общим дискам серверов, составляющих кластеры (рис. 13.13,6). При выборе одного из вариантов такого подхода — без совместного использования (shared nothing) — )бщие диски разбиты на тома, и каждый том принадлежит одному из компьютеров. Если этот компьютер выходит из строя, кластер должен быть переконфигурирован так, чтобы какой-то из оставшихся компьютеров стал владельцем циска вышедшего из строя компьютера. Возможно и такое решение, когда несколько компьютеров совместно ис- аользуют одни и те же диски (подход с совместным использованием дисков), гак что каждый из компьютеров имеет доступ ко всем томам всех дисков. Этот подход требует наличия средств блокировки для обеспечения взаимоисключительного доступа компьютеров к данным. Вопросы разработки операционных систем Для полного использования аппаратного обеспечения кластеров к операционной системе для отдельной системы должны быть добавлены определенные * расширения. Обработка отказов Способ обработки кластером отказов техники зависит от используемого метода кластеризации (см. табл. 13.2). Обычно используется один из двух подходов: высокодоступные или отказоустойчивые кластеры. Высокодоступный кластер предусматривает высокую вероятность того, что все ресурсы будут доступны. При отказе, таком, как сбой системы или потеря тома диска, текущий запрос оказывается потерянным. При повторе запроса он будет отправлен другой машине кластера. Однако операционная система кластера не дает никаких га- ■£ рантий относительно состояния частично выполненных транзакций, которые g должны обрабатываться на уровне приложений. ■[ Отказоустойчивые кластеры гарантируют постоянную доступность всех ре- 6 сурсов. Это достигается за счет использования избыточных совместно используе- '.^ мых дисков и механизмов для восстановления как невыполненных, так и за- jf , вершенных транзакций. - ';'. Функция переключения приложений и передачи ресурсов данных от сбой- '. ной системы другой системе кластера известна как преодоление сбоя (failover). С ;*• ней связана функция восстановления приложений и ресурсов данных возвра- :-=; ^ щенной в строй после отказа вычислительной системы, известная как восстанов- v" < ление после сбоя (fallback). Эта функция может быть автоматизирована, но же- 't лательно, чтобы она выполнялась только после полного устранения причин сбоя, когда повторный сбой маловероятен. Иначе кластер может попасть в состояние, ХЛ когда после восстановления вновь происходит сбой и все-ресурсы вновь перемещаются на другой компьютер, чтобы после возврата в строй только что отказав- * шей системы все повторилось вновь. |; 674 Часть 6. Распределенные системы /Г Балансировка загрузки Кластер нуждается в эффективных средствах для балансировки загрузки работающих компьютеров (сюда же входит и требование инкрементального масштабирования). Когда к кластеру добавляется новый компьютер, средства балансировки загрузки должны подключить эту машину к программе-планировщику. Для распознавания появления доступных сервисов у разных членов кластера и возможности их перемещения с одной системы на другую требуется использование механизма промежуточного программного обеспечения. Параллельные вычисления В ряде случаев эффективное использование кластеров требует параллельного выполнения единого приложения. В [КАРРОО] перечислены три основных подхода к проблеме. • Параллелизующне компиляторы. Такие компиляторы в процессе компиляции определяют, какие части приложения могут выполняться параллельно, и затем эти части разделяются для выполнения на разных компьютерах кластера. Достигаемая при этом производительность зависит от природы решаемой задачи и от того, насколько хорошо разработан компилятор. • Параллелизованные приложения. Это создаваемые программистом приложения, изначально ориентированные на выполнение кластером. Передача сообщений используется для перемещения в случае необходимости данных между узлами кластера. Такой подход предполагает выполнение основной части работы программистом, но для ряда приложений оказывается наилучшим способом эффективного использования возможностей кластера. • Параметрические вычисления. Этот подход может использоваться тогда, когда приложение представляет собой алгоритм или программу, которая должна выполняться большое количество раз, причем каждый раз — с новым набором начальных условий или параметров. Хорошим примером может служить имитационная модель, в которой просчитывается большое количество различных сценариев и используется статистическая обработка полученных результатов. Для того чтобы такой подход был эффективен, следует надлежащим образом организовать управление заданиями и их выполнение. Архитектура кластера На рис. 13.14 показана типичная архитектура кластера. Отдельные компьютеры соединены высокоскоростной сетью; при этом каждый компьютер в состоянии работать независимо от других. На каждом компьютере установлено промежуточное програ*ммное обеспечение для работы компьютера в составе кластера. Оно обеспечивает пользователю унифицированный образ системы (или образ единой системы), а также высокую доступность кластера путем балансировки загрузки и реакции на отказы отдельных компонентов. В [HWAN99J в качестве желательных сервисов и функций промежуточного программного обеспечения перечислены следующие. Глава 13. Распределенные вычисления, архитектура... 675
• Единая точка входа. Пользователь входит в кластер в целом, а не в один из его компьютеров. • Единая иерархия файлов. Пользователь видит единую иерархию каталогов файлов в одном корневом каталоге. • Единая точка управления. Имеется рабочая станция, по умолчанию используемая для слежения за кластером и управления им. • Единая виртуальная сеть. Узел кластера может обратиться к любому другому узлу, даже если реально кластер состоит из ряда взаимосвязанных сетей. • Единое пространство памяти. Распределенная совместно используемая память позволяет программам разделять переменные. • Единая система управления заданиями. Пользователь может передать задание планировщику кластера, не определяя узел, на котором это задание должно выполняться. • Единый пользовательский интерфейс. Все пользователи независимо от используемых рабочих станций получают доступ к кластеру посредством одинакового графического интерфейса пользователя. • Единое пространство ввода-вывода. Любой узел может получить удаленный доступ к любому периферийному или дисковому устройству, даже не зная его физического расположения. • Единое пространство процессов. Используется единая схема идентификации процессов. Процесс на одном узле может создавать процесс на удаленном узле или взаимодействовать с любым другим процессом на нем. • Контрольные точки. Эта функция периодически сохраняет состояние процессов и промежуточные результаты вычислений, с тем чтобы обеспечить восстановление системы при сбое. • Миграция процессов. Эта функция обеспечивает балансировку загрузки. Сервисы и функции, указанные в последних четырех пунктах данного списка, увеличивают доступность кластера; указанное в остальных пунктах связано с предоставлением пользователю единого образа системы. Возвращаясь к рис. 13.14, заметим, что кластер включает в себя также программное обеспечение, отвечающее за эффективную работу программ, способных к параллельному выполнению. 676 Часть 6. Распределенные системы .
равнение кластеров и SMP Как кластеры, так и симметричная многопроцессорная обработка обеспечи- ют конфигурацию с несколькими процессорами для поддержки приложений с асокими требованиями. Оба решения коммерчески доступны, хотя SMP приме- [ется несколько дольше. Основное достоинство SMP состоит в том, что симметричной многопроцес- рностью проще управлять и что ее легче настроить, чем кластер. SMP ближе, :м кластер, к обычной однопроцессорной модели, для которой и разработаны тктически все приложения. При переходе от однопроцессорной системы к SMP обуется единственное принципиальное изменение — изменение функции пла- фования. Другим достоинством SMP является то, что такая система занимает >ныпе места и потребляет меньше электроэнергии, чем сравнимый по мощно- и кластер. И к тому же этот подход хорошо зарекомендовал себя, тщательно (учен и стабилен в работе. О достоинствах кластеров свидетельствует то, что именно эта технология ке длительное время доминирует на рынке высокопроизводительных серверов, иастеры существенно превосходят SMP с точки зрения инкрементальной и аб- лютной масштабируемости, а также доступности, поскольку легко обеспечива- ся избыточность всех элементов системы. L3.5. WINDOWS 2000 CLUSTER SERVER^ | Windows 2000 (W2K) Cluster Server (ранее именовавшийся Wolfpack) пред- авляет собой кластер без совместного использования, в котором у каждого гскового тома и других ресурсов в каждый момент времени имеется свой един- ■венный владелец. W2K Cluster Server разработан с использованием следующих концепций. • Кластерный сервис. На каждом узле имеется программное обеспечение для решения задач, специфичных для работы в составе кластера. • Ресурс. Элемент, управляемый кластерным сервисом. Все ресурсы являются объектами, которые представляют действительные ресурсы системы, включая как физические устройства, такие, как диски и сетевые карты, так и логические элементы (дисковые тома, адреса TCP/IP, приложения и базы данных). • Подключенность. О ресурсе говорят, что он подключен к узлу, когда он обеспечивает работу сервиса на этом конкретном узле. • Группа. Набор ресурсов, управляемых как единое целое. Обычно группа содержит все элементы необходимые для запуска определенного приложения и для подключения системы-клиента к сервису, предоставляемому таким приложением. Концепция группы особенно важна. Группа собирает ресурсы в большие эдули, которыми проще управлять — как с точки зрения преодоления сбоев, lk и с точки зрения балансировки загрузки. Операции, выполняемые над груп- >й, такие, как пересылка группы на другой узел, автоматически действуют на е ресурсы, составляющие группу. Ресурсы реализованы как динамически ком- шуемые библиотеки и управляются монитором ресурсов. Монитор ресурсов 78 Часть 6. Распределенные системы взаимодействует с кластерным сервисом путем вызова удаленных процедур и отвечает на команды кластерного сервиса по конфигурированию и перемещению групп ресурсов. Инструменты управления кластером Z DLL API кластера RPC Сервис - ^ ^ кластера DLL ресурсов приложений Другие узлы Мониторы pecypcoOj^L^ ZA Интерфейс менеджера ресурсов DLL физических ресурсов DLL логических ресурсов DLL ресурсов приложений Прочие приложены Рис. 13.15. Блок-схема Windows 2000 Cluster Server [SHOR97] На рис. 13.15 изображена блок-схема компонентов Windows 2000 Cluster Server и их взаимосвязей в едином кластере. Менеджер узлов отвечает за поддержку участия данного узла в составе кластера. Периодически он посылает контрольные сообщения менеджерам других узлов кластера. В случае, когда менеджер узла обнаруживает, что поток контрольных сообщений от какого-то из узлов прервался, он посылает широковещательное сообщение всем менеджерам узлов кластера, что заставляет их обменяться сообщениями для проверки текущего состава кластера. Если менеджер узла не отвечает на это сообщение, узел удаляется из кластера и его активные группы пересылаются одному или нескольким активным узлам кластера. Менеджер базы данных конфигурации поддерживает базу данных конфигурации кластера. Эта база данных содержит информацию о ресурсах и группах, а также о принадлежности групп узлам. Менеджеры баз данных каждого из узлов сотрудничают друг с другом для поддержки согласованной картины конфигурационной информации. Для гарантии того, что в любой момент времени вся информация о конфигурации кластера корректна и согласованна, используется отказоустойчивое программное обеспечение для выполнения транзакций. Глава 13. Распределенные вычисления, архитектура... 67Э
Менеджер ресурсов и менеджер преодоления сбоев принимают все реше- я, связанные с группами ресурсов, и инициируют все необходимые действия астера. При преодолении сбоев соответствующие менеджеры кооперируются я решения задачи перераспределения групп ресурсов отказавшей системы сре- оставшихся в строю. Когда отказавшая система вернется в работоспособное :тояние, менеджер преодоления сбоев может принять решение о возврате не- горых групп этой системе. В частности, у каждой группы может быть указан едпочтительный владелец, и после сбоя и восстановления этого владельца ^ппа может быть возвращена ему. Процессор событий связывается со всеми компонентами сервиса кластера, рабатывает обычные операции и управляет инициализацией сервиса кластера, шеджер коммуникаций управляет обменом сообщениями с другими узлами астера. Менеджер глобального обновления предоставляет сервис, используе- 1Й другими компонентами сервиса кластера. TT'<*">'''*w *-*"**"к'!? **№ f^ 3.6. SUN CLUSTER is. ~ ~ tJ?£'■- =8 ■f*4t Sun Cluster представляет собой распределенную операционную систему, по- роенную как множество расширений базовой системы Solaris и предоставляющею пользователям единый образ системы (т.е. кластер выглядит для пользова- ля и приложений так, как если бы работал единственный компьютер под равлением операционной системы Solaris). На рис. 13.16 показана архитектура Sun Cluster. Ее основными компонен- ми являются. • Поддержка объектов и коммуникаций. • Управление процессами. • Сеть. Глобальная распределенная файловая система. laris MC Приложения Интерфейс системных вызовов Сеть Файловая система Процессы I C++ J I Структура объектов Существующее ядро Solaris 2.5 Вызовы объектов Другие узлы Рис. 13.16. Структура Sun Cluster 80 Часть в. Распределенные системы Поддержка объектов и коммуникаций Реализация Sun Cluster — объектно-ориентированная. Здесь для определения объектов и механизма вызова удаленных процедур (RPC) применена объектная модель CORBA. Для описания интерфейсов между компонентами различных узлов многокомпыотерной системы (Multi-Computer — МС) используется язык определения интерфейсов (Interface Definition Language — IDL) CORBA. Элементы многокомпыотерной системы реализованы на объектно-ориентированном языке программирования C++. Использование единой объектной модели и IDL обеспечивает механизм связи процессов как внутри узла, так и между узлами. Все описанное реализовано в виде надстройки над ядром Solaris, и практически не требуется вносить изменения в само ядро. Управление процессами Глобальное управление процессами позволяет расширить круг операций над процессами таким образом, что размещение процесса выполняется прозрачно для пользователя. Sun Cluster поддерживает глобальное рассмотрение процессов, так что каждый процесс в кластере получает свой уникальный идентификатор и каждому узлу доступна информация о расположении и статусе любого процесса. В описываемой системе возможна миграция процессов (речь о ней идет в главе 14, "Управление распределенными процессами"): во время работы процесс может перемещаться от одного узла к другому для обеспечения балалсировки загрузки или преодоления сбоев. Однако потоки одного процесса должны располагаться на одном узле. Сеть Разработчики Sun Cluster рассматривают три подхода к управлению сетевым трафиком. 1. Выполнение всей обработки сетевых протоколов на одном узле. В частности, для TCP/IP-приложений входящий (и исходящий) трафик должен проходить через подключенный к сети узел. Этот узел анализирует заголовки TCP и IP и направляет инкапсулированные данные соответствующему узлу; При исходящем трафике этот узел инкапсулирует данные от других узлов в заголовки TCP/IP. Такой подход не является масштабируемым, не способен работать при большом количестве узлов в кластере и потому был отвергнут. 2. Назначение уникальных IP-адресов каждому узлу и работа сетевых протоколов непосредственно с каждым из узлов. Одной из сложностей при таком подходе является то, что конфигурация кластера перестает быть прозрачной для внешнего мира. Еще одной проблемой является сложность преодоления сбоев, когда работающее приложение переносится на новый узел с другим сетевым адресом. 3. Использование фильтрации пакетов для их направления правильному узлу и выполнение обработки сетевых протоколов на этом узле. Внешне кластер выглядит как единый сервер с единственным IP-адресом. Входящие соединения (запросы клиентов) распределяются среди доступных узлов кластера (обеспечивая балансировку загрузки). Именно этот подход и был принят в Sun Cluster. Глава 13. Распределенные вычисления, архитектура... 681
Сетевая подсистема Sun Cluster имеет три ключевых элемента. 1. Входящие пакеты сначала получает узел с физически подключенным сетевым адаптером; получающий пакеты узел фильтрует их и доставляет соответствующим узлам-получателям по кластерным соединениям. 2. Все исходящие пакеты передаются по внутрикластерным соединениям узлу (или одному из нескольких альтернативных узлов), который физически подключен ко внешней сети. Вся обработка исходящих пакетов выполняется узлом — отправителем пакета. 3. Глобальная сетевая база данных конфигурации поддерживает отслеживание сетевого трафика каждого узла. лобальиая файловая система Наиболее важным элементом Sun Cluster является глобальная файловая кггема, изображенная на рис. 13.17, где проводится ее сравнение с базовой семой Solaris. Они обе построены на использовании концепций виртуальных шов (virtual node — vnode) и виртуальной файловой системы. Ядро Интерфейс Vnode/VFS Файловая система Файловая система Ядро J Интерфейс f Vnode/VFS | Прокси-система Вызов объекта Кэш г ir | Реализация объекта Интерфейс Vnode/VFS Файловая система г Файловая система - Кэш 1 а) Solaris б) Sun Cluster Рис. 13.17. Расширения файловой системы Sun Cluster В Solaris структура виртуального узла (vnode) служит для предоставления ощного интерфейса общего назначения к файловым системам любых типов, на используется для отображения страниц памяти в адресное пространство роцесса и для обеспечения доступа к файловой системе. В то время как inode спользуется как средство отображения процессов в файлы UNIX, vnode в со- гоянии отображать процессы в объекты в файловой системе любого типа. Таким эразом, системный вызов должен знать только, как сделать объектно- риентированный вызов с использованием интерфейса vnode; иметь представле- ие о реальном управлении объектом не обязательно. Интерфейс vnode принима- г команды общего назначения для работы с файлами, такие, как команды чте- ия или записи, и транслирует их в действия, соответствующие используемой айловой системе. Так же, как vnode используется для описания отдельных «2 Часть 6. Распределенные системы объектов файловой системы, структуры виртуальной файловой системы (virtual file system — vfs) используются для описания файловой системы в целом. Интерфейс vfs принимает команды общего назначения для работы с файлами как единым целым и транслирует их в команды соответствующей файловой системы. В Sun Cluster глобальная файловая система обеспечивает единый интерфейс для работы с распределенными по кластеру файлами. Процесс может открыть файл, расположенный в любом месте кластера, причем все процессы кластера указывают для этого одинаковый путь к файлу. Для реализации глобального доступа к файлу многокомпыотерная система включает прокси-файловую систему, построенную над существующей файловой системой Solaris с интерфейсом vnode. Операции vfs/vnode преобразуются прокси-системой в вызовы объектов (см. рис. 13.17,6). Вызываемые объекты могут находиться на любом узле системы и выполняют соответствующие локальные операции vfs/vnode с файловой системой на своей машине. Для поддержки такой глобальной файловой среды не требуется вносить какие бы то ни было изменения ни в ядро, ни в существующие файловые системы. Для снижения количества вызовов удаленных объектов используется кэширование. Sun Cluster поддерживает кэширование содержимого файлов, информации о каталогах и атрибутах файлов. ; й.7. шАсшЩшЩги\ЖЖш^^х"~Ш'-"*" В 1994 году в рамках проекта NASA по высокопроизводительным вычислениям и коммуникациям (High Performance Computing and Communications — HPCC) была начата разработка проекта Beowulf, цель которого состояла в изучении потенциала объединенных в кластер персональных компьютеров для выполнения важных вычислительных задач по минимальной цене. На сегодняшний день подход, использованный в этом проекте, широко распространен и, вероятно, представляет собой наиболее важную кластерную технологию из имеющихся. Возможности Beowulf К ключевым возможностям Beowulf относят следующие [RIDG97]. • В качестве составляющих используются массово производящиеся компоненты. • Специализированные процессоры. • Специализированные частные сети (локальные или глобальные или их комбинация). • Использование широко распространенных компонентов. • Простота повторения разными производителями. • Масштабируемый ввод-вывод. • Широкодоступная программная база. • Использование широко распространенных вычислительных инструментов с минимальными изменениями. Хотя элементы программного обеспечения Beowulf реализованы на многих различных платформах, наиболее очевидным выбором является Linux, и боль- Глава 13. Распределенные вычисления, архитектура... 683
шинство реализаций Beowulf используют кластеры рабочих станций и/или персональных компьютеров под управлением Linux. На рис. 13.18 показана обобщенная конфигурация Beowulf. Кластер состоит из ряда рабочих станций, возможно, с разными аппаратными платформами, работающими под управлением операционной системы Linux. Устройства внешней памяти каждой рабочей станции могут быть сделаны доступными для распределенного доступа (для распределенного совместного использования файлов, распределенной виртуальной памяти или других целей). Узлы кластера связаны посредством обычных широко распространенных сетевых средств (типа Ethernet). Как правило, используются стандартные продукты и стандартные скорости передачи данных (10 Mbps, 100 Mbps, l Gbps). Ф Распределенная совместно используемая внешняя память Рабочие станции Linux Рис. 13.18. Обобщенная конфигурация Beowulf Программное обеспечение Beowulf Программная среда Beowulf реализована как дополнение к широко доступ- -" ным бесплатным базовым дистрибутивам Linux. Основную часть исходных тек- {[ стов открытой системы Beowulf можно найти на узле www.beowulf.org, однако У ряд других организаций также предлагают свободно распространяемые инстру- ''. менты и утилиты Beowulf. \ Каждый узел кластера работает со своей собственной копией ядра Linux и " может функционировать как автономная система. Для поддержки концепции кластеров Beowulf в ядро Linux добавлены расширения, позволяющие отдель- ^" ным узлам участвовать в ряде глобальных пространств имен. Приведем примеры ,; системного программного обеспечения Beowulf. " ч • Распределенное пространство процессов Beowulf (Beowulf distributed; process space — BPROC). Этот пакет позволяет пространству идентифи- • каторов процессов объединять многие узлы в кластерную среду и обеспечивает механизм запуска процессов на других узлах. Цель этого паке- ■.; та состоит в обеспечении ключевых элементов, необходимых для пред- ■> ставления кластера Beowulf как единой системы. BPROC обеспечивает - механизм запуска процессов на удаленных узлах без регистрации на этих узлах и делает все удаленные процессы видимыми в таблице про- .; цессов входного узла кластера. 684 Часть в. Распределенные системы • Соединение каналов Ethernet в Beowulf (Beowulf Ethernet Channel Bonding). Это механизм, объединяющий различные недорогие сети в единую логическую сеть с широкой полосой пропускания. Вся дополнительная работа по сравнению с использованием одного сетевого интерфейса при этом сводится к простой вычислительной задаче распределения пакетов по доступным очередям передающих устройств. Такой подход обеспечивает выравнивание загрузки сетей, подключенных к рабочей станции Linux. • Pvmsync. Это программная среда, которая обеспечивает механизмы синхронизации и разделяемых объектов данных для процессов в кластере Beowulf. • EnFuzion. Это набор инструментов для параметрических вычислений, описанных в разделе 13.4. EnFuzion эмулирует множество пользователей одного корневого узла, каждый из которых регистрируется на многих клиентских машинах, формирующих кластер и запускающих программируемые сценарии с разными наборами начальных условий [КАРРОО]. 13.8. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ V И КОНТРОЛЬНЫЕ ВОПРОСЫ Вычисления клиент/сервер являются ключом к реализации потенциала информационных систем и сетей для значительного повышения производительности систем корпоративного уровня При вычислениях в архитектуре клиент/сервер приложения выполняются на однопользовательских рабочих машинах и персональных компьютерах. В то же время ресурсы, которые должны совместно использоваться различными пользователями, поддерживаются на серверных системах, доступных всем клиентам. Таким образом, архитектура клиент/сервер представляет собой смесь децентрализованных и централизованных вычислений. ** Обычно система-клиент обеспечивает графический интерфейс для работы с различными приложениями, требующий минимального обучения пользователей. Серверы поддерживают разделяемые прикладные системы, такие, как системы управления базами данных. Единые приложения разделены между клиентом и сервером таким образом, чтобы оптимизировать производительность при простоте использования. Ключевым механизмом, требующимся в любой распределенной системе, является межпроцессное взаимодействие, реализуемое обычно при помощи сообщений или вызовов удаленных процедур. Средства передачи сообщений в распределенных системах являются обобщением использования сообщений в единых системах; соответственно, к ним применимы такие же соглашения и методы синхронизации. Подход с использованием вызова удаленных процедур представляет собой методику, при которой две программы на разных машинах взаимодействуют с использованием синтаксиса и семантики вызова процедур. Вызывающая и вызываемая программы ведут себя так, как если бы программа- партнер находилась на той же локальной машине. Кластер представляет собой группу взаимосвязанных совместно работающих компьютеров, представляющих собой единый вычислительный ресурс и создающих впечатление единой машины. Каждый из компьютеров, составляющих кластер, способен к автономной работе вне кластера. Глава 13. Распределенные вычисления, архитектура... 685
ключевые термины eowulf осстановление после сбоя ызов удаленной процедуры рафический интерфейс пользователя Интерфейс прикладного программирования Кластер Клиент Клиент/сервер Преодоление сбоя Промежуточное программное обеспечение Распределенная передача сообщений Сервер Согласованность файлового кэша Сообщение Толстый клиент Тонкий клиент г i 1 I 1 а -е 1 \ контрольные вопросы 13.1. Что такое клиент-серверные вычисления? 13.2. Чем клиент-серверные вычисления отличаются от других способов распределенной обработки данных? 13.3. Какова роль архитектуры коммуникаций (такой, как TCP/IP) в среде клиент/сервер? 13.4. Обсудите причины размещения приложений на машине клиента, на сервере или их распределения между клиентом и сервером. 13.5. Что такое толстый клиент и тонкий клиент, и чем отличаются концепции этих подходов? 13.6. Рассмотрите "за" и "против" стратегий толстого и тонкого клиентов. 13.7. Приведите обоснование использования трехуровневой архитектуры клиент/сервер. 13.8. Что такое промежуточное программное обеспечение? 13.9. Зачем нужно промежуточное программное обеспечение при наличии стандартов типа TCP/IP? 13.10. Перечислите некоторые достоинства и недостатки блокирующих и неблокирующих примитивов передачи сообщений. 13.11. Перечислите некоторые достоинства и недостатки постоянного и непостоянного связывания при вызове удаленных процедур. 13.12. Перечислите некоторые достоинства и недостатки синхронных и асинхронных вызовов удаленных процедур. 13.13. Перечислите и кратко опишите четыре различных метода кластеризации. 13.9. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА f ^ Вопросы, рассматривающиеся в этой главе, неплохо освещены в [SING99]. ольшее количество технических подробностей и вопросов разработки, связан- ых с архитектурой клиент/сервер и промежуточным программным обеспечени- «, можно найти в [BERS96]; там же описан ряд продуктов и рассматриваются эпросы стандартизации в этой области. О кластерах идет речь в [REAGOOa] и lEADOOb]. В первой из этих книг, как и в [RIDG97], уделяется внимание кла- герам Beowulf (более подробно с Beowulf можно познакомиться в [STER99]). I Ш f I ■% 86 Часть 6. Распределенные системы В [TANE85] содержится обзор распределенных операционных систем, в котором подробно рассматриваются управление распределенными процессами и связи между ними. Вопросам передачи сообщений посвящена работа [CHAN90], a [TAY90] содержит обзор подходов различных операционных систем к реализации вызовов удаленных процедур. Всем, интересующимся кластерами, будет полезно прочесть [PFIS98] в этой книге рассмотрены вопросы разработки аппаратного и программного обеспечения и проведено сравнение кластеров и SMP. О кластерах речь идет также в [BUYY99a, BUYY99b]. W2K Cluster Server описан в [SHOR97] и [RAJAOO], Sun Cluster — в [SUN99] и [KHAL96]. j BERS96 Berson A. Client /Server Architecture. — New York: McGraw-Hill, 1996. -Ж \ BUYY99a Buyya R. High Performance Cluster Computing: Architectures and Systems. — Upper Saddle River, NJ: Prentice Hall, 1999. J BUYY99bBuyya R. High Performance Cluster Computing: Programming and Applica- ! tiona. — Upper Saddle River, NJ: Prentice Hall, 1999. i CHAN90 Chandras R- Distributed Message Passing Operating Systems. — Operating | Systems Review* January 1990. | KHAL96 Khalidi Y. et al. Solaris MC: A Multicomputer OS. — Proceedings, 1996 j USENIX Conference, January 1996. ' ' PFIS98 Pfister G. In Search of Clusters. — Upper Saddle River, NJ: Prentice Hall, 1998. *& : RAJAOO Rajagopal R. Introduction to Microsoft Windows NT Cluster Server. r;: Boca Raton, FL: CRC Press, 2000. ^ REAGOOa Reagan P. Client/Server Computing. — Upper Saddle River, NJ: PrentilJ* Hall, 2000. iff REAGOOb Reagan P. Client/Server Network: Design,. Operation and Management, ":_* ? Upper Saddle River, NJ: Prentice Hall, 2000. i ~4~ RIDG97 Ridge D. et al. Beowulf: Harnessing the power of Parallelism in a Pile-o '% PCs. — Proceedings. IEEE Aerospace, 1997. ,' * ? ; SHOR97 Short R., Gamache R., Vert J., Massa M. Windows NT Cluster for Avail-, ability and Scalability. — Proceedings. COMPCON Spring 97, February 1997. ■■ SING99 Singh H. Progressing to Distributed Multiprocessing. — Upper Saddle .4 River, NJ: Prentice Hall, 1999. j STER99 Sterling T. et al. How to build a Beowulf. — Cambridge, MA: МГГ Press, 1999. j SUN99 Sun Microsystems. Sun Cluster Architecture: A White Paper. — Proceed • ings, IEEE Computer Society International Workshop on Cluster Computing, December 1999. * TANE85 Tanenbaum A., Renesse R. Distributed Operating Systems. — Computing Surveys, December 1985. TAY90 Tay В., Ananda A. A Survey of Remote Procedure Calls. — Operating Sys-. terns Review, July 1990. j L. Ж 113.10. ЗАДАЧИ -щт 13.1. Пусть а — доля программного кода, которая может одновременно выполняться п компьютерами кластера, с использованием каждым компьютером отличного от других множества параметров или начальных условий. Предположим, что остальной код должен последовательно выполняться на одном процессоре. Скорость работы каждого процессора — х MIPS. Глава 13. Распределенные вычисления, архитектура... 687
а. Выведите выражение для фактической скорости работы при выполнении программы на одном компьютере. б. Определите значение а, для которого при п = 16 и х = 4 MIPS производительность системы будет равна 40 MIPS. Прикладная программа выполняется на 9-компьютерном кластере. Эталонная программа выполняется на этом кластере за время Т. Как выяснилось, 25% времени программа выполнялась на всех 9 компьютерах; остальное время программа выполнялась на одном компьютере. а. Вычислите эффективное ускорение работы программы по сравнению с ее выполнением на одном компьютере. Вычислите также а — долю кода, которая может выполняться параллельно. б. Предположим, что для параллельно выполняемого кода мы можем эффективно использовать 18 компьютеров вместо 9. Вычислите эффективное ускорение работы программы в этом случае. Приведенная далее программа на языке FORTRAN выполняется на одном компьютере, а ее параллелизованная версия — на 32-компъютерном кластере. L1 L2 L3 L4 L5 20 10 DO 10 I = 1, 1024 SUM(I) = 0 DO 20 J = 1, I SUM(I) = SUM(I) CONTINUE + I Предположим, что выполнение второй и четвертой строк занимает по два машинных цикла, включая работу процессора и доступ к памяти. Накладные расходы, как связанные с работой циклов (строки 1, 3, 5), так и системные, игнорируем. а. Чему равно общее время выполнения (в машинных циклах) программы на одном компьютере? б. Разделите цикл I среди 32 компьютеров следующим образом Компьютер 1 выполняет первые 32 итерации (I = 1...32), компьютер 2 — следующие 32 итерации и т.д. Чему равно общее время выполнения и ускорение по сравнению с выполнением кода на одном компьютере? (Цикл J между компьютерами не разделяется.) в. Измените принцип распараллеливания для повышения степени выравнивания загрузки (с тем чтобы каждый компьютер выполнял равное количество присвоений с учетом обоих циклов). г. Каково минимальное время выполнения фрагмента на 32 компьютерах? Каково максимальное ускорение выполнения по сравнению с выполнением на одном компьютере? 688 Часть 6. Распределенные системы ГЛАВА Управление распределенными процессами 14.1. Миграция процессов 14.2. Распределенные глобальные состояния 14.3. Распределенные взаимоисключения 14.4. Распределенная взаимоблокировка 14.5. Резюме, ключевые термины и контрольные вопросы 14.6. Рекомендуемая литература 14.7. Задачи 14
этой главе изучаются основные механизмы, используемые в распределенных операционных системах. Сначала рассматривается перемещение (миграция) процессов, которое состоит в переносе активного процесса с одной машины на гую; затем исследуется, как процессы, выполняющиеся в разных системах и авляемые каждый своими локальными часами, могут координировать свою дельность при обмене информацией с некоторой задержкой. Наконец, в последней ги главы изучаются два вопроса, играющие важную роль в управлении распреде- ными процессами: взаимоисключение и взаимоблокировка. 4.1. МИГРАЦИЯ ПРОЦЕССОВ штЩ §f Перенос (миграция) процесса состоит в передаче с одной машины на другую рормации о состоянии процесса, достаточной для того, чтобы выполнение .цесса можно было продолжить на новой машине. Первоначально интерес к й концепции возник благодаря исследованиям методов выравнивания загруз- нескольких соединенных в сеть систем; в настоящее время применение дан- t концепции распространилось за пределы этой области. Раньше среди большого количества работ, посвященных распределению нагруз- было мало таких, в основе которых лежала надлежащая реализация переноса •цессов, включающая возможность вытеснения процесса на одной машине и во- новления его через некоторое время на другой. Как показал опыт, такой перенос цесса с вытеснением возможен, хотя при этом возникают накладные расходы, го- до большие, чем по предварительным оценкам [ARTS89a]. Некоторые исследова- и считают, что из-за этих затрат переносы процессов непрактичны. Однако по- ные оценки оказались слишком пессимистичными. Новые реализации, включая которые были воплощены в коммерческих продуктах, способствовали дальней- «у развитию этой области; ее обзор представлен в данном разделе. «основание Перенос процессов в распределенных системах необходим по ряду причин ПТ88, JUL88], включая следующие. Распределение нагрузки. Перенося процессы с более загруженных систем на менее загруженные, можно выравнивать загрузку систем, что будет способствовать повышению общей производительности. Эмпирические данные свидетельствуют о том, что таким образом можно достичь существенного роста производительности [LELA86, CABR86]. Однако алгоритмы распределения нагрузки должны быть тщательно разработаны. В [EAGE86] отмечено, что чем интенсивнее происходит обмен информацией в распределенной системе, тем хуже становится ее производительность. Обсуждение этого вопроса со ссылками на другие источники можно найти в [ESKI90]. Производительность обмена информацией. Процессы, интенсивно обменивающиеся информацией, можно перенести на один узел, чтобы снизить стоимость передачи данных и длительность взаимодействия. Кроме того, если процесс выполняет анализ данных, которые находятся в файле или наборе файлов, размер которого превышает размер процесса, возможно, лучше перенести процесс к данным, а не наоборот. О Часть 6. Распределенные системы • Работоспособность. Может возникнуть необходимость перенести выполняющийся в течение длительного времени процесс, чтобы избежать запланированного простоя или отказов, о возможности возникновения которых стало известно заранее. Если от операционной системы поступило подобное извещение, процесс, которому нужно продолжать свою работу, может либо перейти на другую систему, либо убедиться, что позже его можно будет перезапустить на этой же системе. • Использование особых возможностей. Процесс может переместиться с целью использования уникальных аппаратных или программных возможностей конкретного узла. Механизмы переноса процессов Разрабатывая средство переноса процессов, следует обращать внимание на ряд вопросов, в число которых входят следующие. • Кто должен стать инициатором переноса? • Какая "часть" процесса должна быть перенесена? • Что должно произойти с необработанными сообщениями и сигналами? Инициация переноса Выбор инициатора переноса зависит от предназначения переноса процессов. Если целью является перераспределение нагрузки, то решение о необходимости переноса процесса должно приниматься модулем операционной системы, управляющим загрузкой систем. Этот модуль отвечает за вытеснение переносимых процессов или передачу им сигналов. Чтобы определить, куда нужно перенести процесс, модуль должен обмениваться информацией с подобными ему модулями из других систем и иметь возможность отслеживать загрузку этих систем. Если же целью является использование каких-то особых ресурсов, то при возникновении необходимости процесс может мигрировать самостоятельно. В этом случае процесс должен быть осведомлен о существовании распределенной системы; в предыдущем случае работа функции переноса процесса и существование нескольких систем могут остаться для процесса незаметными. Что переносится Во время переноса процесса необходимо "разобрать" его в старой системе и воссоздать в новой. Это не дублирование процесса, а его перемещение. Следовательно, необходимо перенести образ процесса, состоящий, по крайней мере, из управляющего блока. Кроме того, нужно обновить все связи, предназначенные для передачи сигналов и сообщений, между данным процессом и другими процессами. Эти требования проиллюстрированы на рис. 14.1. Процесс 3 перешел с машины S и стал процессом 4 на машине D. Идентификаторы всех содержащихся в процессе связей (они обозначены строчными буквами) остаются прежними. Ответственность за перенос управляющего блока процесса и обновление отображения связей возлагается на операционную систему. Перенос процесса остается незамеченным как самим процессом, так и его партнерами по обмену информацией. Глава 14. Управление распределенными процессами 691
Ядро Машина S Машина D Р1 Р2 РЗ Р4 Р5 J Р1 Р2 РЗ Ядро а) До переноса Машина S Машина D б) После переноса Рис. 14.1. Пример переноса процесса Перенос управляющего блока процесса осуществляется просто. Сложность с точки зрения производительности представляет перенос адресного пространства процесса и открытых им файлов. Сначала рассмотрим адресное пространство процесса, предполагая, что используется схема виртуальной памяти (сегментация и/или разбивка на страницы). Можно рассмотреть такие стратегии [MIL096]. • Интенсивная (полная). Во время переноса процесса перемещается все адресное пространство. Этот подход, несомненно, является самым понятным. В старой системе не остается никаких следов процесса. Однако если адрес- 692 Часть 6. Распределенные системы ное пространство очень большое и процессу вряд ли понадобится больща; его часть, то можно избежать его полного перемещения, тем самым на по рядок сократив расходы по переносу процесса. • Предварительное копирование. Пока процесс продолжает выполняться н; старом узле, его адресное пространство копируется на новый узел. Страни цы, которые были изменены на старой системе во время предварительногч копирования, нужно скопировать еще раз. Такая стратегия сокращает вре мя простоя процесса, возникающего при его переносе. • Интенсивная (выборочная). Осуществляется перенос только тех странш адресного пространства, которые находятся в основной памяти и были из менены. Все остальные блоки виртуального адресного пространства перено сятся только по мере необходимости. Это сводит к минимуму передачу дан ных. Однако при соблюдении такой стратегии нужно, чтобы машина, с ко торой переносится процесс, продолжала принимать участие в его работе поддерживая элементы таблицы страниц и/или сегментов, а также осуще ствляя удаленное предоставление страниц. • Копирование по запросу. Эта стратегия является разновидностью предыдущей В данном случае страницы предоставляются только тогда, когда на них посту пает запрос. При этом начальные затраты на перенос процесса являются мини мальными (в пределах от десятых до сотых долей микросекунды). • Очистка. Страницы процесса удаляются из основной памяти старой машины и переносятся на диск. После этого доступ к ним осуществляется непосредственно с диска старого узла, без участия его основной памяти. Такая стратегия избавляет от необходимости держать в основной памяти старого узла какие-либо страницы переносимого процесса, освобождая занимаемый им блок памяти для других процессов. Одна из трех последних стратегий может понадобиться в том случае, еслв процессу при работе на новой машине, скорее всего, не понадобится большая часть его адресного пространства (например, если он переносится на новую машину только на время, чтобы поработать с каким-то файлом, и скоро вернется). С другой стороны, если через некоторое время после переноса процесса на новую машину будет осуществлен доступ к большей части его адресного пространства* то частичный перенос блоков адресного пространства может оказаться менее эффективным, чем простой перенос всего адресного пространства, при котором используются первые две стратегии. Во многих случаях заранее неизвестно, понадобится ли большая часть отсутствующего в основной памяти адресного пространства. Однако если процессы разбиты на потоки и если основной единицей переноса является не процесс, а поток, то наиболее привлекательно выглядит стратегия, основанная на удаленной подкачке страниц. Этой стратегии почти всегда отдается предпочтение, потому что оставшиеся потоки процесса остаются на старой системе и им также требуется доступ к адресному пространству этого процесса. Перенос потоков реализован в операционной системе Emerald [JUL89]. Аналогично можно рассматривать и перенос открытых файлов. Если первоначально файл находится в той же системе, что и переносимый процесс, и если файл заблокирован переносимым процессом для своего исключительного исполь- Глава 14. Управление распределенными процессами 893
ювания, то имеет смысл перенести файл вместе с процессом. При этом возника- :т опасность, состоящая в том, что перенос процесса может быть лишь времен- шм, и в течение пребывания процесса на новой системе файл ему может не понадобиться. Поэтому, возможно, стоит переносить весь файл только после того, как переносимый процесс обратится к нему. Если файл используется совместно с цругими распределенными процессами, то следует поддерживать распределенный доступ к этому файлу без перемещения. Если разрешено использовать кэш, как это происходит в системе Sprite (см. рис. 13.7), то возникают дополнительные сложности. Например, если процесс открыл файл для записи, затем разветвился, а затем один из его дочерних процессов оказался перенесенным на другую машину, то этот файл теперь должен быть открыт для записи с двух различных узлов. В алгоритме совместимости кэшей, применяющемся в операционной системе Sprite, запрещено кэширование файла, если с ним работают процессы, выполняющиеся на двух разных машинах [DOUG89, DOUG91]. Сигналы и сообщения И, наконец, рассмотрим, что происходит с сигналами и сообщениями, адресованными переносимому процессу. Происходящее зависит от механизма временного хранения необработанных сигналов и сообщений, обеспечивающего их сохранность в течение процесса переноса, а затем направляющего их по новому адресу. Может возникнуть необходимость в течение некоторого времени поддерживать такой канал передачи информации, чтобы убедиться, что все необработанные сообщения и сигналы достигли пункта конечного назначения. Сценарий переноса В качестве показательного примера самопроизвольного переноса рассмотрим средство, предоставляемое операционной системой AIX фирмы IBM [WALK89], являющейся распределенной системой UNIX. Подобное средство имеется и в операционной системе LOCUS [POPE85], которая фактически послужила основой для разработки системы AIX. Кроме того, это средство было перенесено в операционную систему OSF/1 AD, в которой оно получило название TNC [ZAJC93]. События развиваются по такому сценарию. / 1. Когда процесс решает, что ему нужно перейти на другую машину, он выби- ;.' рает ее и отправляет туда сообщение об удаленном создании задания. Вме- ; сте с сообщением переносится часть образа процесса, а также информация " об открытых файлах. 2. На принявшей сообщение машине процесс ядра порождает дочерний про- ■ цесс, которому передается эта информация. ' 3. Новый процесс получает данные, аргументы или информацию из стека — "' все, что нужно для его работы. Если код программы находится в основной [ памяти в измененном, по сравнению с дисковым, состоянии, то он копиру- ' ется из памяти; в противном случае копирование осуществляется из глобальной файловой системы. 4 Исходный процесс получает сигнал о завершении переноса, после чего отправляет новому процессу завершающее сообщение и самоуничтожается. Часть 6- Распределенные системы Если инициатором переноса процесса послужил другой процесс, события развиваются аналогично. Принципиальное отличие состоит в том, что переносимый процесс должен быть приостановлен и должен переноситься в невыпол- няющемся состоянии. Эта процедура соблюдается, например, в операционной системе Sprite [DOUG89]. В приведенном выше сценарии перенос процесса происходит динамично, включая различные действия по переносу образа процесса. Если же перенос процесса не является самопроизвольным, а его инициатором выступает другой процесс, возможен другой подход, описанный в [SMIT89J. При таком подходе образ процесса и все его адресное пространство копируется в файл, процесс уничтожается, файл с помощью соответствующего средства передачи копируется на другую машину, а затем процесс воссоздается из файла на новой машине. Согласование переноса Другой аспект миграции процессов связан с принятием решения о переносе. В некоторых случаях это решение является односторонним. Например, если перенос происходит с целью выравнивания нагрузки, то предназначенный для этого управляющий модуль отслеживает относительную нагрузку, приходящуюся на различные машины, и при необходимости осуществляет перенос. Если самопроизвольный перенос используется для того, чтобы процесс мог получить доступ к особым средствам паи к большим удаленным файлам, то решение о переносе может принять сам процесс. Однако в некоторых распределенных системах в принятии подобного решения может принимать участие система, на которую собирается перейти процесс. Одной из причин этого является желание сохранить время отклика на запросы пользователя на прежнем уровне. Предположим, например, что пользователь выполняет некоторые операции на рабочей станции. Если какие-то процессы будут перенесены в его систему, то время ее отклика может заметно вырасти, даже если такой перенос выполнен с целью выравнивания нагрузки. Примером механизма согласования переноса процесса может послужить механизм, встречающийся в операционной системе Charlotte [FINK89, ARTS89b]. Стратегией переноса ведает служебная программа Starter, которая принимает решения о том, какой процесс подлежит переносу, когда и куда его нужно переносить. Эта служебная программа реализована в виде процесса, который, кроме того, несет от-, ветственность за долгосрочное планирование и за распределение памяти, и поэтому она может координировать стратегии сразу в трех областях. Каждый процесс программы Starter может управлять кластером машин. Starter регулярно получает от ядра довольно подробную статистику о загрузке каждой машины кластера. Решение о переносе должно приниматься совместно двумя процессами программы Starter, один из которых выполняется на исходном узле, а другой — на Узле назначения (рис. 14.2). При этом выполняются такие шаги. 1. Starter, управляющий исходной системой S, принимает решение о целесообразности переноса процесса Р в какую-то другую систему D. Он отправляет процессу Starter в системе D сообщение с запросом на перенос. 2. Если Starter системы D готов принять новый процесс, он отвечает согласием. 3. Starter системы S передает это решение ядру своей системы с помощью вызова сервиса (если он выполняется на системе S) или с помощью сообщения, которое отправляется процессу KernJob (KJ) машины S (если данный проплава 14. Управление распределенными процессами 695
5. граммный стартер выполняется на другой машине). KJ — это процесс, который используется для преобразования сообщений, поступивших от удаленных процессов, в вызовы сервисов. Затем ядро машины S формирует предложение по поводу пересылки процесса системе D. Это предложение включает в себя статистику процесса Р (его возраст, загрузку процессора и интенсивность обмена информацией). Если в системе D недостаточно ресурсов, она может отклонить предложение. В противном случае ядро системы D передает это предложение своей программе Starter, которая получает всю информацию, поступившую от системы S. Система D извещается о решении, принятом в результате выполнения соответствующего алгоритма программы Starter, с помощью вызова Migrateln. В системе D выделяются необходимые ресурсы в целях избежания взаимоблокировок и проблем, связанных с управлением потоками, после чего система S извещается о том, что ее процесс будет принят. Starter 1: Будет ли принят процесс Р? 2: Да, он будет перемещен на машину 3 5: Предложение процесса Р 3: Передача процесса Р Starter 4: Пр^дшке^ие_про_цесса_Р_ 6: Прием процесса Р /^Г> 7: Принятие предложения Рис. 14.2. Согласование переноса процесса На рис. 14.2 показаны два других процесса, А и В, которые имеют откры- ; тые связи с процессом Р. После выполнения описанных выше действий машина 1, на которой находится система S, должна отправить машинам 0 и 2 сообщение о необходимости обновления связей, чтобы сохранить связи процесса Р с процес- -. сами А и В. В этом сообщении указывается новый адрес каждой связи, содержащейся в процессе Р. В целях синхронизации ядра-адресаты должны ответить,, подтверждением. После этого все сообщения, соответствующие любой из связей - процесса Р, пересылаются непосредственно в систему D. Обмен сообщениями," выполняющийся с целью обновления связей, может выполняться параллельно с ' описанными выше шагами. Наконец, после выполнения шага 7 и после обновле-:, ния всех связей система S собирает весь контекст процесса Р в одно сообщение и пересылает это сообщение системе D. в 6 Часть 6. Распределенные системы Машина 4 тоже работает под управлением операционной системы Charlotte но она не принимает участия в переносе процесса и поэтому не обменивается информацией с другими системами на протяжении этого отрезка времени. Вытеснение Механизм согласования позволяет системе назначения отказаться от переноса в одностороннем порядке. Кроме того, было бы полезно позволить системе вытеснять процессы, перенесенные на нее. Например, на простаивающую рабочую станцию могут быть перенесены несколько процессов. Как только пользователь этой рабочей станции начнет выполнять на ней какие-то операции, может возникнуть необходимость вытеснить с рабочей станции перешедшие на нее процессы, чтобы обеспечить адекватное время отклика. Возможности вытеснения продемонстрированы в операционной системе Sprite [DOUG89]. В этой системе, предназначенной для рабочих станций, все выглядит так, как будто каждый процесс на протяжении всего своего времени жизни выполняется на одном и том же узле, который называется домашним узлом процесса. Если процесс переносится на другую машину, он становится внешним процессом на этой машине. Машина в любой момент времени может вытеснить внешний процесс, вследствие чего он переносится на свой домашний узел. Механизм вытеснения операционной системы Sprite состоит из таких элементов. 1. Управляющий процесс на каждом узле отслеживает его текущую загрузку, чтобы определить, когда можно принять новые внешние процессы. Если этот процесс обнаруживает активность консоли рабочей станции, он приступает к процедуре вытеснения всех внешних процессов. 2. Вытесняемый процесс возвращается на домашний узел. Если освобождается какой-нибудь другой узел, процесс может перейти на него. ь 3. Хотя вытеснение всех процессов занимает некоторое время, все предназначенные для вытеснения процессы немедленно приостанавливаются. Если позволить процессу, ожидающему своего вытеснения, продолжить работу, это сократит время, в течение которого процесс остается замороженным, но снизит вычислительные мощности узла, вовлеченные в процесс вытеснения. 4. Все адресное пространство вытесняемого процесса передается на домашний узел. Затраты времени на вытеснение процесса и его возвращение на домашний узел, можно было бы существенно уменьшить, восстанавливая образ памяти вытесняемого процесса из внешнего узла, на котором он находился до этого, но не сразу, а по мере надобности. Однако при этом внешний узел будет вынужден предоставлять вытесняемому процессу свои ресурсы и сервисы в течение более длительного периода времени, чем необходимо. Вытесняющие и невытесняющие переносы Данный раздел рассматривает вытесняющий перенос процессов, который включает передачу частично выполненного процесса (или, по крайней мере, процесса, создание которого уже завершено). Невытесняющий перенос процессов — более простая функция, работающая только с процессами, выпол- ение которых еще не началось, благодаря чему переносить информацию о '^лава 14. Управление распределенными процессами 697
остоянии процесса не требуется. В обоих случаях необходимо передать на даленный узел информацию о среде, в которой будет выполняться процесс. ;ЮДа могут входить сведения о текущем каталоге пользователя, унаследо- анных процессом привилегиях и унаследованных ресурсах, таких, как де- крипторы файлов. Невытесняющий перенос процесса может быть полезен при балансировке агрузки (см., например, [SHIV92]). Она обладает тем преимуществом, что по- во-.лет избежать накладных затрат на полный перенос процесса. Недостатком той схемы является то, что она не может адекватно реагировать на внезапные зменения в распределении нагрузки. 14.2. РАСПРЕДЕЛЕНЙЫЕ ГЛОБАЛЬНЫЕ 1 СОСТОЯНИЯ . - 1 'лобальные состояния и распределенные снимки Все связанные с параллельными вычислениями проблемы, такие, как заимоисключения, взаимоблокировки и голодание, встречающиеся в сильно- вязанных системах, имеются также в распределенных системах. Стратегии азработки в этом случае осложняются тем, что для таких систем нельзя опре- елить глобальное состояние. Это означает, что в распределенной системе опе- ационная система или процесс не могут получить информацию о текущем со- гоянии всех процессов системы. Процесс может знать лишь текущее состоя- ие всех процессов локальной системы, осуществив доступ к управляющим локам процессов, которые находятся в памяти. Что касается удаленных провесов, то информацию об их состоянии процесс может получить только из ришедших сообщений. Следует отметить, что эта информация получена неко- орое время назад и может оказаться устаревшей в момент получения. Анало- ичная ситуация — в астрономии: знания об удаленной звезде или галактике олучены на основании светового и прочего электромагнитного излучения уда- енного объекта, и это излучение дает представление о состоянии объекта в рошлом. Например, знания об объекте, находящемся на расстоянии пяти ты- нч световых лет, успевают устареть на пять тысяч лет. Подобная задержка во времени, зависящая от природы распределенных истем, усложняет все проблемы, связанные с параллелизмом. Чтобы пояс- ить это, приведем пример, взятый из [ANDR90]. Для иллюстрации пробле- ы воспользуемся графиками процессов и событий (рис. 14.3 и 14.4). Гори- энтальными линиями на этих графиках представлены временные оси. Точка а оси соответствует событию (например, событию во внутреннем процессе, гправке или приему сообщения). Обведенный вокруг точки квадрат пред- гавчяет состояние локального процесса в фиксированный момент времени, эответствующий этой точке. Стрелкой обозначается передача сообщения от цного процесса другому. 98 Часть 6. Распределенные системы Филиал А Филиал В SA = $100 sB=$o 3:00 а) Сумма $100 Филиал А Филиал В SA = $0 Сообщение Перевести $100 в филиал В" 3:00 б) Сумма $0 Филиал А Филиал В SA = $100 3:00 Сообщение "Перевести $100 в филиал В" SB = $100 * 2:59 в) Сумма $200 Рис. 14.3. Примеры определения глобального состояния 3:00 В нашем примере клиент банка имеет счет в двух его филиалах. Чтобы определить полную сумму, находящуюся на счету этого клиента, банк должен иметь сведения о количестве его денег в каждом из филиалов. Предположим, что запрос сделан ровно в 3:00. В случае, показанном на рис. 14.3,а, общий счет окажется равным $100.00. Однако возможна также ситуация, представленная на рис. 14.3,6, в которой во время запроса происходит перевод денег из филиала А в филиал В. В результате будет получен неправильный результат, равный $0.00. Эту проблему можно решить, проверяя во время запроса все сообщения о переводе денег. Нужно, чтобы в филиале А хранились записи обо всех переводах из этого филиала, а также о том, кому эти переводы предназначены. Поэтому в "состояние" филиала А нужно включить как учет текущих счетов клиентов, так и записи о денежных переводах. Проверяя эти два пункта, служащий банка обнаружит денежный перевод, покинувший филиал А и предназначенный для филиала В. Так как эта сумма еще не пришла в филиал В, она будет добавлена в общий счет. Любая сумма, которая была переведена и уже получена, учитывается только один раз; она будет входить в текущий счет, содержащийся в филиале-получателе. Глава 14. Управление распределенными процессами 699
Процесс А Процесс В Процесс С а) Несогласованное глобальное состояние Процесс А Процесс В Процесс С t б) Согласованное глобальное состояние в Рис. 14.4. Несогласованное глобальное состояние и согласованное глобальное состояние Такая стратегия не является полностью надежной. В примере, приведенном са рис. 14.3,в, часы в разных филиалах идут с некоторым относительным сдви- ом. Проверка состояния счета клиента в филиале А в момент времени 3:00 дает мззультат, равный $100.00. Однако впоследствии эта сумма переводится в филиал В. В этот момент времени часы в филиале А показывают время 3:01, но в рилиале В в этот же момент на часах — 2:59. Поэтому в запросе, производимом i 3:00, переводимая сумма учитывается дважды. Чтобы понять, с трудностью какого рода мы столкнулись, и сформулиро- тть решение, определим некоторые понятия. • Канал. Если два процесса обмениваются сообщениями, между ними устанавливается канал. Канал можно представить как путь или способ, с помощью которого происходит передача сообщений. Для удобства каналы считаются однонаправленными. Таким образом, для обмена сообщениями между Двумя процессами необходимы два канала, каждый из которых служит для передачи сообщений в одном направлении. • Состояние. Состояние процесса — это последовательность сообщений, отправленных и принятых по всем его каналам. • Снимок. Снимок фиксирует состояние процесса. В каждый снимок входят записи обо всех сообщениях, отправленных и полученных, начиная с того момента, когда был сделан предыдущий снимок. 00 :<А Част ■$. Распределенные.системы • Глобальное состояние. Объединенное состояние всех процессов. • Распределенный снимок. Множество снимков каждого процесса. Проблема состоит в том, что из-за задержки, необходимой для передачи сообщений, невозможно определить истинное глобальное состояние распределенной системы. Можно попытаться определить глобальное состояние, объединив в одно множество снимки всех процессов. Например, в глобальном состоянии, соответствующем рис. 14.4,а, на момент выполнения снимков будет обнаружено, что одно сообщение передается по каналу <А,В>, одно — по каналу <А,С> и одно — по каналу <С,А>. Сообщения 2 и 4 будут представлены правильно, а сообщение 3 — нет. Распределенный снимок покажет, что оно уже получено, но еще не отправлено. Хотелось бы, чтобы распределенный снимок отображал глобальное состояние согласованно. Глобальное состояние будет согласованным, если для каждого состояния процесса, в котором есть запись о получении сообщения, имеется соответствующая запись в состоянии процесса-отправителя. На рис. 14.4,6 приведен пример такого состояния. Несогласованное глобальное состояние возникает тогда, когда в процессе имеется запись о получении какого-то сообщения, а соответствующей записи в процессе, отправившем это сообщение, нет (рис. 14.4,а), Алгоритм распределенного снимка В [CHAN85] описан алгоритм распределенного снимка, который позволяет получить согласованное глобальное состояние. В этом алгоритме предполагается, что сообщения доставляются в том порядке, в котором они были отправлены, и что они не теряются. Надежный протокол передачи сообщений (например, TCP) удовлетворяет этим требованиям. В алгоритме используются специальные управляющие сообщения, которые называются маркерами (marker). Инициатором начала работы алгоритма выступает какой-то процесс, записывающий свое состояние и отправляющий маркер по всем своим исходящим каналам. В промежутке между моментом записи состояния и моментом отправки маркера никакие другие сообщения не отправляются. После этого каждый процесс р, первый раз получивший маркер (скажем, от процесса q), выполняет такие действия. 1. Записывает свое состояние Sp. 2. Делает запись о том, что входной канал из q в р является пустым. 3. Рассылает маркер всем соседним процессам, пользуясь для этого своими выходными каналами. Эти действия должны выполняться атомарно — т.е. до выполнения шага 3 нельзя отправлять или принимать никакие сообщения. Процесс р, который уже записал свое состояние, получив по входному каналу маркер от какого-то другого процесса (скажем, от процесса г), выполняет следующее. 1. Записывает состояние канала из г в р как последовательность сообщений, полученных от процесса г за интервал времени от момента записи своего локального состояния Sp до момента получения маркера от процесса г. Выполнение алгоритма процессом прекращается тогда, когда этот процесс получит маркеры по всем своим входным каналам. Глава 14. Управление распределенными процессами 701
В [ANDR90] по поводу этого алгоритма сделаны такие замечания. 1. Любой процесс может начать выполнение алгоритма, отправив маркер. Фактически решение о записи глобального состояния могут независимо принять несколько узлов, и это никак не повлияет на правильность выполнения алгоритма. 2. Если все сообщения (включая маркеры) передаются в течение конечного времени, время выполнения алгоритма тоже будет конечным. 3. Алгоритм является распределенным: каждый процесс сам отвечает за запись своего собственного состояния и состояния всех своих входных каналов. 4. После того как будут записаны все состояния (после завершения работы алгоритма во всех процессах), из них можно будет собрать глобальное состояние. Для этого нужно, чтобы каждый процесс отправил данные о своем состоянии по всем выходным каналам, а каждый процесс, получивший данные о состоянии других процессов, переслал их по всем своим выходным каналам. Можно предложить и другой метод сборки, в котором процесс- инициатор запрашивает в установленном порядке состояния всех других процессов, составляя из них глобальное состояние. 5. Алгоритм не влияет на другие распределенные алгоритмы, в которых принимают участие вовлеченные в него процессы, и не подвержен влиянию этих алгоритмов. В качестве примера применения описанного выше алгоритма (пример взят [з [BEN90]) рассмотрим множество процессов, изображенных на рис. 14.5. Каж- [ый процесс представлен кружком, а каждый однонаправленный канал — со- диняющей кружки линией со стрелкой, которая указывает направление. Пред- голожим, что алгоритм снимка начинает работу; пусть при этом по каждому из (ыходных каналов каждого процесса пересылается по девять сообщений. Реше- ше о записи глобального состояния принимается независимо процессами 1 и 4. Троцесс 1 к этому времени отправил шесть сообщений, а процесс 4 — три сооб- цения. По завершении работы алгоритма собираются снимки всех процессов, в >езультате чего получается глобальное состояние, показанное на рис. 14.6. Перед ем как записать свое состояние, процесс 2 отправил по каждому из своих выгодных каналов по четыре сообщения процессам 3 и 4. До записи своего состоя- шя этот процесс успел получить от процесса 1 четыре сообщения, а сообщения 5 i 6 попали в запись о состоянии каналов. Читатель может убедиться в согласо- 1анности моментального снимка: для каждого отправленного сообщения имеется [ибо запись о его получении, либо запись о том, что оно передается по каналу. Рис. 14.5. Граф процессов и каналов Г02 Часть 6. Распределенные системы Процесс 1 Выходные каналы Канал 2: посланы для 1, 2, 3, 4, 5, 6 Канал 3: посланы для 1, 2, 3, 4, 5, 6 Входные каналы ?mkt Процесс 2 Выходные каналы Канал 3: посланы для 1, 2, 3, 4 Канал 4: посланы для 1, 2, 3, 4 Входные каналы Канал 1: получены от 1, 2, 3, 4; остались 5, 6 Канал 3: получены от 1, 2, 3, 4, 5, б, 7, 8 Процесс 3 Выходные каналы , „ Канал 2: посланы для 1, 2, 3, 4, б, 6, 7, 8 Входные каналы „,£ Канал 1: получены от 1, 2, 3; ;/' г, -.-,-. остались 4, 5, 6 Канал 2: получены от 1, 2, 3; остались 4 Канал 4: получены от 1, 2, 3 Процесс 4 Выходные каналы Канал 3: посланы 1, 2, 3 Входные каналы Канал 2: получены 1,2; остались 3, 4 Рис. 14.6. Пример снимка Приведенный алгоритм получения распределенного снимка является мощ ным и гибким инструментом. Его можно использовать для адаптации любогс централизованного алгоритма к условиям распределенной среды, так как в осно ве любого централизованного алгоритма лежат знания о глобальном состоянии. В качестве частных примеров можно привести алгоритмы выявления взаимоблокировок и обнаружения прекращения процессов (см., например, [BEN90, LYNC96]). Этот алгоритм также можно использовать для работы контрольных точек распределенного алгоритма, с тем чтобы в случае ошибки можно было восстановить исходное состояние системы. * дг!;-2=-л.-«а,«"^~ж-. T*Jf. е~" 9»." F 14.3. РАСПРЕДЕЛЕННЫЕ ВЗАИМОИСКЛЮЧЕНИЯ £'Ъ > Напомним, что в главах 5, "Параллельные вычисления: взаимоисключения и многозадачность", и 6, "Взаимоблокировка и голодание", речь шла о вопросах, связанных с выполнением параллельных процессов. Двумя основными проблемами, которые возникают при этом, являются взаимоисключение и взаимоблокировка. В указанных главах основное внимание сосредоточено на решениях указанных проблем в контексте одной системы, обладающей одним или несколькими процессорами, но единой основной памятью. В распределенной операционной системе, управляющей системой с множеством процессоров, которые не используют совместно основную память или часы, возникают новые трудности и требуются новые решения. Алгоритмы взаимоисключения и взаимоблокировки должны зависеть от обмена сообщениями и не могут зависеть от возможности доступа к общей памяти. В этом разделе и далее взаимоисключения и взаимоблокировка изучаются в контексте распределенной операционной системы. Глава 14. Управление распределенными процессами 703
Концепции распределенных взаимоисключений Если два или большее количество процессов соревнуются за возможность использования системных ресурсов, нужен механизм обеспечения взаимоисключений. Предположим, что двум или большему количеству процессов нужен доступ к единому неразделяемому ресурсу, например к принтеру. Во время своей работы каждый процесс будет отдавать команды этому устройству ввода- вывода, получая информацию о его состоянии, отправляя данные и/или получая их. Такой ресурс мы будем называть критическим, а использующую его часть программы — критическим разделом программы. Важно отметить, что в каждый момент времени может выполняться критический раздел только одной программы. Понимание и воплощение этого ограничения не может основываться лишь на операционной системе, так как точные требования могут быть не очевидными. Например, принтер должен находиться под управлением процесса до тех пор, пока не будет распечатан весь файл. В противном случае в распечатанном документе будут чередоваться строки, направленные разными конкурирующими процессами. Чтобы успешно применять параллелизм процессов, нужно иметь возможность задавать критические разделы и реализовывать взаимоисключения. Это является основой любой схемы параллельной обработки. Устройство или средство, обеспечивающее взаимоисключения, должно удовлетворять следующим требованиям. 1. Необходимо обеспечить реализацию взаимоисключения: в каждый момент времени лишь один процесс из всех тех, в которых имеются критические разделы одного и того же ресурса или совместно используемого объекта, может находиться в этом критическом разделе. 2. Если выполнение процесса прекращается не в критическом разделе, это не должно влиять на работу других процессов. 3. Нельзя, чтобы процесс, которому нужен доступ к критическому разделу, ожидал до бесконечности: нельзя допускать взаимоблокировок и голодания. 4. Если в критическом разделе нет ни одного процесса, то любой процесс, которому нужно войти в этот критический раздел, должен иметь возможность сделать это без промедления. 5. Не делается никаких предположений об относительной скорости выполнения процессов или об их количестве. 6. Процесс остается в критическом разделе лишь в течение конечного времени. На рис. 14.7 показана модель, на примере которой можно изучать разные подходы к взаимоисключениям в контексте распределенных систем. Допустим, что некоторое количество систем соединены между собой с помощью какого-то сетевого устройства. Предположим также, что в операционной системе каждой системы имеется некоторая функция или процесс, отвечающий за распределение ресурсов. Каждый такой процесс управляет определенным количеством ресурсов и обслуживает несколько пользовательских процессов. Нужно разработать алгоритм, согласно которому эти процессы могут совместно обеспечивать взаимоисключение. 704 Часть 6. Распределенные системы Система 1 Rt1 Re*" R|m Рис. 14.7. Модель для изучения проблемы взаимоисключения в распределенных процессах Механизм взаимоисключения может быть либо централизованным, либо распределенным. В полностью централизованном алгоритме один из узлов настраивается как управляющий; он управляет доступом ко всем совместно используемым объектам. Если какому-то процессу нужен доступ к критическому ресурсу, он генерирует запрос и отправляет его своему локальному процессу, управляющему ресурсами. Локальный управляющий процесс, в свою очередь, передает этот запрос контрольному узлу, который возвращает ответ (разрешение), когда совместно используемый объект становится доступным. Закончив работу с ресурсом, запрашивавший его процесс отправляет управляющему узлу сообщение об освобождении ресурса. Такой централизованный алгоритм обладает двумя определяющими свойствами. 1. Решения о распределении ресурсов принимает только управляющий узел. 2. Вся необходимая информация, включая сведения об идентификаторах и размещении всех ресурсов, а также о статусе распределения каждого ресурса, сосредоточена на управляющем узле. Централизованный подход является прямолинейным; легко понять, как в нем реализуются взаимоисключения: управляющий узел не удовлетворит запрос на ресурс до тех пор, пока этот ресурс не освободится. Однако такая схема имеет ряд недостатков. При отказе управляющего узла механизм взаимоисключений разлаживается (по крайней мере, на некоторое время). Кроме того, для каждого предоставления или освобождения ресурса нужен обмен сообщениями с управляющим узлом. Таким образом, недостаточная мощность управляющего узла может тормозить работу всей распределенной системы. Глава 14. Управление распределенными процессами 705 Система N р«« Рдй * *' Р« - Ч/ RP; — процесс управления ресурсами в системе/ Р., — пользовательский процесс /' в системе /' Fiji- — ресурс /' е системе/
Из-за этих, присущих централизованным алгоритмам, проблем, возрос ин- ipec к разработке распределенных алгоритмов. Полностью распределенный ал- >ритм обладает такими свойствами [МАЕК87]. 1. Каждый узел в среднем обладает одинаковым количеством информации. 2. Каждый узел имеет лишь частичные сведения обо всей системе и может принимать решения, основываясь на этих сведениях. 3. За принятие конечного решения все узлы отвечают в равной мере. 4. На осуществление конечного решения все узлы в среднем затрачивают одинаковые усилия. 5. Отказ одного из узлов не приводит к упадку всей системы. 6. В системе нет общих часов, по которым можно координировать события. Пункты 2 и 6 требуют некоторого уточнения. Что касается пункта 2, то в екоторых распределенных алгоритмах требуется, чтобы все узлы обменивались звестной им информацией. Даже в этом случае в каждый фиксированный мо- ент времени некоторая часть информации находится в пути и может еще не ойти до всех остальных узлов. Таким образом, из-за временных задержек, воз- икающих при передаче сообщений, хранящаяся на каком-то отдельном узле нформация не является полностью обновленной, и в этом смысле каждый узел бладает лишь частичной информацией. Что касается пункта 6, из-за того что обмен информацией между системами роисходит с некоторой задержкой, невозможно поддерживать часы, которые ыли бы немедленно доступны для всех систем. Кроме того, с технической точки рения непрактично поддерживать одни централизованные часы, по которым южно было бы точно синхронизовать все локальные часы. Однако через некото- юе время в показаниях разных локальных часов возникнет расхождение, в ре- ультате чего утратится синхронизация. Существенное усложнение механизмов взаимоисключения в распределенных системах по сравнению с централизованными вызвано задержками, возни- ;ающими при обмене информацией, а также отсутствием общих часов. Перед •ем как обратиться к некоторым алгоритмам распределенного взаимоисключе- шя, исследуем общий подход к проблеме преодоления рассогласованности часов. Упорядочение событий в распределенной системе Основой работы большинства распределенных алгоритмов взаимоисклю- 1ений и взаимоблокировок является временное упорядочение событий. Основном ограничением в нашей ситуации является отсутствие общих часов или :редств синхронизации локальных часов. Проблему можно сформулировать и гак: хотелось бы иметь возможность определить, какое из событий произошло эаньше, — событие а в системе i или событие b в системе j. Кроме того, желательно было бы иметь возможность делать такие выводы относительно любой ;истемы, подключенной к сети. К сожалению, эта формулировка не является гочной по двум причинам. Во-первых, между самим событием и его наблюдением в других системах может возникать задержка. Во-вторых, из-за отсутствия синхронизации возникают разногласия в показаниях часов, установленных в различных системах. 706 Часть 6- Распределенные системы Чтобы преодолеть эти трудности, Лампорт (Lamport) [LAMP78] предложил метод, получивший название метода временных меток (timestamping), который помогает упорядочивать события в распределенных системах, не используя физические часы. Эта технология оказалась настолько действенной и эффективной что стала использоваться в подавляющем большинстве алгоритмов взаимоисключений и взаимоблокировок. Для начала выберем определение понятия событие (event). В конечном счете, мы имеем дело с событиями, происходящими в локальной системе, например вхождением процесса в критический раздел или выходом из него. Однако в распределенной системе процессы взаимодействуют между собой с помощью сообщений. Поэтому имеет смысл ассоциировать события с сообщениями. Связать локальное событие с сообщением очень просто — например, процесс может отправлять сообщение, когда ему нужно войти в критический раздел или выйти из него. Чтобы избежать неоднозначности, события будем связывать только с отправкой сообщений, а не с их получением. Таким образом, каждый раз, когда процесс передает сообщение, задается событие, соответствующее моменту времени, когда сообщение покинуло процесс. Схема временных меток предназначена для того, чтобы упорядочить события, заключающиеся в передаче сообщений. В каждой подключенной к сети системе i поддерживается локальный счетчик Cit выполняющий функцию часов. Перед передачей каждого сообщения система увеличивает показания этого счетчика на 1. Сообщение имеет вид (гп.Тг1) , где т — содержимое сообщения, Т, — временная метка сообщения, равная Q, i — численный идентификатор узла. Получив сообщение, система-адресат j устанавливает значение своего счетчика равным увеличенному на единицу максимальному значению из текущего показания счетчика системы и поступившей временной метки: С j «-l + max[Cr7;.] Упорядочение событий в каждом узле происходит по следующим правилам. Говорят, что сообщение х, поступившее от узла i, предшествует сообщению у, поступившему от узла /, если выполняется одно из следующих условий. 1. Tt< Tj 2. Tt = Tj и i < j. Временной характеристикой каждого сообщения является его временная метка, а упорядочение времен определяется двумя приведенными выше правилами (т.е. два сообщения, временные метки которых равны, упорядочиваются по номерам их узлов). Благодаря тому что применение этих правил не зависит от узлов, при таком подходе удается избежать проблем, связанных с расхождением часов процессов, которые обмениваются информацией. Пример работы этого алгоритма показан на рис. 14.8. В распределенной системе имеется три узла, каждый из которых представлен процессом, выполняющим алгоритм временных меток. Процесс Рх начинается с показанием часов, равным 0. Перед передачей сообщения а он увеличивает показание своих Глава 14. Управление распределенными процессами 707
часов на 1 и передает сообщение вида (а, 1,1), в котором первое численное значение соответствует временной метке, а второе — идентификатору узла. Это сообщение принимается процессами на узлах 2 и 3. В обоих случаях показания локальных часов равняются нулю, а после получения сообщения устанавливаются равными 2 = 1 + тах[0,1]. Процесс Р2 генерирует следующее сообщение, увеличивая перед этим показание своих часов на 1 (т.е. до 3). Получив это сообщение, процессы 1 и 3 должны установить на своих часах значение 4. Затем примерно в одно и то же время процесс Pi отправляет сообщение b, a процесс Р3 — сообщение j. Оба сообщения имеют одинаковые временные метки. Благодаря сформулированному выше временному принципу это не приведет к путанице. После всех этих событий упорядочение событий на всех узлах будет одним и тем же, а именно {а, х, Ъ, j}. Время Рис. 14.8. Пример работы алгоритма временных меток Как показано на рис. 14.9, описанный алгоритм работает, несмотря на различия во времени передачи сообщений в паре систем. Процессы Р! и Р4 отправляют сообщения с одинаковыми временными метками. Сообщение от процесса Рх прибывает на узел 2 раньше, чем сообщение от процесса Р4, а на узел 3 сообщения от этих процессов прибывают в обратном порядке. Несмотря на это, после получения всех сообщений их упорядочение на всех узлах остается одинаковым: {a, q). Заметим, что упорядочение по такой схеме не всегда соответствует реальной последовательности событий. Так как основой этих алгоритмов является схема временных меток, не важно, какое событие произошло первым на самом деле. Важно только то, что упорядочение всех процессов по этому алгоритму выполняется согласованно. 708 Насть ф. Расцределенные^ис^емы Время 1 (q.1,4) Рис. 14.9. Еще один пример работы алгоритма временных меток В двух приведенных примерах процесс адресует каждое сообщение всем остальным процессам. Если какие-то сообщения отправляются по-другому, bksko- торые узлы не получат всех сообщений, пересланных в системе, и поэтому невозможно будет одинаково упорядочить сообщения на всех узлах. В этом случае получится множество частичных упорядочений. Однако использование временных меток первоначально предназначалось для распределенных алгоритмов взаимоисключений и взаимоблокировок. В таких алгоритмах процесс обычно отправляет сообщение (с временной меткой) всем другим процессам; временные метки используются для того, чтобы определить порядок обработки сообщений. Распределенная очередь Первая версия Один из самых ранних подходов, предложенный для обеспечения распределенных взаимоисключений, связан с концепцией распределенной очереди [LAMP78]. В основе этого алгоритма лежат такие предположения. 1. Распределенная система состоит из N узлов, пронумерованных числами от 1 до N. На каждом узле содержится один процесс, запрашивающий взаимоисключающий доступ к ресурсам от имени других процессов; этот процесс также выступает арбитром, разрешая перекрывающиеся во времени входящие запросы. 2. Получение сообщений, отправленных одним процессом другому, происходит в том же порядке, в котором эти сообщения были отправлены. 3. Каждое сообщение доставляется по указанному адресу в течение конечного времени. 4. Сеть является полносвязной; это означает, что каждый процесс может отправить сообщение любому другому процессу без участия в передаче какого- либо промежуточного процесса. Глава 14. Управление распределенными процессами 709
Условия 2 и 3 можно выполнить, применяя надежный транспортный протокол, такой, как TCP. Опишем алгоритм, предназначенный для того случая, когда каждый узел управляет только одним ресурсом. Обобщение на случай управления несколькими ресурсами тривиально. В этом алгоритме предпринята попытка обобщить простой алгоритм, который мог бы работать в централизованной системе. Если ресурсом управляет единый центральный процесс, он может выстраивать поступающие запросы в очередь и предоставлять доступ к ресурсу в порядке поступления запросов. Чтобы реализовать этот же алгоритм в распределенной системе, на всех узлах должна быть копия одной и той же очереди. Чтобы порядок предоставления ресурса по запросам совпадал на всех узлах, можно применять временные метки. При этом возникает одна сложность: из-за того что сообщение передается в течение какого-то конечного времени, возникает угроза, что на двух различных узлах во главе очереди будут находиться запросы разных процессов. Обратимся к рис. 14.9. Имеется некоторый интервал времени, в течение которого сообщение а уже получено процессом Р2, а сообщение q — процессом Р3, но оба сообщения еще не . дошли до других процессов, которым они также были отправлены. Таким образом, в течение этого интервала времени процессы Р! и Р2 считают, что первым в очереди является сообщение а, а процессы Р3 и Р4 считают, что первым является сообщение q. Подобная ситуация может привести к нарушению требования взаимоисключения. Во избежание этого накладывается следующее ограничение: прежде чем процесс, исходя из состояния своей собственной очереди, примет решение о предоставлении ресурса, он должен получить от всех других узлов сообщение, гарантирующее, что в каналах не осталось ни одного сообщения, которое может занять первое место в очереди. На каждом узле поддерживается структура данных, в которой хранятся записи о последних сообщениях, полученных от каждого узла (а также о тех, которые недавно отправлены с данного узла). Лампорт называет такую структуру очередью; фактически она является массивом, в котором каждому узлу соответствует один элемент. В каждый момент времени в элементе локального массива q[j] содержится сообщение от процесса Р;. Массив инициализируется следующим образом: <7(j] = (Release,*),./') j = l,D , Л/ В этом алгоритме используются три вида сообщений: • (Request, Tit i): запрос ресурса процессом Р,; • (Reply, Т, у): предоставление процессом Р, доступа к ресурсу, который на ходится под его управлением; • (Release, Tk% k): процесс Pt освобождает предоставленный ему ресурс. Алгоритм работает следующим образом. 1. Когда процессу Р4 нужен доступ к ресурсу, он отправляет запро (Request, Т1л i) с временной меткой, значение которой равняется текущее показанию локального счетчика этого процесса. Процесс помещает это со общение в элемент своего собственного массива q[i] и рассылает его всем ос тальным процессам. . * Част?» 6* РАспреде&евдш йстемы 2. Когда процесс Р, получает запрос (Request, Tif i), он помещает его в элемент собственного массива q[i]. Если в элементе q{J] не содержится сообщения с запросом, то процесс Ру отправляет процессу Pt ответ. Это именно то действие, с помощью которого реализуется описанное ранее правило. Оно гарантирует, что в момент принятия решения в каналах не осталось ни одного сообщения с запросом. 3. Процесс Р, может получить доступ к ресурсу (войти в критический раздел), если соблюдаются два условия. а. Запрос q, поступивший от процесса Р,, является первым сообщением в собственной очереди этого процесса; поскольку сообщения на всех узлах упорядочены одинаково, это сообщение предоставляет в каждый момент времени доступ к ресурсу одному и только одному процессу. б. Все другие сообщения, содержащиеся в локальном массиве, являются более поздними, чем сообщение в элементе q[i]; соблюдение этого правила гарантирует, что процессу Р{ известно обо всех запросах, предшествующих его текущему запросу. 4. Процесс Р, освобождает ресурс путем генерации сообщения (Release, Tt, £)» которое он помещает в свой собственный массив и рассылает всем другим процессам. 5. Получив сообщение (Release, Tj7 у), процесс Р, помещает его в элемент массива q[j], заменяя его текущее содержимое этим сообщением. 6. Получив сообщение (Reply, Т,, у), процесс Р; помещает его в элемент массива q[j], заменяя его текущее содержимое этим сообщением. Легко показать, что этот алгоритм обеспечивает взаимоисключение, равноправность процессов, отсутствие взаимоблокировок и голодания. • Взаимоисключение. Запросы на вход в критический раздел обрабатываются в том порядке, который определяется механизмом временных меток. Если процесс Р, принимает решение войти в свой критический раздел, то в системе не может быть никаких других запросов, которые были переданы перед его запросом. Это утверждение является справедливым, так как процесс Р, к этому моменту получил от всех других узлов сообщения, помеченные более поздним временем, чем его запрос. В этом можно быть уверенным благодаря механизму ответных сообщений. Напомним, что при передаче сообщений их порядок не может быть нарушен. • Равноправность. Доступ по запросам предоставляется строго в соответствии с временными метками. Поэтому все процессы обладают равными возможностями. • Отсутствие взаимоблокировок. Благодаря тому, что порядок временных меток на всех узлах совпадает, взаимоблокировки невозможны. • Отсутствие голодания. Как только процесс Р* закончит выполнение своего критического раздела, он передает сообщение об освобождении (Release). Это приводит к удалению на всех узлах запроса, поступившего от процесса Р,, и предоставлению доступа к критическому разделу другому процессу. 1 лава 14. Управление распределенными процессами 711
Чтобы оценить эффективность работы этого алгоритма, отметим, что для обеспечения исключения необходимо переслать Зх (2V - 1) сообщений: (N - 1) сообщений- запросов, (N - 1) ответных сообщений и (N - 1) сообщений об освобождении. Вторая версия В [RICA81] предложен улучшенный вариант алгоритма Лампорта. В нем предпринята попытка оптимизировать первоначальную версию этого алгоритма, исключив из него сообщения об освобождении ресурса. Остаются в силе все ранее сделанные предположения, за исключением того, что теперь нам не нужно, чтобы сообщения, отправленные одним процессом другому, приходили в том же порядке, в котором они были отправлены. Как и ранее, на каждом узле имеется один процесс, управляющий распределением ресурсов. Этот процесс поддерживает массив q и работает по следующим правилам. 1. Если процессу Р4 нужен доступ к ресурсу, он генерирует запрос (Request, T£, i) с временной меткой, значение которой равняется текущему показанию локального счетчика этого процесса. Процесс помещает это сообщение в элемент своего собственного массива q[i\ и рассылает его всем остальным процессам. 2. Когда процесс Ру получает запрос (Request, Tif г), он действует следующим образом. а. Если процесс Ру в данное время находится в своем критическом разделе, он откладывает отправку ответного сообщения (см. правило 4 ниже). б. Если процесс Ру не ожидает, пока ему можно будет войти в свой критический раздел (у него нет необработанных запросов), он передает процессу Р, ответ (Reply, Ту, ;). в. Если процесс Ру ожидает, пока ему можно будет войти в свой критиче-. ский раздел, и если входящее сообщение следует после запроса процесс; Ру, то он помещает это сообщение в элемент собственного массива q[i] и откладывает отправку ответного сообщения. :; г. Если процесс Ру ожидает, пока ему можно будет войти в свой критический раздел, и если входящее сообщение предшествует запросу процесс Ру, то он помещает это сообщение в элемент собственного массива q[i] отправляет процессу Р< ответное сообщение (Reply, Ty, у). 3. Процесс Р4 может получить доступ к ресурсу (войти в свой критически раздел), если он получил ответные сообщения от всех остальных процессов. 4. После выхода из своего критического ресурса процесс Р, освобождает ре суре, рассылая ответные сообщения на все ожидающие запросы. Диаграмма переходов каждого процесса из одного состояния в другое пока зана на рис. 14.10. Итак, если процессу нужно войти в свой критический раздел, он рассылав всем другим процессам запрос с временной меткой. Когда он получит ответы от всех них, он сможет войти в свой критический раздел. Если процесс получает запрос о другого процесса, он, в конце концов, должен отправить ему соответствующий ответ Если процессу не нужно входить в свой критический раздел, он отправляет этот ответ сразу же. Если же ему нужно войти в свой критический раздел, то он сравнивает г Часть 6. Распределенные.систем временные метки своего запроса и запроса, полученного от другого процесса Если временная метка запроса другого процесса является более поздней, отправка ответа откладывается; в противном случае ответ отправляется тут же. Запрос взаимоисключения ^илрошеннЦс взаимо- Щ исключением §&*" ; лз* Рассылка запроса всем другим процессам Ожидание Получены все ответы итичес, Гразде/i Рассылка ответов Ц;,Ыз^ по ожидающим запросам .ггвизацйя ";\ других %■ процессов Выход из критического раздела Рис. 14.10. Диаграмма состояний, соответствующая алгоритму из [RICA81] При соблюдении этого метода требуется 2x(N - 1) сообщений: (N - 1) сообщений-запросов нужны для того, чтобы указать на намерение процесса Р, войти в свой критический раздел, и еще (N - 1) ответных сообщений — чтобы предоставить запрашиваемый доступ. Использование временных меток в этом алгоритме обеспечивает взаимоисключение; благодаря ему удается также избежать взаимоблокировок. Докажем последнее утверждение методом от противного: предположим, что возможна ситуация, когда в каналах не осталось ни одного сообщения, каждый процесс отправил запрос и не получил необходимого ответа. Такая ситуация невозможна, потому что решение о задержке ответа основывается на порядке поступления запросов. Поэтому найдется хотя бы один запрос с минимальным значением временной метки, который получит все необходимые ответы. Благодаря этому взаимоблокировка невозможна. Кроме того, поскольку запросы упорядочены, голодания также удается из- ежать. Так как запросы обслуживаются именно в порядке их расположения, каждый процесс рано или поздно становится самым старым и будет обслужен. Подход с передачей маркера Несколько исследователей предложили реализовать взаимоисключения с омощьнэ совершенно иного подхода, в котором используется передача маркера ?7 А лава 14. Управление распределенными процессами 713
между процессами. Маркер — это объект, который в каждый момент времени может содержаться только в одном процессе. Процесс, в котором находится маркер, может войти в критический раздел без дополнительного разрешения. Покидая свой критический раздел, процесс передает маркер другому процессу. В этом разделе описана одна из наиболее эффективных схем. Впервые она была предложена в [SUZU82]; логически эквивалентное ей предложение можно найти в [ШСА83]. Согласно этому алгоритму нужны две структуры данных. Маркер, который передается от одного процесса другому, на самом деле является массивом, в /г-м элементе которого записана временная метка, соответствующая времени, когда маркер побывал в процессе Рк. Кроме того, каждый процесс поддерживает массив запросов, в ;-м элементе которого записана временная метка, соответствующая моменту получения запроса от процесса Р,. Процедура состоит в следующем. Первоначально маркер присваивается одному из процессов, который выбирается произвольным образом. Процесс, которому нужно использовать свой критический раздел, может это сделать, если он владеет маркером; в противном случае процесс рассылает всем другим процессам запрос с временной меткой и ждет, пока один из них не пришлет ему маркер. Покинув свой критический раздел, процесс Р, должен передать маркер какому-то другому процессу. Выбор этого процесса происходит следующим образом. Процесс Р^ просматривает массив запросов в следующем порядке: j + 1, j + 2, ..., 1, 2, ..., ) — 1, пока не найдет первый элемент [ft], в котором временная метка последнего запроса больше, чем ft-e значение маркера (запрос[&] > маркер[&]). Это означает, что процесс Рк сделал запрос после последнего пребывания в нем маркера. В листинге 14.1 приведен алгоритм, состоящий из двух частей. Первая связана с использованием критического раздела и состоит из вступления, критического раздела и заключительной части. Вторая часть касается действий, предпринимаемых после получения запроса. Переменная clock — это локальный счетчик, используемый для временных меток. Выполнение функции! wait (access, token) приводит к ожиданию процесса до тех пор, пока не будет получено сообщение типа "доступ", которое затем помещается в массив token. Для работы алгоритма требуется следующее количество сообщений: • N сообщений {N - 1 сообщений для рассылки запроса и 1 сообщение для- получения маркера), если запрашивающий процесс не содержит маркера; • ни одного сообщения, если маркер находится в этом процессе. Листинг 14.1. Алгоритм с передачей маркера (для процесса Pt) if (1token_present) /* Вступительная часть */ I clock++; broadcast (Request, clock, i) ; wait (access, token); token_present = true; ) token_held = true; <критический раздем>; стем /* Заключительная часть */ token[i] = clock; token_held = false; for (int j = i + 1; j < n; j++) { if (request(j) > token [j] £& token_present) { token^present = false; send (access, token [j])*" } } for (j = 1; j <= i-1; j++) { if (request(j) > token [j] && token_present) { token_present = false; send (access, token [j]); } } а) Первая часть if (received (Request, k, j)) { request (j) = max(request(j), k); if {token_present && !token_held) <код заключительной частн>; ) б) Вторая часть Примечание send(j, access, token) отправляет процессом j сообщения access с маркером broadcast(request, рассылает сгенерированное clock, x) процессом i сообщение с запросом и временной меткой всем другим процессам received(request, t, j) принимает от процесса j сообщение с запросом и временной меткой t 14.4. РАСПРЕДЕЛЕННАЯ *г ВЗАИМОБЛОКИРОВКА as. '^ В главе 6, "Взаимоблокировка и голодание", взаимоблокировка была опр Делена как постоянное блокирование ряда процессов, которые либо конкурир *от, пытаясь получить доступ к системным ресурсам, либо обмениваются инфс нацией друг с другом. Это определение справедливо как для изолированной, т и Для распределенной системы. Проблема взаимоблокировки, как и пробле взаимоисключения, в распределенной системе является более сложной, чем системе с общей памятью. Причинами этого усложнения является то, что Глава 14. Управление распределенными процессами 7.
дн узел не обладает точными сведениями о текущем состоянии всей системы, ,акже то, что передача сообщения от одного процесса другому сопровождается предсказуемой по длительности временной задержкой. В литературе рассматриваются два вида распределенных взаимоблокировок: зникающие в связи с распределением ресурсов и возникающие при обмене сведениями. Взаимоблокировка, связанная с ресурсами, возникает тогда, когда оцесс пытается получить доступ к ресурсам, например объектам данных из ба- данных или ресурсам ввода-вывода, которые находятся на сервере; при этом разуется группа процессов, каждый из которых запрашивает ресурс, которым ладает другой процесс из этой группы. Взаимоблокировка, связанная с обме- м сообщениями, возникает в том случае, когда требующимися процессу ресур- ми являются сообщения; при этом образуется группа процессов, каждый из торых ожидает сообщения от другого процесса из этой группы и ни один просе не может отправить свое сообщение. заимоблокировка, связанная с распределением ресурсов В главе 6, "Взаимоблокировка и голодание", сказано, что взаимоблоки- >вка в распределении ресурсов возникает только при соблюдении всех пере- 1сленных условий. • Взаимоисключение. Одновременно использовать ресурс может только один процесс. • Удержание и ожидание. Процесс может удерживать выделенные ресурсы во время ожидания других ресурсов. • Отсутствие перераспределения. Ресурс не может быть принудительно отобран у удерживающего его процесса. • Циклическое ожидание. Существует замкнутая цепь процессов, каждый из которых удерживает как минимум один ресурс, необходимый процессу, следующему в цепи после него. Цель алгоритма обработки взаимоблокировок состоит в том, чтобы либо редотвратить образование циклического ожидания, либо обнаружить, что оно эзникло или может возникнуть. В распределенной системе ресурсы распределе- ы по разным узлам. Доступ к ресурсам регулируется управляющими процесса- :и на этих узлах. Любой отдельный управляющий процесс не обладает полными свежими сведениями о глобальном состоянии системы и должен принимать ешение, основываясь на локальной информации. Таким образом, в распреде- енной системе требуется новый алгоритм защиты от взаимоблокировок. Одной из сложностей, возникающих при управлении распределенными заимоблокировками, является явление фиктивной взаимоблокировки (phantom eadlock). Пример такой взаимоблокировки проиллюстрирован на рис. 14.11. 1апись Рх—»Р2-»Р3 означает, что процесс Рх приостановлен в ожидании ресурса, юторым владеет процесс Р2, а процесс Р2 приостановлен в ожидании ресурса, :оторым владеет процесс Р3. Пусть вначале процесс Р3 обладает ресурсом R0, a [роцесс Рх — ресурсом Rb. Предположим, что процесс Р3 сначала генерирует со- •бщение, освобождающее ресурс Re, а затем — сообщение с запросом ресурса Rb. 5сли процесс выявления циклов сначала получит первое сообщение, а затем вто- >ое, возникнет цепочка, изображенная на рис. 14.11,а. В противном случае бу- Г16 Часть 6. Распределенные системы дет зарегистрирована взаимоблокировка (рис. 14.11,6). На самом деле никакой взаимоблокировки не возникает; будет зарегистрирована ложная взаимоблокировка, вызванная отсутствием информации о глобальном состоянии. Запрос Rb Освобождение R. а) Освобождение перед поступлением запроса Рис. 14.11. Фиктивная взаимоблокировка 6) Запрос поступает перед освобождением Предотвращение взаимоблокировок В распределенной среде можно использовать два метода предотвращения взаимоблокировок из тех, что обсуждались в главе 6, "Взаимоблокировка и голодание". 1. Возникновения циклического ожидания можно избежать, линейно упорядочив типы ресурсов. Если процессу выделены ресурсы типа R, то он может последовательно запрашивать только те ресурсы, номер типа которых следует после R. Основной недостаток этого метода состоит в том, что не всегда ресурсы можно запрашивать в том порядке, в котором они используются, поэтому ресурсы могут удерживаться процессом дольше, чем необходимо. 2. Условий удержания и ожидания можно избежать, потребовав, чтобы процесс запрашивал все необходимые ресурсы одновременно, и блокируя процесс до тех пор, пока такой запрос не сможет быть полностью выполнен в один момент времени. Такой подход неэффективен по двум причинам. Во- первых, процесс может длительное время ожидать одновременной доступности всех затребованных ресурсов, в то время как реально он мог бы работать и только с частью из них. Во-вторых, затребованные процессом ресурсы могут значительное время оставаться неиспользованными, и в течение этого времени они оказываются недоступными другим процессам. При использовании обоих методов нужно, чтобы процесс заранее мог указать свои требования к ресурсам. Это не всегда возможно; примером является приложение типа базы данных, в которую можно динамически добавлять новые элементы. В качестве варианта подхода, при котором предварительные сведения такого рода не нужны, рассмотрим два алгоритма, предложенные в [ROSE78]. Глава 14. Управление распределенными процессами 717
Зба они были разработаны в контексте работы с базами данных, и поэтому мы >удем говорить не о процессах, а о транзакциях. Б предложенных методах используются временные метки. В каждой тран- }акции на протяжении ее времени жизни хранится временная метка, соответствующая времени ее создания. Таким образом среди транзакций устанавливается зтрогий порядок. Если ресурс R, который используется транзакцией Т1, запрашивается другой транзакцией Т2, конфликт разрешается с помощью сравнения их временных меток. Соблюдение этого условия позволяет предотвратить образование циклического ожидания. Авторы предложили две разновидности этого Зазового метода и назвали их методом "ожидания-перезапуска" ("wait-die") и методом "прекращения-ожидания" ("wound-wait"). Предположим, что в текущий момент транзакция Т1 владеет ресурсом R, а транзакция Т2 генерирует запрос на этот ресурс. Алгоритм метода ожидания- перезапуска, который используется распределителем ресурсов, показан в листинге 14.2,а. Временные метки двух транзакций обозначены как е (Т1) и е (Т2). Если транзакция Т2 старше, она блокируется до тех пор, пока транзакция Т1 не освободит ресурс R — либо сгенерировав запрос, либо в результате того, что она будет "убита" при запросе другого ресурса. Если транзакция Т2 моложе, то она перезапускается с той же временной меткой, что и раньше. Листинг 14.2. Методы предотвращения взаимоблокировок if (е(Т2) < е(Т1)) halt_T2 ('wait'); else kill_T2 ('die'); а) Метод ожидания-перезапуска. if (e(T2) < е(Т1)) kill_Tl {'wound'); else halt_T2 ('wait'); б) Метод прекращения-ожидания Таким образом, при возникновении конфликта преимуществом обладает более старая транзакция. Благодаря тому что "убитая" транзакция восстанавливается со своей предыдущей временной меткой, она становится старше, и ее приоритет возрастает. Узлам не нужно знать о состоянии распределения всех ресурсов. Все, что нужно, — это временные метки транзакций, запрашивающих ресурс. Как показано в листинге 14.2,6, метод прекращения-ожидания предоставляет немедленный доступ к запрашиваемому ресурсу старшей транзакции, удаляя владеющую этим ресурсом младшую транзакцию. В отличие от метода ожидания-перезапуска, транзакция не должна ждать, пока ей будет предоставлен ресурс, использующийся младшей транзакцией. Избежание взаимоблокировок Избежание взаимоблокировок — это метод динамического принятия решения о том, может ли предоставление данного ресурса по запросу привести к взаимоблокировке. В [SING94b] отмечено, что избежание распределенных взаимоблокировок является непрактичным по таким причинам. 718 ■*- -tUi. Часть 6. Распределенные системы 1. Каждый узел должен следить за глобальным состоянием системы, что требует значительных накладных расходов на хранение и обмен информацией. 2. Процесс проверки безопасного глобального состояния должен быть взаимоисключающим. В противном случае вопрос о предоставлении ресурса двум различным ресурсам может рассматриваться на двух узлах, и они оба одновременно могут принять решение о том, что удовлетворение запроса является безопасным. В результате возникнет взаимоблокировка. 3. В распределенной системе с большим количеством процессов и ресурсов проверка безопасности состояния приводит к значительным накладным расходам на обработку запросов. Выявление взаимоблокировок При методе выявления взаимоблокировок процессам позволено получать незанятые ресурсы по первому требованию, а наличие взаимоблокировок определяется при их возникновении. Если обнаружена взаимоблокировка, выбирается один из составляющих (constituent) процессов, к которому предъявляется требование освободить ресурсы, необходимые для снятия взаимоблокировки. При выявлении распределенных взаимоблокировок возникают труд о- сти, состоящие в том, что каждый узел обладает сведениями только о своих ресурсах, в то время как взаимоблокировка может включать в себя распределенные ресурсы. В зависимости от того, как управляется система — централизовано, иерархически или распределенно, — можно использовать различные подходы (см. табл. 14.1). При централизованном управлении ответственность за выявление взаимоблокировок возлагается на один узел. Все сообщения с запросами и освобождениями ресурсов отправляются центральному процессу, а также процессу, кон тролирующему данный ресурс. Поскольку центральный процесс обладает всеми необходимыми сведениями, он в состоянии определить наличие взаимоблокировки. Такой подход требует передачи большого количества сообщений; он также уязвим по отношению к отказу центрального узла. Кроме того, не исключена возможность выявления фиктивных взаимоблокировок. При иерархическом управлении узлы организованы в древовидную структуру, в которой один из них выступает в роли корня дерева. На каждом узле, не являющемся листом, собрана информация о распределении ресурсов между всеми зависимыми от него узлами. Это позволяет выявлять взаимоблокировки, возникающие на более низких по отношению к корневому узлу уровнях. Другими словами, взаимоблокировка, в которой участвует какое-то множество ресурсов, будет выявлена тем узлом, который является общим "предком" всех узлов, ресурсы которых принимают участие в конфликте. При распределенном управлении все процессы выявляют взаимоблокировку сообща. Вообще говоря, это означает необходимость интенсивного обмена информацией, включающей временные метки; в результате возникают значительные накладные расходы. В [RAYN88] можно найти несколько ссылок на алгоритмы распределенного управления, а в [DATT90] приводится подробное изучение одного из таких подходов. Глава 14. Управление распределенными процессами 719
Е Я о. о U Ч « «и Л S Я ш Ч ш Ч О) с к о «С № *■* А £ н ** Q. о ч (в ш а О ш ЕГ Я X Сц ев & ш к 3 итм О. о и ч а Щ 2 в в ев И изо 3 £ в Щ я я ста о rf о И-1 мн ев Я Н о Я Я О е« 5 о e=L я г а н Cj О ei п) ей и О в Я о о fct В стат о В* ш К сез В а я Ё и о 1=1 о к £ S со Неуяз аз о я я со отпош о к 4 _ 5 >> н » о я «и и о ч я и «U <" м " £ £ » &£ Is e ° Q) о В а,Я к о со а я _ о ев га Ч О. о О О £ Я га й §. я ь Я о Я и Я и ю о о й р" V - И W S» сз а з S Е to 3 Я I A в Й S 3 g ч я v3 я Н* £ Ч я £ а 5; so е- m О га И я и о 1 >> ном ел со я н а я ч о этот подх CD а Р* приво- & о £ £ Я больш и Л Е- я ч • о т ным р 5 ч л: я я а Ч О X ° Б 5 I & S и £ га Я К ей >« a о Я 9 о Я я т Pf Ч ' £ га я я я и & § Я « О. О я я о . £ я я tf Я ф a & £ с л Я л я S я- a о а о а я й о 5 I.*1!" -. Приведем пример алгоритма, предназначенного для выявления распределенных взаимоблокировок ([DATT92, JOHN91]). Этот алгоритм работает с распределенной базой данных, в которой на каждом узле поддерживается некоторая часть базы данных; транзакции могут инициироваться каждым узлом. В каждой транзакции может быть не больше одного запроса ресурса. Если транзакция нуждается в нескольких объектах данных, второй объект данных можно запрашивать только после того, как будет предоставлен первый объект данных. С каждым объектом данных i на узле связаны два параметра: уникальный идентификатор D, и переменная Locked_by (Dy). Эта переменная имеет нулевое значение, если объект данных не заблокирован ни одной транзакцией. В противном случае ее значение равно идентификатору блокирующей транзакции. С каждой транзакцией у на узле связано четыре параметра: • уникальный идентификатор Ту; • переменная Held_by (Ту), значение которой равно нулю, если транзакция Ту находится в состоянии выполнения или готовности; в противном случае ее значение равно идентификатору транзакции, которая удерживает объект данных, требующийся транзакции Ту; • переменная Wait_for (Ту), значение которой равно нулю, если транзакция Ту не ожидает никаких других транзакций; в противном случае ее значение равно идентификатору транзакции, которая находится во главе упорядоченного списка блокированных транзакций; • очередь P.equest_Q(Ty), в которой содержатся все необработанные запросы объектов данных, удерживаемых транзакцией Ту; каждый элемент очереди имеет вид (Т*, Dt), где Тк — запрашивающая транзакция, a Dk — объект данных, удерживаемый транзакцией Ту. Предположим, например, что транзакция Т2 ожидает предоставления объекта данных, закрепленного за транзакцией Tj, которая, в свою очередь, ожидает предоставления объекта данных, закрепленного за транзакцией Т0- При этом параметры имеют такие значения: Транзакция Wait_for Held__by R*queet_Q То 0 0 Tj Т, То То Та Т2 То Тх О Этот пример дает возможность понять разницу между параметрами Wait_for(T/) и Held_by(Trf). Ни один процесс не может продолжаться, пока Т0 не освободит объект данных, нужный для Tlt который после этого сможет выполнить необходимые действия с этим объектом данных и освободить его для Т2. В листинге 14.3 приведен алгоритм, использующийся для выявления взаимоблокировок. Когда транзакция делает запрос на блокировку объекта данных, связанный с этим объектом данных обслуживающий процесс либо удовлетворяет запрос, либо отказывает в его удовлетворении. Если требуемый ресурс не предоставляется, обслуживающий процесс возвращает идентификатор транзакции, удерживающей этот объект данных. Глава 14. Управление распределенными процессами 72
Цистияг 14.3. Алгоритм выявления распределенных взаимоблокировок '* Получение объектом данных D-, запроса lock_request (Тх) */ If (Locked_by (D-,) == null) send(granted); slse [ send (отказ транзакции) для Ti#' send (Locked_by (D-j) ) для Tt \ /* Транзакция Ti выполняет блокирующий запрос объекта данных D-j */ send (lock_request (Ti) ) для D-,; ожидание предоставления/отказа; if (granted) { Locked_by (Dj) = T± Held_by(Ti) = 0; } slse /* Считаем, что Dj используется транзакцией Tj */ { Held_by(Ti) = T-j,- Enqueue(Tlf Request_Q(T3) ) ; if (Wait_for(Tj) == null) Wait_for(TJ = T-j/ else Wait_for(Ti) = Wait_for (Tj) ; update(Wait_for(T^ , Request_Q(Ti) ) ; } /* Получение транзакцией Tj обновляющего сообщения */ if (Wait_for(T-j) != Wait_for(TJ ) Wait_for(Tj) = Wait_for(Ti) ; if (intersect(Wait_for(T3) , Request_Q(T-,) ) = null) update(Wait_for(Ti) , Request_Q(Tj) ) ; else { Объявление взаимоблокировки /* начало разрешения взаимоблокировки */ /* выбирается Tjf которая должна Сыть прекращена */ /* Tj освобождает все удерживаемые ею объекты данных */ send_clear (Tj, Held_by (Tj)) ; каждый освобожденный объект данных D_,- предоставляется транзакции Tkf находящейся во главе очереди Request_Q(Tj) ; £ог(каждой транзакции Тп из очереди Request_Q(T.,) , запрашивающей объект данных, которых находится в Т-,) { Enqueue (Tn, Request_Q (Tk) ) ; } } /* Получение транзакцией Т* сообщения clear(Tjf Tk) */ удаление транзакции Tj из очереди Request_Q(Tk) ; 722 п , ^ г.к г. ***» Часть 6. Распределенные системы Когда запрашивающая транзакция получает ответ о том, что ее запп будет удовлетворен, она блокирует объект данных. В противном случае зГ прашивающая транзакция обновляет свою переменную Heldjoy, присваивая ей идентификатор транзакции, удерживающей объект данных, и добавляет свой идентификатор в очередь транзакций Requested. Транзакция также об новляет переменную Wait_for, присваивая ей либо идентификатор транзак ции, удерживающей объект данных (если эта транзакция не находится в ожидании), либо тот идентификатор транзакции, который хранится в пере меннои Wait_for удерживающей транзакции. В этом случае переменной Wait_for присваивается значение транзакции, которая находится в начале цепочки запирающих транзакций. Наконец, запрашивающая транзакция рассылает всем другим транзакциям обновляющее сообщение со своим пара метром RequestQ, чтобы изменить значения всех подлежащих изменению переменных Wait_for. Получив обновляющее сообщение, транзакция обновляет свою переменную Wait_for. Это означает, что ожидаемая ею транзакция сейчас заблокирована другой. Затем выполняются действия по выявлению взаимоблокировки, в процессе которых проверяется, ожидает ли транзакция какую-то другую, которая, в свою очередь, ждет первую. Если это условие не выполняется, транзакция передает обновляющее сообщение дальше. Если же условие выполняется, транзакция отправляет той транзакции, которая удерживает нужный ей объект данных, сообщение об освобождении своих объектов, предоставляя каждый объект данных транзакции, которая согласно очереди Request_Q запросила его первой. Оставшиеся запросы помещаются в очередь новой транзакции. На рис. 14.12 приведен пример работы описанного алгоритма. Когда транзакция Т0 запрашивает объект данных, содержащийся в транзакции Т3, возникает цикл. Транзакция Т0 отправляет обновляющее сообщение, которое передается от Т, к Т2 и от Т2 к Т3. В этот момент транзакция Т3 обнаруживает, что пересечение ее переменных Wait_for и RequestQ отлично от нуля. Транзакция Т3 отправляет транзакции Т2 сообщение об освобождении своих объектов данных, вследствие чего Т3 удаляется из очереди Request_Q(T2), и освобождает свои объекты, активизируя транзакции Т4 и Тв. Рис. 14.12. Пример работы алгоритма по выявлению распределенных взаимоблокировок Глава 14. Управление; распределенными процессами 7 3
Транзакция То т, т2 Тз т4 т5 т6 ) Состояние системы Транзакция То Ti т2 Тз Тч т5 Те Wait_for 0 То То То То То То до запроса Wait for То То То То То То То Heldjby 0 Т0 т, т2 Тз т4 Тз Heldjby Тз То Ti т2 Та Т4 Тз Request_Q т, ъ Т3 Т4, Те т5 0 0 Request Q т, т2 Тз Т4, Те, То т5 О 0 >) Состояние системы после того, как запрос транзакции То будет получен транзакцией Тз Взаимоблокировки, возникающие при обмене сообщениями Взаимное ожидание При обмене сообщениями взаимоблокировки возникают, если есть группа фоцессов, каждый из которых ожидает сообщения от другого процесса, являю- цегося членом этой группы, и не осталось ни одного сообщения в каналах. Чтобы проанализировать эту ситуацию подробнее, определим понятие дножества зависимости (dependence set — DS) процесса. Для процесса Р,, который не может выполняться из-за ожидания сообщения, множество DS(P,) ;остоит из всех процессов, от которых процесс Pj ждет сообщения. Обычно троцесс Р, сможет продолжить свою работу после получения любого из сооб- цений. Возможна также ситуация, когда процесс может продолжать работу только после получения всех ожидаемых сообщений. Однако наиболее рас- 1ространенной является первая ситуация, поэтому в данной книге рассматривается именно она. Опираясь на приведенное выше определение, можно сформулировать определение взаимоблокировки множества процессов S. Взаимоблокировка возникает зри таких условиях. 1. Все процессы множества S находятся в ожидании сообщений. 2. S содержит множества зависимости всех процессов, входящих в S. 3. В каналах нет ни одного сообщения, передаваемого от одного члена множества S другому. ? * ':■ > • ■■ -.Часть Ф* Распределенные системы Все процессы множества S являются заблокированными, так как не моэк«г быть получено ни одно сообщение, благодаря которому хотя бы один nponeei мог продолжить работу. H«4ec< Разницу между взаимоблокировкой, возникающей при обмене сообщениями i взаимоблокировкой, возникающей при распределении ресурсов, можно пояснить i помощью графов. Взаимоблокировка ресурсов возникает тогда, когда в графе зави симости процессов образуется замкнутый цикл. В случае взаимоблокировки pecypcoi один процесс зависит от другого, если последний обладает нужным ему ресурсом Условие взаимоблокировки сообщений состоит в том, что все последующие элементь любого входящего в множество S члена сами входят в этот множество. Это положение проиллюстрировано на рис. 14.13. На рис. 14.13,а процесс Рх ожидает сообщения либо от процесса Р2, либо от процесса Р5; процесс Рб не ожидает никаких сообщений, поэтому он может отправить сообщение процессу Plf тем самым выводя его из состояния ожидания. В результате звенья (Р1( Р5) н (Pi. Рг) удаляются. На рис. 14.13,6 добавлена еще одна зависимость: процесс Р. ожидает сообщения от процесса Р2, который ждет сообщения от процесса Рз' ожидающего сообщения от процесса Plf который, в свою очередь, ждет сообщения от процесса Р2. В результате возникает взаимоблокировка. \ Д Wr~' i'p' \ а) Взаимоблокировка отсутствует б) Взаимоблокировка Рис. 14.13. Взаимоблокировка, возникающая при обмене сообщениями Проблему взаимоблокировки сообщений, как и проблему взаимоблокировки ресурсов, можно решить, предотвращая ее возникновение или выявляя образование взаимоблокировки. Некоторые примеры можно найти в [RAYN88]. Недоступность буферов сообщений Еще одна причина, по которой в системе с обменом сообщениями может возникнуть взаимоблокировка, связана с распределением буферов, предназначенных для хранения передаваемых сообщений. Этот вид взаимоблокировок хорошо известен в сетях с коммутацией пакетов данных. Сначала разберем эту проблему в контексте сети передачи данных, а затем рассмотрим ее с точки зрения распределенной операционной системы. Самым простым видом взаимоблокировки в сети передачи данных является непосредственная блокировка хранения и передачи сообщений (store-and-forward deadlock). Она может возникнуть в том случае, когда узел пакетной коммутации использует единый буферный пул, буфера которого по мере необходимости предоставляются пакетам. На рис. 14.14,а показана ситуация, в которой все буферное пространство на узле А занято пакетами, предназначенными для узла В. То же справедливо и для узла В. Ни один из узлов не может принять ни одного па- Глава 14. Управление распределенными процессами 726 л.-.-- ••4. ^Ч^"^ **—»щ р
кета, поскольку их буфера заполнены. Таким образом, ни один из них не может передать или получить сообщение. Непосредственную блокировку хранения и передачи сообщений можно предотвратить, не позволяя всем буферам заполняться сообщениями, предназначенными для одного узла. Этого можно достичь, используя раздельные буфера фиксированного размера для каждой связи. Если сообщения, предназначенные для одного узла, не смогут занять все буферное пространство, взаимоблокировка не возникнет даже при использовании общего буферного пула. Буферный пул заполнен Буферный пул заполнен а) Непосредственная блокировка хранения и передачи Заполнен пакетами для С Заполнен пакетами для В Заполнен пакетами для D Заполнен пакетами для А Заполнен пакетами для Е б) Косвенная блокировка хранения и передачи Рис. 14.14. Блокировка хранения и передачи сообщений На рис. 14.14,6" проиллюстрирована более сложная разновидность взаимоблокировки — косвенная блокировка хранения и передачи сообщений. Она возникает, если образуется замкнутый цикл узлов, на каждом из которых очередь сообщений, передаваемых на соседний узел, до отказа заполнена пакетами, предназначенными для узла находящегося за соседним. Одним из простых спо- 726 Часть.6. Распределенное системы собов предотвращения взаимоблокировки подобного типа является использова ние структурированного буферного пула (рис. 14.15). Такие буфера имеют ие рархическую организацию. Использование пула памяти на нулевом уровне н€ ограничивается никакими правилами; там может храниться любой входящий пакет. Буфера, которые находятся на уровнях с первого по N-й (где N — ЭТс максимальное количество промежуточных узлов при передаче пакета по сети) резервируются следующим образом: буфера на уровне k зарезервированы для пакетов, которые до этого подверглись не менее k транзитным пересылкам. Таким образом, при большой загрузке сети буфера заполнены от нулевого до iV-ro уровня. Если заполнены все уровни до Л-го включительно, то не принимается ни одно входящее сообщение, прошедшее менее k транзитных пересылок. Можно показать (см. [GOPA85]), что при соблюдении такой стратегии удается избежать как прямых, так и косвенных взаимоблокировок. Буферное пространство для пакетов, прошедших к промежуточных узлов Классе Класс к Класс 2 Класс! Общий лул (Класс 0) Рис. 14.15. Структурированный буферный пул, предотвращающий взаимоблокировки С описанной выше проблемой взаимоблокировок можно столкнуться в контексте коммуникационной архитектуры, обычно на сетевом уровне модели OS1. Проблема такого же рода может возникнуть и в распределенной операционной системе, в которой межпроцессное взаимодействие происходит с помощью обмена сообщениями. В частности, если операция отправки не является блокирующей, то для хранения исходящих сообщений нужен буфер. Буфер, который используется для хранения сообщений, отправленных процессом X процессу Y, можно рассматривать как канал обмена информацией между процессами X и Y. Если емкость этого канала ограничена (конечным размером буфера), то операция отправки сообщения может привести к приостановке процесса. Другими словами, если емкость буфера — п сообщений, и в процессе передачи (т.е. еще не получены адресатом) находятся п сообщений, то попытка отправить еще одно сообщение приведет к блокированию процесса до тех пор, пока в буфере не освободится место. На рис. 14.16 проиллюстрировано, как может возникнуть взаимоблокировка при использовании конечного числа каналов. На рисунке показаны два канала, каждый из которых обладает емкостью в четыре сообщения. Если в каждом Глава 14. Управление распределенными процессами 727
з каналов (из X в Y и из Y в X) находится ровно по четыре сообщения и оба зла попытаются передать еще по одному сообщению, прежде чем получат хотя ы одно имеющееся, то оба они приостановят свою работу, в результате чего озникнет взаимоблокировка. Рис. 14.16. Взаимоблокировка при обмене сообщениями в распределенной системе Если есть возможность ограничить сверху количество сообщений, передаваемых между каждой парой процессов системы, то очевидная стратегия предотвращения взаимоблокировок состоит в том, чтобы предоставить каждому каналу необходимое количество слотов в буфере. Этот способ может оказаться чрезмерно расточительным и, конечно же, требует некоторых предварительных сведений. Если требования нельзя предугадать или если выделение буферов, размер которых оценивается по верхней границе, является слишком расточительным, для оптимизации объема буферов нужно применять методы оценки. Можно показать, что в общем случае эта проблема является неразрешимой. Некоторые эвристические методы решения задачи предложены в [BARB90]. 14.5. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ " Щ И КОНТРОЛЬНЫЕ ВОПРОСЫ 4Й Распределенная операционная система способна поддерживать перенос процессов, который состоит в передаче достаточного количества информации о состоянии процесса, выполняющегося на какой-то машине, на другую машину. Перенос процессов может использоваться для выравнивания нагрузки, повышения производительности путем сведения к минимуму интенсивности обмена информацией, улучшения доступности или предоставления процессу доступа к особым удаленным устройствам. В распределенной системе часто возникает необходимость получения информации о глобальном состоянии, которая может понадобиться для разрешения конфликтов, возникающих при распределении ресурсов, а также для координации процессов. Учитывая то, что сообщения передаются с непредсказуемой задержкой во времени, необходимо позаботиться о согласованности порядка всех происходящих событий с точки зрения различных процессов. В управлении процессами в распределенной системе участвуют средства, предназначенные для реализации взаимоисключений, а также для действий по 728 Часть 6. Распределенные системы борьбе с взаимоблокировками. Обе проблемы в распределенных системах гораздо более сложные, чем в отдельной системе. Ключевые термины Вытеснение Невытесняющий перенос Распределенное Вытесняющий перенос Перенос процесса взаимоисключение Глобальное состояние Распределенная взаимо- Снимок Канал блокировка Контрольные вопросы 14.1. Приведите и обоснуйте причины, по которым целесообразен перенос процессов. 14.2. Что происходит с адресным пространством процесса при его переносе? 14.3. Приведите обоснования применения вытесняющего и невытесняющего переноса процессов. 14.4. Почему невозможно определить истинное глобальное состояние? 14.5. В чем состоят различия между централизованным и распределенным алгоритмами обеспечения взаимоисключений в распределенной системе? 14.6. Дайте определение двух видов распределенных взаимоблокировок. [14.6. РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА -t Все темы, представленные в этой главе, изложены в [GALLOO]. В [MIL096] подробно рассматриваются механизмы переноса процессов, а также их реализаций. Другими заслуживающими внимания обзорами являются [ESKI90] и [SMIT88]. В [NUTT94] описывается несколько примеров реализации переноса процессов в операционных системах. В [FIDG96] представлены различные подходы, применяющиеся для упорядочения событий в распределенных системах, а также делается вывод, что предпочтительным является подход, изложенный в данной главе. Алгоритмы управления процессами в распределенной системе (реализующие взаимоисключение и предотвращающие взаимоблокировку) можно найти е [SINH97] и [RAYN88]. Более формальное изложение содержится в [RAYN90], [GARG96] и [LYNC96]. ESKI90 Eskicioglu M. Design Issues of Process Migration Facilities in Distributed Systems. — Newsletter of the IEEE Computer Society Technical Committee on \ Operating Systems and Application Environments, Summer 1990. FIDG96 Fidge C. Fundamentals of Distributed System Observation. — IEEE Software, November 1996. - GALLOO Galli D. Distributed Operating Systems: Concepts and Practice. — Upper Saddle River, NJ: Prentice Hall, 2000. . GARG96 Garg V. Principles of Distributed Systems. — Boston: Kluwer Academic Publishers, 1996. t = ._ ■-._.. ...... -" .. -,-■ Глава 14. Управление распределенными процессами 729
i:"NC96 Lynch N. Distributed Algorithms. — San Francisco, CA: Morgan Kaufmann, • 1996. Vй. IL096 Milojicic D., Douglis F., Paindaveine Y., Wheeler R., Zhou S. Process Mi- 5 gration. TOG RI Technical Report, December 1996. Available at , ht tp:www.opengroup.org/~dej an/papers/index.htm. UTT94 Nuttal M. A Brief Survey of Systems Providing Process or Object Migration Facilities. — Operating Systems Review, October 1994. ,/YN88 Raynal M. Distributed Algorithms and Protocols. — New York: Wiley, 1988. AYN90 Raynal M., Helary J. Synchronization and Control of Distributed Systems and Programs. — New York: Wiley, 1990. ING94 Singhal M., Shivaratri N. Advanced Concepts in Operating Systems. — New York: McGraw-Hill, 1994. INH97 Sinha P. Distributed Operating Systems. — Piscataway, NJ: IEEE Press, 1997. M1T88 Smith J. A Survey of Process Migration Mechanisms. — Operating Systems Review, July 1988. 4.7. ЗАДАЧИ £=ГГ...-Г.—>-—= -; !-■ *. - - 4.1. В подразделе раздела 14.1, посвященном стратегиям переноса процессов, описывается методика очистки страниц. а. На какую другую стратегию похожа очистка страниц с точки зрения той машины, с которой переносится процесс? б. На какую другую стратегию похожа очистка страниц с точки зрения той машины, на которую переносится процесс? L4.2. В примере, приведенном на рис. 14.9, все четыре процесса размещают сообщения а и q в порядке {a, q}, даже если сообщение q будет получено перед сообщением а. Выполните описанный алгоритм самостоятельно и убедитесь в правильности этого утверждения. L4.3. а. Докажите что алгоритм, приведенный в [RICA81], обеспечивает взаимоисключение, б. Если сообщения поступают не в том порядке, в котором они были отправлены, этот алгоритм не гарантирует, что критические разделы будут выполняться в том же порядке, в котором они были запрошены. Может ли в этой ситуации возникнуть голодание? 14.4. С какой целью в алгоритме взаимоисключений, в котором используется передача маркера, применяются временные метки? Совпадает ли эта цель с целью применения меток в алгоритме распределенной очереди? 14.5. Рассмотрим алгоритм взаимоисключений, в котором используется передача маркера. Докажите, что этот алгоритм: а) гарантирует взаимоисключение; б) позволяет избежать взаимоблокировок; в )беспристрастен. 14.6. Объясните, почему вторую строку второй части алгоритма, приведенного в листинге 14.1, нельзя просто записать как "request(y) = t". ,г 30 Часть 6. Распределенные системы часть 7 Безопасность В наш век средств электронной связи, век вирусов и хакеров, век прослушивания и мошенничества с использованием электронных приспособлений обеспечение безопасности становится насущной проблемой. Чрезвычайная важность этой части книги обусловлена двумя тенденциями. Во-первых, интенсивное развитие компьютерных систем и их объединение в сети привело к росту зависимости как отдельных лиц, так и организаций от хранящейся в компьютерах информации, а также от средств связи между компьютерными системами. Это, в свою очередь, привело к пониманию того, что данные и ресурсы необходимо защищать от постороннего доступа, чтобы гарантировать аутентичность данных и сообщений, а также оградить системы от атак по сети. Во- вторых, развились такие дисциплины, как криптография и компьютерная безопасность, что привело к появлению практичных и удобных в применении приложений, обеспечивающих защиту. ПУТЕВОрИТЕЛЬ ПО ЧАСТИ 71 3^1 Глава 15. Безопасность В этой главе дается обзор операционных систем и компьютерной безопасности. Глава начинается с рассмотрения различных типов угроз безопасности систем. Затем изучаются механизмы защиты компьютерных систем, после чего обсуждаются способы противостояния злоумышленникам, в роли которых могут выступать как несанкционированные пользователи, так и санкционированные пользователи, пытающиеся выполнить запрещенные операции. Далее рассматриваются вирусы, представляющие одну из наиболее известных и опасных угроз. Кроме того, в главе описан подход к обеспечению компьютерной безопасности, известный под названием систем с доверительными отношениями. После этого вводятся основные понятия безопасности сетей.
ГЛАВА Безопасность 15.1. Угрозы для безопасности 15.2. Защита 15.3. Взломщики 15.4. Зловредное программное обеспечение 15.5. Системы с доверительными отношениями 15.6. Безопасность операционной системы Windows 2000 15.7. Резюме, ключевые термины и контрольные вопросы 15.8. Рекомендуемая литература 15.9. Задачи Приложение. Шифрование 15
ема компьютерной безопасности весьма обширна и охватывает вопросы I физического и административного контроля, а также автоматических Л. видов контроля. В этой главе мы ограничимся рассмотрением автомати- ированных средств обеспечения безопасности. Рис. 15.1 дает представление сфере применения этих инструментов. Мы начнем рассмотрение с видов уг- оз, которым подвержены устройства, обеспечивающие возможности обмена нформацией между компьютерами. После этого речь пойдет об особых ин- трументах, которые можно использовать для повышения безопасности. В азделе 15.2 описываются традиционные подходы к обеспечению компью- ерной безопасности, основанные на защите различных компьютерных ресур- ов, включая память и данные. Затем рассматривается угроза, которую пред- тавляют лица, пытающиеся преодолеть механизмы защиты. В следующем азделе рассказывается о вирусах и подобных им механизмах. Далее рас- матривается концепция систем с доверительными отношениями. В конце лавы в приложении представлены способы шифрования информации, ле- сащего в основе многих предназначенных для обеспечения безопасности риложений. Компьютерная система Компьютерная система ©Необходим онтроль доступа , . данным (защита)4^ / Т Рис. 15.1. Область охвата системной безопасности [МАЕК87] ЙЙйС-'ь 1-5.1. УГРОЗЫ ДЛЯ БЕЗОПАСНОСТИ ГТ^| Чтобы понять, какого рода угрозам подвергаются компьютерные системы, ужно определить требования к безопасности. Обычно выдвигаются такие четы- г требования. 34 Часть 7. Безопасность • Конфиденциальность. Согласно этому требованию, информацию от компьютерных систем могут получать только авторизованные лица. Доступ подобного рода включает в себя вывод на печать, на экран и другие формы предоставления информации, в том числе само обнаружение существования объекта. • Целостность. Предполагает, что свойства компьютерной системы могут изменять только авторизованные лица. Под изменением подразумевается запись, редактирование, изменение статуса, удаление или создание новых объектов. • Доступность. Необходимо, чтобы свойства компьютерной системы были доступны авторизованным лицам. • Аутентичность. Компьютерная система должна иметь возможность проверять идентичность пользователя. Виды угроз Чтобы понять, атаки какого вида представляют угрозу для компьютерной системы, рассмотрим ее работу в процессе предоставления информации. Вообще говоря, информация каким-либо образом переходит от источника (например, файла или области основной памяти) к получателю (например, другому файлу или пользователю). Обычная передача информации изображена на рис. 15.2,а. В остальных фрагментах этого рисунка показаны четыре общих категории атак. • Прерывание. Компоненты системы выходят из строя, становятся недоступными или непригодными. Это атака, целью которой является нарушение доступности. • Перехват. Это атака, целью которой является нарушение конфиденциальности, в результате чего доступ к компонентам системы получают несанкционированные стороны. В роли несанкционированной стороны может выступать лицо, программа или компьютер. В качестве примеров можно привести перехват передаваемых по сети сообщений или незаконное копирование файлов или программ. • Изменение. Несанкционированная сторона не только получает доступ к системе, но и вмешивается в работу ее компонентов. Целью этой атаки является нарушение целостности. В качестве примеров можно привести замену значений в файле данных, изменение программы таким образом, что она будет работать по-другому, а также изменение содержимого передаваемых по сети сообщений. • Подделка. Несанкционированная сторона помещает в систему поддельные объекты. Целью этой атаки является нарушение аутентичности. В качестве примеров можно привести помещение в сеть поддельных сообщений или добавление записей в файл. Глава 15. Безопасность 735
Рис. 15.2. Угрозы безопасности Компоненты компьютерной системы Компоненты компьютерной системы можно разделить на следующие категории: аппаратное обеспечение, программное обеспечение, данные, а также линии связи и сети. На рис. 15.3, а также в табл. 15.1 указан характер угроз, с которыми встречаются категории каждого вида. Рассмотрим их по порядку. A.-»,»niiuavrno!4KJ Пассивные угрозы Активные угрозы Извлечение содержимого сообщения Анализ трафика Имитация Воспроизведение JKjjJ^So вобслуживании сообщения щения Рис. 15.3. Угрозы безопасности активного и пассивного характера Часть Ъ Безопасность Таблица 15.1. Компоненты компьютерной системы и виды угроз, которым они подвергаются Доступность Секретность Целостность/Аутентичность Аппаратное обеспечение Программное обеспечение Данные Линии связи Оборудование может быть похищено или выведено из строя (отказ в обслуживании) Удаление программ, отказ пользователям в доступе Удаление файлов, отказ пользователям в доступе к ним Разрушение или удаление сообщения. Нарушение работы линий передачи или сетей Несанкционированное копирование программ Несанкционированное чтение данных. Анализ статистических данных Чтение сообщений. Наблюдение за трафиком Рабочая программа изменяется таким образом, что она либо перестает работать, либо выполняет какое-то другое задание Изменение имеющихся файлов или подделка новых Изменение содержимого, времени доставки (задержка), порядка доставки сообщений или их дублирование. Подделка сообщений Аппаратное обеспечение Основная угроза для аппаратного обеспечения компьютерной системы связана с его доступностью. Аппаратное обеспечение больше всего подвержено атакам и менее всего поддается автоматическому управлению. В число угроз входят случайный и преднамеренный вывод оборудования из строя, а также его кража. Распространенность персональных компьютеров, рабочих станций и все более широкое использование локальных сетей приводят к увеличению потенциальной возможности потерь в этой области. Для устранения угрозы подобного рода нужны административные меры по предотвращению физического доступа к системам. Программное обеспечение Компьютерная система без программного обеспечения представляет собой бесполезный набор аппаратных устройств. Именно операционная система, утилиты и приложения делают компьютерную систему пригодной для использования отдельными лицами и организациями. Рассмотрим несколько различных угроз этой части компьютерной системы. Основную опасность для программного обеспечения представляет атака на доступность. Программы, особенно прикладные, чрезвычайно легко удалить. Кроме того, программное обеспечение может быть изменено или повреждено, в результате чего оно станет непригодным для работы. Аккуратное управление настройкой конфигурации программ, включающее хранение резервных копий новейших версий, поможет повысить надежность их работы. Сложнее решить проблему, когда изменение программы приводит к тому, что она продолжает работать, но при этом ведет себя не так, как раньше. Эта категория атак связана с компьютерными вирусами (они будут рассмотрены далее в настоящей главе). Глава 15. Безопасность 737
помянем также о проблеме секретности программ. Несмотря на существование тределенных мер защиты, в целом проблема несанкционированного копирова- ня программного обеспечения остается неразрешенной. Данные Ответственность за безопасность аппаратного и программного обеспечения бычно возлагается на профессионалов вычислительного центра или на пользо- ателей персонального компьютера. Безопасность данных является более обшир- ой проблемой, включающей в себя безопасность файлов и других видов дан- :ых, управляемых отдельными лицами, группами и деловыми организациями. Безопасность данных охватывает широкий круг вопросов, включающий в себя [оступность, секретность и целостность. Когда речь идет о доступности, подразуме- 1ается защита от случайной либо преднамеренной порчи файлов с данными. Очевидно, что для соблюдения секретности необходимо заботиться о пре- (отвращении несанкционированного чтения файлов данных или баз данных. В >той области было проведено больше исследований и затрачено больше усилий, хем в любой другой области компьютерной безопасности. Не столь очевидной угрозой для секретности является анализ данных, заключающийся в использовании так называемых статистических баз данных, предоставляющих краткую или совокупную информацию. Совокупная информация обычно не представляет угрозы вмешательства в частную жизнь отдельных лиц. Однако в результате все более широкого использования статистических баз данных возрастает потенциальный риск раскрытия хранящейся в ней информации личного характера. По сути, в ходе тщательного анализа могут быть получены сведения об отдельных лицах, занесенных в базу данных. Это можно пояснить на таком простом примере: если в одной таблице записан суммарный доход респондентов А, В, С и D, а в другой — суммарный доход респондентов А, В, С, D и Е, то разность этих величин составит доход респондента Е. Проблема обостряется в связи с комбинированием наборов данных. Во многих случаях в процессе составления необходимых совокупностей нужно извлекать отдельные составляющие, сопоставляя несколько различных наборов данных на уровнях агрегирования, подходящих для задачи. Таким образом, на различных этапах обработки наборов данных становятся доступными отдельные составляющие базы данных, являющиеся закрытыми. Наконец, в большинстве систем основной задачей является сохранение целостности данных. Изменение файлов данных может иметь различные последствия — от незначительных до сокрушительных. Линии связи и сети Прослушивание или отслеживание передаваемой информации по своему характеру являются пассивными атаками. Цель атакующего состоит в получении этой информации. К данному виду атак относятся извлечение содержимого сообщения и анализ трафика. Легко понять, зачем нужно извлекать содержимое сообщения. Во время телефонного разговора или с помощью электронной почты можно передать важную или конфиденциальную информацию. Нам не хотелось бы, чтобы оппонент узнал содержимое этих сообщений. Часть 7. Безопасность Другой вид пассивной атаки, анализ трафика (traffic analysis), является более сложным. Предположим, что у нас есть возможность скрыть содержимое передаваемой информации, так что оппоненты, даже перехватив сообщение, не могут извлечь из него информацию. Общепринятым методом маскировки содержимого является его шифровка. Однако оппонент может получить представление о характере сообщений, несмотря на то что они зашифрованы. Он может определить местоположение и параметры узлов, обменивающихся информацией, а также собрать сведения о частоте передачи сообщений и об их размере. Полученные сведения могут дать представление о характере передаваемой информации. Пассивные атаки очень трудно выявить, так как они не влекут за собой никаких изменений данных. Однако предотвратить эти атаки вполне возможно. Таким образом, внимание следует сосредоточить не на выявлении пассивных атак, а на их предотвращении. Другой категорией атак являются активные атаки. Они предполагают некоторое изменение потока данных или создание поддельного потока и подразделяются на четыре категории: имитация, воспроизведение, изменение сообщений и отказ от обслуживания. Имитация имеет место, когда какой-то объект выдает себя за другой объект. Атака с имитацией обычно предпринимается вместе с активными атаками других видов. Например, может перехватываться, а затем воспроизводиться последовательность сообщений, передаваемых в процессе аутентификации, в результате чего авторизированные стороны с небольшими привилегиями получают дополнительные привилегии, выдавая себя за объект, обладающий ими. Воспроизведение включает в себя пассивный перехват элементов данных с их последующей повторной передачей, чтобы произвести неавторизирован- ный доступ. Под изменением сообщений подразумевается изменение какой-то части первоначального законного сообщения, удаление сообщений или изменение порядка их получения. Все это делается с целью получить несанкционированный доступ. Например, сообщение: "Позволить Ивану Сидорову читать конфиденциальные файлы" может быть изменено на такое: "Позволить Сидору Иванову читать конфиденциальные файлы". Отказ от обслуживания препятствует нормальному использованию средств связи или управлению ими либо сдерживает их. Цель этой атаки может быть вполне конкретной; например, объект может подавлять все сообщения, предназначенные конкретному адресату (например, службе аудита безопасности). Другим видом отказа от обслуживания является подрыв работы всей сети, который достигается посредством вывода ее из строя либо перегрузки сообщениями в целях снижения ее производительности. Активные атаки обладают характеристиками, противоположными характеристикам пассивных атак. Хотя пассивные атаки трудно выявить, их можно предотвратить с помощью специально разработанных мер. С другой стороны, активные атаки очень трудно полностью предотвратить, потому что для этого понадобилось бы обеспечить постоянную физическую защиту всех средств связи. Целесообразнее сосредоточить усилия на выявлении этих атак и устранении их последствий. Благодаря тому что выявление производит сдерживающий эффект, оно также может способствовать и предупреждению. Глава 15. Безопасность 739
.. _ .«,.ш~х^т?*Ж<Л^зф^ Ч~-■'ЗкРш** ... . < * -^ В основе многозадачности лежит способность системы предоставлять поль зователям возможность совместного использования ресурсов. Объектом совмест ного использования является не только процессор, но и такие элементы, как: • память; ULttiViji in, устройства ввода-вывода, например диски и принтеры; • программы; • данные. Возможность совместного использования ресурсов предполагает их защиту. В [PFLE97] указано, что операционная система может обеспечить разные степени защиты. • Отсутствие защиты. Этот вариант подходит, если соответствующие процедуры выполняются во времени раздельно. • Изоляция. При этом подходе каждый процесс работает отдельно от других процессов, не используя совместно с ними никаких ресурсов и не обмениваясь информацией. Каждый процесс имеет свое собственное адресное пространство, свои файлы и другие объекты. • Полное разделение или полное его отсутствие. Владелец объекта (например, файла или сегмента памяти) объявляет его открытым либо закрытым. В первом случае доступ к объекту может получить любой процесс; во втором — доступ к этому объекту предоставляется только его владельцу. • Совместное использование с ограничением доступа. Операционная система проверяет дозволенность доступа каждого отдельного пользователя к каж- ■ дому отдельному объекту. В этом смысле операционная система выступает в роли стража, гарантируя, что доступ к объектам получат только авторизованные пользователи. • Совместное использование с помощью динамических возможностей. Этот вариант расширяет концепцию контроля доступа, позволяя динамически создавать права совместного использования объектов. • Ограниченное использование объекта. При этой форме защиты ограничива-. ется не столько доступ к объекту, сколько его использование. Например,, пользователю может быть разрешено просматривать важный документ, но не распечатывать его. Приведем еще один пример: пользователь имеет доступ к базе данных, при котором он может извлекать статистические сводки, но не имеет возможности определять значения отдельных величин. \ Выше перечислены различные варианты защиты в порядке возрастания: сложности их реализации, что соответствует качеству предоставляемой защиты. Конкретная операционная система может предоставлять защиту разной степени для разных объектов, пользователей или приложений. Требуется, чтобы в операционной системе поддерживался баланс между возможностями совместного использования компонентов компьютерной системы, способствующего повышению эффективности ее использования, и сте- _ л л Часть 7. Безопасность пенью защищенности ресурсов отдельных пользователей. В этом разделе рас смотрены некоторые механизмы, с помощью которых в операционной системе обеспечивается защита. Защита памяти В многозадачной среде защита памяти становится важной проблемой. Здеа возникают вопросы, связанные не только с безопасностью, но и с правильной ра ботой различных активных процессов. Если один из процессов неосторожно за пишет что-то в область памяти другого процесса, то этим он может нарушит] работу последнего. Разделение пространства памяти между различными процессами легко осу ществляется при использовании схемы виртуальной памяти. Эффективным сред ством управления основной памятью является сегментная или страничная орга низация памяти, либо комбинированный вариант, в котором сочетаются оба ви да организации. Если нужно обеспечить полную изоляцию, то операционно* системе достаточно просто убедиться, что каждый сегмент или каждая страниц] доступна только тому процессу, которому она предоставлена. Этого легко до биться, потребовав, чтобы в таблицах страниц и/или сегментов не было повто ряющихся элементов. Если совместное использование разрешено, то один и тот же сегмент или страница может появиться в нескольких таблицах. Этот тип совместное использования легче всего осуществить в системе, поддерживающей сегмен тацию или комбинацию сегментации с разбивкой на страницы. В этом случа< сегментная структура видима приложению, которое может объявлять от дельные сегменты доступными или недоступными для совместного использо вания. В среде с чисто страничной организацией памяти труднее провесп черту между двумя областями памяти, потому что структура памяти про зрачна для приложения. Примером аппаратной поддержки защиты памяти является система за щиты, установленная на машинах семейства IBM System/370, работающи: под управлением операционной системы OS/390. На этих машинах каждом; страничному блоку основной памяти отвечает 7-битовый управляющий ключ значение которого может устанавливаться операционной системой. Два бит; этого ключа указывают на то, делались ли запросы и изменения страницы занимающей данный блок; эти биты используются алгоритмом замещение страниц. Остальные биты, четыре из которых являются разрядами управле ния доступом и один — разрядом защиты от выборки, используются меха низмом защиты. Чтобы получить разрешение на доступ к какой-либо стра нице, в обращениях процессора к памяти и в обращениях устройства прямо го доступа к памяти (Direct Memory Access — DMA) должен использоватьс соответствующий ключ. В разряде защиты от выборки указывается, дает л] ключ управления доступом право записи или право чтения и записи. В прс Цессоре имеется регистр под названием "слово состояния программы (Program Status Word — PSW), который содержит управляющую информя Цию, имеющую отношение к выполняющемуся в данное время процессу. Сс ставляющим элементом этого слова является 4-битовый ключ PSW. Есл: процесс пытается получить доступ к странице или начинает операцию с уча стием прямого доступа к памяти, текущий ключ PSW сравнивается с кодоз Глава 16. Безопасность 74
доступа. Разрешение на запись будет получено только при условии совпадения ключей. Если бит выборки установлен, то ключ PSW должен соответствовать ключу доступа для чтения. Контроль доступа, ориентированный на пользователя Меры по контролю доступа, которые предпринимаются в системах обработки данных, можно разбить на две категории: имеющие отношение к пользователю и имеющие отношение к данным. Контроль доступа, осуществляемый по отношению к пользователю, иногда неудачно называют аутентификацией. Мы воздержимся от использования этого термина, так как он широко применяется в связи с аутентификацией сообщений. Однако читателю следует иметь в виду, что в литературе он может употребляться в различном смысле. Наиболее распространенным методом контроля доступа пользователя в совместно используемой системе или сервере является процедура регистрации, при которой пользователю нужно ввести свой идентификатор-и пароль. Система позволит пользователю войти только тогда, когда его идентификатор совпадает с известным системе, и если пользователь знает пароль, относящийся к этому идентификатору. Такая система совместного использования идентификатора и пароля зарекомендовала себя как не очень надежный метод контроля доступа пользователя. Пользователи иногда забывают свои пароли, случайно или непреднамеренно раскрывают их. Хакеры приобрели большие навыки разгадывания идентификаторов особых пользователей, осуществляющих управление системой, а также принадлежащих к персоналу, выполняющему ее обслуживание. Наконец, предпринимаются попытки проникнуть в файл, в котором хранятся идентификаторы и пароли. Возможные контрмеры обсуждаются в разделе 15.3. Контроль доступа пользователей в распределенной среде может быть либо централизованным, либо децентрализованным. При централизованном подходе сеть обеспечивает сервис регистрации, определяя, кому позволено пользоваться сетью и кому из пользователей позволено подключиться к ней. При децентрализованном контроле доступа пользователей сеть рассматривается как прозрачный канал связи, а процедура регистрации пользователя выполняется на том узле, на который он пытается войти. Конечно же, в таком случае следует позаботиться о безопасной передаче паролей по сети. Во многих сетях используется двухуровневый контроль доступа. Отдельные узлы могут быть оснащены регистрационными устройствами для защиты своих ресурсов и приложений, а вся сеть в целом может иметь защиту, ограничивающую доступ к ней несанкционированных пользователей. Такие двухуровневые средства желательно иметь в том случае, когда в одну сеть подключены неравноправные узлы, а сама она просто служит удобным средством доступа с терминала узла. В сети с более однородными узлами на центральном узле управления сетью можно обеспечить централизованную стратегию доступа. Контроль доступа, ориентированный на данные После успешной регистрации пользователю предоставляется доступ к одному или нескольким узлам и приложениям. Для системы, в базе данных 742 Часть 7. Безопас ость которой содержится важная информация, этого в общем случае недостаточно. Пользователь может быть идентифицирован системой с помощью процедуры управления доступом. Каждому пользователю может соответствовать профиль, в котором указываются разрешенные операции и режимы доступа к файлам. В некоторых операционных системах профили пользователей служат основой для определенных правил. Однако система управления базой данных должна управлять доступом к отдельным записям или даже к их частям. Например, возможна ситуация, когда каждому члену администрации разрешено просматривать список персонала компании, но только некоторым из них предоставлен доступ к информации по зарплате. Это больше, чем просто еще одна степень детализации. В то время как операционная система имеет возможность предоставлять пользователю доступ к файлу или право на пользование приложением, после чего она не в состоянии производить дальнейших проверок, система управления базой данных должна принимать решения по поводу каждой отдельной попытки доступа. Это решение будет зависеть не только от персоны пользователя, но также от конкретных данных, которые он пытается получить, и даже от того, какая информация ему уже предоставлена. Система управления файлами или базой данных основывается на общей модели под названием матрица доступа (access matrix) (рис. 15.4,а, основой для которого послужил рисунок из [SAND94]). В эту модель входят такие основные элементы. • Субъект. Элемент, способный осуществлять доступ к объектам. Вообще говоря, понятие "субъект" приравнивается к понятию "процесс". Фактически любой пользователь или приложение получает доступ к объекту с помощью представляющего его процесса. • Объект. Все то, доступ к чему контролируется. Примерами могут быть файлы, части файлов, программы и сегменты памяти. • Право доступа. Способ, с помощью которого субъект осуществляет доступ к объекту. В качестве примеров можно привести чтение, запись и выполнение. Одно измерение этой матрицы состоит из идентификаторов субъектов, которые могут попытаться получить доступ. Обычно в этот список входят идентификаторы отдельных пользователей или групп пользователей, хотя контроль доступа может производиться не в отношении пользователей, а в отношении терминалов, узлов или приложений. Второе измерение представляет собой список объектов, к которым может осуществляться доступ. На самом высоком уровне детализации в роли объектов могут выступать отдельные файлы данных. Объектами матрицы могут быть также более общие группы, такие, как записи, файлы или даже целые базы данных. В каждом элементе матрицы указаны права доступа данного субъекта к данному объекту. Глаза 16. Безопасн ть 743
Файл 1 Файл 2 ФайлЗ Файл 4 Учетная запись 1 Учетная запись 2 Пользователь А Пользователь В Пользователь С Владелец -' R W R R Владелец R W ■ R Владелец R W W R Владелец R W Кредит запроса Дебет запроса - Кредит - запроса Дебет запроса а) Матрица доступа Файл 1 ■ А Владелец R W г> В R г> С R W ^^ Пользователь А Файл 2' Файл1 Владелец R . W г> ФайлЗ Владелец R . W -^^^ В Владелец R W г> С R ^ Пользователь В Файл 3 ■ Файл! Файл 2 (Владелец) R W ФайлЗ W А Владелец R W г> В W ^^^ Пользователь С Файл 4 • Файл! R W г> Файл 2 , R г> Файл 4 Владелец R W ^^ в) Списки возможностей для файлов из матрицы доступа В R г> С Владелец R б) Списки управления доступом для файлов из матрицы доступа Рис. 15.4. Пример структур управления доступом На практике матрица доступа применяется редко; обычно при реализации она раскладывается одним из двух способов. Эту матрицу можно разложить по столбцам, в результате чего получаются списки контроля доступа (access control lists) (рис. 15.4,6). Таким образом, каждому объекту соответствует список кон- 744 Часть 7. Безопасность троля доступа, в котором перечислены пользователи, а также указаны их прав доступа. Список контроля доступа может содержать элемент, который задаете по умолчанию (например, является общедоступным). Это позволяет пользоват< лям, для которых специальные права явно не указаны, предоставлять права п умолчанию. Элементами списка могут быть как отдельные пользователи, так группы пользователей В результате разложения по строкам получаются мандаты возможносте (capability tickets) (рис. 15.4,в). В мандате возможностей указаны объекты операции, санкционированные для данного пользователя. Каждый пользовател обладает несколькими мандатами и может иметь возможность передавать ил предоставлять их другим. Поскольку мандаты могут быть рассеяны по систем» они являются большей проблемой для безопасности, чем списки контроля досгз па. Эти мандаты нужно хранить в области памяти, недоступной пользователям. Ориентированный на данные контроль доступа к сети осуществляется пара; лельно с контролем доступа, ориентированным на пользователя. Если только нек« торым пользователям разрешено осуществлять доступ к определенным данным, то процессе передачи этих данных авторизованным пользователям может понадобитьс защитить их с помощью шифрования. Обычно контроль доступа к данным являете децентрализованным, т.е. он осуществляется системами управления базами давны на каждом локальном компьютере. Если в сети имеется сервер сетевой базы данны? то контроль доступа к данным становится функцией сети. ^^ Одной из наиболее известных угроз для безопасности являются злоумыц ленники (другим видом угрозы являются вирусы), которых обычно называю хакерами или кракерами. На ранних стадиях изучения вторжений Андерсо (Anderson) [ANDE80] идентифицировал следующие классы взломщиков. • Притворщик. Лицо, не обладающее полномочиями по использованию ко» пьютера, которое проникает в систему, несмотря на контроль доступа сш темы, и использует учетную запись законного пользователя. • Правонарушитель. Законный пользователь, получающий доступ к данный программам или ресурсам, к которым у него нет доступа, или тот, у коте рого есть такой доступ, но он злоупотребляет своими привилегиями. • Тайный пользователь. Лицо, завладевшее управлением в режиме супер пользователя и использующее его, чтобы избежать аудита и преодолет контроль доступа, или чтобы подавлять сбор данных по аудиту. Притворщик — это, скорее всего, постороннее лицо; правонарушителем ч* ще всего бывает непосторонний человек; в роли тайного пользователя могут вь ступать и те, и другие. Последствия атак злоумышленников могут быть самыми различными - от незначительных до серьезных. В начале шкалы взломщиков располагают ся те, которые просто хотят использовать сети и узнать, что и где находите* На противоположном конце размещаются индивидуумы, пытающиеся дрочя тать служебные данные, выполнить несанкционированное изменение данны или разрушить систему. Глава 15. Безопасность 74;
Методы вторжения Целью злоумышленника является получение доступа к системе или расширение спектра привилегий, доступных ему в системе. Вообще говоря, для этого пользователю нужно получить информацию, которая должна быть защищена. В большинстве случаев эта информация имеет вид пользовательских паролей. Зная пароли некоторых других пользователей, злоумышленник может войти в систему и проверить, какими привилегиями обладают эти законные пользователи. Обычно в системе должен поддерживаться файл, с помощью которого авторизованным пользователям ставятся в соответствие пароли. Если этот файл хранится без всяких предосторожностей, то к нему легко получить доступ и узнать пароли. Файл с паролями можно защитить одним из перечисленных способов. • Одностороннее шифрование. Пароли пользователей хранятся в системе только в зашифрованной форме. Когда пользователь вводит пароль, система шифрует его и сравнивает с хранящимся значением. На практике система обычно выполняет одностороннее (необратимое) преобразование, при котором пароль используется для того, чтобы сгенерировать ключ для функции шифрования, в результате которого получается слово фиксированной длины. • Контроль доступа. Доступ к файлу с паролями ограничен одной учетной записью или малым числом учетных записей пользователей. Если применяется одна или обе эти меры предосторожности, потенциальному злоумышленнику придется затратить некоторые усилия, чтобы узнать пароль. В [ALVA90] перечислены методы взлома пароля (сведения получены на основании обзора литературы и опросов некоторых взломщиков). 1. Попытка применить пароли стандартных учетных записей, которые устанавливаются по умолчанию при поставке системы. Многие администраторы не утруждают себя их изменением. 2. Настойчивый перебор всех коротких паролей (длиной от одного до трех символов). 3. Перебор слов из подключенного к системе словаря или специального списка слов, чаще всего применяемых в качестве пароля. Примеры таких списков можно найти на хакерских досках объявлений. 4. Сбор такой информации о пользователях, как их полные имена, имена их супругов и детей, фотографии офиса, названия книг в офисе, хобби пользователей. 5. Использование в качестве вероятного пароля номеров телефона пользователя, его номера социального обеспечения, даты рождения или номеров комнат. 6. Использование в качестве вероятного пароля номерных знаков автомобиля. 7. Обход ограничений доступа с помощью троянских коней (описанных в разделе 15.4). 8. Перехват сообщений, которыми обмениваются удаленный пользователь и узел системы. Первые шесть методов являются разновидностями отгадывания пароля. Если злоумышленник должен проверять правильность догадки методом прямого перебора с попыткой входа, эта процедура является для него утомительной; к тому же в этом случае легко принять контрмеры. Например, система может про- 746 Часть 7. Безопасность сто отвергать любую попытку регистрации, в которой было испробовано более трех неправильных паролей. В этом случае злоумышленнику, перепробовавшему три пароля, нужно вновь соединяться с узлом, чтобы повторить попытку. При таких обстоятельствах взломщику не имеет смысла перебирать большое количество паролей. Однако он, скорее всего, и не станет применять такие грубые методы. Например, получив доступ с привилегиями низкого уровня к зашифрованному файлу с паролями, он может попытаться скопировать этот файл, а затем использовать механизм шифрования данной системы на свободной машине чтобы узнать пароль, предоставляющий большие привилегии. Атаки с отгадыванием пароля применимы и эффективны при условии, что возможен автоматический перебор большого количества вариантов, который можно провести так, чтобы не выдать себя. Далее в этом разделе мы должны будем еще раз вернуться к теме противодействия атакам с отгадыванием паролей. Седьмому из вышеперечисленных методов атаки — атаке с помощью троянских коней — часто бывает особенно трудно противостоять. Пример такой программы приведен в [ALVA90]. Допустим, пользователь с низкими привилегиями написал игровую программу и предложил ее сетевому администратору, чтобы тот мог поиграть в свободное время. Однако в программе есть небольшой секрет. Запустив ее, действительно можно играть в игру, но она также содержит код, который на фоне этого копирует незашифрованный файл с паролями, для доступа к которому нужны привилегии администратора. Поскольку игра запущена администратором и пользуется его привилегиями, то она имеет доступ и к файлу с паролями. Восьмой из вышеперечисленных видов атак, подключение к линии, связан с физической безопасностью. Ей можно противостоять с помощью методов шифрования в каналах связи. Теперь обратимся к обсуждению двух основных контрмер: предотвращению и выявлению. Предотвращение является заветной целью специалистов по безопасности. Трудность состоит в том, что защищающемуся нужно противостоять всем видам возможных атак, в то время как взломщик может попытаться найти самое слабое звено в цепи защиты, и обратить все силы на него. Выявление связано с обнаружением атаки либо до того, как она удастся, либо после того. Защита паролей Система паролей является передовой линией обороны против взломщиков. Почти во всех многопользовательских системах пользователю нужно вводить не только свое имя или идентификатор, но и пароль. Пароль служит для подтверждения идентификатора того человека, который входит в систему. Идентификатор, в свою очередь, обеспечивает безопасность следующим образом. • По идентификатору можно определить, имеет ли пользователь полномочия на доступ к системе. • С помощью идентификатора задаются привилегии данного пользователя. Лишь небольшое количество пользователей имеет статус суперпользователя, позволяющий им читать файлы и выполнять функции, которые находятся под особой защитой операционной системы. В некоторых системах имеются учетные записи гостя или анонимные учетные записи, пользователям которых предоставляется гораздо меньше привилегий, чем другим. Глава 16. Безопасность 747
• Идентификаторы используются для так называемого разграничительного контроля доступа (discretionary access control). Например, составив список идентификаторов пользователей, некий пользователь может дать им разрешение на чтение своих файлов. Уязвимость паролей Чтобы понять природу атак, рассмотрим часто применяющуюся в систе- ах UNIX схему, в которой пароли никогда не хранятся в открытом виде, место этого используется описанная ниже процедура (рис. 15.5,а). Каждый ользователь выбирает пароль длиной до восьми печатных знаков, который с омощью 7-битового кода ASCII преобразуется в 56-битовое значение. Это зна- ение служит входным параметром для функции шифровки под названием rypt (3), которая основана на алгоритме DES. Алгоритм DES преобразуется с омощью 12-битового значения salt, которое обычно связано со временем вы- еления пароля пользователю. Модифицированный алгоритм DES выполняется входными данными, состоящими из 64-битового блока нулей, в результате его получается значение, которое используется в качестве входного значения ля второго шифрования. Всего этот процесс повторяется 25 раз. Затем полу- ившееся в результате 64-битовое выходное значение преобразуется в последо- ательность из 11 символов. После этого зашифрованный пароль сохраняется месте с незашифрованным 12-битовым значением salt в файле с паролями ля данного идентификатора пользователя. Значение salt используется с тремя целями. • Благодаря ему в файле с паролями два одинаковых пароля выглядят по- разному. Даже если два пользователя выберут один и тот же пароль, назначение этих паролей произойдет в разное время. Поэтому "расширенные" одинаковые пароли двух разных пользователей будут отличаться. • Это значение эффективно увеличивает длину пароля, но при этом пользователю не нужно помнить еще два дополнительных символа. Таким образом, количество возможных паролей возрастает в 4096 раз, благодаря чему становится труднее отгадать пароль. • Это значение служит для предупреждения аппаратной реализации алгоритма DES, что могло бы облегчить проведение атаки с отгадыванием "в лоб". При входе в систему UNIX пользователь вводит свой идентификатор и па- >оль. Операционная система использует идентификатор в качестве указателя для райла с паролями, извлекая из него незашифрованное значение salt и зашиф- юванный пароль. Введенный пользователем пароль используется в качестве 1ходного значения шифровальной программы, после чего результат ее работы :равнивается с извлеченным зашифрованным паролем. Если эти два значения совпадают, пароль принимается. Шифровальная программа устроена так, чтобы воспрепятствовать атакам с отгадыванием паролей. Программные реализации алгоритма DES работают медленнее, чем аппаратные версии; кроме того, необходимость 25 итераций увеличивает затрачиваемое время в 25 раз. Однако в этом алгоритме, по сравнению с гго первоначальной реализацией, произошли две перемены. Во-первых, в новых реализациях была ускорена работа самого алгоритма. Например, вирус-червь, Л от %* Везо^сдость попавший в систему из Internet, был в состоянии производить отгадывание нескольких сот паролей в режиме реального времени за довольно короткий срок. Это достигалось за счет более эффективного алгоритма шифрования, чем стандартный, который хранился в системах UNIX. Во-вторых, производительность компьютерных систем продолжает возрастать благодаря новому аппаратному обеспечению, поэтому все программы работают быстрее. Salt / / 12 бит Пароль //56бит Crypt (3) ~iT Файл паролей Идентификатор пользователя salt Epwjlsalt.O] / Загрузка 11 символов • а) Загрузка нового пароля Файл паролей Идентификатор Идентификатор пользователя пользователя salt Ep^salt.OJ Выбор Salt Пароль Г СгурЦЗ) т Зашифрованный пароль -W Сравнение б) Проверка пароля Рис. 15.5. Схема паролей системы UNIX Таким образом, для схемы паролей системы UNIX существуют две угрозы. Во- первых, пользователь может получить доступ к машине с помощью учетной записи Глава 15. Безопасность 740
стя или каким-нибудь другим образом, а затем он на этой машине может запус- [ть программу для отгадывания паролей, которая называется взломщиком паро- ■й. Взломщику нужно суметь проверить сотни или тысячи возможных паролей, шользуя небольшие вычислительные ресурсы. Кроме того, если злоумышленник в гстоянии получить копию файла с паролями, то программу-взломщик можно будет шустить в свободное время на другой машине. Это позволяет перепробовать в течете небольшого отрезка времени тысячи и тысячи вариантов паролей. Пример взломщика паролей был опубликован в Internet в августе 1993 года /IADS93]. На параллельной вычислительной машине фирмы Thinking Machines orporation достигнута производительность, равная 1560 шифрованиям в секун- у в каждом векторном модуле. Если в каждом обрабатывающем узле установ- вно четыре векторных устройства (стандартная конфигурация), то всего на ма- гине с 128 узлами (современный размер) получается 800000 шифрований в се- унду, а на машине с 1024 узлами — 6.4 миллиона шифрований в секунду. Однако даже такие огромные скорости перебора вариантов не позволяют зломщику отработать за разумное время все возможные варианты и отгадать ароль "в лоб". Поэтому взломщикам паролей остается надеяться, что некоторые ользователи выберут легко отгадываемые пароли. Когда пользователям разрешено самим выбирать пароли, они стараются ис- ользовать пароли покороче. В табл. 15.2 приведены результаты одного из исследо- аний, проведенных в университете Purdue. Изучались пароли на 54 машинах, на юторых было представлено около 7000 учетных записей пользователей. Длина 3% [аролей не превышала 3 символов. Взломщик мог начать атаку, настойчиво переби- 1ая всевозможные комбинации из 3 или меньшего числа символов. Простейшим редством повышения безопасности в этом случае является настройка системы, при юторой минимальное количество символов в пароле равно, например, шести. Мож- ю даже потребовать, чтобы все пароли состояли ровно из восьми символов. Боль- пинство пользователей не будут недовольны таким ограничением. Габлица 15.2. Длина исследованных паролей 1л1гна Количество Относительное количество L 55 .004 I 87 .006 J 212 .02 * 449 .03 э 1260 .09 В 3035 .22 7 2917 .21 В 5772 .42 Итого 13787 1.0 Слишком короткие пароли — это лишь часть проблемы. Многие из тех, кому разрешено выбирать пароли по собственному усмотрению, предпочитают легко запоминающиеся варианты, которые так же легко отгадать. Возможными вариантами могут быть имена пользователей, названия улиц, часто употребляемые слова из словаря и т.д. Нередко пароль оказывается таким же, как и идентификатор пользовате- Настъ Л. Безопасность ля. Это значительно упрощает задачу тому, кто пытается отгадать пароль. Взломщику нужно просто проверить файл с паролями на наличие в нем наиболее вероятных паролей. Поскольку многие используют легко отгадываемые пароли, такая стратегия обеспечивает взломщикам успех почти на всех системах. Одно из доказательств эффективности такого отгадывания представлено в [KLEI90]. Автор собрал из различных источников файлы с паролями, содержащие около 14 000 зашифрованных паролей. Результат, который автор справедливо называет пугающим, показан в табл. 15.3. Ему удалось разгадать почти четверть всех паролей. При отгадывании использовались такие стратегии. 1. Перебор имен пользователей, их инициалов, регистрационных имен и другой подобной информации. На каждого пользователя приходилось по 130 вариантов, отличающихся перестановками символов. 2. Подбор слов из различных словарей. Автор составил словарь из 60000 слов, включая встроенный словарь самой системы и различные другие приведенные списки. 3. Перебор возможных вариантов написания слов, испробованных в предыдущем пункте. Сюда вошли слова, написанные с прописной буквы или такие, в которых на первом месте стоит управляющий символ, все буквы являются прописными, порядок букв заменен обратным, буква "о" заменена нулем и т.д. В результате подобных комбинаций словарь пополнился еще одним миллионом слов. 4. Различные варианты написания слов из пункта 2 с использованием прописной буквы, которые не были рассмотрены в пункте 3. При этом список слов пополнился еще почти 2 миллионами вариантов. Таблица 15.3. Количество взломанных паролей из пробного набора, состоящего из 13797 учетных записей [KLEI90] Виды паролей Количество Количество Совпадение вариантов совпадений паролей, % Имя/регистрационное 130 368 2.7 имя пользователя Последовательности 866 22 О.*! символов Числа 427 9 0.1 Китайские слова 392 56 О-4 Названия мест 628 82 0.6 Имена собственные 2239 548 4.0 Женские имена 4280 161 1-2 Мужские имена 2866 140 1-0 Редко встречающиеся 4955 130 °-у названия Мифы и легенды 1246 66 0.5 Творчество Шекспира 473 11 0-1 Спортивные термины 238 32 0-^ Глава 15. Безопасность 751
Окончание табл. 15.3 Виды паролей Научная фантастика Кино и актеры Мультфильмы Знаменитости Обороты и выражения Фамилии Биология Системный словарь Названия машин Мнемонические схемы Библия короля Иакова Смешанные слова Слова из идиша Астероиды Всего Количество вариантов 691 99 92 290 933 33 58 19683 9018 14 7525 3212 56 2407 62727 Количество совпадений 59 12 9 55 253 9 1 1027 132 2 83 54 0 19 3340 Совпадение паролей, % 0.4 0.1 0.1 0.4 1.8 0.1 0.0 7.4 1.0 0.0 0.6 0.4 0.0 0.1 24.2 Таким образом, было протестировано около 3 миллионов слов. С помощью самой быстрой реализации на уже упоминавшейся системе Thinking Machines время шифрования всех этих слов с использованием всех значений salt заняло меньше часа. Нужно иметь в виду, что такая тщательная проверка приводит к отгадыванию почти 25% паролей, в то время как даже одной попытки может быть достаточно для получения широкого спектра привилегий в системе. Контроль доступа Одним из способов предотвращения атаки со взломом пароля является перекрытие доступа к файлу с паролями. Если зашифрованная часть пароля доступна в файле только привилегированным пользователям, то взломщик не сможет прочитать этот файл, не зная пароля привилегированного пользователя. В [SPAF92] приведено несколько недостатков такой стратегии. • Многие системы, в том числе и многие системы UNIX, подвержены неожиданным взломам. Как только взломщик каким-то образом получит доступ к системе, он захочет узнать несколько паролей, чтобы по очереди использовать при регистрации разные идентификаторы, уменьшая тем самым риск быть обнаруженным. С другой стороны, зарегистрированный пользователь может захотеть узнать идентификатор и пароль другого пользователя, чтобы получить привилегированный доступ к данным или причинить вред системе. • Авария в системе защиты может сделать читаемым файл с паролями, дискредитируя таким образом все учетные записи. • Некоторые пользователи имеют учетные записи на других машинах, расположенных в иных областях защиты, где они используют тот же пароль. По- 7 2 :Частъ 7,- Безопасность этому если на указанных машинах пароли доступны для чтения кому угодно, это может привести к дискредитации рассматриваемой системы. Таким образом, более эффективная стратегия могла бы заключаться в том, чтобы заставить пользователей выбирать пароли, не поддающиеся легкому разгадыванию. Стратегии выбора паролей Урок, который можно извлечь из двух описанных выше экспериментов (см. табл. 15.2 и 15.3), заключается в том, что если пользователи при выборе паролей предоставлены самим себе, то у многих из них они будут слишком короткими или такими, которые легко отгадать. Когда же пользователям назначаются пароли, состоящие из восьми случайным образом выбранных печатаемых символов, эффективный взлом паролей практически невозможен. Однако в этом случае большинство пользователей будут не в состоянии запомнить свои пароли. К счастью, даже если ограничить множество символьных строк теми вариантами, которые вполне запоминаемы, количество элементов этого множества будет все еще достаточно велико для того, чтобы их легко можно было отгадать. Таким образом, позволяя пользователям выбирать запоминающиеся пароли, нужно исключить такие, которые легко отгадать. Для этого используются четыре основных метода: • повышение уровня образования пользователя; • пароли, сгенерированные компьютером; • реактивная проверка паролей; • упреждающая проверка паролей. Можно рассказывать пользователям о том, как важно использовать пароли, которые трудно отгадать, а также о том, как выбирать надежные пароли. Стратегия, заключающаяся в повышении уровня образования пользователей (user education), вряд ли будет успешной в большинстве ситуаций, в особенности там, где много пользователей или большая текучесть кадров. Многие пользователи просто проигнорируют подобные указания. Другие же не смогут оценить надежность выбранного пароля. Например, многие пользователи ошибочно считают, что изменение порядка символов в слове на противоположный или написание в нем последней буквы в верхнем регистре существенно усложняет отгадывание пароля. Использование паролей, сгенерированных с помощью компьютера (computer- generated passwords), также может привести к проблемам. При выборе слишком необычных паролей пользователям будет трудно их запомнить, и они будут стараться где-то их записать. Вообще говоря, опыт показывает, что схемы компьютерного генерирования паролей плохо воспринимаются пользователями. В стандарте FTPS PUB 181 представлен автоматический генератор паролей. В этом стандарте имеется не только описание используемого подхода, но и полный листинг исходного кода на С, на котором реализован данный алгоритм. В процессе работы алгоритма генерируются легкие для произношения слоги, которые потом объединяются в слово. При образовании слогов и слов используется генератор случайных чисел, с помощью которого генерируется случайный поток символов. Стратегия с реактивной проверкой паролей (reactive password-checking) — это стратегия, при которой в системе периодически запускается своя собственная Глава. 15» Безопасн ть 753
программа — взломщик паролей, пытающаяся отыскать легко отгадываемые пароли. Система отменяет все отгаданные пароли и сообщает об этом пользователю. Такая тактика имеет несколько недостатков. Во-первых, чтобы сделать все как следует у нужно интенсивно использовать ресурсы. Поскольку решительно настроенный оппонент, который имеет возможность похитить пароль, может посвятить этой задаче несколько часов и далее дней с полным использованием процессора, программа реактивной проверки паролей явно находится на невыгодных позициях. К тому же до того, как эта программа найдет имеющиеся уязвимые пароли, они остаются в системе. Наиболее многообещающим подходом к повышению безопасности паролей является упреждающая проверка паролей (proactive password checker). В этой схеме пользователю предоставлена возможность выбирать свой собственный пароль. Однако во время выбора система проверяет, приемлем ли этот пароль, и если он недостаточно надежен, она его отвергает. Данный подход привлекателен тем, что при надлежащем контроле со стороны системы пользователи могут выбрать из довольно большого числа возможностей запоминающиеся пароли, которые, скорее всего, не будут отгаданы при атаке с использованием словаря. В схеме с упреждающей проверкой паролей самое главное — установить удачный баланс между удобством пароля дгя пользователя и надежностью. Если система отвергает слишком большое количество паролей, пользователи будут жаловаться, что очень сложно подобрать пароль. Если же в системе используется некоторый простой алгоритм отбора приемлемых паролей, их взломщикам предоставляется зеленая улица. В заключительной части этого подраздела рассмотрим возможные варианты упреждающей проверки паролей. Первый из них — это простая система с соблюдением определенных правил, например: • длина всех паролей должна быть не менее восьми символов; • среди первых восьми символов должны присутствовать хотя бы по одному такие, как прописная буква, строчная буква, цифра и символ пунктуации. Эти правила должны быть дополнены советами пользователям. Хотя данный способ не имеет себе равных по простоте, он может оказаться недостаточно эффективным для того, чтобы противостоять взломщикам паролей. При использовании такой схемы взломщики будут предупреждены, какие пароли им не следует пробовать, но они все же могут попытаться взломать пароль. Другой вариант рассматриваемого подхода заключается в том, чтобы просто составить большой словарь возможных "плохих" паролей. Когда пользователь выбирает пароль, система проверяет, нет ли этого пароля в списке. При таком способе есть две проблемы. • Пространство. Чтобы словарь работал эффективно, он должен быть очень большим. Например, словарь, который используется в исследовании университета Purdue [SPAF92], занимает более 30 Мбайт. • Время. Поиск в таком большом словаре может продолжаться довольно долго. Кроме того, чтобы проверить возможные перестановки слов из словаря, либо все эти варианты должны быть включены в словарь, что сделает его поистине огромным, либо длительность каждой проверки увеличивается за счет обработки перестановок. 714 Часть 7. Безопасность Выявление вторжений Даже самая лучшая система предотвращения вторжения рано или поздно будеа взломана. Второй линией обороны от вторжений является их выявление, на чем е последние годы было сфокусировано внимание большого количества исследователей Интерес к этой теме обусловлен несколькими причинами, включая следующие. 1. Если вторжение обнаружено достаточно быстро, взломщика можно идентифицировать и изгнать из системы, прежде чем он успеет причинить врел или дискредитировать данные. Чем раньше удастся обнаружить присутствие взломщика, тем меньше вреда он нанесет и тем быстрее можно будеэ восстановить систему. 2. Эффективная система обнаружения вторжений может служить сдерживающим средством, предотвращающим вторжения. 3. Обнаружение вторжений позволяет собирать информацию о методах вторжений, которую можно использовать для повышения надежности соответствующих средств. Выявление вторжений основано на предположении, что поведение взломщике отличается от поведения законного пользователя, и эти отличия можно определит! количественно. Конечно же, нельзя ожидать, что отличие в поведении будет полным; скорее, следует предположить наличие некоторой корреляции. На рис. 15.6 в самых общих чертах представлен характер задачи, которая стоит перед разработчиком системы выявления вторжений. Несмотря на то чте типичное поведение взломщика отличается от типичного поведения санкционированного пользователя, они имеют нечто общее. Таким образом, вольное толкование поведения взломщика, при котором будет отобрано больше злоумышленников, приведет к тому, что в эти сети попадутся ненастоящие взломщики, т.е. некоторые санкционированные пользователи будут идентифицированы кап взломщики. С другой стороны, если попытаться ужесточить критерии отбора, наложив строгие рамки на интерпретацию поведения взломщика, это повысит риск упустить злоумышленника. Некоторые злоумышленники могут не попасть в эти рамки и не будут идентифицированы как взломщики. Андерсон (Anderson) провел исследование [ANDE80], в котором было дока зано, что можно с разумной степенью достоверности отличить имитатора от за конного пользователя. Понаблюдав за поведением легальных пользователей некоторое время, можно установить определенные закономерности их поведения, i затем выявлять существенные отклонения от них. Андерсон предположил, чте правонарушителя (санкционированного пользователя, который выполняет не санкционированные действия) обнаружить труднее, так как в этом случае раз личие между обычным и необычным поведением может быть незначительным Таким образом исследователь пришел к выводу, что подобные нарушения почт* не подлежат обнаружению, при котором только ведутся поиски необычного по ведения. Тем не менее поведение правонарушителя подлежит обнаружению < помощью разумного определения класса условий, предполагающих несанкцио нированное поведение. Наконец, оказалось, что невозможно выявить тайногс пользователя с помощью одних лишь автоматических методов. Результаты эти> наблюдений, сделанных в 1980 году, остаются актуальными и сейчас. Глаза 15. Безопасность 75£
функция плотности вероятности Профиль поведения взломщика Профиль поведения авторизованного пользователя Перекрытие в наблюдаемом или ожидаемом поведении Среднее поведение взломщика Среднее поведение авторизованного пользователя Измеримый параметр поведения Рис. 15.6. Профили поведения взломщиков и санкционированных пользователей В [PORR92] перечислены такие подходы к выявлению вторжений. 1. Выявление статистических отклонений. Этот подход включает в себя сбор в течение некоторого периода времени данных, связанных с поведением законных пользователей. Затем наблюдаемое поведение проходит обработку статистическими методами, в результате чего с высокой степенью достоверности удается выявить, является ли данный пользователь законным, исходя из его поведения. • Пороговое обнаружение. При этом подходе необходимо задать не зависящие от пользователя пороги частот различных событий. • Профильное обнаружение. Создается профиль поведения каждого пользователя, который служит для выявления изменений в поведении пользователей отдельных учетных записей. 2. Выявление на основе правил. Делается попытка установить набор правил, на основе которых можно было бы принимать решение, является ли данное поведение поведением взломщика. • Выявление отклонений. Правила составляются для того, чтобы выявить отклонения от предыдущих характеристик использования системы. • Идентификация проникновения. Подход, лежащий в основе экспертных систем, при котором осуществляется поиск подозрительного поведения. Стержнем статистических подходов является попытка определить нормаль- или ожидаемое, поведение, в то время как подходы, основанные на прави- пытаются задать надлежащее поведение. Если говорить о перечисленных выше видах взломщиков, то выявление на основе статистических отклонений эффективно в отношении притворщиков, которые, скорее всего, не станут подражать стилю поведения пользователей тех ное л ах Часть 7. Безопасность учетных записей, которыми они завладели. С другой стороны, эти методы могут оказаться бессильными против правонарушителей. Для выявления атак такого рода могут быть полезными подходы, основанные на правилах, позволяющих распознавать события и их последовательности, которые при определенных обстоятельствах свидетельствуют о проникновении чужака. На практике может понадобиться использование в системе обоих подходов для эффективной борьбы против широкого спектра атак. Основным инструментом выявления вторжений является запись данных аудита. Должно вестись некоторое протоколирование деятельности пользователей которое используется системой для выявления вторжения. Оно выглядит следующим образом. • Записи аудита пользователей системы. Почти все многопользовательские операционные системы содержат в себе программные средства учета вычислительных ресурсов, собирающие информацию о деятельности пользователей. Преимущество использования этой информации заключается в отсутствии необходимости в наличии дополнительного набора программ. Недостаток же состоит в том, что в записях обычных пользователей может не содержаться нужная информация или она может иметь неудобный вид. • Записи аудита, предназначенные для выявления. Можно реализовать набор средств, которые будут генерировать записи аудита, содержащие только ту информацию, которая нужна системе выявления вторжений. Одним из преимуществ такого подхода является то, что его можно сделать независимым от производителя и переносимым на самые разные системы. Недостаток состоит в том, что этот подход предполагает дополнительные накладные расходы, связанные с добавлением пакетов учета использования ресурсов. Хорошей демонстрацией предназначенных для выявления записей аудита является разработанный Дороти Деннинг (Dorothy Denning) [DENN87] пример. Каждая запись содержит такие поля. • Субъект. Инициаторы действий. Субъектом обычно является пользователь терминала, но может быть и процесс, работающий от имени пользователей или групп пользователей. Вся активность возникает как результат выполнения команд субъекта. Субъекты могут быть сгруппированы в различны* классы доступа, для которых допустимо перекрытие. • Действие. Операция, которую субъект выполняет с объектом, например ре гистрация, чтение, операции ввода-вывода, запуск программ. • Объект. То, над чем выполняются действия. В качестве примеров можн< привести файлы, программы, сообщения, записи, терминалы, принтеры i структуры, созданные пользователями или программами. В том случае, ко гда действие выполняется над субъектом, таким, как электронная почта, oi рассматривается как объект. Объекты могут быть сгруппированы по типам Степень детализации объектов может зависеть от их типа и от окружения Например, аудит действий, выполняемых в базе данных, может выполнять ся на уровне базы данных как целого или на уровне отдельных записей. • Исключительная ситуация. Если в ответ на действие возникла исключи тельная ситуация, то она указывается в этом поле. Глава 16, Безопасность 7JK
• Использование ресурсов. Список числовых параметров, с помощью которых измеряется использование определенного ресурса (например, количество распечатанных или выведенных на экран строк, количество записанных или прочитанных записей, процессорное время, использованные устройства ввода-вывода, время сеанса). • Временной штамп. Штамп с указанием времени и даты, указывающий, когда было выполнено действие. Большинство выполняемых пользователями операций состоят из несколь- их элементарных действий. Например, копирование файла включает в себя вы- олнение команды пользователя, в которой содержится проверка возможности оступа, предварительная настройка, чтение из одного файла и копирование в ругой. Рассмотрим команду OPY GAME.EXE TO <Library>GAME.EXE веденную пользователем Smith, чтобы скопировать исполняемый файл Z\ME.EXE из текущего каталога в каталог <Library>. При этом могут быть сге- ;ерированы такие записи: imith execute <Library>COPY.EXE 0 CPU = 00002 11058721678 Imith read <Smith>GAME.EXE 0 RECORDS = 0 11058721679 imith execute <Library>COPY.EXE write-viol RECORDS = 0 11058721680 В данном случае копирование прерывается, так как Смиту не разрешено за- шсывать в каталог <Library>. Разложение операций пользователя на элементарные действия обладает ■ремя преимуществами. 1. Благодаря тому что объекты являются защищаемыми элементами систе- , мы, использование элементарных действий позволяет вести всесторонний '; аудит воздействий на объект. Таким образом, система может обнаружить попытки преодолеть контроль доступа (отмечая аномальный рост количе- -\ ства возникающих исключительных ситуаций). Система может также вы- , являть удавшиеся нарушения, отмечая необычные изменения в наборе ;, доступных субъекту объектов. 2. Записи аудита, включающие в себя единственный объект и единственное ? действие, упрощают модель и ее реализацию. ■•■ 3. Благодаря простой единообразной структуре предназначенных для выявле- ,' ния записей аудита появляется возможность сравнительно легко получить эту информацию, или по крайней мере ее часть, с помощью прямого переноса имеющихся в системе встроенных записей аудита в записи аудита, предназначенные для выявления вторжения. 15.4. ЗЛОВРЕДНОЕ ПРОГРАММНОЕ \| ОБЕСПЕЧЕНИЕ ' ,."!'. i Вероятно, наиболее изощренные угрозы для компьютерных систем представляют программы, исследующие их уязвимые места. Общее название угроз ■ такого вида — зловредные программы (malicious software или malware). Зло- 758 Часть 7. Безопасность ' вредные программы — это программы, которые предназначены для того, чтобы причинить вред или использовать ресурсы компьютера, выбранного в качестве мишени. Они часто маскируются в легальных программах или выдаются за них. В некоторых случаях они распространяются сами по себе, переходя на другие компьютеры по электронной почте или через зараженные файлы или дискеты. В начале этого раздела представлен обзор таких программных угроз; остальная часть раздела посвящена вирусам. Сначала мы познакомимся с их природой, а затем — с возможными контрмерами. Зловредные программы На рис. 15.7 представлена общая систематизирующая схема зловредных программ. Угрозы этого вида можно разделить на две категории: те которые используют программу-носитель, и те, которые являются независимыми. К первой категории в основном относятся фрагменты программ, которые не могут существовать независимо от программы-носителя, в роли которой может выступать приложение, утилита или системная программа. Ко второй категории относятся отдельные независимые программы, которые могут планироваться и запускаться операционной системой. Зловредное программное обеспечение Нуждается в программе-носителе Независимое Люки Логические бомбы Троянские кони Вирусы Черви Зомби _> Размножаются Рис. 15.7. Систематизация зловредных программ Опасные программы разделяются на такие, которые не воспроизводят себя, и такие, которые делают это. К программному обеспечению первого вида относятся фрагменты программ, которые должны активизироваться во время определенных действий главной программы. В программное обеспечение второго вида входят либо фрагменты программ (вирусы), либо независимые программы (черви), способные при запуске создавать одну или несколько копий самих себя; эти копии позже активизируются в этой же или в какой-то другой системе. Хотя представленная на рис. 15.7 систематика полезна для усвоения обсуждаемой информации, она не дает полной картины. В частности, логические бомбы или троянские кони также могут быть составной частью вирусов или червей. Глава 15. Безопасность 759
Люки дюк — это скрытая точка входа в программу, которая позволяет каждому, ■о о пей знает, получать доступ к программе в обход обычных процедур, пред- значенных для обеспечения безопасности. Многие годы люки использовались юграммистами для отладки и тестирования программ. Обычно это происходит гда, когда программист разрабатывает приложение, в которое входит процеду- регистрации, или которое нужно долго настраивать, вводя при запуске много зличных значений. Разработчик может захотеть предоставить программе, >едназначенной для отладки, особые привилегии или иметь возможность избе- ть процесса настройки и аутентификации. Программисту также может понадобься иметь в своем распоряжении надежный метод, позволяющий активизиро- iTb программу в случае возможных сбоев в работе встроенной в приложение хщедуры регистрации. Люк — это код, распознающий некую особую последо- (тельность входных данных или включающийся при запуске с определенным *ентификатором пользователя, либо в результате маловероятной последова- :льности событий. Если люки используются недобросовестными программистами для получе- ля несанкционированного доступа, они становятся угрозой. Именно ловушка эслужила основной идеей уязвимости, изображенной в фильме "Военные игры" Var Games) [COOP89]. В качестве другого примера можно привести случай, роизошдший при разработке системы Multics, испытание на проникновение в оторую проводилось группой "tiger team" (команда тигров) военно-воздушных «л США, изображавшей противника. Один из тактических ходов заключался в эм, чтобы отправить на узел, работающий под управлением Multics, подложную Зновленную версию операционной системы. Версия содержала в себе троянского оня (эти программы описаны далее), которого можно было активизировать с омощью люка, и который позволил команде получить доступ к системе. Угроза ыла реализована так хорошо, что разработчики системы Multics не смогли най- и ее даже тогда, когда их проинформировали о ее наличии [ENGE80]. Очень трудно выявлять люки в операционной системе. Меры безопасности олжны предприниматься в основном на этапах разработки и обновления программ. Логические бомбы Логические бомбы — один из самых ранних видов программ, представляю- дих угрозу. Они являются предшественниками вирусов и червей. Логическая ' омба — это код, помещенный в какую-то легальную программу и устроенный * ак, что при определенных условиях он "взрывается". Условием, использую- цимся для включения логической бомбы, может быть наличие или отсутствие ■пределенных файлов, определенный день недели или дата, а также запуск при- \ южения определенным пользователем. В одном известном случае [SPAF89] ло- ?. ическая бомба проверяла идентификационный номер сотрудника компании, ко- ;» чэрый был автором этой бомбы, а затем включалась, если этот идентификатор не фигурировал в двух последовательных начислениях заработной платы. Вклю- гившись, бомба могла изменить или удалить данные или целые файлы, стать . гричиной остановки машины или причинить какой-нибудь другой вред. Порази- * • 'ельным примером применения логической бомбы стал случай, произошедший в >иблиотечной системе графства Монтгомери, в Мэриленде [TIME90]. Подрядчик, которому поручили разработку компьютеризованной абонементной системы, по- О Часть 7. Безопасность местил в нее логическую бомбу. При наступлении определенной даты эта бомба могла вывести систему из строя, если заказчик отказывался платить. Когда библиотека задержала выплату денег из-за того что абонентская система имела плохое время отклика, подрядчик признался в существовании бомбы и пригрозил что если деньги не будут перечислены, то он даст бомбе сработать. Троянские кони Троянский конь — это полезная или кажущаяся таковой программа или процедура, в которой спрятан код, способный в случае срабатывания выполнить некоторую нежелательную или вредную функцию. Троянские кони могут использоваться для выполнения тех функций, которые несанкционированный пользователь не мог бы выполнить непосредственно. Например, некий пользователь-злоумышленник хочет получить доступ к файлам другого пользователя. Для этого он может написать программу, которая при запуске изменяла бы права доступа к файлам вызвавшего ее пользователя так, чтобы эти файлы могли прочитать все другие пользователи. Затем, поместив эту программу в общий каталог и присвоив ей имя, похожее на имя какой-нибудь полезной утилиты, автор программы мог бы добиться того, чтобы интересующий его пользователь запустил ее. Примером маскирующей программы может быть программа, которая якобы выводит листинг файлов пользователя в нужном формате. После того как ничего не подозревающий пользователь запустит программу, ее автор сможет получить доступ к информации, которая находится в файлах этого пользователя. Примером трудно обнаруживаемого троянского коня является компилятор, измененный таким образом, чтобы при компиляции он вставлял в определенные программы (например, программы регистрации в системе) дополнительный код [ТНОМ84]. С помощью такого кода в программе регистрации можно создать люк, позволяющий автору входить в систему с помощью специального пароля. Такого троянского коня нельзя обнаружить в исходном коде программы регистрации. Троянские кони также широко используются для уничтожения данных. Все выглядит так, будто программа выполняет полезную функцию (например, программа-калькулятор), но при этом она может незаметно удалять файлы пользователя. Вирусы Вирус — это программа, которая может "заражать" другие программы, изменяя их; к числу изменений относится копирование программы-вируса в программу, которая затем может заразить другие программы. Биологические вирусы представляют собой крошечные обломки генетического кода (ДНК или РНК), которые могут перенимать структуру живых клеток и хитростью вовлечь их в производство тысяч точных копий первоначального вируса. Подобно своему биологическому прототипу компьютерный вирус содержит в своем коде рецепт того, как точно копировать самого себя. Попав в компьютер, типичный вирус временно берет на себя управление операционной системой компьютера. Затем при любом контакте зараженного компьютера с неза- раженным фрагментом программного обеспечения в новую программу внедряется новоиспеченная копия вируса. Таким образом, ничего не подозревающие пользователи могут передавать заражение от одного компьютера другому в процессе переписывания программ с одного диска на другой или их пере- Глаяа 15, Безопасность 761
аки по сети. Сетевая среда, предоставляющая возможность получать доступ к сложениям и системным сервисам, которые находятся на других компьюте- i создает идеальные условия для распространения вирусов. Далее в этом разделе вирусы изучаются подробнее. Черви Сетевые программы-черви используют сетевые соединения, чтобы перехо- гь из одной системы в другую. Однажды активизировавшись в системе, сете- й червь может вести себя как компьютерный вирус, порождать троянских ко- й или выполнять любые другие разрушительные или деструктивные действия. Для самовоспроизведения сетевой червь использует некоторое транспортное гдство. В качестве примеров можно привести следующие. » Электронная почта. Червь рассылает свою копию другим системам по электронной почте, i Возможности удаленного запуска программ. Червь запускает свою копию на другой системе. » Возможность удаленной регистрации. Червь входит в удаленную систему под видом пользователя, а затем с помощью стандартных команд копирует ■, себя из одной системы в другую. Затем новая копия программы-червя запускается на удаленной системе, где шин продолжает распространяться таким же образом. Сетевой червь обладает такими же характеристиками, что и компьютерный [рус: фаза покоя, фаза размножения и фаза выполнения. В фазе размножения |ЫЧно выполняются такие функции. С' 1. Поиск других систем для заражения путем проверки списков узлов или других хранилищ адресов удаленных систем. >г 2. Установление связи с удаленной системой. л 3. Копирование самого себя в удаленную систему и запуск новой копии. 1 Перед тем как копировать себя на какую-то систему, сетевой червь может ■■' 1кже попытаться определить, инфицирована ли эта система. Кроме того, в мно- V )задачной системе он может маскироваться, присваивая своим копиям имена .'. «темных процессов или какие-то другие имена, которые будет трудно заметить дстемному оператору. Сетевым червям так же трудно противостоять, как и вирусам. Однако про- уманные и правильно реализованные меры безопасности, предусматривающие ; ак безопасность сетей, так и безопасность отдельных систем, сводят угрозу ■■■• роникновения червей к минимуму. V Зомби ; Зомби — это программа, которая скрытно соединяется с другим подклю- . енным в Internet компьютером, а затем использует этот компьютер для запуска так, что усложняет отслеживание пути к создателю программы-зомби. Зомби ? [спользуются при атаках с отказом в обслуживании, которые обычно направле- [ы против выбранных в качестве мишени Web-узлов. Зомби распространяются в fa сотни компьютеров, принадлежащих ничего не подозревающим третьим ли- Ш2 Часть 7. Беаопасность цам, а затем используются для пораэкения выбранного в качестве мишени Web- узла при помощи огромного увеличения сетевого трафика. Природа вирусов Вирус может делать все то, что делает обычная программа. Единственное отличие состоит в том, что он прикрепляется к другой программе и скрытно выполняется во время работы программы-хозяина. Будучи запущенным, вирус может выполнять любые функции, например удалять файлы и программы. За время своего существования типичный вирус проходит четыре стадии. • Фаза покоя. Вирус бездействует. Рано или поздно он будет активизирован некоторым событием. Таким событием может служить наступление определенной даты, наличие другой программы или файла или превышение некоторой граничной емкости диска. Не все вирусы придерживаются этой стратегии. • Фаза размножения. Вирус помещает свою точную копию в другие программы или в определенные системные области на диске. После этого каждая зараженная программа содержит клон вируса, который тоже когда-нибудь вступит в фазу размножения. • Фаза запуска. Вирус активизируется, чтобы получить возможность выполнять функции, для которых он был создан. Как и выход из фазы покоя, переход в фазу запуска может быть спровоцирован различными системными событиями, в их числе — превышение некоторого предельного количества новых копий вируса. • Фаза выполнения. В этой фазе вирус выполняет свои функции. Эти функции могут быть безобидными (например, вывод на экран сообщения) или причинять вред (например, удаление файлов с программами и данными)." Большинство вирусов делают свое дело, приспосабливаясь к определенной операционной системе, а в некоторых случаях — к определенной аппаратной платформе. Таким образом, они задуманы так, чтобы воспользоваться особенностями и слабостями определенных систем. Виды вирусов С момента появления вирусов между теми, кто пишет вирусы, и теми, кто пишет антивирусные программы, ведется непрерывная борьба. Как только разрабатываются эффективные меры противодействия вирусам имеющихся типов, тут же появляются новые типы вирусов. В [STEP93] приводятся такие категории, в которые сгруппированы наиболее значительные виды вирусов. • Вирус-паразит. Традиционная и наиболее распространенная форма вируса. Вирус-паразит прикрепляется к исполняемым файлам и размножается в процессе работы зараженной программы, отыскивая и заражая другие исполняемые файлы. • Резидентный вирус. Проникает в основную память вместе с резидентной системной программой и заражает все запускаемые программы. • Вирус в загрузочном секторе. Этот тип вирусов заражает главную загрузочную запись или загрузочную запись диска, а затем распространяется при условии, что система загружается с диска, который содержит этот вирус. Глава 16. Безопасность 763
• Вирус-невидимка. Разновидность вирусов, специально разработанная так, чтобы скрываться от антивирусных программ. • Полиморфный вирус. Вирус, который может видоизменяться при каждом новом заражении, в связи с чем выявить вирус с использованием некоторой последовательности байтов его кода (сигнатуры) невозможно. Один из видов вирусов-невидимок использует сжатие, при котором зараженная программа имеет точно такой же размер, как и ее незараженная версия Возможно также применение намного более сложных методов. Например, вирус может поместить в программы, выполняющие ввод-вывод на диск, фрагмент кода, работающего на перехват. Тогда при попытке прочитать с помощью этой программы подозрительную часть диска вирус представит первоначальную, незараженную программу. Таким образом, термин невидимка скорее применим не к самому вирусу, а к технологии, используемой вирусом, чтобы его нельзя было обнаружить. Полиморфный вирус в процессе размножения создает копии, которые функционально эквивалентны, но заметно отличаются битовыми комбинациями. Как и в случае с вирусом-невидимкой, цель данного подхода состоит в том, чтобы сбить с толку программы, ведущие поиск вирусов. При этом каждая копия вируса будет отличаться от предыдущей. Чтобы этого достичь, вирус может случайным образом помещать в свои копии избыточные инструкции или изменять порядок независимых инструкций. Более эффективный подход состоит в использовании шифрования. Часть вируса, которую обычно < называют мутационным устройством (mutation engine), создает случайный , ключ шифрования, с помощью которого кодируется остальная часть вируса; < ключ при этом сохраняется в вирусе. Когда вызывается зараженная программа, вирус дешифруется с помощью хранящегося в нем ключа. При раз- * множении выбирается другой случайный ключ. ^ Существуют наборы инструментов, предназначенных для создания вирусов. Хотя такие вирусы являются менее сложными, чем те, которые созданы вруч- '. ную, рост количества новых сравнительно легко создаваемых вирусов является проблемой для антивирусной защиты. Еще одним инструментом создателей вирусов являются электронные доски ' объявлений, с помощью которых ведется обмен вирусами. Такие доски объявле- ^ ний стали появляться в Соединенных Штатах и других странах [ADAM92]. На них предлагаются копии вирусов, которые можно загрузить на свой компьютер, ;. а также советы по созданию вирусов. Макровирусы В последние годы резко возросло количество вирусов на корпоративных узлах. Это связано преимущественно с распространением одного из новейших ти- "\ пов вирусов — макровирусов. В конце 1999 года количество макровирусов составляло две трети от общего числа компьютерных вирусов [КАВА99]. Эти вирусы являются особенно опасными по нескольким причинам. 1. Макровирусы являются независимыми от платформы. Почти все макровирусы заражают документы, созданные в редакторе Microsoft Word. Все аппаратные платформы и операционные системы, поддерживающие Word, . подвержены заражению. 764 Часть 7. Безопасность * 2. Макровирусы заражают не исполняемую часть кода, а документы. Большинство информации, содержащейся в компьютерной системе, находится в форме документов, а не в форме программ. 3. Макровирусы легко распространяются. Очень часто для этого применяется электронная почта. Макровирусы используют возможность применения макросов в Microsoft Word и других офисных приложениях, таких, как Microsoft Excel. Макрос является исполняемой программой, вставленной в электронный документ или файл другого типа. Обычно пользователи применяют макросы для автоматизации повторяющихся задач и сохранения времени, которое пришлось бы затратить на ввод текста и команд. Как правило, основой макроязыка служит разновидность языка программирования Basic. Пользователь может определить в макросе последовательность нажатий клавиш и настроить макрос так, чтобы он вызывался при нажатии функциональной клавиши или некоторой специальной комбинации клавиш на клавиатуре. Возможность создания макровируса определяется наличием самозапускающихся макросов, т.е. таких макросов, которые вызываются сами по себе, без каких-либо явных действий со стороны пользователя. Обычно запуск таких макросов происходит при открытии файла, его закрытии или при запуске приложения. Макрос в процессе работы может копировать себя в другие документы, удалять файлы, а также причинять другой вред пользователям системы. В приложении Microsoft Word существуют самозапускающиеся макросы трех видов. • Автоматически выполняющийся (autoexecute). Если макрос в шаблоне "normal.dot" или в глобальном шаблоне, который хранится в каталоге инициализации (startup directory) приложения Word, имеет имя AutoExec, он всегда запускается при запуске Word. • Автомакрос (automacro). Автомакрос запускается в результате наступления определенного события. Таким событием может быть открытие или закрытие документа, создание нового документа или выход из приложения Word. • Командный макрос (command macro). Если имя макроса, имеющегося в глобальном файле макросов или вложенного в документ, совпадает с именем существующей команды Word, то при вызове этой команды запускается такой макрос (например, FileSave). Общепринятый метод распространения макровирусов состоит в следующем. Автомакрос, или командный макрос, вкладывается в документ Word, который передается в систему с помощью электронной почты или копирования с дискеты. Спустя некоторое время после открытия документа начинает работать макрос. Он копирует сам себя в глобальный файл макросов. В начале следующего сеанса работы пользователя с приложением Word активизируется глобальный макрос. При запуске этого макроса он может размножаться и причинять вред. Следующие один за другим выпуски приложения Word обеспечивают вое более надежную защиту от макровирусов. Например, фирма Microsoft предлагает устанавливаемый по желанию инструмент Macro Virus Protection, который выявляет подозрительные файлы в формате Word и предупреждает клиента о потенциальном риске, возникающем при открытии файлов с макросами. Другие производители антивирусных программных продуктов также имеют в своем арсенале инструменты для выяв- Глава 15. Безопасность 766
ения и устранения макровирусов. В борьбе с макровирусами происходит такая же гонка вооружений", как и в отношении вирусов других типов. 1одходы к борьбе с вирусами Идеальным решением проблемы вирусной угрозы является предотвращение: ревалируют меры, не допускающие проникновения вируса в систему. Этой це- и, вообще говоря, достичь невозможно, но предотвращение может сократить :оличество успешных вирусных атак. Хорошо организованная защита должна ыть в состоянии реализовать такие действия. • Выявление. Как только произойдет заражение, необходимо обнаружить наличие вируса и его местонахождение. • Идентификация. Если произойдет заражение, необходимо идентифицировать вирус, который заразил программу. • Удаление. После идентификации вируса необходимо удалить все следы его присутствия в зараженной программе и восстановить ее до первоначального состояния. Нужно избавиться от вируса во всех удаленных системах, чтобы инфекция больше не могла распространяться. Если вирус выявлен, но невозможно его идентифицировать или избавиться от него, то выход состоит в том, чтобы избавиться от зараженной программы и загрузить ее чистую версию, воспользовавшись дубликатом. Достижения в области технологии вирусов и антивирусных программ идут рука об руку. Ранние вирусы имели вид сравнительно простых фрагментов кода, и можно было их легко идентифицировать, а также избавиться от них с помощью сравнительно простых антивирусных программных пакетов. По мере нагнетания "гонки вооружений" как вирусные, так и (соответственно) антивирусные программы становились все сложнее и сложнее. Появлялись и продолжают появляться все более изощренные антивирусные подходы и соответствующие продукты. В этом подразделе освещены два важнейших подхода. Обобщенное дешифрование Технология обобщенного дешифрования (generic decryption — GD) позволяет антивирусной программе легко обнаруживать даже самые сложные полиморфные вирусы, поддерживая в то же время высокую скорость сканирования [NACH97]. Вспомним, что при запуске файла, содержащего полиморфный вирус, этот вирус перед активизацией должен дешифровать сам себя. Чтобы обнаружить такую структуру, исполняемые файлы пропускаются через сканер обобщенного дешифрования, в котором содержатся такие элементы. • Эмулятор центрального процессора. Виртуальный компьютер, реализованный программными средствами. Команды исполняемых файлов, вместо того чтобы выполняться на системном процессоре, интерпретируются эмулятором, который содержит в себе программные реализации всех регистров и других аппаратных компонентов процессора. Поэтому выполняющиеся на эмуляторе программы не затрагивают системный процессор. • Средство обнаружения сигнатур вирусов. Модуль, который сканирует исследуемый код, отыскивая в нем сигнатуры известных вирусов. • Модуль управления эмуляцией. Управляет выполнением исследуемого кода. 766 Часть 7. Безопасность В начале каждой имитации эмулятор начинает по очереди интерпретировать каждую команду исследуемого кода. Если в этом коде содержится процедура дешифрования, что может свидетельствовать о наличии вируса, такой код интерпретируется, и вирус выполняет работу антивирусной программы, выявляя себя. Управляющий модуль периодически прерывает интерпретацию, чтобы проверить исследуемый код на наличие сигнатур вирусов. В процессе интерпретации исследуемый код не может причинить вред вычислительной среде персонального компьютера, потому что он интерпретируется в полностью контролируемой среде. Самое сложное при разработке компьютерных средств обобщенного сканирования — определить, как долго должна продолжаться каждая интерпретация. Обычно элементы вирусов активизируются вскоре после запуска программы, но это вовсе не обязательно. Чем дольше сканер выполняет эмуляцию программы, тем с большей вероятностью он найдет в ней спрятанные вирусы. Однако антивирусные программы должны выполняться в течение ограниченного времени и занимать ограниченные ресурсы, иначе пользователи будут недовольны. Цифровая иммунная система Цифровая иммунная система представляет собой комплексный подход к защите от вирусов, разработанный компанией IBM [KEPH97a, KEPH97b]. Эта разработка появилась в связи с постоянно возрастающей угрозой распространения вирусов через Internet. Сначала скажем несколько слов об этой угрозе, а затем кратко изложим подход компании IBM. В настоящее время вирусная угроза характеризуется сравнительно небольшими скоростями распространения новых вирусов и их новых разновидностей. Антивирусные программы обычно ежемесячно обновляются, что позволяет обеспечить достаточный контроль над ситуацией. Кроме того, в наши дни Internet играет сравнительно малую роль в распространении вирусов. Однако в [CHES97] отмечается, что две приведенные ниже основные тенденции развития технологии сети Internet будут оказывать все более возрастающее влияние на скорость распространения вирусов в будущем. • Интегрированные почтовые системы. Такие системы, как Lotus Notes и Microsoft Outlook, существенно упрощают процедуру пересылки чего угодно кому угодно, а также работу с полученными объектами. • Системы мобильных программ. Возможности Java и ActiveX позволяют программам самостоятельно переходить из одной системы в другую. В связи с угрозой, связанной с возможностями Internet, фирма IBM разработала прообраз цифровой иммунной системы. Она основана на использовании эмуляции программ, которая обсуждалась в предыдущем подразделе, и предоставляет возможность общей эмуляции и систему обнаружения вирусов. Цель этой системы — обеспечить малое время отклика, чтобы можно было удалить вирусы вскоре после их появления. При появлении в организации нового вируса иммунная система автоматически захватывает его, анализирует, пополняется соответствующими средствами обнаружения и противодействия, удаляет этот вирус и передает информацию о нем в системы, на которых работает программа IBM Antivirus. После этого данный вирус, где бы он ни появился, будет выявлен еще до того, как он сможет активизироваться. Глава 15. Безопасность 767
На рис. 15.8 проиллюстрированы типичные действия, выполняемые в ходе работы цифровой иммунной системы. 1. Управляющая программа на каждом персональном компьютере использует разнообразные эвристические методы, основанные на наблюдении за поведением системы, подозрительными изменениями программ или сигнатур, свидетельствующими о возможном присутствии вируса. Копию любой программы, которую она сочтет зараженной, управляющая программа пересылает на административную машину организации. 2. Административная машина шифрует полученный образец и отправляет его на центральную машину, где проводится анализ на наличие вирусов. 3. При анализе используются такие методы, как эмуляция или создание защищенной среды, в которой можно запустить и проконтролировать подозрительную программу. Затем машина, на которой анализируется вирус, создает рекомендации по идентификации и удалению данного вируса. 4. Результирующее предписание отправляется обратно на административную машину. 5. Административная машина пересылает это предписание инфицированному клиенту. 6. Кроме того, предписание пересылается другим клиентам организации. 7. Подписчики, разбросанные по всему миру, получают очередное антивирусное обновление, защищающее их от нового вируса. Анализ поведения и структуры вируса Машина для анализа \+- вирусов Извлечение сигнатуры :%г Распространение предписаний Административная машина Машина-клиент, инфицированная вирусом Машина- клиент Отдельный пользователь Рис. 15.8. Цифровая иммунная система Успешность работы цифровой иммунной системы зависит от возможностей анализирующей машины, выявляющей черты новых и модифицированных вирусов. Постоянно анализируя и отслеживая вирусы, найденные в их естествен- 768 Часть 7. Безопасность ной среде обитания, машина должна быть в состоянии постоянно обновлять цифровые иммунные программы, чтобы сдержать угрозу. Вирусы, распространяющиеся по электронной почте Последними разработками в области зловредного программного обеспечения являются вирусы, распространяющиеся по электронной почте. Первые быстро распространяющиеся по электронной почте вирусы, такие, как Melissa, использовали вложенный в сообщение макрос Microsoft Word. Если абонент открывает вложение, макрос активизируется. Затем происходит следующее. 1. Вирус рассылает себя всем, кого найдет в списке подписчиков, имеющемся в пакете программ электронной почты, который содержится на машине пользователя. 2. Вирус причиняет вред на локальной машине. В конце 1999 года появилась более мощная версия вируса, распространяющегося по электронной почте. Чтобы активизировать эту версию, не обязательно открывать вложение; достаточно открыть само сообщение, которое содержит вирус. Этот вирус использует язык сценариев Visual Basic, который поддерживается пакетами электронной почты. Таким образом, мы стали свидетелями возникновения зловредных программ нового поколения, которые прибывают по электронной почте и используют особенности ее программного обеспечения, чтобы распространяться по сети Internet. Как только вирус активизируется, он распространяется (либо при открытии вложения электронной почты, либо при открытии самого сообщения) по всем электронным адресам, которые известны на зараженном узле. В результате скорость распространения вирусов возрастает от нескольких месяцев или лет до нескольких часов (табл. 15.4). В связи с этим авторам антивирусного программного обеспечения становится очень трудно среагировать прежде, чем будет причинен значительный ущерб. В качестве альтернативных мер, направленных против возрастающей угрозы [SCHN99], необходимо встроить в утилиты, предназначенные для работы в Internet, и программные приложения персональных компьютеров более надежные средства безопасности. Таблица 15.4. Время распространения вирусов (по данным www.isca.net) Вирус Год Тип запуска Время достижения Оцениваемый пика численности ущерб Jerusalem, 1990 Cascade, Form Concept 1995 Melissa 1999 Любовное письмо 2000 (love letter) .exe файл 3 года 4 месяца Макрос Word Использует электронную 4 дня почту, макрос Word Использует электронную 5 часов почту, основан на VBS $50 млн. (все вирусы за 5 лет) $50 млн. До $385 млн. До $15 млрд. Глава 15. Безопасность 769
" %ж№к -Syr* i i-ЛЦГ ' *> > 15.5. СИСТЕМЫ С ДОВЕРИТЕЛЬНЫМИ- ^f к * \ ОТНОШЕНИЯМИ V- Большинство рассмотренных до сих пор вопросов касались защиты конкретного сообщения или элемента от пассивной или активной атаки со стороны данного пользователя. Несколько отличный, но широко применяемый способ состоит в том, чтобы защищать данные или ресурсы, основываясь на уровнях безопасности. Этот подход часто применяется в военных организациях, где информация разбита на такие категории: несекретная (unclassified — U), конфиденциальная (confidential — С), секретная (secret — S), совершенно секретная (top secret — TS) и прочая. Данная концепция с таким же успехом применима в других областях, в которых информацию можно сгруппировать в большие категории и предоставлять пользователям разрешение на доступ к определенным категориям данных. Например, документы и данные со стратегическими корпоративными планами можно отнести к наивысшим уровням, доступным только персоналу корпоративных офисов; вслед за ними могут идти служебные данные, касающиеся финансов и персонала и доступные персоналу администрации и корпоративных офисов, и т.д. Когда определено несколько категорий или уровней данных, такие требования называются многоуровневой безопасностью (multilevel security). Общее требование многоуровневой безопасности состоит в том, что объекту, который находится на более высоком уровне, нельзя передавать информацию субъекту, который находится на более низком или лежащем вне этой иерархии уровне, если эта передача не выполняется по желанию санкционированного пользователя. Чтобы сделать это требование более пригодным для реализации, его разбивают на две части, имеющие более простую формулировку. Система многоуровневой безопасности должна обеспечивать выполнение таких требований. • Запрет на чтение снизу вверх. Субъект может читать информацию только из того объекта, уровень секретности которого не выше уровня секретности субъекта. В.литературе это требование известно под названием "простого свойства безопасности" (simple security property). • Запрет на запись сверху вниз (no write down). Субъект может записывать информацию только в тот объект, уровень секретности которого не ниже уровня секретности субъекта. Б литературе это требование известно под названием *-свойство (^-property1). Надлежащая реализация этих двух требований обеспечивает многоуровневую безопасность. К системе обработки данных был применен подход, основан- ■ ный на концепции монитора обращений (reference monitor), который послужил объектом многих исследований и разработок. Схема этого подхода изображена на рис. 15.9. Монитор обращений представляет собой управляющий элемент ап- 1 Символ "*" ничего не означает. Во время, написания первого отчета по этой модели подходящего названия так и не придумали. Звездочка — это символ, который ставится в черновом варианте документа, чтобы потом, когда будет найдено подходящее название свойства, текст можно было обработать с помощью текстового редактора, • автоматически заменив все звездочки нужным словом. Однако название так и не было придумано, и отчет был опубликован с оставшимся в нем символом "*". 770 Часть 7. Безопасность паратного обеспечения и операционной системы того компьютера, который управляет доступом субъектов к объектам на основе их параметров безопасности. Монитор обращений обладает доступом к файлу, известному под названием база данных ядра безопасности (security kernel database), в которой перечислены привилегии доступа (уровень защиты) каждого субъекта, а также атрибуты защиты (уровень классификации) каждого объекта. Монитор обращений обеспечивает соблюдение правил безопасности (запрет на чтение снизу вверх, запрет на запись сверху вниз) и обладает такими свойствами. • Полное сопровождение. Правила безопасности соблюдаются при каждом доступе, а не только, например, во время открытия файла. • Изолированность. Монитор обращений и база данных защищены от несанкционированных изменений. • Возможность проверки. Нужно, чтобы была возможность проверить правильность работы монитора сообщений (т.е. необходимо иметь математическое доказательство того, что монитор безопасности обеспечивает выполнение правил безопасности и предоставляет возможность полного сопровождения и изоляции). >мэв.- 1 г' 1 Субъекты Файл аудита Монитор обращений (стратегия) Т База данных '*". безопасности вдрзг. Субъект: разрешение защиты Объект: классификация защиты Объекты Рис. 15.9. Концепция монитора безопасности Эти требования должны неукоснительно соблюдаться Требование полного сопровождения означает, что необходимо сопровождение каждого обращения к данным, которые находятся в основной памяти, на диске и на ленте. Чисто программные реализации приводят к слишком большому снижению производительности, поэтому являются непрактичными; решение должно хотя бы частично опираться на аппаратную часть. Требование изолированности означает, что у взломщика, каким бы умным он ни был, не должно быть возможности изменить Глава 15. Безопасность 771
логику работы монитора обращений или содержимое базы данных ядра безопасности- Наконец, требования математической доказуемости представляет затруднение для такой сложной системы, как компьютер общего назначения. Система, в которой можно выполнить такую проверку, называется системой с доверительными отношениями (trusted system). Конечным элементом, показанным на рис. 15.9, является файл аудита. В него заносится информация о таких важных для безопасности событиях, как обнаружение нарушений безопасности или санкционированные изменения базы данных ядра безопасности. Пытаясь удовлетворить свои потребности и оказать услугу общественности, министерство обороны США в 1981 году основало в рамках Управления национальной безопасности (National Security Agency — NSA) Центр компьютерной безопасности (Computer Security Center), целью которого является поддержка распространения компьютерных систем с доверительными отношениями. Для реализации этой цели была разработана Программа оценки коммерческих продуктов (Commercial Product Evaluation Program). По сути, центр пытается оценивать, насколько появляющиеся на рынке коммерческие продукты удовлетворяют описанным выше требованиям безопасности. Центр классифицировал оцениваемые продукты в соответствии со степенью предоставляемой безопасности. Эти оценки используются министерством обороны при приобретении программных продуктов для собственных нужд, но они открыто публикуются, и их можно получить бесплатно. Таким образом, эти публикации могут быть полезными для клиентов, покупающих имеющееся в наличии оборудование. Защита от троянских коней Одним из путей, с помощью которых можно обезопаситься от атак с применением троянских коней, является использование безопасной операционной системы с доверительными отношениями. Один из примеров [ВОЕВ85] проиллюстрирован на рис. 15.10. В данном случае троянский конь используется для того, чтобы перехитрить стандартный механизм безопасности, используемый большинством систем управления файлами и операционных систем — список контроля доступа. В этом примере пользователь, которого зовут Боб, взаимодействует с помощью программы с файлом данных, в котором содержится секретная символьная строка "CPE170KS". Пользователь Боб создал файл с правами чтения и записи, предоставляемыми только тем программам, которые запускаются от его имени, так что доступ к файлу могут получать только те процессы, владельцем которых является Боб. Атака с применением троянского коня начинается тогда, когда враждебно настроенный пользователь Алиса получает законный доступ к системе и устанавливает эту программу, а также личный файл, который будет использоваться в качестве "потайного кармана". Алиса предоставляет себе права чтения и записи при работе с этим файлом, а Бобу — право записи (рис. 15.10,а). Затем Алиса склоняет Боба к тому, чтобы он запустил троянского коня; для этого она, возможно, рекламирует программу как полезную утилиту. Когда программа обнаружит, что ее запустил Боб, она считает из его файла секретную символьную строку и скопирует ее в потайной файл Алисы (рис. 15.10,6). Обе операции — операция чтения и операция записи — не выходят за рамки ограничений, накладываемых списками контроля доступа. После этого Алисе остается только заглянуть в скопированный файл, чтобы узнать значение строки. 772 Часть 7. Безопасность
А теперь посмотрим, как в этой ситуации работает безопасная операционная система (рис. 15.10,в). При входе пользователя в систему ее субъектам присваиваются уровни безопасности; при этом в качестве критерия используется терминал, с которого осуществляется доступ к компьютеру, а также идентификатор и пароль пользователя, которому предоставляется доступ. В рассматриваемом примере применяются два уровня безопасности: секретный (серый цвет) и общедоступный (белый цвет). Уровни упорядочены так, что секретный уровень выше общедоступного. Процессам и файлу данных Боба присваивается секретный уровень безопасности, а файлу и процессам Алисы — общедоступный. Если Боб запускает программу-троянца (рис. 15.10,г), этой программе присваивается уровень безопасности Боба. Таким образом, она имеет возможность узнать значение секретной символьной строки. Однако при попытке сохранить эту строку в общедоступном файле (потайном файле Алисы) нарушается *-свойство, и монитор ссылок накладывает запрет на это действие. Таким образом, попытка записи в потайной файл заканчивается неудачей, несмотря на то что она не противоречит списку контроля доступа: политика безопасности превосходит по старшинству механизм списка управления доступом. -ГЭГ: —лг--— оЛ Д. и. . аа,.™-. .,-gg,^™,. „зг-з— -TfSS^sSgfe ^РЩ 15.6. БЕЗОПАСНОСТЬ ОПЕРАЦИОННОЙ^* ' * СИСТЕМЫ WINDOWS 2000 Ш Хорошим примером реализации обсуждаемых концепций контроля доступа являются средства контроля доступа операционной системы Windows 2000 (W2K), в которых используются объектно-ориентированные концепции, обеспечивающие мощные и гибкие возможности контроля доступа. Операционная система W2K предоставляет средства единообразного контроля доступа к процессам, потокам, файлам, семафорам, окнам и другим объектам. Контролем доступа управляют два элемента: маркер доступа, который связан с каждым процессом, и дескриптор защиты, связанный с каждым объектом, для которого возможно межпроцессное взаимодействие. Схема контроля доступа При входе пользователя система W2K использует для его аутентификации схему имя/пароль. Если пользователь успешно зарегистрирован, для него создается процесс, с которым ассоциируется маркер доступа. Этот маркер доступа, детали которого будут описаны далее, содержит идентификатор защиты (security ID — SID), по которому система безопасности идентифицирует данного пользователя. Когда начальный пользовательский процесс порождает какие-нибудь другие процессы, новый объект-процесс наследует тот же маркер доступа. Маркер доступа имеет два предназначения. 1. Благодаря ему вся информация по безопасности хранится вместе, что способствует ускорению подтверждения доступа. Когда какой-нибудь связанный с пользователем процесс пытается получить доступ, подсистема безопасности может использовать связанный с процессом маркер, чтобы определить привилегии доступа, которыми обладает данный пользователь. 774 Часть 7. Безопасность 2. Наличие маркера доступа позволяет процессу в определенных рамках изменять свои характеристики безопасности, не влияя при этом на работу других процессов, запущенных от имени данного пользователя. Основное значение второго пункта состоит в том, что маркер доступа должен иметь дело с привилегиями, которые могут быть связаны с пользователем. Маркер доступа указывает, какие привилегии разрешено иметь пользователю. Как правило, для каждой из этих привилегий маркер инициализируется состоянием запрета. Впоследствии, если одному из процессов пользователя нужно выполнить привилегированную операцию, этот процесс может включить соответствующую привилегию и попытаться получить доступ. Иногда нежелательно хранить всю информацию по безопасности, касающуюся пользователя, в одном месте системы, потому что в этом случае предоставление привилегии одному процессу приводит к тому, что данная привилегия предоставляется всем остальным процессам. С каждым объектом, для которого возможен межпроцессный доступ, связан дескриптор защиты. Основным компонентом дескриптора защиты является список контроля доступа, в котором права доступа к данному объекту указываются для различных пользователей и для различных групп пользователей. Когда процесс пытается получить доступ к этому объекту, идентификатор защиты этого процесса сравнивается со списком управления доступом объекта и определяется, разрешен ли доступ. Когда приложение открывает ссылку на подлежащий защите объект, W2K проверяет, предоставляет ли дескриптор защиты объекта доступ пользователю, которому принадлежит приложение. Если проверка проходит, система W2K помещает предоставленные в результате права доступа в кэш. Важным аспектом безопасности операционной системы W2K является концепция заимствования прав, упрощающая использование безопасности в среде клиент/сервер. Если клиент и сервер общаются между собой с помощью вызова удаленных процедур, сервер может временно принять параметры клиента, чтобы суметь оценить возможность доступа с правами клиента. После обработки обращения сервер возвращается к своему собственному состоянию. Маркер доступа На рис. 15.11,а показана общая структура маркера доступа, в который входят такие параметры. • Идентификатор защиты. Уникальным образом идентифицирует пользователя в рамках всех машин сети. Идентификатор защиты, как правило, соответствует регистрационному имени пользователя. • Идентификаторы защиты групп. Список групп, в которые входит пользователь. Группа — это просто набор идентификаторов пользователей, который идентифицируется при контроле доступа как группа. Каждая группа обладает собственным идентификатором защиты. Доступ к объекту можно определять на основе группового идентификатора защиты, персонального идентификатора защиты или их комбинации. • Привилегии. Список системных сервисов, важных для безопасности, к которым может обратиться данный пользователь. Примером является созда- Глава 15. Безопасность 775
ние маркера. Другой пример — назначение привилегий резервирования. Пользователям, обладающим этими привилегиями, разрешено пользоваться средствами создания резервных копий для резервного копирования файлов, которые им нельзя читать. Большинство пользователей не обладают никакими привилегиями. Владелец по умолчанию. Если процесс создает другой объект, в данном поле указывается владелец нового объекта. Чаще всего пользователем нового процесса является пользователь родительского процесса. Однако пользователь может указать, что по умолчанию пользователем любого процесса, порожденного данным процессом, является идентификатор безопасности группы, к которой принадлежит пользователь. Список контроля доступа по умолчанию. Это начальный список средств защиты, которые применяются к объекту, создаваемому данным пользователем. Впоследствии пользователь может изменить список контроля доступа любого объекта, которым он владеет или который принадлежит группе пользователя. Идентификатор защиты (SIO)f Идентификаторы защиты групп Привилегии Пользователь по умолчанию Список контроля доступа по умолчанию а) Маркер доступа Флаги Владелец Системный список контроля доступа (SACL) Список разграничительного контроля доступа (DACL) Заголовок ACL б) Дескриптор защиты Заголовок АСЕ Маска доступа Идентификатор защиты (SID) Заголовок АСЕ Маска доступа Идентификатор защиты (SID) L в) Список контроля доступа (ACL) Рис. 15.11. Структуры безопасности операционной системы. Windows 2000 Дескрипторы безопасности На рис. 15.11,6 показана общая структура дескриптора защиты, который содержит в себе такие параметры. • Флаги. Определяют тип и содержимое дескриптора защиты. Флаги указывают на наличие (или отсутствие) системного списка контроля доступа и списка разграничительного доступа, на то, помещены ли эти списки в объект по умолчанию и какая адресация используется в указателях дескриптора: абсолютная или относительная. Относительные дескрипторы требуются для объектов, которые передаются по сети. Примером такого объекта является информация, передаваемая при удаленном вызове процедуры. • Владелец. Вообще говоря, владелец может выполнить с дескриптором защиты любое действие. В роли пользователя может выступать индивидуаль- p*fri» Часть 7. Безопасность ный или групповой дескриптор защиты. Владелец имеет право изменять список разграничительного контроля доступа. • Системный список контроля доступа (System Access Control List — SACL). В этом списке указано, операции какого вида должны генерировать сообщения аудита. Чтобы выполнять операции чтения или записи с SACL какого-либо объекта, приложение должно иметь соответствующие привилегии в своем маркере доступа. Это нужно, чтобы предотвратить чтение несанкционированными приложениями системных списков контроля доступа (в результате чего они смогут избежать создания записей аудита), а также запись в них (что может привести к созданию слишком большого количества записей аудита, в которых затеряется запись о незаконной операции). • Список разграничительного контроля доступа (Discretionary Access Control List — DACL). Определяет, какие пользователи и группы могут получить доступ к данному объекту и для каких операций. Этот список состоит из записей контроля доступа (Access Control Entry — АСЕ). Когда создается объект, процесс-создатель может в качестве владельца назначить этому объекту в его маркере доступа собственный идентификатор защиты или идентификатор защиты своей группы. Следовательно, любой процесс, которому предоставлено право изменять владельца объекта, может это делать, но с определенными ограничениями. Это ограничение нужно, чтобы пользователь не смог замести следы после того, как он попытается предпринять какие- нибудь несанкционированные действия. Рассмотрим подробнее структуру списков контроля доступа, так как они лежат в основе средства контроля доступа операционной системы W2K (рис. 15.11,в). Каждый список состоит из общего заголовка и переменного количества элементов контроля доступа. В каждом элементе указан индивидуальный или групповой идентификатор защиты, а также маска доступа, в которой определены права, которые должны быть предоставлены данному идентификатору защиты. При попытке процесса получить доступ к объекту диспетчер объектов исполняющей системы W2K считывает в маркере доступа индивидуальные и групповые идентификаторы защиты, а затем просматривает список разграничительного контроля доступа объекта. Если обнаружено совпадение (т.е. если найден элемент контроля доступа, идентификатор защиты которого совпадает с идентификатором защиты, обнаруженным в маркере доступа), значит, этот процесс обладает правами доступа, установленными маской доступа данного элемента контроля доступа. На рис. 15.12 показано содержимое маски доступа. В 16 младших значащих разрядах указываются права доступа, применяющиеся к объектам определенного типа. Например, в нулевом разряде объекта-файла задается доступ по чтению, а в нулевом разряде объекта-события задается доступ для запроса статуса события. В 16 старших разрядах маски содержатся биты, применимые к объектам всех видов. • Синхронизация. Разрешает синхронизацию выполнения с некоторым связанным с данным объектом событием. В частности, объект может быть использован в функции ожидания. Глава 16. Безопасность 777
Общие права доступа Право на удаление Контроль чтения Запись DAC Разрешение изменения владельца Разрешение синхронизации N11 М-Л I ЬМ-МТГП Ш Стандартные права доступа Доступ к системному списку контроля доступа Максимальное разрешение Специфические права доступа Полный общий доступ Общий доступ для выполнения Общий доступ для записи Общий доступ для чтения Рис. 15.12. Маска доступа • Разрешение на изменение владельца. Позволяет программе изменять владельца объекта. Иногда это оказывается полезным, так как владелец объекта всегда может менять защиту своего объекта (владельцу нельзя отказывать в доступе для записи параметров избирательного контроля доступа). • Разрешение на изменение списка избирательного контроля доступа. Позволяет приложению изменять DACL, меняя таким образом защиту объекта. • Контроль чтения. Позволяет приложению обращаться к полям в дескрипторе защиты, в которых указан владелец данного объекта и его DACL. • Разрешение на удаление. Позволяет приложению удалять объект. Кроме того, в старшей половине маски доступа содержатся общие права досту- а четырех видов. С помощью этих битов легко устанавливать специфические права оступа к различным объектам других типов. Предположим, например, что приложению нужно создать объекты нескольких видов таким образом, чтобы пользовате- ги имели права доступа по чтению ко всем объектам, даже если само понятие чтение" несколько изменяется в зависимости от типа объекта. Если бы приложению гужно было защищать каждый объект каждого вида, не используя биты общего [оступа, оно должно было бы для объектов каждого вида создавать свой элемент контроля доступа, а затем аккуратно передавать его в качестве параметра при созда- ши каждого объекта. Удобнее создать один элемент контроля доступа, в котором •ыла бы выражена общая концепция разрешения чтения, а затем просто применять •тот элемент контроля доступа к каждому создаваемому объекту. В этом и состоит предназначение битов общего доступа. Перечислим эти биты: • Genericall — позволяет осуществлять все виды доступа; • Generic_execute — позволяет запускать исполняемые файлы; ■ЧГялтъ, 7. Безопасность Л i • Generic_write — позволяет осуществлять доступ для записи; • Generic_read — позволяет осуществлять доступ для чтения. Значения битов общего доступа также влияют на стандартные типы доступа. Например, для файлового объекта бит Generic_read отображается в стандартные биты Read_control и Synchronize, а также в специфические биты File_Read_Data, File_Read_Attributes и File_Read_EA. Два оставшихся бита маски доступа имеют специальное значение. Бит Access_System_Security позволяет изменять контроль аудита и аварийного сигнала данного объекта. Однако недостаточно установить этот бит в элементе контроля доступа для идентификатора защиты. Кроме того, в маркере доступа процесса, обладающего этим идентификатором защиты, должна быть разрешена соответствующая привилегия. Наконец, бит MaximumAllowed — это не совсем бит доступа. Он изменяет алгоритм, по которому операционная система W2K сканирует список выбороч^ ного контроля доступа данного идентификатора безопасности. Обычно операционная система W2K просматривает список выборочного контроля доступа, пока не дойдет именно до того элемента контроля доступа, который предоставляет (бит установлен) или запрещает (бит не установлен) запрашиваемый процессом доступ, или пока она не дойдет до конца списка (в этом случае доступ запрещен). Бит MaximumAl lowed позволяет владельцу объекта определять набор прав доступа, представляющий собой максимум того, что может быть позволено данному пользователю. Помня об этом, предположим, что у приложения нет информации обо всех выполняемых над объектом операциях, разрешение на которые ему нужно будет просить на протяжении сеанса работы. При выполнении запроса используются три возможности. 1. Попытка открыть объект для всех возможных видов доступа. Недостаток этого подхода состоит в том, что в доступе может быть отказано, даже если приложение обладает всеми правами доступа, которые нужны для этого сеанса. 2. Открытие объекта только для определенных видов доступа. При этом в объекте для каждого типа запроса открывается новый дескриптор. В большинстве случаев этот метод является предпочтительным, потому что при его использовании не бывает отказов в доступе без необходимости и не предоставляется больше доступа, чем нужно. Однако он требует дополнительных Накладных расходов. 3. Попытка открыть объект для доступа, осуществляемого в такой мере, в какой это позволяет идентификатор защиты. Преимущество такого метода в том, что пользователь не получит "искусственного" отказа в доступе. Однако при этом приложение может иметь больший доступ, чем требуется. Эта ситуация может скрывать имеющиеся в приложении ошибки. Важная особенность системы безопасности операционной системы W2K состоит в том, что приложение может использовать структуру безопасности этой операционной системы для объектов, заданных пользователем. Например, сервер зы данных мог бы создать свои собственные дескрипторы защиты и присоединить их к блокам базы данных. В дополнение к обычным ограничениям при доступе для чтения/записи сервер может позаботиться о защите таких специфиче- ких операций, выполняющихся в базе данных, как прокрутка результирующего Глава 15. Безопасность ^79
ножества или выполнение объединения. На сервер может быть возложена от- ;тственность по определению значения особых прав и выполнению проверок )ступа. Однако эти проверки будут выполняться в обычном контексте с исполь- >ванием системных учетных записей пользователей/групп пользователей и кон- зольных журналов. Расширяемая модель безопасности может оказаться полез- эй при реализации внешних файловых систем. L5.7. РЕЗЮМЕ, КЛЮЧЕВЫЕ ТЕРМИНЫ || И КОНТРОЛЬНЫЕ ВОПРОСЫ 1^%&4 Требования безопасности легче всего удовлетворить, изучив различные гоящие перед организацией угрозы. Прекращение обслуживания является угро- эй для доступности, перехват информации представляет угрозу для секретно- ги. Наконец, изменение и подделка подлинной информации представляют собой грозу для целостности. Одной из основных областей компьютерной безопасности является защита амяти. Она является существенной во всех системах, в которых одновременно ктивны несколько процессов. Для этого схемы виртуальной памяти обычно ос- ащаются соответствующими механизмами. Другим важным методом обеспечения безопасности является контроль доступа, {ель контроля доступа состоит в том, чтобы убедиться, что доступ к данной системе отдельным ресурсам имеют лишь санкционированные пользователи и что доступ к пределенным частям данных и их изменение ограничены санкционированными ли- ;ами и программами. Строго говоря, контроль доступа — это, скорее, не вопрос езопасности сети, а вопрос безопасности компьютера. Т.е. в большинстве случаев сеханизм контроля доступа реализуется в рамках одного компьютера, чтобы кон- ролировать доступ к нему. Однако необходимо разрабатывать механизмы контроля .оступа, которые эффективно работали бы в распределенной среде (в сети), так как ;оступ к компьютерам часто осуществляется с помощью сетевых устройств или редств, предназначенных для обмена информацией. Все большую угрозу представляют собой вирусы и другие подобные программное механизмы. Эти программы исследуют уязвимые места программного обеспече- [ия системы и используют их либо для того, чтобы получить несанкционированный [оступ к информации, либо для дискредитации системных сервисов. Системы с доверительными отношениями — это технология, которая находит tee более широкое применение в военных и коммерческих организациях. Системы 'акого типа предоставляют средства для регулирования доступа к данным на основе шформации о том, кто имеет санкционированный доступ к каким объектам. Ключевые термины Активная угроза Вирус, распространяющий- Контроль доступа Алгоритм шифрования ся по электронной почте Конфиденциальность данных Воспроизведение Логическая бомба Аутентичность Выявление вторжения Люк Взломщик Доступность Макровирус Вирус Зловредные программы Отказ от обслуживания Зомби Пароль 780 Часть 7. Безопасность Пассивная угроза Целостность Шифрование с открытым Стандарт шифрования Червь ключом данных Шифрование Троянский конь Шифрование RSA Контрольные вопросы 15.1. Перечислите фундаментальные требования, которым должна удовлетво рять компьютерная безопасность. 15.2. В чем разница между пассивной и активной угрозами безопасности? 15.3. Перечислите категории пассивной и активной угроз безопасности и дайте их краткие определения. 15.4. Какие элементы нужны для осуществления наиболее общих методов контроля доступа пользователей? 15.5. Какая разница между субъектом и объектом при контроле доступа? 15.6. Объясните, зачем используется значение salt, приведенное на рис. 15.5. 15.7. Объясните различие между выявлением вторжения на основе статистических отклонений и на основе правил. 15.8. Злоумышленное вложение в сообщение электронной почты, появившееся в 1999 году (Melissa), и злоумышленное электронное сообщение с использованием языка VBS, возникшее в 2000 году (love letter) известны под названием вирусы, распространяющиеся по электронной почте (е- mail viruses). He является ли более точным название черви, распространяющиеся по электронной почте (e-mail worms)? 15.9. Какую роль играет шифрование в устройстве вирусов? 15.10. Объясните, в чем состоит различие между стандартным шифрованием и шифрованием с открытым ключом. 15.11. В чем заключается различие значений терминов открытый ключ (public key), закрытый ключ (private key) и секретный ключ (secret key)? ; 15.8. РЕКОМЕНДУЕМАЯ 3lHTEPATF»ji Темы этой главы подробно изложены в [STAL98]. В фундаментальном справочнике [SCHN96] представлен обзор криптографических алгоритмов; в этой работе содержится описание почти всех алгоритмов и протоколов шифрования, опубликованных за последние 15 лет. Изложение вопросов, связанных с устройством операционных систем, можно найти в [BOLL9], [PFLE97], [SINH97] и [SING94]. В [HOFF90] и [DENN90] собраны многие основополагающие статьи, в которых говорится о взломщиках и вирусах. В [NACH97] обсуждаются последние достижения в области антивирусных технологий. В [SHEL97] и [SUTT97] представлено подробное изложение принципов безопасности операционной системы Windows NT. В обоих изданиях внимание сосредоточено на администрировании и управлении, но обсуждаются и некоторые особенности внутреннего устройства Windows NT, имеющие отношение к безопасности. Глава 15. Безопасность 781
OLL99 Gollmann D. Computer Security. — New York: Wiley,1999. . 1 ENN90 Denning P. Computers Under Attack: Intruders. Worms, and Viruses! — j Reading, MA: Addison-Wesley, 1990. | [OFF90 Hoffman L., editor. Rogue Programs: Viruses. Worms and Trojan Horses. — \ New York; Van Nostrand Reinhold, 1990. ■ i ГАСН97 Nachenberg C. Computer Virus-Antivirus Coevolution. — Communications^ of the ACM, January 1997. j FLE97 Pfleeger C. Security in Computing. — Upper Saddle River, NJ: Prentice ; Hall PTR, 1997. „I CHN96 Schneier B. Applied Cryptography. — New York: Wiley, 1996. I IHEL97 Sheldon T. Windows NT Security Handbook. — New York: Osborne ] McGraw-Hill, 1997. j IING94 Singhal M., Shivaratri N. Advanced Concepts in Operating Systems. — New J York: McGraw-Hill, 1994. 1 ;INH97 Sinha P. Distributed Operating Systems. — Piscataway, NJ: IEEE Press, 1997. =j JTAL98 Stallings W. Cryptography and Network Security: Principles and Practice. \ 2nd ed. — Upper Saddle River, NJ: Prentice Hall, 1995. - 1 »UTT97 Sutton S. Windows NT Security Guide. — Reading, MA: Addison-Wesley, 199J;-i L5.9. ЗАДАЧИ " M J i.l. Предположим, что пароли выбираются в виде четырехсимвольных комбинаций, составленных из букв 26-символьного алфавита. Предположим также, что злоумышленник имеет возможность перебирать пароли с частотой один пароль в секунду. а. За какое время злоумышленник сможет найти правильный пароль при условии, что система не реагирует на его действия до полного завершения очередной попытки? б. За какое время злоумышленник сможет найти правильный пароль при условии, что система сообщает об ошибке при вводе каждого неправильного символа? 5.2. Предположим, что некоторый элемент длины k, выступающий в роли прообраза, отображается в элемент длины р, являющийся его образом. Если каждая цифра может принимать одно из г значений, то всего может быть г* прообразов, а количество образов равно меньшему числу L Пусть некоторый элемент х, отображается в элемент yt. а. Какова вероятность того, что злоумышленник сможет выбрать правильный элемент-прообраз за одну попытку? б. Какова вероятность того, что другой прообраз хк (*, * xt) отображается в тот же элемент у,? в. Какова вероятность того, что злоумышленник за одну попытку получит правильный образ? 5.3. Фонетический генератор паролей для каждого шестибуквенного пароля случайным образом выбирает два сегмента в виде СГС (согласная, гласная, согласная), где Г = <a,e,i,o,u>, а С — остальные символы алфавита. а. Сколько всего может быть паролей? б. Какова вероятность того, что злоумышленник правильно отгадает пароль? .5.4. Предположим, что пароли составляются из 95 печатаемых символов ASCII и что все пароли состоят из 10 символов. Предположим также, что есть Г82 Часть 7. Безопасность. взломщик паролей, скорость шифрования которого составляет 6.4 миллиона шифрований в секунду. За какое время можно полностью проверить все возможные пароли в системе UNIX? 15.5. Из-за угроз, которым подвергается система паролей операционной системы UNIX, в документации по операционной системе SunOS-4.0 рекомендуется удалить файл с паролями и заменить его общедоступным файлом под названием /etc/publickey. Запись пользователя А в этом файле состоит из его идентификатора — IDA, открытого ключа пользователя — KUA и соответствующего закрытого ключа — KRA. Этот закрытый ключ зашифрован с помощью алгоритма DES с ключом, порожденным из пароля пользователя РА. Если пользователь А входит в систему, система дешифрует EP^KRjJ, чтобы получить KRA. а. Затем система проверяет правильность пароля РА. Как она это делает? б. Как взломщик может попытаться атаковать такую систему? 15.6. Схема шифрования, используемая для паролей операционной системы UNIX, является однонаправленной; ее невозможно применить в обратном направлении. Будет ли правильнее сказать, что это по сути не шифрование паролей, а хэш-код? 15.7. Ранее говорилось о том, что включение в схему паролей операционной системы UNIX значения salt усложняет отгадывание паролей в 4096 раз. Однако это значение хранится в незашифрованном виде в той же записи, что и соответствующий зашифрованный пароль. Таким образом, эти два символа известны взломщику, и ему их не нужно угадывать. Почему же тогда утверждается, что значение salt повышает степень безопасности? 15.8. Предположим, что вы правильно ответили на предыдущий вопрос и понимаете, зачем нужно значение salt. Ответьте на другой вопрос. Можно ли воспрепятствовать работе всех программ для взлома паролей, неимоверно увеличив размер значения salt, скажем, до 24 или 48 бит? 15.9. Необходимость введения правила, состоящего в запрете на чтение "снизу вверх" вполне очевидна. Почему важно также ввести запрет на запись "сверху вниз"? 15.10. На рис. 15.10 изображен разрыв одного звена цепочки, состоящей из копирования файла троянским конем с последующим его просмотром. У Алисы есть две возможности атаки: она может войти в систему и попытаться непосредственно прочитать секретную строку; кроме того, Алиса может присвоить своему потайному файлу секретный уровень безопасности. Предотвратит ли монитор обращений эти атаки? 15.11. Предположим, что предложен описанный далее способ подтверждения того, что два пользователя обладают одним и тем же секретным ключом. Один из пользователей создает случайную битовую строку, длина которой совпадает с длиной ключа, выполняет над этой строкой операцию XOR (исключающее ИЛИ) с помощью своего ключа, а затем отправляет результат второму пользователю по каналу. Второй пользователь выполняет над полученным блоком операцию XOR с помощью своего ключа (который, предположительно, совпадает с ключом первого пользователя) и отсылает результат обратно. Первый пользователь проверяет, совпадает ли полученная строка с первоначальной случайной строкой, и таким образом узнает, является ли секретный ключ второго пользователя таким же, как и у него. Вся проверка происходит без передачи по каналу самого ключа. Есть ли недостаток в этой схеме? Глава 15. Безопасность 783
1 ПРИЛОЖЕНИЕ. ШИФРОВАНИЕ Шифрование является основной технологией, лежащей в основе почти всех приложений, обеспечивающих безопасность сетей и компьютеров. Используются два основных подхода: стандартное шифрование (conventional encryption), или симметричное шифрование, и шифрование с открытым ключом, или асимметричное шифрование. В данном приложении представлен обзор обоих видов шифрования, а также краткое обсуждение некоторых важных алгоритмов шифрования. Стандартное шифрование Стандартное шифрование, известное также как симметричное шифрование (symmetric encryption) или шифрование с одним ключом (single-key encryption), было единственным используемым видом шифрования, принятым до появления в конце 70-х годов шифрования с открытым ключом. Стандартное шифрование применялось для обмена секретной информацией от Юлия Цезаря до экипажей немецких подводных лодок, а также современных пользователей из дипломатических, военных и коммерческих организаций. Оно, безусловно, используется более интенсивно, чем шифрование другого типа. В схеме стандартного шифрования имеется пять составляющих (рис. 15.13). • Открытый текст (plaintext). Это первоначальное сообщение или данные, которые подаются на вход алгоритма шифрования. • Алгоритм шифрования (encryption algorithm). Алгоритм шифрования выполняет различные подстановки и преобразования открытого текста. • Секретный ключ (secret key). Секретный ключ также подается на вход алгоритма шифрования. От него зависит, какие именно подстановки и преобразования выполняет алгоритм. • Зашифрованный текст (ciphertext). Это сообщение, которое получается на выходе. То, каким получится зашифрованный текст, зависит от первоначального открытого текста и от секретного ключа. Из одного и того же первоначального сообщения, зашифрованного с помощью разных ключей, получатся два различных зашифрованных текста. • Алгоритм дешифровки (decryption algorithm). По сути, это алгоритм шифрования, выполненный в обратном порядке. Он восстанавливает первоначальный открытый текст, используя зашифрованный текст и секретный ключ. Чтобы стандартное шифрование было безопасным, на него накладываются два требования. 1. Нужен надежный алгоритм шифрования. Нужно, чтобы этот алгоритм был как минимум таким, чтобы противник, который знает этот алгоритм и имеет доступ к одному или нескольким зашифрованным сообщениям, не смог бы дешифровать зашифрованный текст или разгадать ключ. Обычно это требование формулируется более строго: оппонент не должен иметь возможности расшифровать зашифрованный текст или разгадать ключ, даже если у него есть несколько зашифрованных текстов вместе с первоначальными незашифрованными оригиналами каждого из них. 784 Часть 7. Безопасность 2. Отправитель и получатель должны получить копии секретного ключа надежным путем и хранить этот ключ в недосягаемости. Если кто-то сможет обнаружить ключ и будет знать алгоритм, обмен всей информацией с помощью этого ключа станет доступным. Секретный ключ, совместно используемый отправителем и получателем сообщения Секретный ключ, совместно используемый отправителем и получателем сообщения Передача зашифрованного текста Нешифрованный . текст Алгоритм шифрования (например, DES) Алгоритм дешифровки текст (обратный алгоритму шифрования) Рис. 15.13. Стандартное шифрование Есть два подхода, использующихся при атаке на схему стандартного шифрования. Атака первой разновидности называется криптоанализом (cryptanalysis). Основой таких атак служит знание природы алгоритма и, возможно, некоторые предположения относительно общих характеристик исходного текста или даже наличие некоторых образцов, представляющих собой незашифрованный оригинал текста и его зашифрованный образ. При атаках такого рода используются характеристики алгоритма, из которых делаются выводы относительно данного текста или используемого при его шифровании ключа. Если в процессе атаки разгадан ключ, это приводит к катастрофическим последствиям: дискредитируются все зашифрованные этим ключом сообщения, которые уже были отправлены или еще будут отправлены. Атака второго вида, известная как атака "в лоб" (brute-force), заключается в подборе ключа к расшифровываемому образцу текста до тех пор, пока расшифрованный текст не станет понятным. Чтобы достичь результата с пот мощью такого подхода, нужно в среднем перепробовать половину всех возможных ключей. В табл. 15.5 приводятся данные о том, сколько времени нужно потратить на подбор ключа в зависимости от его размера. Результаты для каждого размера ключа показаны в предположении, что на одну попытку затрачивается 1 миллионная доля секунды, что на сегодняшний день по порядку величины совпадает с реальной величиной. Использовав параллельные вычисления с участием большого количества микропроцессоров, можно достичь скорости обработки, превышающей указанную на многие порядки. В последнем столбце таблицы приводятся результаты для системы, которая способна обрабатывать ключи со скоростью 1 миллион ключей за микросекунду. Обратите внимание, что при таком уровне производительности ключ Длиной в 56 бит перестает быть достаточно надежным. Глава 16. Безопасность 785
аблица 15.5. Среднее время, затрачиваемое на поиск ключа лина Количество Время поиска при Время поиска люча. биты различных ключей скорости 1 ключ/мкс при скорости 10 ключей/мкс 2 232 = 4.3 х 109 231 мкс = 35.8 минут 2.15 мс 6 232 = 7.2 х 1016 255 мкс = 1142 года 10 часов 28 2128 = 3.4 х Ю38 2127 мкс = 5.4 х Ю24 лет 5.4 х Ю18 лет 68 21в8 = 3.7 х 1050 2167 мкс = 5.9 х 10м лет 5.9 х 1030 лет Стандарт шифрования данных Наиболее популярная схема шифрования определена стандартом шифрова- ия данных (Data Encryption Standard — DES), принятым национальным бюро тандартов (National Bureau of Standards) (в настоящее время Национальный ин- титут стандартов и технологий (National Institute of Standards and 'echnology — NIST)) в 1977 году в качестве федерального стандарта по обработ- е информации (Federal Information Processing Standard 46, FIBS PUB 46). В 994 году NIST вновь подтвердил стандарт DES для федерального использования а следующие пять лет в документе FIPS PUB 46-2. Институт NIST рекомендует спользовать DES не только для секретной информации, но и в других прило- сениях. Сам алгоритм носит название алгоритма шифрования данных (Data Еп- ryption Algorithm — DEA). Как и в любой другой схеме шифрования, на вход функции шифрования )ES подается два объекта: незашифрованный текст, который нужно зашифро- ать, и ключ. Согласно стандарту DES, длина текста должна равняться 64 бит, а лина ключа — 56 бит. Более длинный текст при шифровании разбивается на локи по 64 бит. Суть стандарта DES состоит в том, что каждый 64-битовый поступающий на ход блок обрабатывается 16 итерациями. После каждой итерации, представ- яющей собой одну и ту же сложную функцию, в которой участвуют переста- овки битов и подстановка одних битов вместо других, получается некоторое ромежуточное 64-битовое значение. На вход каждой следующей стадии обра- отки подается выход предыдущей стадии, а также так называемый подключ, оторый получается путем перестановки битов первоначального ключа. Процесс дешифровки в стандарте DES, по сути, является таким же, как и роцесс шифрования: на вход подается зашифрованный текст и подключи, поученные при каждой итерации, но в обратном порядке (т.е. шестнадцатый под- :люч используется в первой итерации, пятнадцатый — во второй и т.д.). Надежность стандарта DES В конце 70-х годов эксперты начали проявлять беспокойство по поводу то- о, что дни стандарта DES как надежного алгоритма шифрования сочтены, и остижение таких высоких скоростей работы процессора и такой низкой стоимо- ти аппаратного обеспечения, которые позволят взломать DES легко и быстро, — ишь вопрос времени. Наконец в июле 1998 года пришлось признать, что пациент скончался". Это случилось, когда организация Electronic Frontier 'oundation (EFF) объявила о том, что ее специалистам удалось взломать DES с юмощью специально разработанной "машины-взломщика DES", на которую бы- г8в Часть 7* Безопасность ло затрачено менее $250000. Взлом занял менее трех дней. Организация EFF опубликовала подробное описание машины, предоставив желающим возможность создать свой собственный взломщик [EFF98]. Кроме того, стоимость аппаратного обеспечения продолжает падать вместе с ростом производительности, что делает DES бесполезным. К счастью, на рынке есть альтернативы этого алгоритма. Здесь представлен обзор наиболее популярных возможностей. Тройной алгоритм шифрования данных В виду потенциальной уязвимости стандарта DES по отношению к атаке "в лоб" значительно возрос интерес к поиску альтернативы этому алгоритму. Один из подходов, являющийся достаточно надежным при имеющемся уровне расходов на программное и аппаратное обеспечение, состоит в многократном применении шифрования с помощью DES и нескольких ключей. Тройной алгоритм шифрования данных (triple DEA — TDEA) впервые был стандартизирован для использования в финансовых приложениях в стандарте ANSI ХЭЛ 7 в 1985 году. В 1999 году алгоритм TDEA был официально зарегистрирован как часть стандарта шифрования данных, что зафиксировано в документе FIPS PUB 46-3. В алгоритме TDEA используется три ключа и тройное шифрование по алгоритму DES. Функции алгоритма применяются в последовательности "шифрование- дешифровка-шифрование" (EDE).1 С тремя разными ключами эффективная длина ключа TDEA возрастает до 168 бит. Документ FIPS 46-3 позволяет также использовать два ключа (К1 = КЗ); при этом длина ключа равна 112 бит. В этом документе приводятся следующие указания по использованию алгоритма TDEA. • TDEA является предпочтительным алгоритмом стандартного шифрования, одобренным в стандарте FIPS. • Первоначальный алгоритм DEA, в котором используется один 56-битовый ключ, можно использовать только для совместимости систем. Новое приобретаемое оборудование должно поддерживать TDEA. • Нужно способствовать переходу правительственных организаций, в которых остались системы с алгоритмом шифрования DES, к использованию TDEA. • Ожидается, что алгоритмы TDEA и улучшенный стандарт шифрования (Advanced Encryption Standard — AES) будут существовать совместно в качестве алгоритмов, одобренных стандартом FIPS, что позволит постепенно перейти к алгоритму AES. Легко понять, что алгоритм TDEA является труднопреодолимым. Поскольку в его основе лежит алгоритм шифрования DEA, можно сказать, что алгоритм TDEA обладает такой же надежностью по отношению к криптографическому анализу, что и DEA. Кроме того, так как длина ключа равняется 168 бит, атака "в лоб" практически невозможна. Использование на второй стадии алгоритма в режиме дешифровки не влияет на надежность алгоритма. Единственным преимуществом является то, что при этом пользователи тройного DES имеют возможность расшифровывать данные, зашифрованные пользователями однократного DES, применяя на каждой из трех стадий один и тот же ключ. Глава 15. Безопасность 787
Можно ожидать, что в течение ближайших нескольких лет алгоритм TDEA будет становиться все более распространенным по мере роста недоверия к алгоритму DES и в ожидании разработки полноценного алгоритма AES. Улучшенный стандарт шифрования У алгоритма TDEA имеется два преимущества, способствующих его распространению в течение нескольких ближайших лет. Во-первых, благодаря 168- битовому ключу устраняется уязвимость по отношению к атаке "в лоб". Во- вторых, в основе алгоритма TDEA лежит тот же алгоритм шифрования, что и в основе алгоритма DEA. В течение долгого времени этот алгоритм подвергался более тщательным испытаниям, чем любой другой алгоритм шифрования, и за это время против него не найдено ни одной криптоаналитической атаки, которая основывалась бы на особенностях самого алгоритма, а не на методе прямого перебора. Поэтому алгоритм TDEA с высокой степенью надежности устойчив против криптоанализа. Если бы во внимание принималась только безопасность, то на несколько ближайших десятилетий этот алгоритм мог бы вполне подойти в качестве стандартного алгоритма шифрования. Принципиальным недостатком алгоритма TDEA является то, что его программная реализация является довольно медленной. Первоначальный алгоритм DEA был разработан в средине 70-х годов для аппаратной реализации, и эффективного программного кода для него нет. Алгоритм TDEA, в котором алгоритм DEA выполняется три раза, является еще более медленным. Вторым недостатком является то, что как в алгоритме DEA, так и в алгоритме TDEA используются 64-битовые блоки текста. Исходя из соображений эффективности и безопасности, желательно было бы использовать более крупные блоки. Из-за этих недостатков алгоритм TDEA не является приемлемым кандидатом на долгосрочное использование. В 1977 году Национальный институт стандартов и технологий объявил о необходимости нового улучшенного стандарта шифрования (Advanced Encryption Standard — AES), надежность которого должна быть такой же, как надежность алгоритма TDEA, или превышать ее, и который обладал бы значительно лучшей производительностью. В дополнение к этим общим условиям NIST потребовал, чтобы AES был симметричным блочным шифром с длиной блока, равной 128 бит, и поддерживал ключ длиной 128, 192 или 256 бит. В критерии, использующиеся для оценки алгоритма, входят его надежность, скорость вычислений, требования к памяти, пригодность для аппаратного и программного обеспечения, а также гибкость. В первом испытательном этапе принимали участие 15 предложенных алгоритмов. Во втором этапе круг кандидатов сузился до 5 алгоритмов. Во время написания этой книги институт NIST выразил надежду закончить испытания а опубликовать конечный вариант стандарта к лету 2001 года. После этого процесс признания на рынке может длиться несколько лет. Шифрование с открытым ключом Шифрование с открытым ключом, предложенное в 1976 году Дифф (Diffie) и Хеллманом (Hellman), является первым воистину революционным достижением в шифровании на протяжении нескольких тысяч лет. Напри' мер, в основе алгоритмов с открытым ключом лежат не простые операции с битами, а математические функции. Еще важнее то, что криптография с от* 788 Часть 7. Безопасность' крытым ключом является асимметричной и в ней используются два отдел] ных ключа, а не один, как в симметричном стандартном шифровании. И> пользование двух ключей приводит к глубоким последствиям, имеющим о- ношение к конфиденциальности, распределению ключей и аутентификации Перед тем как продолжить, следует упомянуть несколько распростри ненных неправильных представлений о шифровании с открытым ключод Одно из них заключается в том, что шифрование с открытым ключом явлз ется более надежным по отношению к криптоанализу, чем стандартное щий рование. Фактически безопасность любой схемы шифрования зависит с длины ключа и вычислительных мощностей, участвующих во взломе шифр* В принципе нет никакой причины, по которой тот или другой вид шифров! ния мог бы считаться более устойчивым к криптоанализу. Второе заблужд* ние заключается в том, что в связи с универсальностью шифрования с о: крытым ключом стандартное шифрование устарело. Напротив, из-за накла; ных вычислительных расходов, которыми сопровождаются современны схемы шифрования с открытым ключом, в ближайшем будущем не предв* дится снижения роли стандартного шифрования. Наконец, создается ложнс впечатление, что при использовании шифрования с открытым ключом ра< пределение ключей является тривиальным по сравнению с довольно грс моздким процессом подтверждения установления связи, использующимся центрах распространения ключей для стандартного шифрования. В схеме шифрования с открытым ключом имеется шесть составляющи (рис. 15.14). • Открытый текст (plaintext). Это сообщение или данные, которые подаютс на вход алгоритма шифрования. • Алгоритм шифрования (encryption algorithm). Алгоритм шифрования вь полняет различные преобразования открытого текста. • Открытый и закрытый ключ (public and private key). Это пара ключей, пс добранных таким образом, что если один из них используется для шифре вания, то второй используется для дешифровки. То, какие преобразована выполняет алгоритм шифрования, зависит от поступающего на его вход от крытого или закрытого ключа. • Зашифрованный текст (ciphertext). Это зашифрованное сообщение, кс торое получается на выходе. Каким оно получится — зависит от откры того текста и ключа. Из одного и того же первоначального сообщения зашифрованного с помощью разных ключей, получаются два различны зашифрованных текста. • Алгоритм дешифровки (decryption algorithm). На вход этого алгоритма пс дается зашифрованный текст и соответствующий ключ, а в результате ег выполнения получается первоначальный открытый текст. Процесс работает (производит на выходе правильный открытый текст независимо от порядка, в котором применяется пара ключей. Как можно до гадаться по названию ключей, открытый ключ предоставляется другим дл. открытого пользования, в то время как закрытый ключ известен только ег владельцу. Глава 15. Безопасность 781
Передача зашифрованного текста Закрытый ключ Аписы Незашифрованный . . текст Алгоритм шифрования (например, RSA) Расшифрованный Алгоритм дешифровки текст (обратный алгоритму кодирований) а) Шифрование Закрытый ключ Боба Передача зашифрованного текста Незашифрованный . . текст Алгоритм шифрования (например, RSA) Расшифрованный Алгоритм дешифровки текст (обратный алгоритму кодирования) б) Подпись Рис. 15.14. Шифрование с открытым ключом Пусть, например, Боб хочет отправить Алисе частное сообщение. Предпо ложим, что у него есть открытый ключ Алисы и что у Алисы есть соответст вующий закрытый ключ (рис. 15.14,а). С помощью открытого ключа Алисы Б » кодирует сообщение, которое он в зашифрованном виде пересылает Алисе. По лучив это зашифрованное сообщение, Алиса дешифрует его с помощью свое t закрытого ключа. Никто, кроме Алисы, не сможет это сделать, так как только нее есть копия закрытого ключа. Как видно на рис. 15.14,6, шифрование с открытым ключом можно исполь^ зовать и по-другому. Предположим, что Боб хочет отправить сообщение Алисе, 790 Часть 7. Безопасность хотя не так важно, чтобы сообщение хранилось в секрете, он хочет, чтобы Алис* не сомневалась, что сообщение пришло действительно от него. В этом случае Бо£ кодирует сообщение с помощью своего закрытого ключа. Когда Алиса получит зашифрованный текст, она обнаружит, что может его расшифровать с помощьк открытого ключа Боба. Это послужит для нее доказательством, что сообщение было зашифровано Бобом, потому что больше ни у кого нет его закрытого ключа и никто другой не смог бы создать зашифрованный текст, который расшифровывался бы с помощью открытого ключа Боба. Универсальный криптографический алгоритм с открытым ключом основан на паре ключей. Один из них применяется для шифрования, а другой, который отличается от первого (хотя и связан с ним), применяется для дешифровки. Кроме того, подобные алгоритмы обладают следующими важными характеристиками. • Если известен алгоритм шифрования и ключ, применяющийся для шифрования, то раскрытие ключа для дешифровки требует неоправданно высоких затрат вычислительных ресурсов. • Для шифрования может быть использован один из пары подходящих друг к другу ключей. При этом для дешифровки применяется другой ключ из этой пары. В процессе работы выполняются такие основные шаги. 1. Каждый пользователь создает пару ключей, которые предназначены для шифрования и дешифровки сообщений. 2. Каждый пользователь помещает один из двух ключей в открытый реестр или другие открытые для других файлы. Этот ключ является открытым. Дополняющий ключ хранится в секрете. Как видно из рис. 15.14,а, каждый пользователь поддерживает коллекцию открытых ключей, полученных от других пользователей. 3. Если Бобу нужно отправить Алисе частное сообщение, он шифрует это сообщение с помощью открытого ключа Алисы. 4. Получив сообщение, Алиса дешифрует его с помощью своего закрытого ключа. Никто другой из получателей не может расшифровать это сообщение, потому что только Алиса знает свой закрытый ключ. При таком подходе все участники имеют доступ к открытым ключам, а закрытые ключи генерируются каждым из них отдельно, и поэтому их распространять нельзя. До тех пор, пока пользователь защищает свой ключ от других, его входящие сообщения — в безопасности. Пользователь в любой момент времени может поменять свой закрытый ключ и опубликовать соответствующий ему открытый ключ, заменив им старый открытый ключ. Ключ, который применяется в стандартном шифровании, обычно называется секретным ключом (secret key). Два ключа, использующиеся при шифровании с открытым ключом, называются открытым ключом (public еУ) и закрытым ключом (private key). Закрытый ключ должен неизменно Раниться в секрете, но он называется не секретным, а закрытым ключом, тооы его не путали с секретным ключом, применяющимся в стандартном шифровании. 16. Безопасность
Алгоритм Ривеста-Шамира-Адлемана (Rivest-Shamir-Adleman — RSA) Одна из первых схем шифрования с открытым ключом была разработана в 77 году сотрудниками Массачусетского технологического института Роном Рифтом (Ron Rivest), Ади Шамиром (Adi Shamir) и Леном Адлеманом (Len Adle- ,п). С тех пор схема RSA доминирует и является единственным широко при- анным и применяющимся подходом к шифрованию с открытым ключом. Ал- эитм RSA представляет собой шифр, в котором и открытый и зашифрованный <ст представлен целыми числами в интервале от 0 до п - 1 с фиксированным При шифровании применяются арифметические операции над абсолютными ачениями чисел. Надежность алгоритма основана на сложности разложения сел на простые множители. 2.-'. - - ' Часть .7, Безопа<?н<>сть, • ПРИЛОЖЕНИЕ Протокол TCP/IP А.1. Необходимость архитектуры протоколов А.2. Архитектура протоколов TCP/IP А
начале этого приложения вводится понятие многоуровневой архитектуры про- * токолов. Затем исследуется самая важная архитектура такого типа — набор 9 протоколов TCP/IP. Протоколы TCP/IP — это основная концепция в Internet, >рая служит каркасом для разработки всевозможных стандартов, предназначен- для обмена информацией между компьютерами. В настоящее время почти все авщики компьютеров обеспечивают поддержку этой архитектуры. ;i. необходимость архитектуры щ ПРОТОКОЛОВ " « В процесс обмена информацией между компьютерами, терминалами и/или 'ими предназначенными для обработки данных устройствами могут вовле- .ся довольно сложные процедуры. Рассмотрим, например, передачу файла от >го компьютера к другому. Для этого между двумя компьютерами должен ествовать путь для данных, реализованный либо напрямую, либо с помощью , предназначенной для обмена информацией. Однако этого недостаточно, чно нужно выполнить такие задачи. Передающая система должна либо активизировать прямой канал передачи данных, либо сообщить в сеть идентификатор той системы, для которой она передает данные. Передающая система должна убедиться в том, что система-получатель готова к приему данных. Приложение передачи файлов, которое находится на передающей системе, должно убедиться, что программа управления файлами системы-получателя готова принять и сохранить файл, предназначенный для данного пользователя. Если форматы файлов, которые используются на двух обменивающихся информацией системах, несовместимы, то одна из них должна выполнить преобразование формата. Ясно, что между такими двумя компьютерными системами должно быть 'Шо налажено взаимодействие. Эта сложная задача реализуется не в виде од- модуля, а разбивается на подзадачи, каждая из которых реализуется от- но. В архитектуре протоколов эти модули размещаются в виде вертикальной ктуры. Каждый из уровней структуры выполняет определенный набор щий, необходимых для обмена информацией с другой системой. Работа ка- -о уровня основывается на более низком уровне, в котором выполняются бо- зростые функции, и таким образом скрываются детали выполняемых функ- Каждый уровень предоставляет сервисы ближайшему уровню, который на- :тся выше него. В идеале уровни должны быть определены так, чтобы нения в одном из них не влекли за собой изменений в других. В обмене информацией, несомненно, участвуют две системы, поэтому в обе- истемах должен быть задан один и тот же набор разбитых на уровни функ- Обмен информацией происходит тогда, когда удается наладить взаимодей- е соответствующих (или равных (peer)) уровней обеих систем. Равные уров- бмениваются блоками данных заданного формата, определяющихся набором ил или соглашений, которые называются протоколом (protocol). Основные гнности протокола такие: Приложение А • синтаксис (syntax) — определяет формат блоков данных; • семантика (semantics) — содержит в себе управляющую информацию, предназначенную для координации и обработки ошибок; • синхронизация (timing) — включает в себя согласование скоростей и установление последовательности данных. —■а, л- ■-. ■ "пиит™ * да- г jviwj» ■-•>ш „L --""V—■"* •' ■•*■ Г"¥ * <**«№ №ЧХ. чмщ.. - А.2. АРХИТЕКТУРА ПРОТОКОЛОВ TCP/IP & % Архитектура протоколов TCP/IP, известная как набор протоколов TCP/IP, возникла в результате исследований в области протоколов и разработок, выполнявшихся в экспериментальной сети с коммутацией пакетов под названием ARPANET, которая была основана Управлением перспективных исследовательских программ Министерства обороны США (Defense Advanced Research Projects Agency — DARPA). Этот набор протоколов состоит из большого собрания протоколов, изданных Координационным советом по сети Internet (Internet Activities Board — IAB) в качестве стандартов для Internet. Уровни протокола TCP/IP В общем можно сказать, что в обмене информацией принимают участие три агента: приложения, компьютеры и сети. К приложениям относятся программы, предназначенные для передачи файлов и для электронной почты. Приложения, о которых здесь пойдет речь, являются распределенными приложениями, включающими в себя обмен данными между двумя компьютерными системами. Эти и другие приложения выполняются на компьютерах, которые зачастую могут поддерживать параллельную работу нескольких приложений. Компьютеры соединены между собой в сети, и предназначенные для обмена данные передаются по сети от одного компьютера на другой. Таким образом, передача данных от одного приложения другому включает в себя, во-первых, получение данных тем компьютером, на котором находится приложение-адресат, и, во-вторых, получение данных именно тем выполняющимся на компьютере-адресате приложением, которому они предназначены. Ввиду этого в задаче обмена информацией естественно выделить пять относительно независимых уровней: • физический уровень (physical layer); • уровень доступа к сети (network access layer); • межсетевой уровень (intranet layer); • транспортный уровень (host-to-host layer или transport layer); • уровень приложений (application layer). На физическом уровне находится физический интерфейс между устройством передачи данных (т.е. рабочей станцией или компьютером) и передающей средой или сетью. На этом уровне задаются характеристики передающей среды, природа сигналов, скорость передачи данных и другие подобные характеристики. Протокол TCP/IP 795
Уровень доступа к сети связан с обменом данными между конечной системой (сервером, рабочей станцией и т.п.) и сетью, к которой подсоединена эта система. Компьютер-отправитель должен передать в сеть адрес компьютера- адресата, чтобы сеть могла направить данные по месту назначения. Компьютеру- отправителю могут понадобиться определенные сервисы, такие, как предоставляемый сетью приоритет. Вид используемых на этом уровне программ зависит от типа сети; разработаны различные стандарты для сетей с коммутацией каналов, коммутацией пакетов (например, Х.25), локальных сетей (Local Area Net — LAN) (например, Ethernet) и других. Таким образом, имеет смысл выделить функции, связанные с предоставлением сетевого доступа, в отдельный уровень. С помощью этого приема удается избавиться от необходимости рассматривать в остальных программах, предназначенных для обмена информацией на более высоких уровнях доступа к сети, специфические вопросы устройства используемых сетей. Одни и те же программы более высоких уровней должны правильно работать независимо от того, к какой сети подключен компьютер. Уровень доступа к сети рассматривается в связи с доступом к сети и маршрутизацией данных между двумя подключенными к одной сети конечными системами. В тех случаях, когда устройства подключены к разным сетям, нужны дополнительные процедуры, позволяющие данным переходить из одной сети в другую, если эти сети соединены между собой. Такие функции относятся к межсетевому уровню. На этом уровне функции межсетевой маршрутизации предоставляются с помощью Internet-протокола (Internet Protocol — IP). Internet- протокол реализован не только в конечных системах, но и в маршрутизаторах. Маршрутизатор — это обрабатывающее устройство, которое соединяет две сети и основной функцией которого является передача данных из одной сети в другую на их пути от одной конечной системы к другой. Независимо от природы приложений обмен данными должен быть надежным. Т.е. хотелось бы иметь уверенность в том, что все данные попали к приложению-адресату и что эти данные получены в том порядке, в котором они отправлены. Как вы увидите, механизмы обеспечения надежности, по сути, независимы от природы приложений. Таким образом, имеет смысл выделить такие механизмы в один общий уровень, совместно используемый всеми приложениями; он называется транспортным уровнем. Чаще всего для этого применяется протокол управления передачей (Transmission Control Protocol — TCP). Наконец, в уровень приложений заложена логика, необходимая для обеспечения работы различных пользовательских приложений. Приложению каждого вида (например, программе передачи файлов) нужен отдельный модуль, специально предназначенный для этого приложения. Работа протоколов TCP и IP На рис. А.1 показано конфигурирование этих протоколов для обмена информацией. Чтобы было ясно, что средство связи в целом может состоять из нескольких сетей, составляющие сети обычно называются подсетями (subnetworks). Для подключения компьютера в подсеть используется некоторый протокол доступа к сети, например Ethernet. Этот протокол позволяет узлу пересылать данные по подсети другому узлу; если же узел-получатель находится в другой подсети, данные попадают на маршрутизатор. Протокол IP реализован на всех конечных системах и маршрутизаторах. При передаче данных от одного уз- 796 Приложение А ла другому с промежуточным прохождением одного или нескольких маршрути заторов этот протокол действует как релейная станция. Протокол TCP реализо ван только на конечных системах; он отслеживает блоки данных, убеждаясь, чт< все они надежно доставлены соответствующим приложениям. Узел А Узел В TCP IP Протокол доступа к сети №1 Physical Порт (точка доступа к сервису) Логическое соединение (соединение TCP) Глобальный адрес в сети TCP IP Протокол доступа к сети №2 Логическое соединение Адрес точки подключения (например, виртуальная сеть) ^ к подсети Маршрутизатор J Physical IP Точка входа в сеть 1 Точка входа в сеть 2 Рис. А.1. Концепции протоколов TCP/IP Чтобы обмен информацией был возможен, каждый элемент системы долже] иметь уникальный адрес. Фактически нужно задать два уровня адресации. Каж дый узел подсети должен обладать своим уникальным глобальным сетевым адре сом; это позволит доставить данные соответствующему узлу. Каждый процее узла должен иметь адрес, который был бы уникальным в пределах этого узла что позволит транспортному протоколу (TCP) доставить данные нужному про Цессу. Этот адрес известен как порт. Проследим за выполнением простой операции. Предположим, что процессу выполняющемуся на узле А и связанному с портом 1, нужно отправить сообщени Другому процессу, связанному с портом 3 на узле В. Процесс на узле А передает про токолу TCP сообщение с инструкциями, предписывающими отправить его в порт ; Узла В. Протокол TCP передает сообщение протоколу IP, снабжая это сообщение ин гтрукциями отправить его на узел В. Обратите внимание, что протоколу IP не нужн сообщать идентификатор порта назначения. Все, что ему нужно знать, — это сам) Данные и идентификатор узла В. После этого протокол IP передает сообщение н Уровень доступа к сети (например, протоколу Ethernet), снабжая его инструкциям! отправить это сообщение маршрутизатору J (первый ретранслятор на пути к узлу В) Протокол TCP/IP 7#
Чтобы сообщением можно было управлять, вместе с пользовательскими данными в нем должна передаваться управляющая информация (рис. А.2). Предположим, что процесс-отправитель порождает блок данных и передает его протоколу TCP. Протокол TCP может разбить этот блок на меньшие части, чтобы ими было легче управлять. К каждой из этих частей протокол TCP добавляет управляющую информацию, известную как TCP-заголовок (TCP header), формируя сегмент TCP (TCP segment). Эта управляющая информация будет использоваться протоколом TCP на узле В. В заголовок среди прочих входят такие пункты. • Порт назначения (destination port). Когда объект TCP на узле В получает сегмент, ему необходимо знать, кому нужно доставить данные. • Порядковый номер (sequence number). Протокол TCP нумерует сегменты, которые он последовательно пересылает в определенный порт назначения. Это делается для того, чтобы при нарушении порядка получения сообщений объект TCP на узле В мог расположить их в правильном порядке. • Контрольная сумма (checksum). При отправке сообщения протокол TCP включает в него код, являющийся функцией содержимого остатка сегмента. При получении сообщения протокол TCP выполняет те же вычисления и сравнивает результат с входящим кодом. Если в процессе передачи произошла ошибка, результаты различаются. Данные пользователя Байтовый поток приложения I I Заголовок TCP I Сегмент TCP Заголовок IP Датаграмма IP Сетевой заголовок Пакет сетевого уровня Рис. А.2. Модули данных различных протоколов в архитектуре TCP/IP ,\ Затем протокол TCP передает сегменты протоколу IP, снабжая каждый из них инструкциями передать эти пакеты узлу В. Данные сегменты необходимо будет передать через одну или несколько подсетей, при этом они должны пройп через один или несколько маршрутизаторов. Для этого тоже нужна контрольн информация. Поэтому протокол IP добавляет к каждому сегменту заголовок контрольной информацией, формируя таким образом IP-датаграмму (IP data gram). Одним из хранящихся в IP-заголовке каждого сегмента элементов явля ется адрес узла назначения (в нашем примере, узла В). ' <7Ъ Приложение Наконец, каждая IP-датаграмма передается на уровень доступа к сети, чтобы на ее пути к месту назначения она могла пересечь первую подсеть. Уровень доступа к сети добавляет свой собственный заголовок, создавая при этом пакет, или кадр (фрейм). Этот пакет передается по подсети маршрутизатору подсети J. Б заголовке пакета содержится необходимая для подсети информация, благодаря которой эти данные смогут пройти по подсети. Среди других элементов в заголовке могут содержаться такие. • Адрес подсети назначения. Подсеть, в которой находится пакет, должна иметь информацию о том, какому присоединенному устройству нужно его доставить. • Запросы средств. Протокол доступа к сети может запросить предоставление определенных сетевых средств, например приоритета. На маршрутизаторе J из пакета удаляется его заголовок пакета и проверяется IP-заголовок. Основываясь на адресе назначения, который содержится в IP- заголовке, IP-модуль маршрутизатора направляет датаграмму по подсети 2 на узел В. Для этого к ней снова добавляется заголовок доступа к сети. Когда узел В получит данные, на нем выполняется обратный процесс. На каждом уровне удаляется соответствующий заголовок, а оставшаяся часть передается на ближайший более высокий уровень до тех пор, пока пользовательские данные не будут доставлены в первоначальном виде тому процессу, для которого они предназначены. Протоколы TCP и UDP Для большинства приложений, выполняющихся в рамках архитектуры протокола TCP/IP, протоколом транспортного уровня является TCP. Этот протокол обеспечивает надежное соединение для передачи данных от одного приложения другому. На рис. А.3,а показан формат заголовка TCP, который состоит как минимум из 20 октетов или 160 бит. В полях Порт отправления (Source Port) и Порт назначения (Destination Port) указаны идентификаторы приложений исходной системы и системы назначения, которые используют это соединение. 1 Поля Порядковый номер (Sequence Number), Номер подтверждения (Acknowledgment Number) и Окне (Window) обеспечивают текущее управление и контроль ошибок. Каждый сегмент пронумерован, чтобы можно было обнаруживать их потерю и отправлять явные подтверждения при получении сегментов. Объект, отправляющий подтверждения, Для каждого из них указывает в поле Окно, сколько еще данных он готов принять. Поле Контрольная сумма (Checksum) представляет собой 16-битовый кадр, е котором находится контрольная последовательность, предназначенная для выявления ошибок в сегменте TCP. Термин порт грубо соответствует термину точка доступа к службе (Service Ac '%*- о °^nt — SAP), который используется в документах по протоколу взаимодействш йо.;г . кРЫгпъ1х систем (Open System Interconnection — OSI). П Ркол TCP/IP 79£
10 16 31 Биты Порт отправления Порт назначения UDP или какой-то другой. Поля Флаги (Flags) и Смещение фрагмента (Fragment Offset) используются в процессе фрагментации и повторной сборки, в котором IP-датаграмма разбивается на несколько IP-датаграмм, а затем в пункте назначения снова собирается воедино. длина | Резервное I заголовка] поле_ Порядковый номер Номер подтверждения Фпаги I Указатель срочности Контрольная сумма Необязательные и выравнивающие поля а) ТСР-заголовок 16 31 Биты Порт отправления Длина сегмента Порт назначения Контрольная сумма б) UDP-заголовок Рис. А.З. ТСР-заголовок и UDP-заголовок Кроме протокола TCP существует еще один широко используемый прото о транспортного уровня, входящий в набор протоколов TCP/IP: пользовательски протокол датаграмм (User Datagram Protocol — UDP). Протокол UDP предос в- ляет сервис без установления соединения, предназначенный для процедур1 р уровне приложений; этот протокол не гарантирует доставку, сохранение по т. - довательности или защиту от дублирования. Он позволяет процедуре отправ. сообщения другим процедурам с помощью минимального протокольного м \ низма. Протоколом UDP пользуются некоторые приложения, ориентирован! на транзакции. Одним из таких приложений является простой протокол сете о управления (Simple Network Management Protocol — SNTP), который явля стандартным протоколом сетевого администрирования в сетях, работающих протоколу TCP/IP. Протокол UDP выполняет крайне ограниченный набор ф н ■ ций, так как он работает без установления соединения. По сути, он добавля т протоколу IP некоторые возможности адресации портов. Легче всего это пон i рассмотрев заголовок UDP, показанный на рис. А.3,б. Протоколы IP и IPv6 Internet-протокол (IP) на протяжении десятилетий был основным элеме т архитектуры протоколов TCP/IP. На рис. А.4,а показан формат 1Р-заголо который состоит как минимум из 20 октетов, или 160 бит. В этом заголовк держатся 32-битовые адреса отправления и назначения. Поле Контрольная ма заголовка (Header Checksum) используется для выявления ошибок в заго. ке, что помогает избежать ошибок при доставке. В поле Протокол (Protocol) зано, какой из протоколов более высокого уровня использует протокол IP: Приложен Биты О 16 19 31 са О о о Версия лина Internet заголовка Тип сервиса Общая длина Идентификатор Время жизни Протокол Флаги! Смещение фрагмента Контрольная сумма заголовка Адрес отправления Адрес назначения Необязательные и выравнивающие поля а) IPv4 Биты 0 4 Приоритет 16 Метка потока ,_. едаощи «^заголовок- 24 Предельное количество пе^ач 31 б) IPv6 Рис. А.4. IP-заголовки ring -r^t Г°АУ проблемная гРУппа проектирования Internet (Internet Engi- °в IntaS Ce — IETF), занимающаяся разработкой стандартов для прото- l» KoTo6rnet' опубликовала спецификацию протокола IP следующего поколе- «я пРаЯгС ТОГ° момента стала известна как IPng. В 1996 году эта специфи- *°ставлЛУЧИЛа СТатус станДарта, известного как IPv6. Протокол IPv6 ^кола ^рТ °пределенный набор функциональных улучшений существующего п&тъ с б (Известного как IPv4). Он разработан, чтобы иметь возможность ке с п °Лее высокими скоростями, достигнутыми в современных сетях, а овятся°ТОКаМИ данных> включающими графику и видеосигналы, которые Про/06 б°Лее Распространенными. Однако движущей силой разработки % окола послужила необходимость дополнительных адресов. Находя- ■*#■". ^СР/1Р 801
щийся в обращении протокол IP поддерживает 32-битовые адреса отправки или назначения. В результате интенсивного расширения сети Internet и роста количества подсоединенных к Internet ведомственных сетей длины этих адресов стало недостаточно для всех систем, которым нужны адреса. Как показано на рис. А.4,б, заголовок IPv6 содержит 128-битовые поля для адресов отправления и назначения. Предполагается, что все системы, в которых используется протокол TCP/IP, со временем перейдут от текущего протокола IP к протоколу IPv6, однако этот процесс займет многие годы, если не десятилетия. Приложения TCP/IP Стандартизирован ряд приложений, которые работают поверх протокола TCP. Здесь упоминаются три из них, которые получили наибольшее распространение. Простой протокол электронной почты (Simple Mail Transfer Protocol — SMTP) предоставляет основные средства электронной почты. Он предоставляет механизм передачи сообщений от одного узла к другому. В протоколе SMTP не указывается способ создания сообщений; для этого требуется наличие некоторых локальных средств редактирования или встроенных средств электронной почты. После создания сообщения протокол SMTP принимает его и с помощью протокола TCP пересылает модулю SMTP другого узла. Получивший сообщение модуль SMTP сохраняет это сообщение в почтовом ящике пользователя с помощью локального пакета электронной почты. Протокол передачи файлов (File Transfer Protocol — FTP) используется для пересылки файлов по команде пользователя из одной системы в другую. Он работает как с текстовыми, так и с бинарными файлами, а также предоставляет средства контроля доступа пользователей. Когда пользователю нужно организовать передачу файла, протокол FTP устанавливает соединение TCP с системой назначения для обмена контрольными сообщениями. Это позволяет передать идентификатор и пароль пользователя, а также указать нужный файл и требуемые действия. Как только передача файла будет одобрена, устанавливается второе соединение TCP для передачи данных. Файл передается по соединению без накладных расходов, затрачиваемых на передачу каких бы то ни было заголовков или контрольной информации на уровне приложений. После окончания передачи используется контрольное соединение, с помощью которого подается сигнал об окончании сеанса, и подаются команды по передаче нового файла. Удаленный доступ (TELNET) предоставляет возможность удаленного входа в систему и позволяет работать с ней так, как если бы было установлено прямое соединение с этим компьютером. Этот протокол был разработан для работы с" простыми терминалами. Фактически удаленный доступ реализован в виде двух, модулей: telnet-клиент взаимодействует с модулем ввода-вывода на терминал; обмениваясь данными с локальным терминалом. Он преобразует характеристик реальных терминалов в сетевые стандарты и наоборот. Сервер telnet взаимодействует с приложением, подменяя терминал, с тем чтобы удаленные терминалы; выглядели для приложения так же, как и локальные. Связь при этом поддерг живается посредством протокола TCP. ' 802 Приложение А ПРИЛОЖЕНИЕ Объектно- ориентированный подход Б.1. Мотивация Б.2. Объектно-ориентированные концепции Б.З. Преимущества объектно-ориентированного подхода Б
о перационная система Windows 2000 и ряд других современных операционных систем интенсивно используют принципы объектно- ориентированного подхода. лу^ -ч/- ! Б.1. МОТИВАЦИЯ шшш^ш^-2Ш *™s W§^P ЭЙЙ Йй ■*te k^&ffi^ .*№** Объектно-ориентированные концепции приобрели большую популярность в области компьютерного программирования. Ожидается, что они помогут в разработке взаимозаменяемых, повторно используемых, легко обновляемых и легко взаимосвязываемых частей программного обеспечения. В последнее время признавать преимущества этого подхода начали разработчики баз данных, что привело к появлению систем управления объектно-ориентированными базами данных (object-oriented database management systems — OODBMS). Разработчики операционных систем тоже оценили преимущества объектно-ориентированного подхода. Вообще говоря, объектно-ориентированное программирование и объектно- ориентированные базы данных — это разные вещи, но у них есть одна общая концепция: программы или данные можно "помещать в контейнер". Все происходит как бы в некотором ящике, внутри которого могут находиться свои, меньшие ящички. В простейшей традиционной программе каждый шаг программы задается одной инструкцией; в объектно-ориентированном языке каждый шаг может быть представлен целым набором инструкций. Кроме того, в объектно-ориентированной базе данных переменная может приравниваться не к отдельному элементу данных, а к целому набору данных. В табл. Б.1 представлены некоторые ключевые термины, используемые в объектно-ориентированном дизайне. Таблица Б.1. Термины объектно-ориентированного дизайна Термин Определение Атрибуты Включение Инкапсуляция Наследование Сообщение Метод Объект Класс объектов Экземпляр объекта Переменные, которые хранятся в объекте Взаимосвязь между экземплярами объекта, при которой содержащий объект включает в себя указатель на содержащийся объект Изоляция атрибутов и сервисов экземпляра объекта от внешнего окружения. Сервисы можно вызывать только по имени, а доступ к атрибутам можно получать только с помощью сервисов Взаимоотношение между двумя классами объектов, при котором дочерний класс перенимает атрибуты и сервисы порождающего класса Средство взаимодействия объектов ^ Процедура, являющаяся частью объекта, которую можно активизировать извне объекта для выполнения определенных функций Абстракция реально существующего предмета или понятия Именованный набор объектов, совместно использующих одни и те же имена, множества атрибутов и сервисы Определенный член класса объектов, атрибутам которого присвоены значения 804 Приложение Б Термин Определение Окончание табл. Б.1 Полиморфизм Это понятие связано с существованием нескольких объектов, использующих одни и те же имена сервисов и предоставляющих один и тот же внешний интерфейс, но являющихся экземплярами разных типов Сервис Функция, выполняющая операции в объекте 'Л £W ■«— >"t*£- i? Г-oW Sfti -ч^ияк-тя-е» Б.2. ОБЪЕКТНО-ОРИЕНТИРОВАННЫЕ КОНЦЕПЦИИ Основным понятием объектно-ориентированного подхода является объект. Объект — это отдельная программная единица, которая содержит набор связанных с ней переменных (данных) и методов (процедур). Вообще говоря, эти переменные и методы извне объекта непосредственно не видны. Вместо этого имеются определенные интерфейсы, позволяющие программам осуществлять доступ к данным и процедурам. Объект представляет собой некоторую сущность, будь то физический предмет, понятие, программный модуль или нечто динамическое, например виртуальная схема. Значения переменных объекта выражают информацию, известную о той вещи, которая представлена данным объектом. Методы содержат в себе процедуры, выполнение которых влияет на имеющиеся в объекте значения и, возможно, на ту вещь, которую этот объект представляет. На рис. Б.1 и Б.2 проиллюстрированы ключевые концепции объектно- ориентированного подхода.1 1 Эти рисунки взяты из иллюстраций, выполненных сотрудником, корпорации Object International, Inc. (Остин, штат Техас, www. OI. сот) Питером Коудом (Peter Coad) Объектно-ориентированный подход 805
Объекты Объектам известны данные; объекты выполняют действий Это тележка дйя товаров :: 7^ Этооперациа .: гю продаже :::;:i Классы Класс представляет группу однородных объектов Класс:товар • Это объект класса "товар* • Для него известна дата производства и дата получения • Можно проверить его наличие Классы могут быть "специализированными" Класс: скоропортящийся товар »Это скоропортящийся товар • Для него известна дата производства, дата получения и конечный срок годности ' Можно проверить его наличие Рис. Б.1. Объекты Структура объектов Данные и процедуры, которые содержатся в объекте, обычно называют соответственно переменными и методами. Все, что известно объекту, можно выразить с помощью его переменных, а все, что он может выполнять, - с помощью его методов. Переменные (variables) объекта, которые также называются атрибутам (attributes), обычно имеют вид простых скаляров или таблиц. Для каждой и переменных задан тип и, возможно, набор значений, которые может прини, мать эта переменная; переменная может быть определена как константа ил , как переменная (по соглашению термин переменная используется и для кон стант). Кроме того, могут быть наложены ограничения на использование переменной определенными пользователями, классами пользователей или в оп. ределенных ситуациях. Методы (methods) объекта - это процедуры, которые можно запускать извне для выполнения определенных функций. Метод может изменять состояни объекта, обновлять значения некоторых переменных или воздействовать н внешние ресурсы, к которым имеет доступ объект. Объекты взаимодействуют между собой с помощью сообщений (messages) Сообщение содержит в себе имя объекта-отправителя, имя объекта-получателя имя метода в объекте-получателе и прочие уточняющие параметры, необход» 806 Приложение мые для работы метода. Содержащийся в объекте метод можно вызвать только с помощью сообщения. Получить доступ к хранящимся в объекте данным можно только с помощью методов этого объекта. Таким образом, с помощью метода можно произвести нужное действие или получить доступ к переменным объекта, или выполнить и то, и другое. Отправка сообщения локальному объекту равносильна вызову метода объекта. Для распределенных объектов пересылка сообщения означает именно то, что обычно под этим подразумевается. Инкапсуляция Принцип, согласно которому объект должен скрывать от других объектов свои данные, и частично — свою функциональность % ^ Открытые Наследование Принцип, согласно которому класс может быть расширением другого ранее определенного класса Обобщенный класс Специализированный класс 0 Класс: товар Класс: скоропортящийся товар Полиморфизм Принцип, согласно которому объекты различных классов могут принимать одни и те же сообщения, хотя и отвечать на них по-разному >. Проверфналичий; I\|fi Выполняется по-своему Выполняется по-своему Рис. Б.2. Концепции объектов Интерфейс объекта представляет собой набор открытых методов, поддерживаемых объектом. По интерфейсу нельзя судить о реализации; объекты разных классов могут иметь различные реализации одних и тех же интерфейсов. Свойство объекта, состоящее в том, что его единственным связующим звеном с внешним миром являются сообщения, называется инкапсуляцией (encapsulation). Объектно-ориентиров^ный^прдход 807
[етоды и переменные объекта являются инкапсулированными, и доступ к ним осу- дествляется только с помощью сообщений. Это свойство дает два преимущества. 1. Оно защищает переменные объекта от разрушения другими объектами. Эта защита может включать в себя защиту от несанкционированного доступа, а также защиту от таких проблем, возникающих при параллельном доступе, как взаимоблокировка и несогласованные значения. 2. Оно скрывает внутреннюю структуру объекта, поэтому взаимодействие с ним является сравнительно простым и стандартизированным. Более того, если внутренняя структура или процедуры объекта изменяются без изменения выполняемых им внешних функций, это не влияет на другие объекты. Классы объектов На практике обычно вещи одного типа представлены несколькими объектами. Например, если процесс представлен объектом, то в системе для каждого процесса зудет присутствовать свой объект. Очевидно, что каждый такой объект нуждается в ;воем наборе переменных. Однако если методы объекта являются реентерабельными процедурами, то все похожие объекты могут совместно использовать одни и те же методы. Более того, может оказаться, что для каждого нового, но похожего на предыдущие, объекта неэффективно определять и методы, и переменные. Чтобы избежать трудностей, нужно научиться различать класс объекта и экземпляр объекта. Класс объекта (object class) — это шаблон, по которому определяются методы и переменные, входящие в объект определенного вида. Экземпляр объекта (object instance) — это сам объект, включающий в себя характеристики того класса, в котором он определен. В экземпляре содержатся значения переменных, определенных в классе объектов. Наследование Благодаря существованию понятия класса объектов можно с минимальными усилиями создавать многие экземпляры объектов. Эта концепция стала еще ' мощнее благодаря механизму наследования [TAIV96]. , Наследование позволяет определять новые классы объектов в терминах существующего класса. Новый класс (более низкого уровня), который называется,? подклассом (subclass), автоматически включает в себя определения методов и>. переменных исходного класса (более высокого уровня), который называется над-г классом (superclass). Подкласс может отличаться от своего надкласса по не-^ скольким параметрам. ^ 1. Подкласс может содержать в себе дополнительные методы и переменные,1 которых нет в надклассе этого подкласса. 2. В подклассе можно изменить определение любого метода или любой пере^ менной, имеющееся в его надклассе; при этом новое определение используй ется с тем же именем. « 3. Подклассы могут ограничивать методы или переменные, каким-либо образом унаследованные от соответствующего надкласса. ., Механизм наследования является рекурсивным, что позволяет подклассу, быть надклассом своих собственных подклассов. Таким образом можно создать 80S Приложение Б иерархию наследования. Иерархию наследования можно представлять себе как определение способа поиска методов и переменных. Получив сообщение с предписанием выполнить метод, который не задан в данном классе, объект осуществляет его поиск на других иерархических уровнях, пока не найдет нужный метод. Аналогично, если при выполнении метода происходит ссылка на переменную, которая не определена в данном классе, объект ищет переменную с таким именем на других иерархических уровнях. Полиморфизм Полиморфизм — это мощная характеристика, позволяющая скрывать за общим интерфейсом различные реализации. В двух полиморфных по отношению друг к другу объектах используются одинаковые имена методов и представлены одинаковые интерфейсы по отношению к другим объектам. Можно определить несколько предназначенных для печати объектов, каждый для своего устройства вывода (например, printDotmatrix для матричного принтера, printLaser для лазерного принтера, printScreen для вывода на экран и т.д.) или каждый для своего вида документа (например, printText для текстовых документов, printDrawing для рисунков, printCompound для документов смешанного типа). Если в каждом таком объекте содержится метод под названием print, то любой документ можно распечатать, отправив сообщение print соответствующему объекту. При этом не имеет значения, как именно выполняется этот метод. Интересно сравнить полиморфизм с методами обычного модульного программирования. Целью нисходящего модульного проектирования является разработка в рамках общей утилиты модулей более низких уровней с фиксированным по отношению к модулям более высоких уровней интерфейсом. Это позволяет различным модулям более высоких уровней вызывать один и тот же модуль низкого уровня. Если внутренняя структура модуля низкого уровня изменяется, не затрагивая при этом интерфейс, то это никак не влияет ни на один из модулей более высоких уровней, которые используют изменяемый модуль. Когда речь идет о полиморфизме, все происходит наоборот. Здесь имеется в виду способность объекта более высокого уровня вызывать с помощью сообщения в одном и том же формате различные объекты более низких уровней, выполняя таким образом подобные функции. При этом можно добавлять новые объекты низких уровней с минимальными изменениями в существующих объектах* Включение Экземпляры объекта, которые содержат в себе другие объекты, называются составными объектами (composite objects). Включение может быть достигнуто путем использования в объекте указателя на другой объект. Преимущество составных объектов заключается в том, что они позволяют представлять сложные структуры. Например, объект, который входит в составной объект, сам может быть составным. Обычно из составных объектов конструируются структуры, имеющие древовидную топологию — т.е. нельзя использовать никаких циклических ссылок, и каждый экземпляр дочернего объекта может иметь только один экземпляр родительского объекта. Объектно-ориентированный подход 809
Важно понять различие между иерархией наследования классов объектов и ерархией, возникающей в составных объектах. Они никак не связаны между обой. Наследование просто позволяет с минимальными усилиями определять азлячные типы объектов. Включение объектов позволяет создавать сложные труктуры данных. ^■"W^'C""" ,~-.»™ A 0ч~-е> л/ицГяид: Б.З. ПРЕИМУЩЕСТВА ОБЪЕКТНО- г ^ ОРИЕНТИРОВАННОГО ПОДХОДА ^ В [CAST92] перечислены такие преимущества объектно-ориентированного юдхода. • Лучшая организация сложных наследственных отношений. Используя наследственность, можно эффективно определять взаимосвязанные понятия, ресурсы и другие объекты. С помощью включения можно конструировать произвольные структуры данных, отражающие поставленную задачу. Объектно- ориентированные языки программирования и структуры данных позволяют разработчикам описывать ресурсы и функции операционной системы таким способом, который отражает представление об этих ресурсах и функциях. • Снижение усилий, затрачиваемых на разработку, за счет повторного использования. Повторное использование классов объектов, которые уже написаны, протестированы и опробованы другими, сокращает время, необходимое для разработки и тестирования. • Повышение степени расширяемости и облегчение поддержки систем. Обычно на протяжении всего времени жизни продукта 65% его стоимости затрачивается на поддержку этого продукта, включая его улучшение и устранение недостатков. Объектно-ориентированный подход сокращает этот показатель. Использование объектно-ориентированных программ помогает сократить число возможных взаимодействий между различными частями этих программ, обеспечивая тем самым минимальное воздействие, которое может оказать изменение в реализации класса на остальную часть системы. Эти преимущества способствуют тому, что разработка операционных систем ведется в направлении объектно-ориентированных систем. Объекты позволяют разработчикам изменять операционную систему так, чтобы она удовлетворяла новым требованиям, не нарушая ее целостности. Кроме того, объекты являются строительными блоками, использующимися при разработке распределенных систем. Благодаря тому, что объекты взаимодействуют между собой с помощью сообщений, не имеет значения, находятся ли обменивающиеся сообщениями объекты в одной и той же системе или в двух разных системах, подключенных в одну сеть. Данные, функции и потоки могут быть динамически назначены рабочим станциям и серверам. Благодаря всем перечисленным достоинствам объектно-ориентированного подхода растет его роль при разработке операционных систем, предназначенных для персональных компьютеров и рабочих станций. 810 Приложение Б Словарь терминов Адресное пространство (Address space). Диапазон адресов, доступный компьютерной программе. Архитектура коммуникаций (Communications architecture). Аппаратное и программное обеспечение, реализующее функции коммуникации. Асинхронная операция (Asynchronous Operation) Операция, которая выполняется без точной связи с некоторым событием или в непредсказуемое время; примером может служить подпрограмма диагностики ошибок, которая может получить управление в любой момент работы основной программы. База данных (Database). Набор взаимосвязанных данных, зачастую с управляемым дублированием, организованных в соответствии со схемой для обслуживания одного или нескольких приложений. Данные хранятся так, чтобы они могли быть использованы различными программами безотносительно к структуре или организации данных. Для добавления новых данных, их изменения и выборки существующих используется общий подход. Базовый адрес (Base address). Адрес, используемый в качестве начального при вычислении адресов в процессе выполнения программы. Бактерия (Bacteria). Программа, потребляющая системные ресурсы путем самовоспроизведения. Беовульф (Beowulf). Класс кластеризованных вычислительных систем, применяемых для уменьшения соотношения цена/производительность системы в целом при сохранении возможности выполнения вычислений, для которых предназначена данная система. Большинство таких систем реализовано на компьютерах Linux. Бинарный семафор (Binary semaphore). Семафор, принимающий только два значения — О или 1.
док (Block). 1) Набор последовательных записей, представляющих собой единую группу; группы разделены промежутками. 2) Группа битов, передаваемая как единое целое. ригадное планирование (Gang scheduling). Планирование множества связанных потоков при одновременной работе на множестве процессоров по одному потоку на процессор. уфер поиска трансляции (Translation Lookaside buffer, TLB). Высокоскоростной кэш, использующийся как часть схемы страничной виртуальной памяти для хранения записей таблицы страниц, к которым недавно были обращения. TLB снижает частоту обращений к основной памяти для выборки записей таблицы страниц. *аимоблокировка (Deadlock). 1) Тупиковая ситуация, возникающая при ожидании несколькими процессами доступности ресурса, который не может быть освобожден, будучи захвачен процессом, находящимся в аналогичном состоянии ожидания. 2) Тупиковая ситуация, возникающая при ожидании несколькими процессами некоторого действия или ответа от процесса, который находится в аналогичном состоянии ожидания. »аимоисключение (Mutual exclusion). Ситуация, в которой существует множество процессов, но получить доступ к некоторому ресурсу или выполнить некоторую функцию в определенный момент времени может лишь один из них. См. critical section. \ яртуальный адрес (Virtual address). Адрес ячейки виртуальной памяти. «рус (Virus). Секретная недокументированная подпрограмма, внедренная в обычную программу, выполняющую полезные действия. Запуск такой программы приводит к выполнению этой секретной подпрограммы. Отличается способностью самостоятельного внедрения в другие программы (заражения). ключенное прерывание (Enabled interrupt). Условие (обычно осуществляемое \ операционной системой), при котором процессор отвечает на сигналы запросов прерываний определенного класса. I зешняя фрагментация (External fragmentation). Происходит при разделении ; памяти на части переменного размера, соответствующие блокам данных, / размещаемых в памяти (например, сегменты в основной памяти). При за- [■• грузке и выгрузке сегментов из памяти между занятыми областями памяти *' 1 \ возникают разрывы. ... аутренняя фрагментация (Internal fragmentation). Происходит при разделении . памяти на части фиксированного размера (например, кадры страниц в ос- ,.• новной памяти или физические блоки на диске). Если блоку данных отво- =■• дится одна или несколько частей, в последней из них может оказаться не- f используемое пространство. Это происходит, когда размер данных в послед- ?' ней части меньше ее размера. ремя отклика (Response time). Время, прошедшее между концом передачи со- !ч. общения с запросом и началом получения ответного сообщения, измеряемое на запрашивающем терминале. горичная память (Secondary memory). Память, расположенная вне вычисли- \, тельной системы, например диски или магнитные ленты. 12 Словарь терминов Выборка по требованию (Demand paging). Передача страницы из вторичной памяти в основную в тот момент, когда эта страница оказывается запрошенной процессом. См. prepaging. Вытеснение (Preemption). Возврат ресурса, захваченного процессом, до окончания его использования этим процессом. Голодание (Starvation). Ситуация, когда выполнение процесса бесконечно откладывается в связи с тем, что предпочтение отдается другим процессам Дескриптор процесса (Process descriptor). To же, что и управляющий блок процесса (process control block). Динамическое перемещение (Dynamic relocation). Процесс, который получает новый абсолютный адрес программы во время выполнения, так что программа может работать в разных областях основной памяти. Диспетчеризация (Dispatch). Распределение времени процессора между заданиями, готовыми к выполнению. Драйвер устройства (Device driver). Модуль операционной системы (обычно находящийся в ядре), который работает непосредственно с устройством или контроллером ввода-вывода. Задание (Job). Последовательность вычислительных этапов, собранных для запуска как единое целое. Задача (Task). To же, что и процесс (process). Задача реального времени (Real-time task) Задача, которая выполняется в связи с некоторыми процессами, функциями или событиями, внешними по отношению к компьютерной системе, и которая должна реагировать на внешние события за приемлемое для них время. Запись (Record). Группа элементов данных, рассматриваемая как единое целое. Злонамеренное программное обеспечение (Malicious software) Программное обеспечение, разработанное с целью вызвать повреждения или использовать ресурсы целевого компьютера. Зачастую такое программное обеспечение маскируется под полезное; нередко оно самораспространяется по электронной почте или через инфицированные дискеты. Включает в себя вирусы, троянских коней, червей, программы для исчерпания ресурсов. Индексированный файл (Indexed file). Файл, обращение к записям которого производится в соответствии со значениями ключевых полей. Индекс должен указывать положение каждой записи на основе значения ее ключа. Индексно-последовательный доступ (Indexed sequential access). Организация записей и доступ к записям во вторичной памяти посредством индексов ключей, хранящихся в файлах или отдельно от них. Сами файлы имеют последовательную организацию области данных. Индексно-последовательный файл (Indexed sequential file). Файл, записи в котором упорядочены в соответствии со значениями ключевого поля. Основной файл данных сопровождается индексным файлом, содержащим частичный список значений ключей. Индекс обеспечивает быстрый поиск и доступ к требуемой записи. Область индекса может быть частью основного файла. Словарь терминов 813
[ндексный доступ (Indexed access). Организация записей и доступ к записям в памяти с использованием индексов. [нтерфейс прикладного программирования (Application programming interface, API). Стандартизованная библиотека программных средств, используемая разработчиками программного обеспечения для создания приложений, совместимых с определенной операционной системой и принятым графическим пользовательским интерфейсом. Садр (Frame). В системе виртуальной страничной памяти — блок фиксированной длины основной памяти, использующийся для хранения одной страницы виртуальной памяти. Садр страницы (Page frame). Блок фиксированного размера в основной памяти, используемый для хранения страницы. Санал (Pipe). Циклический буфер, позволяющий двум процессам сообщаться в соответствии с моделью производитель/потребитель. Канал представляет собой очередь "первым вошел — первым вышел", в который пишет один из процессов, а второй — читает. В некоторых системах используется обобщение каналов, что обеспечивает возможность выборки любого элемента из очереди. Свантование времени (Time slicing). Режим работы, при котором два или несколько процессов получают кванты времени на одном и том же процессоре. Сластер (Cluster). Группа взаимосвязанных компьютеров, работающих как единый вычислительный ресурс (что создает иллюзию работы одной машины). Каждый из компьютеров кластера представляет собой систему, которая мо- .); жет работать и вне кластера. клиент (Client). Процесс, который запрашивает сервисы у процесса-сервера, от- ■ правляя ему сообщения. хонтекст выполнения (Execution context). To же, что и состояние процесса .;■ (process state). .:, критический раздел (Critical section). В асинхронной процедуре компьютерной про- > граммы — часть, которая не может выполняться одновременно со связанным ■■■-' критическим разделом другой асинхронной процедуры. См. mutual exclusion. Круговое (карусельное) планирование (Round robin). Алгоритм планирования, / при котором процессы активируются в фиксированном циклическом поряд- '•' ке. Процессы, которые не могут выполняться в связи с состоянием ожида-:£ ния некоторого события (например, завершения дочернего процесса или J операции ввода-вывода), просто возвращают управление планировщику. ; Кэш диска (Disk cache). Буфер, обычно размещаемый в основной памяти, кото- '.,, рый работает в качестве кэша дисковых блоков между дисковой памятью и': остальной частью основной памяти. « Кэш-память (Cache memory). Память, меньшая по размеру и более быстрая, чем..' основная память; расположена между процессором и основной памятью. Кэш работает в качестве буфера для ячеек памяти, обращения к которым были последними. Ловушка (Trap). Непрограммируемый условный переход к определенному адресу, автоматически активируемый аппаратным обеспечением; позиция, из . которой был выполнен переход, записывается. 814 Словарь терминов Логическая запись (Logical record) Структура данных в прикладной программе, не зависящая от ее физического окружения; части одной логической записи могут располагаться в различных физических записях, так же как и несколько логических записей или их частей могут располагаться в одной физической записи. Логический адрес (Logical address). Ссылка на местоположение в памяти, не зависящее от текущего размещения данных в памяти. Перед тем как получить данные из памяти, должно быть выполнено преобразование этого адреса в физический. Люк (Trap door). Секретная недокументированная входная точка в программу, используемая для получения доступа минуя обычные методы аутентификации. Макроядро (Macrokemel). Большое ядро операционной системы, обеспечивающее широкий диапазон сервисов. Метод доступа (Access method). Метод, используемый для поиска в файле записи или множества записей. Микроядро (Microkernel). Малое привилегированное ядро операционной системы, обеспечивающее планирование процессов, управление памятью и коммуникации; для выполнения прочих функций, традиционно связываемых с ядром операционной системы, использует отдельные процессы. Многозадачность (Multiprogramming). Режим работы, при котором обеспечивается чередующееся выполнение двух или большего количества программ одним процессором. Синоним термина multitasking. Многозадачность (Multitasking). Режим работы, при котором обеспечивается параллельное или чередующееся выполнение двух или большего количества программ. Синоним термина multiprogramming. Многопроцессорная система (Multiprocessor). Компьютер, имеющий два и более процессора с общим доступом к основной памяти. Многопроцессорность (Multiprocessing). Режим работы, при котором параллельные вычисления обеспечиваются двумя или более процессорами многопроцессорной системы. Многопроцессорные системы с неоднородным доступом к памяти (Nonuniform memory access (NUMA) multiprocessor). Многопроцессорная система с общей памятью, в которой время доступа данного процессора к слову в памяти зависит от местоположения этого слова. Многоуровневая безопасность (Multilevel security). Управление доступом на нескольких уровнях классификации данных. Модель взаимодействия открытых систем (Open systems interconnection (OSI) reference model). Модель взаимосвязи между сотрудничающими устройствами. Определяет семиуровневую архитектуру коммуникационных функций. Модуль данных протокола (Protocol data unit). Информация, передаваемая по сети как единый модуль, который может содержать управляющую информацию, адрес или данные. Монитор (Monitor). Конструкция языка программирования, обеспечивающая абстрактные типы данных и взаимоисключительный доступ к множеству процедур. Словарь терминов 815
Монолитное ядро (Monolithic kernel). Большое ядро, виртуально содержащее всю операционную систему, включая планировщик, файловую систему, драйверы устройств и управление памятью. Все функциональные компоненты ядра имеют доступ ко всем его внутренним структурам данных и подпрограммам. Обычно монолитное ядро реализуется как единый процесс, в котором все элементы разделяют одно и то же адресное пространство. Непривилегированное состояние (Nonprivileged state). Контекст выполнения, не позволяющий выполнять привилегированные команды, такие, как останов процессора или команды ввода-вывода. Обнаружение взаимоблокировки (Deadlock detection). Методика, состоящая в удовлетворении по возможности всех запросов на ресурсы при периодической проверке наличия состояния взаимоблокировки. Оболочка (Shell). Часть операционной системы, интерпретирующая интерактивные пользовательские команды и команды языка управления заданиями. (По сути, представляет собой интерфейс между пользователем и операционной системой.) Обработчик прерывания (Interrupt handler). Подпрограмма, обычно являющаяся частью операционной системы. В случае прерывания управление передается соответствующему обработчику, который предпринимает определенные действия в ответ на вызвавшие прерывание условия. Образ процесса (Process image). Все составляющие процесса, включая программный код, данные, стек и управляющий блок процесса. Ожидание занятости (Busy waiting). Повторяющееся выполнение цикла в коде программы в процессе ожидания некоторого события. Операционная система (Operating system). Программное обеспечение, управляющее выполнением программ и предоставляющее различные сервисы, такие, как распределение ресурсов, планирование, управление вводом- выводом и управление данными. Организация файла (File organization). Физический порядок записей в файле, определяемый методом доступа, использовавшимся для их сохранения и выборки. Основная память (Main memory) Память, внутренняя по отношению к вычислительной системе, адресуемая программами. Ее ячейки могут быть загружены в регистры для последующего выполнения или обработки. Отключенное прерывание (Disabled interrupt). Условие (обычно осуществляемое операционной системой), при котором процессор игнорирует сигналы запросов прерываний определенного класса. Относительный адрес (Relative address). Адрес, вычисляемый как смещение относительно некоторого базового адреса. Пакетная обработка (Batch processing). Метод выполнения потока компьютерных программ, при котором запущенная программа полностью завершается до запуска следующей программы из множества. Параллельные (Concurrent). Относится к процессам и потокам, которые могут выполняться в один промежуток времени и при этом поочередно использовать общие ресурсы. 816 Словарь терминов Первым вошел — первым вышел (First-in-first-out, FIFO). Метод построения очереди, при котором следующим выбираемым элементом будет элемент, находившийся в очереди наибольшее время. Переключение потоков (Thread switch). Операция переключения процессора с выполнения одного потока на выполнение другого потока в пределах одного процесса. i Переключение процессов (Process switch). Операция переключения процессора с выполнения одного процесса на выполнение другого, путем сохранения управляющего блока процессора, регистров и другой информации первого процесса и замены их соответствующей информацией второго процесса*. Переключение режимов (Mode switch). Аппаратная операция, заставляющая процессор работать в другом режиме (ядра или процесса). При переключении процессора в режим ядра сохраняется счетчик команд, слово состояния процессора и его регистры. При переключении в режим процесса сохраненная ранее информация восстанавливается. Перенос процесса (Process migration). Перемещение достаточного количества состояния процесса. Планирование (Schedule). Выбор задания для выполнения. В некоторых операционных системах планироваться могут и другие единицы, например операции ввода-вывода. Повторно используемый ресурс (Reusable resource). Ресурс, который может безопасно использоваться в определенный момент времени только одним процессом и не расходуется им. Процесс получает единицы повторно используемого ресурса, которые позже освобождает для их повторного использования другими процессами. Примерами повторно используемых ресурсов могут служить процессоры, каналы ввода-вывода, основная и вторичная память, устройства и структуры данных, такие, как файлы, базы данных и семафоры. Подкачка страниц (Paging). Перемещение страниц между основной и вторичной памятью. Поле (Field). 1) Определяет логические данные, являющиеся частью записи. 2) Элементарная единица записи, которая может содержать элемент данных, совокупность данных, указатель и т.п. Последним вошел — первым вышел (Last in first out, LIFO). Метод организации очереди, при котором следующим выбираемым элементом будет последний помещенный в нее элемент. Последовательный доступ (Sequential access). Возможность запоминания данных в устройстве хранения в той последовательности, в которой эти данные предоставляются прикладной программой, а также получения данных в том порядке, в котором они были запомнены. Последовательный файл (Sequential file). Файл, в котором записи расположены в соответствии с порядком их формирования и обрабатываются в той же последовательности от начала файла. ^ Словарь терминов 817
Посредник запросов к объектам (Object request broker). В объектно-ориентированной системе действует в качестве посредника для запросов, посылаемых клиентами серверу. Поток (Thread). Независимо планируемый контекст выполнения, разделяющий единое адресное пространство с другими потоками. Почтовый ящик (Mailbox). Структура данных, совместно используемая рядом процессов для реализации очереди сообщений. Сообщения посылаются в почтовый ящик и извлекаются из него вместо непосредственной передачи между процессами. Предварительная выборка (Prepaging). Выборка страниц до запроса в связи с прерыванием из-за обращения к странице. Тем самым снижается количество операций дискового ввода-вывода. Сравните с выборкой по требованию (demand paging). Предотвращение взаимоблокировки (Deadlock prevention). Методика предотвращения возникновения состояния взаимоблокировки путем устранения одного из необходимых условий ее осуществления. Прерывание (Interrupt). Приостановка нормального выполнения процесса (компьютерной программы), вызванная, например, внешним по отношению к процессу событием и осуществляемая таким образом, что по ее завершении выполнение процесса может быть продолжено. Прерывание (из-за) отсутствия страницы (Page fault). Происходит тогда, когда страница, содержащая слово, к которому выполняется обращение, отсутствует в основной памяти. Это вызывает генерацию прерывания, обработчик которого загружает требуемую страницу в основную память. Привилегированное состояние (Privileged state). Контекст выполнения, разрешающий выполнение любых аппаратных команд. Привилегированные команды (Privileged Instruction). Команды, которые могут выполняться только в определенном режиме, обычно операционной системой. Проверенная (сертифицированная) система (Trusted system). Компьютер и операционная система, которые могут быть проверены на соответствие данной стратегии безопасности. Процесс (Process). Выполняемая программа. Процесс управляется и планируется операционной системой. То же, что и задача (task). Прямой доступ (Direct access). Возможность получения данных из устройства хранения или внесения их туда в последовательности, не зависящей от их относительного расположения, посредством использования адреса физического размещения данных. Прямой доступ к памяти (Direct memory access, DMA). Способ ввода-вывода, при котором специальный контроллер DMA управляет обменом данных между устройством ввода-вывода и основной памятью. Процессор посылает контроллеру DMA запрос на пересылку блока данных; по завершении этой операции процессор уведомляется об этом прерыванием. Псевдоблокировка (Livelock). Ситуация, когда два или большее количество процессов изменяют свое состояние в ответ на изменение состояния другого процесса(процессов) без выполнения какой-либо полезной работы. Эта си- 818 Словар терминов туация похожа на взаимоблокировку тем, что процессы, по сути, ничего не делают, но при этом ни один из них не заблокирован и не находится в состоянии ожидания. Рабочее множество (Working set). Рабочее множество с параметром Д в виртуальный момент времени t процесса (обозначается W(t,A)), представляет собой множество страниц, к которым процесс обращался за последние Д единиц времени. Сравните с резидентным множеством (resident set) Разделение времени (Time sharing). Параллельное использование устройства несколькими пользователями. Рандеву (Rendezvous). Ситуация в передаче сообщений, когда и отправитель, и получатель сообщения блокируются до окончания доставки сообщения. Распределение памяти (Memory partitioning). Разделение памяти на независимые разделы. Распределенная операционная система (Distributed operating system). Общая операционная система, совместно используемая сетью компьютеров. Распределенная операционная система обеспечивает поддержку для межпроцессного взаимодействия, перемещение процессов, взаимоисключения, а также предотвращение и обнаружение взаимоблокировок. Расходуемые ресурсы (Consumable resources). Ресурсы, которые могут быть созданы (произведены) и уничтожены (потреблены). При получении процессом ресурса последний прекращает существование. Примерами расходуемых ресурсов могут служить прерывания, сигналы, сообщения, информация в буферах ввода-вывода. Реентерабельная процедура (Reentrant procedure). Подпрограмма, вход в которую может быть выполнен до завершения ее предыдущего выполнения. Резидентное множество (Resident set). Часть процесса, находящаяся в конкретный момент времени в основной памяти. Сравните с рабочим множеством (working set). Результативность поиска (Hit ratio). В двухуровневой памяти — доля обращений к памяти, запрашиваемые данные которых находятся в быстрой памяти (кэше). Свопинг (Swapping). Передача сегмента или страницы данных из вторичной памяти в основную или в обратном направлении. Связанный список (Chained list). Список, данные в котором могут быть рассредоточены, но каждый элемент списка при этом содержит информацию, определяющую положение следующего элемента списка. Сегмент (Segment). В виртуальной памяти — блок, имеющий виртуальный адрес. Блоки программы могут быть разной, и даже динамически изменяемой, длины. Сегментация (Segmentation). Разделение программы или данных на сегменты как часть схемы виртуальной памяти. Семафор (Semaphore). Целое значение, используемое в целях передачи сигналов между процессами. С семафором могут быть выполнены три атомарные операции: инициализация, увеличение и уменьшение. В зависимости от оп- Словарь терминов 819
ределения конкретного семафора операция уменьшения может приводить к блокированию процесса, а операция увеличения — к разблокированию. Сервер (Server). 1) Процесс, отвечающий на запросы клиента посредством сообщений. 2) В сети — компьютер, предоставляющий определенные устройства или услуги другим компьютерам, например файл-сервер, сервер печати, почтовый сервер. Сессия (Session). Набор из одного или нескольких процессов, представляющий единое интерактивное пользовательское приложение или функцию операционной системы. Весь ввод информации, поступающий от клавиатуры и мыши, направляется к сессии переднего плана, и весь ее вывод направляется на экран. Сетевая операционная система (Network operating system). Программное обеспечение, относящееся к операционной системе, которое обеспечивает поддержку использования обычных серверных систем в сети компьютеров. Сильный семафор (Strong semaphore). Семафор, у которого все ожидающие его процессы становятся в очередь и обрабатываются в том порядке, в котором они выполнили операцию ожидания ("первым вошел — первым вышел"). Симметричная многопроцессорность (Symmetric Multiprocessing, SMP). Вид многозадачности, позволяющий операционной системе работать на любом из доступных процессоров либо на нескольких доступных процессорах одновременно. Синхронизация (Synchronization). Ситуация, когда два или большее количество процессов согласовывают свои действия на основе некоторого условия. Синхронная операция (Synchronous operation). Операция, выполняющаяся регулярно или предсказуемо в связи с определенным событием в другом процессе, например вызов подпрограммы ввода-вывода в определенном, заранее известном месте программы. Система реального времени (Real-time system). Операционная система, которая может планировать задачи реального времени и управлять ими. Система управления файлами (File management system). Набор системных программ, предоставляющих пользователям и приложениям возможности работы с файлами, включая обращение к файлу, работу с каталогами и управление доступом. Слабый семафор (Weak semaphore). Семафор, у которого все ожидающие его процессы обрабатываются в неопределенном порядке, т.е. порядок обработки неизвестен или не может быть определен в принципе. Снижение пропускной способности (Thrashing). Явление в схемах виртуальной памяти, когда процессор тратит больше времени на перемещение данных, чем на выполнение команд. Создание процесса (Process spawning). Создание (порождение) нового процесса другим процессом. Сообщение (Message). Блок информации, которым в качестве средства взаимосвязи могут обмениваться процессы. Состояние процесса (Process state). Вся информация, требующаяся операционной системе для управления процессом, а процессору — для корректного выполнения данного процесса. Состояние процесса включает содержимое различных регистров процессора, таких, как счетчик команд и регистров Слови ьтервшнов данных, а также информацию, используемую операционной системой, такую, как приоритет процесса, и о том, находится ли процесс в ожидании завершения операции ввода-вывода. То же, что и контекст выполнения (execution context). Спулинг (Spooling). Использование вторичной памяти в качестве буфера для снижения задержек при передаче данных между периферийным оборудованием и процессорами компьютера. Стек (Stack). Список, созданный и поддерживаемый таким образом, чтобы очередным выбираемым из него элементом был элемент, внесенный в список последним ("последним вошел — первым вышел"). Страница (Page). В виртуальной памяти блок фиксированной длины, имеющий виртуальный адрес и передаваемый между основной и вторичной памятью как единое целое. Таблица размещения файлов (File allocation table, FAT). Таблица, указывающая физическое расположение на устройстве вторичной памяти пространства, выделенного файлам. Таблица распределения диска (Disk allocation table). Таблица, указывающая, какие блоки дисковой памяти свободны и доступны для размещения файлов. Транслятор адреса (Address translator). Функциональный модуль, преобразующий виртуальные адреса в реальные. Троянский конь (Trojan horse). Секретная недокументированная подпрограмма, внедренная в обычную программу, выполняющую полезные действия. Запуск такой программы приводит к выполнению этой секретной подпрограммы. Удаленный вызов процедуры (Remote procedure call, RPC). Методика, в соответствии с которой две программы на различных машинах взаимодействуют с использованием синтаксиса и семантики вызова процедуры и возврата из нее. Как вызываемая, так и вызывающая программы ведут себя так, как если бы обе программы выполнялись на одной и той же машине. Уплотнение (Compaction). Методика, используемая при разделении памяти на части разных размеров. Время от времени операционная система перемещает части так, чтобы они занимали непрерывную область, а свободная память была размещена отдельным блоком. Управляющий блок процесса (Process control block). Структура данных, содержащая информацию о характеристиках и состоянии процесса. Уровень многозадачности (Multiprogramming level). Количество процессов, полностью или частично резидентных в основной памяти. Условие гонки (Race condition). Ситуация, в которой доступ к совместно используемым данным и работа с ними со стороны нескольких процессов зависит от их синхронизации. Устранение взаимоблокировки (Deadlock avoidance). Динамическая методика исследования каждого нового запроса ресурса с точки зрения возможности возникновения взаимоблокировки. Если удовлетворение запроса может привести к взаимоблокировке, запрос отклоняется. Файл (File). Множество однотипных записей, рассматриваемых как единое целое. Словарь терминов 821
Физический адрес (Physical address). Абсолютное положение адресуемой единицы данных в памяти (например, слова или байта в основной памяти, блока во вторичной памяти). Хеширование (Hashing). Выбор положения хранимого элемента путем вычисления адреса как функции от содержащихся в нем данных. Этот метод усложняет процесс распределения памяти, но ускоряет произвольную выборку элементов. Хеш-файл (Hash file). Файл, обращение к записям которого выполняется по значениям ключевого поля. Для поиска положения записи используется хеширование — вычисление позиции в файле на основе значений ключей. Червь (Worm). Программа, которая может перемещаться с компьютера на компьютер по сетевым соединениям. Может содержать вирус. Шифрование (Encryption). Преобразование обычного текста или данных в нераспознаваемый вид путем применения обратимых математических вычислений. Ядро (Kernel). Часть операционной системы, включающая наиболее интенсивно используемые программы операционной системы. Обычно ядро постоянно располагается в основной памяти и работает в привилегированном режиме, отвечая на вызовы процессов и прерывания от устройств. Язык управления заданиями (Job control language, JCL). Язык, разработанный для описания заданий и их требований к операционной системе. Словарь терминов
Юглавление Предисловие 21 Глава 0. Руководство читателя 25 Часть 1. Основные понятия 31 Глава 1. Обзор компьютерных систем 33 Глава 2. Обзор операционных систем 81 Часть 2. Процессы 139 Глава 3. Описание процессов и управление ими 143 Глава 4. Потоки, симметричная мультипроцессорная обработка ': и микроядра 195 Глава 5. Параллельные вычисления: взаимоисключения и многозадачность 245 Глава 6. Взаимоблокировка и голодание 319 г Часть 3. Память 355 Глава 7. Управление памятью 357 Глава 8. Виртуальная память 391 Часть 4. Планирование 455 Глава 9. Планирование в системах с одним процессором 457 Глава 10. Многопроцессорное планирование и планирование реального времени 505 Часть 5. Операции ввода-вывода и файлы 543 Глава 11. Управление вводом-выводом и дисковое планирование 545 Глава 12. Управление файлами 603 Часть 6. Распределенные системы 647 Глава 13. Распределенные вычисления, архитектура клиент/сервер и кластеры 649 Глава 14. Управление распределенными процессами 689 f Часть 7. Безопасность 731 Глава 15. Безопасность 733 . Приложение А. Протокол TCP/IP 793 '"'*■ Приложение Б. Объектно-ориентированный подход 803 Словарь терминов 811 W \