Операционная система управляет событиями, которые происходят в компьютерной системе. Она планирует и координирует выполнение процессов, выделяет им ресурсы и предоставляет по запросу системных и пользовательских программ основные сервисы. Мы можем представить себе операционную систему как некий механизм, управляющий тем, как процессы используют системные ресурсы.
Эта концепция проиллюстрирована на рис. 3.7. Пусть в многозадачной среде имеется несколько процессов (Pj, ..., Р„), которые уже созданы и загружены в виртуальную память. Каждому процессу для его функционирования нужен доступ к определенным системным ресурсам, в число которых входят процессор, устройства ввода-вывода и основная память. В ситуации, изображенной на рисунке, процесс Pi находится в состоянии выполнения, т.е. в основной памяти находится по крайней мере часть этого процесса. Кроме того, он осуществляет управление двумя устройствами ввода-вывода. Процесс Р2 тоже находится в основной памяти, но он блокирован, ожидая, пока освободится устройство ввода-вывода, находящееся в распоряжении процесса Pj. Процесс Р„ выгружен из основной памяти и, соответственно, приостановлен.
Рис. 3.7. Процессы и ресурсы в некоторый момент времени
Далее в этой главе мы подробно рассмотрим, как выглядит управление ресурсами со стороны операционной системы с точки зрения процессов. А пока что зададим себе более фундаментальный вопрос: какая информация нужна операционной системе, чтобы управлять процессами и выделяемыми для них ресурсами?
Управляющие структуры операционной системы
Поскольку в задачи операционной системы входит управление процессами и ресурсами, она должна располагать информацией о текущем состоянии каждого процесса и ресурса. Универсальный подход к предоставлению такой информации прост: операционная система создает и поддерживает таблицы с информацией по каждому объекту управления. Общее представление об этом можно получить на основании рис. 3.8, на котором показаны четыре различных вида таблиц, поддерживающихся операционной системой: для памяти, устройств ввода-вывода, файлов и процессов. Хотя детали в разных операционных системах могут различаться, по сути, все операционные системы поддерживают информацию по этим четырем категориям.
Образ процесса
Рис. 3.8. Общая структура управляющих таблиц операционной системы
Таблицы памяти (memory tables) используются для того, чтобы следить за основной (реальной) и вторичной (виртуальной) памятью. Некоторая часть основной памяти резервируется для операционной системы, оставшаяся же — доступна для использования процессами. Процессы, которые находятся во вторичной памяти, используют некоторую разновидность виртуальной памяти либо простой механизм свопинга. Таблицы памяти должны включать такую информацию:
- объем основной памяти, отведенной процессу;
- объем вторичной памяти, отведенной процессу;
- все атрибуты защиты блоков основной или виртуальной памяти, как, например, указание, какой из процессов имеет доступ к той или иной совместно используемой области памяти;
- вся информация, необходимая для управления виртуальной памятью.
Подробно эти информационные структуры, используемые для управления памятью, рассматриваются в третьей части книги.
Таблицы ввода-вывода (I/O tables) используются операционной системой для управления устройствами ввода-вывода и каналами компьютерной системы. В каждый момент времени устройство ввода-вывода может быть либо свободно, либо отдано в распоряжение какому-то определенному процессу. Если выполняется операция ввода-вывода, операционная система должна иметь информацию о ее состоянии и о том, какие адреса основной памяти задействованы в этой операции в качестве источника вывода или места, куда передаются данные при вводе. Управление вводом-выводом рассматривается в главе 11, "Управление вводом-выводом и дисковое планирование".
Операционная система может также поддерживать таблицы файлов (file tables). В этих таблицах находится информация о существующих файлах, их расположении на магнитных носителях, текущем состоянии и других атрибутах. Большая часть этой информации, если не вся, может поддерживаться системой управления файлами. В этом случае операционная система мало знает (или совсем ничего не знает) о файлах. В операционных системах другого типа основная часть работы, связанной с управлением файлами, выполняется самой операционной системой. Эта тема обсуждается в главе 12, "Управление файлами".
Наконец, операционная система должна поддерживать таблицы процессов, чтобы иметь возможность управлять ими. В оставшейся части данного раздела рассматриваются требования к таблицам процессов (process tables). Перед тем как продолжить рассмотрение, сделаем два замечания. Во-первых, хотя на рис. 3.8 и показаны четыре разных вида таблиц, ясно, что все они должны быть связаны между собой или иметь перекрестные ссылки. В конце концов, управление памятью, устройствами ввода-вывода и файлами осуществляется для того, чтобы могли выполняться процессы, поэтому в таблицах процессов должны быть явные или неявные ссылки на эти ресурсы. Например, доступ к файлам, информация о которых хранится в таблицах файлов, осуществляется через устройства ввода-вывода, и эти файлы или их части в определенные моменты времени будут находиться в основной или виртуальной памяти. Сами таблицы должны быть доступны для операционной системы, поэтому место для них выделяется системой управления памятью.
Во-вторых, какие сведения необходимы операционной системе для создания этих таблиц? Конечно же, у нее должна быть информация по основной конфигурации системы, в которую входят сведения об объеме основной памяти, количестве и виде устройств ввода-вывода, а также их идентификаторах и т.п. Таким образом, во время инициализации операционной системы она должна иметь доступ к определенным данным конфигурации, которые определяют основные параметры вычислительной среды. Эти данные могут создаваться как вне операционной системы с участием оператора, так и с помощью каких-то программ, определяющих конфигурацию вычислительной системы.
Структуры управления процессами
Рассмотрим вопрос о том, какими сведениями должна располагать операционная система, чтобы она могла управлять процессом. Во-первых, она должна знать, где находится этот процесс, а во-вторых, ей должны быть известны необходимые для управления атрибуты процесса (такие, как его идентификатор, состояние и размещение в памяти).
Местоположение процесса
Перед тем как перейти к рассмотрению вопроса о размещении процесса или о его атрибутах, зададим себе еще более фундаментальный вопрос: в чем заключаются физические проявления процесса? Как минимум, в процесс входит программа или набор программ, которые нужно выполнить. С этими программами связан набор ячеек памяти, в которых хранятся локальные и глобальные переменные и константы. Таким образом, процессу должен быть выделен такой объем памяти, в котором поместились бы программа и данные, принадлежащие процессу. Кроме того, при работе программы обычно используется стек, с помощью которого реализуются вызовы процедур и передача параметров. Наконец, с каждым процессом связано несколько атрибутов, которые используются операционной системой для управления этим процессом. Обычно такой набор атрибутов называется управляющим блоком процесса (process control block). Множество, в которое входят программа, данные, стек и атрибуты, называется образом процесса (process image) (табл. 3.4).
Таблица 3.4. Типичные элементы образа процесса
Местонахождение образа процесса зависит от используемой схемы управления памятью (в простейшем случае образ процесса имеет вид непрерывного блока памяти, который расположен во вторичной памяти, обычно на диске).
Чтобы операционная система могла управлять процессом, по крайней мере небольшая часть его образа должна находиться в основной памяти. Чтобы можно было запустить процесс, его образ необходимо полностью загрузить в основную (или в виртуальную) память. Таким образом, операционной системе нужно знать местонахождение каждого процесса на диске, а для тех процессов, которые загружены в основную память — их местонахождение в основной памяти. В главе, "Обзор операционных систем", мы рассматривали несколько более сложную модификацию этой схемы, использующуюся в системах CTSS, где при свопинге процесс может выгружаться из основной памяти только частично. При этом операционная система должна следить за тем, какая часть образов каждого из процессов осталась в основной памяти.
В большинстве современных операционных систем используется схема управления памятью, в которой образ процесса состоит из набора блоков, не обязательно расположенных последовательно. В зависимости от используемой схемы эти блоки могут быть переменной длины (в этом случае они называются сегментами), фиксированной длины (в этом случае они называются страницами) или представлять собой комбинацию тех и других. Любая из этих схем позволяет операционной системе загружать в память лишь часть процесса. Таким образом, в любой момент времени часть образа процесса может находиться в основной памяти, в то время как остальная его часть остается во вторичной памяти. Поэтому таблицы процессов, поддерживаемые операционной системой, должны содержать сведения о местонахождении каждого сегмента и/или каждой страницы всех образов процессов.
Структура сведений о расположении процессов, изображенная на рис. 3.8, организована следующим образом. Имеется первичная таблица процессов, в которой каждому процессу соответствует одна запись. Все записи должны содержать по крайней мере указатель на образ процесса. Если образ процесса состоит из нескольких блоков, то эта информация либо непосредственно содержится в соответствующей записи первичной таблицы, либо может быть получена при помощи ссылок на записи в таблицах памяти. Конечно же, это описание носит общий характер; в каждой операционной системе используется собственный метод организации информации о расположении процессов.
Атрибуты процессов
Сложная многозадачная система должна располагать обширными сведениями о каждом процессе. Как было сказано ранее, можно считать, что эта информация находится в управляющем блоке процесса. Различные системы организуют эту информацию по-разному; в конце настоящей и следующей глав приводится несколько примеров такой организации. А пока что рассмотрим вопрос о том, информация какого типа может понадобиться операционной системе, не останавливаясь на схеме организации этой информации.
В табл. 3.5 перечислены типичные виды информации, требующейся операционной системе для каждого процесса. Возможно, читателя несколько удивит объем требуемой информации, однако этот список будет выглядеть гораздо убедительнее после более полного знакомства с функциями операционной системы.
Таблица 3.5. Типичные элементы управляющего блока процесса
Продолжение табл. 3.5.
Информацию, которая находится в управляющем блоке процесса, можно разбить на три основные категории:
- информация по идентификации процесса;
- информация по состоянию процесса;
- информация, используемая при управлении процессом.
Что касается идентификации процесса (process identification), то почти во всех операционных системах каждому процессу присваивается числовой идентификатор, который может быть просто индексом в первичной таблице процессов (рис. 3.8). В любом случае должно иметься некоторое отображение, позволяющее операционной системе найти по идентификатору процесса соответствующие ему таблицы. Идентификаторы могут использоваться в разных ситуациях. В частности, они используются для реализации перекрестных ссылок на таблицы процессов из других таблиц, находящихся под управлением операционной системы. Например, таблицы памяти могут предоставлять информацию об основной памяти с указанием всех областей, выделенных каждому из процессов, указываемому посредством его идентификатора. Аналогичные ссылки могут быть и в таблицах ввода-вывода или таблицах файлов. Если процессы обмениваются между собой информацией, их идентификаторы указывают операционной системе участников такого обмена. При создании нового процесса идентификаторы указывают родительский и дочерние процессы.
Кроме того, процессу может быть присвоен идентификатор пользователя, который указывает, кто из пользователей отвечает за данное задание.
Информация о состоянии процессора (processor state information) состоит из содержимого его регистров. Во время выполнения процесса эта информация, конечно же, находится в регистрах. Прерывая процесс, всю содержащуюся в регистрах информацию необходимо сохранить, чтобы восстановить ее при возобновлении выполнения этого процесса. Характер и количество участвующих в сохранении регистров зависит от устройства процессора. Обычно в набор регистров входят регистры, доступные пользователю, управляющие регистры и регистры состояния, а также указатели вершин стеков. Все они описаны в главе 1, "Обзор компьютерных систем".
Следует заметить, что в процессорах любого вида имеется регистр или набор регистров, известных под названием "слово состояния программы" (program status word — PSW), в которых содержится информация о состоянии и кодах условий. Хорошим примером слова состояния процессора является регистр EFLAGS (показан на рис. 3.9 и описан в табл. 3.6), имеющийся в процессорах Pentium. Этот регистр используют все операционные системы, работающие на компьютерах Pentium.
Рис. 3.9. Регистр EFLAGS процессора Pentium II
Таблица 3.6. Биты регистра EFLAGS процессора Pentium
Продолжение табл. 3.6.
На рис. 3.10 предложена возможная структура образов процессов в виртуальной памяти. Каждый образ процесса состоит из управляющего блока процесса, стека пользователя, закрытого адресного пространства процесса и всех других адресных пространств, которые данный процесс использует совместно с другими процессами. На рисунке каждый образ процесса изображен в виде области непрерывных адресов, но в реальной реализации это может быть не так; размещение образа процесса в памяти зависит от схемы управления памятью и от способа организации управляющих структур в операционной системе.
Как видно из табл. 3.5, управляющий блок процесса может содержать в себе структурную информацию, в которую входят указатели, позволяющие связывать между собой различные управляющие блоки процессов. Таким образом, описанные в предыдущем разделе очереди могут быть реализованы в виде связанных списков, элементами которых являются управляющие блоки процессов. Например, схема очередности, показанная на рис. 3.5,а, может быть реализована в соответствии со схемой, изображенной на рис. 3.11.
Рис. 3.10. Пользовательские процессы в виртуальной памяти
Рис. 3.11. Структуры списков процессов
Роль управляющего блока процесса
Управляющий блок процесса — это самая важная структура данных из всех имеющихся в операционной системе. В управляющий блок каждого процесса входит вся необходимая операционной системе информация о нем. Информация в этих блоках считывается и/или модифицируется почти каждым модулем операционной системы, включая те, которые связаны с планированием, распределением ресурсов, обработкой прерываний, а также осуществлением контроля и анализа. Можно сказать, что состояние операционной системы задается совокупностью управляющих блоков процессов.
Рассмотрим в связи с этим один из аспектов архитектур операционных систем. В состав операционной системы входит ряд программ, которым нужен доступ к блокам управления процессами. Предоставить прямой доступ совсем не трудно — каждому процессу присваивается свой уникальный идентификатор, который может быть использован в качестве индекса в таблице указателей на управляющие блоки процессов. Трудность состоит не в том, чтобы предоставить доступ, а в том, чтобы обеспечить защиту, и в связи с этим возникают две проблемы.
Ошибка в какой-нибудь подпрограмме (например, в обработчике прерываний) может привести к повреждению управляющего блока процесса, в результате чего система потеряет возможность управлять данным процессом.
Изменение структуры или семантики управляющего блока процесса может повлиять на ряд модулей операционной системы.
В качестве возможного способа решения этих проблем можно потребовать, чтобы выполнение всех действий с управляющими блоками осуществлялось операционной системой только через программу-обработчик, единственной задачей которой будет защита управляющего блока процесса и которая в единоличном порядке отвечает за чтение информации из этих блоков и запись информации в них. Целесообразность использования такой программы определяется тем, насколько она повлияет на производительность системы, а также степенью надежности остального программного обеспечения системы.