ОСНОВНЫЕ ДОСТИЖЕНИЯ
Операционные системы относят к числу самых сложных программ. В этом проявляется стремление их разработчиков сделать системы такими, чтобы они удовлетворяли требованиям удобства и эффективности и при этом не утратили способности к развитию. Согласно [DENN80a], в процессе развития операционных систем были проведены исследования в пяти основных направлениях.
• Процессы.
• Управление памятью.
• Защита информации и безопасность.
• Планирование и управление ресурсами.
• Структура системы.
Каждое из этих направлений можно охарактеризовать набором абстрактных принципов, разработанных для решения сложных прикладных задач. В основном развитие современных операционных систем также происходит по пяти перечисленным выше направлениям. Краткий их обзор, приведенный в этом разделе, поможет читателю получить представление о содержании большей части настоящей книги.
Процессы
Одной из основополагающих концепций, помогающих понять структуру операционных систем, является концепция процессов. Этот термин впервые был применен в 60-х годах разработчиками операционной системы Multics [DALE68] и с тех пор широко используется. Есть много определений термина "процесс", в том числе:
• выполняющаяся программа;
• экземпляр программы, выполняющейся на компьютере;
• объект, который можно идентифицировать и выполнять на процессоре;
• единица активности, которую можно охарактеризовать единой цепочкой
последовательных действий, текущим состоянием и связанным с ней набором системных ресурсов.
Данная концепция станет более понятной по мере освоения матери ала. В процессе развития компьютерных систем при решении проблем, связанных с распределением времени и синхронизацией, был сделан определенный вклад в развитие концепции процесса: разработаны системы групповой обработки нескольких программ, разделения времени и транзакций в реальном времени. Как мы уже могли убедиться, многозадачный режим дает возможность процессору и устройствам ввода-вывода работать одновременно, повышая тем самым эффективность использования компьютерной системы. При этом используется механизм, принцип работы которого заключается в следующем: в ответ на сигналы, свидетельствующие о завершении транзакций ввода-вывода, процессор переключается с одной программы на другую (при условии, что в оперативную память одновременно загружено несколько программ).
Другим направлением развития являются системы разделения времени. Основная цель их разработки — удовлетворение потребностей каждого пользователя при условии их одновременной работы. В этих системах используется тот факт, что пользователь реагирует на события намного медленнее, чем компьютер. К примеру, если потребность пользователя во времени процессора для обработки его действий в среднем составляет 2 с в течение 1 мин, то одной и той же системой, не мешая друг другу» могут пользоваться до 30 пользователей. Конечно же, в таких расчетах нужно учитывать время, которое требуется для работы самой операционной системы.
Еще одним важным направлением развития являются системы обработки транзакций в реальном времени. При работе таких систем некоторое число пользователей отправляют запросы в базу данных или вносят в нее изменения. Пример — система бронирования авиабилетов. Основное различие между системой обработки транзакций и системой разделения времени состоит в том, что в первой из них выполняются одно-два приложения, в то время как пользователи системы с разделением времени могут заниматься разработкой программ, запускать их и пользоваться многими различными приложениями. В обоих случаях ключевым фактором является время отклика системы.
Прерывание было важным инструментом, который стал доступен системным программистам еще на ранних стадиях развития многозадачных и многопользовательских интерактивных систем. Выполнение любого задания может быть прервано при наступлении определенного события, например завершения ввода-вывода. При этом процессор должен сохранить определенную информацию (такую, как содержимое программного счетчика, общих и системных регистров) и переключиться на выполнение программы обработки прерываний, которая выясняет природу прерывания, обрабатывает его, а затем возобновляет исполнение одного из заданий.
Устройство системного программного обеспечения, координирующего подобные процессы, оказалось очень сложным. При одновременной обработке многих заданий, каждое из которых включает в себя длинную последовательность действий, нельзя проанализировать все возможные комбинации последовательностей событий. Ввиду отсутствия систематических средств обеспечения координации и взаимодействия разных видов деятельности систем программисты обратились к специальным методам, основанным на представлении о той среде, работу которой должна контролировать операционная система. При этом они подвергались риску допустить трудноуловимые ошибки, которые проявляются только в очень редких случаях, при выполнении определенных последовательностей событий. Такие ошибки трудно обнаружить, потому что их нужно отличить от ошибок в приложениях и ошибок, возникающих при сбоях аппаратного обеспечения. Еще одной особенностью, затрудняющей определение причины этих ошибок (когда они обнаружены), является то, что воспроизвести точные условия, в которых эти ошибки проявляются, крайне трудно. Ниже перечислены основные причины подобных ошибок [DENN80a].
• Неправильная синхронизация. Часто случается так, что программа должна
приостановить свою работу и ожидать наступления какого-то события в системе. Например, программа, которая начала операцию ввода-вывода, не сможет продолжать работу, пока в буфере не будут доступны необходимые ей данные. В этом случае требуется передача сигнала от какой-то другой программы. Не достаточная надежность сигнального механизма может привести к тому, что сигнал будет потерян или что будет получено два таких сигнала.
• Сбой взаимного исключения. Часто один и тот же совместно используемый
ресурс одновременно пытаются использовать несколько пользователей или
несколько программ. Например, в системе бронирования авиабилетов два
пользователя могут запросить доступ к базе данных и при наличии свободных мест изменить ее, забронировав билеты. Если этот доступ не контролируется должным образом, возможно возникновение ошибок. Для корректной работы требуется некоторый механизм взаимного исключения, позволяющий в каждый момент времени выполнять транзакцию только одной
программе. Правильность реализации такого взаимного исключения при
всех возможных последовательностях событий крайне трудно проверить.
• Недетерминированное поведение программы. Результат работы каждой
программы обычно должен зависеть только от ее ввода и не должен зависеть от работы других программ, выполняющихся в этой же системе. Однако в условиях совместного использования памяти и процессора программы могут влиять на работу друг друга, переписывая общие области памяти не предсказуемым образом. При этом результат работы программ может зависеть от порядка, в котором они выполняются.
• Взаимоблокировки. Возможны ситуации, в которых две или большее число
программ зависают, ожидая действий друг друга. Например, двум программам
может понадобиться, чтобы устройства ввода-вывода выполнили некоторую операцию (например, копирование с диска на магнитную ленту). Одна из этих программ осуществляет управление одним из устройств, а другая — другим. Каждая из них ждет, пока другая программа освободит нужный ресурс. Выйти из такой тупиковой ситуации может помочь система распределения ресурсов.
Для решения перечисленных проблем нужен систематический метод, основанный на слежении за различными выполняющимися процессором программами и управлении ими. В основе такого метода лежит концепция процесса. Мысленно процесс можно разделить на три компонента.
• Выполняющаяся программа.
• Данные, нужные для ее работы (переменные, рабочее пространство, буферы
и т.д.).
• Контекст выполнения программы.
Последний элемент является очень важным. Контекст выполнения (execution context), или состояние процесса (process state), включает в себя всю информацию, нужную операционной системе для управления процессом, и процессору — для его выполнения. Данные, характеризующие это состояние, включают в себя содержимое различных регистров процессора, таких, как программный счетчик и регистры данных. Сюда же входит информация, использующаяся операционной системой, такая, как приоритет процесса и сведения о том, находится ли данный процесс в состоянии ожидания какого-то события, связанного с вводом-выводом.
На рис. 2.8 показан пример реализации процессов. Два процесса, А и В, находятся в различных областях основной памяти. Другими словами, каждому процессу отведен блок памяти, в котором содержатся код программы, данные и информация о состоянии процесса. Каждый процесс заносится в список процессов, который создается и поддерживается операционной системой. Часть этого списка, соответствующая определенному процессу, содержит указатель размещения этого процесса в памяти. Кроме того, сюда же частично или полностью может входить и информация о состоянии процесса. Остальные данные могут храниться в самом процессе. В регистре индекса процесса содержится индекс выполняющегося в текущий момент времени процесса, идентифицирующий его в списке процессов. Содержимое программного счетчика указывает на очередную инструкцию, которую нужно выполнить. Базовый и граничный регистры задают область памяти, занимаемую процессом. В базовый регистр заносится адрес начальной ячейки этой области, а в граничный — ее размер (в байтах или словах). Содержимое программного счетчика и всех ссылок на данные отсчитывается от значения базового регистра; по своей величине эти ссылки не могут превосходить значение граничного регистра (что защищает процессы от воздействия друг на друга).
Регистр. индекса процесса, изображенный на рис. 2.8, указывает, что выполняется процесс В. До этого выполнялся процесс А, но он временно прерван. Содержимое всех регистров в момент прекращения этого процесса записано в виде данных о состоянии процесса. Впоследствии операционная система сможет вернуться к выполнению процесса А; при этом будет сохранен контекст выполнения процесса В и восстановлен контекст выполнения процесса А. Когда в программный счетчик загружается значение, указывающее на область кода программы процесса А, автоматически возобновляется выполнение этого процесса.
Таким образом, процесс реализуется в виде структуры данных. Он может выполняться или находиться в состоянии ожидания. Состояние процесса в каждый момент времени заносится в специально отведенную область данных. Использование структуры позволяет развивать мощные методы координации и взаимодействия процессов. В рамках операционной системы на основе данных о состоянии процесса путем их расширения и добавления в них дополнительной информации о процессе можно разрабатывать новые , возможности операционных систем. При чтении книги нам встретится множество примеров использования описанной структуры в решении задач, возникающих при разработке многозадачных и многопользовательских операционных систем.
.
Рис. 2.8. Типичная реализация процессов
Управление памятью
Лучше всего потребности пользователя удовлетворяются вычислительной средой, поддерживающей модульное программирование и гибкое использование данных. Нужно обеспечить эффективный и систематичный контроль над размещением данных в запоминающем устройстве со стороны управляющих программ операционной системы. Исходя из сформулированных требований, операционная система должна выполнять такие функции.
• Изоляция процессов. Операционная система должна следить за тем, чтобы
ни один из независимых процессов не смог изменить содержимое памяти,
отведенное другому процессу, и наоборот.
Автоматическое размещение и управление. Программы должны динамически размещаться в памяти в соответствии с определенными требованиями.
Распределение памяти должно быть прозрачным для программиста. Таким
образом, программист будет избавлен от необходимости следить за ограничениями, связанными с конечностью памяти, а операционная система повышает эффективность работы вычислительной системы, выделяя заданиям
только тот объем памяти, который им необходим
• Поддержка модульного программирования. Программист должен иметь
возможность определять модули программы, а также динамически их создавать, уничтожать и изменять их размер.
• Зашита и контроль доступа. При совместном использовании памяти на каждом
ее иерархическом уровне есть вероятность, что одна программа обратится к
пространству памяти другой программы. Такая возможность может понадобиться, если она заложена в принцип работы данного приложения. С другой
стороны, это угроза целостности программ и самой операционной системы.
Операционная система должна следить за тем, каким образом различные пользователи могут осуществлять доступ к различным областям памяти.
• Долгосрочное хранение. Многим приложениям требуются средства, с помощью которых можно было бы хранить информацию в течение длительного периода времени после выключения компьютера.
Обычно операционные системы выполняют эти требования с помощью средств виртуальной памяти и файловой системы. Файловая система обеспечивает долгосрочное хранение информации, помещаемой в именованные объекты, которые называются файлами. Файл — это удобная для широкого использования структура данных, доступ к которой и ее защита осуществляются операционной системой.
Виртуальная память — это устройство, позволяющее программистам рассматривать память с логической точки зрения, не заботясь о наличии физической памяти достаточного объема. Принципы работы с виртуальной памятью были разработаны, чтобы задания нескольких пользователей, выполняясь параллельно, могли одновременно присутствовать в основной памяти. При такой организации процессов нет задержки между их выполнением: как только один из процессов заносится на вспомогательное запоминающее устройство, считывается следующий процесс. Из-за различий в количестве памяти, требующемся для разных процессов, при переключении процессора с одного процесса на другой трудно компактно разместить их в основной памяти. Поэтому были разработаны системы со страничной организацией памяти, при которой процесс разбивается на блоки фиксированного размера, которые называются страницами. Обращение программы к слову памяти происходит по виртуальному адресу (virtual address), который состоит из номера страницы и смещения относительно ее начала. Страницы одного и того же процесса могут быть разбросаны по всей основной памяти. Система разбивки на страницы обеспечивает динамическое соответствие между виртуальным адресом, использующимся программой, и реальным (real address), или физическим, адресом основной памяти.
Следующим логическим шагом развития в этом направлении (при наличии аппаратного обеспечения, позволяющего выполнять динамическое отображение) было исключение требования, чтобы все страницы процесса одновременно находились в основной памяти; достаточно, чтобы все они хранились на диске. Во время выполнения процесса только некоторые его страницы находятся в основной памяти. Если программа обращается к странице, которая там отсутствует, аппаратное обеспечение, управляющее памятью, обнаружит это и организует загрузку недостающих страниц. Такая схема называется виртуальной памятью; она проиллюстрирована на рис. 2.9.
Рис. 2.9. Концепция виртуальной памяти
Аппаратное обеспечение процессора вместе с операционной системой предоставляют пользователю "виртуальный процессор", который имеет доступ к виртуальной памяти. Это хранилище может быть организовано в виде линейного адресного пространства или в виде набора сегментов, представляющих собой непрерывные блоки переменной длины. При каждом из этих способов организации с помощью средств языка программирования можно обращаться к ячейкам виртуальной памяти, в которых содержится программа и ее данные. Чтобы изолировать процессы друг от друга, каждому из них можно выделить свою область памяти, не пересекающуюся с областью памяти другого процесса. Общее использование памяти можно организовать, частично перекрывая участки двух областей виртуальной памяти. Файлы создаются на долговременном запоминающем устройстве. Чтобы с ними могли работать программы, файлы или их фрагменты могут копироваться в виртуальную память.
Рис. 2.10 поясняет концепцию адресации в схеме виртуальной памяти. Хранилище состоит из основной памяти, открытой для прямого доступа, осуществляемого с помощью машинных команд, а также более медленной вспомогательной памяти, доступ к которой осуществляется косвенно путем загрузки блоков в основную память. Между процессором и памятью находятся аппаратные средства преобразования адреса. Программы обращаются к ячейкам памяти посредством виртуальных адресов, преобразующихся в ходе обращения в реальные адреса, основной памяти. Если происходит обращение к виртуальному адресу, который не загружен в основную память, то один из блоков реальной памяти меняется местами с нужным блоком, который находится во вспомогательной памяти. Во время этого обмена процесс, который обратился к данному адресу, должен быть приостановлен. Задача разработки такого механизма преобразования адресов, который бы не требовал больших дополнительных ресурсов, и такой стратегии размещения данных в хранилище, которая бы сводила к минимуму перемещение данных между различными уровнями памяти, возлагается на разработчика операционной системы.
Рис. 2.10. Адресация виртуальной памяти
Дата добавления: 2016-06-05; просмотров: 1623;