Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Министерство образования Российской Федерации
Томский политехнический университет
А.А. Дубаков
ОПЕРАЦИОННЫЕ СИСТЕМЫ
Учебное пособие
Томск 1999
УДК 681.325.5
Дубаков А.А. Операционные системы: Учебное пособие. - Томск:. Изд. ТПУ, 1999. 140 с.
Настоящее учебное пособие охватывает архитектуру и современные концепции и технологии проектирования операционных систем: управление процессами, работу с памятью, мультипроцессорные системы, управление устройствами, управление данными, безопасность систем. Изложение ведется в общем виде без привязки к какой - либо конкретной операционной системе. Рассмотрены наиболее распространенные и играющие важную роль в настоящее время операционные системы: UNIX, Windows NT.
Пособие подготовлено на кафедре “Оптимизации систем управления” ТПУ и предназначено для студентов Центра дистанционного образования по направлению “Информационные системы в экономике”.
Печатается по постановлению Редакционно-издательского Cовета Томского политехнического университета.
Рецензенты:
Ю.П. Ехлаков - профессор Томского университета систем управления и радиоэлектроники; доктор технических наук, зав. кафедрой автоматизации обработки экономической информации.
Н.Г. Марков профессор Томского политехнического университета; доктор технических наук, зав. кафедрой вычислительной техники.
Темплан 1999
Томский политехнический университет, 1999
сПИСОК ЧАСТО ИСПОЛЬЗУЕМЫХ СОКРАЩЕНИЙ
PC - персональный компьютер
АРI - программный интерфейс
АО - аппаратное обеспечение
БИС - большая интегральная схема
БнД - банк данных
БПО - базовое программное обеспечение
ВЗУ- внешнее запоминающее устройство
ВС - вычислительная система
ИПО - инструментальное программное обеспечение
ИС - интегральная микросхема
КПТО - комплекс программ технического обслуживания
МП - микропроцессор
НМЛ - накопитель на магнитной ленте
ОЗУ - оперативное запоминающее устройство
ОП - оперативная память
ОС - операционная система
ОСПО - общесистемное ПО
ПЗУ - постоянное запоминающее устройство
ППЗУ - перепрограммируемое ПЗУ
ППО - прикладное программное обеспечение
ПУ - периферийное устройство
РВ - разделение времени
РРВ - режим разделения времени
СБИС - сверхбольшая интегральная схема
СПО системное программное обеспечение
СРВ - система реального времени
СТО - система телеобработки
СУБД - система управления базами данных
УВВ - устройство ввода-вывода
ЦП - центральный процессор
введение
Нарастающие темпы компьютеризации уже приблизили время, когда в контакте с компьютерами оказываются не только относительно немногочисленные профессионалы по обработке информации, а практически все члены общества. Контакт с компьютером - это контакт с его программным обеспечением и, прежде всего, с операционной системой (ОС). Именно она формирует интерфейс между аппаратурой компьютера и человеком, причем задача создателей ОС состоит в том, чтобы сделать этот интерфейс, как теперь принято говорить, как можно более дружественным.
Свойства ОС зачастую оказываются не менее важными, чем свойства аппаратуры. Известны случаи, когда переход с одной ОС на другую на одной и той же машине приводил к пятикратному ускорению разработки программ.
На «голой» машине в современном мире не работает практически никто, и именно это определяет интерес к операционным системам.
В главе 1 вводится понятие «операционная система», приводятся факты из истории развития операционных систем и обсуждаются основные характеристики операционных систем. Глава 2 рассматривает архитектуру вычислительной системы и выделяет обобщенный состав и функции операционной системы. В главе 3 даются понятия процесса, перехода процесса из состояния в состояние, прерывания, переключения контекста, вводятся различные концепции, связанные с управлением процессами, и рассматривается организация прерываний в различных архитектурах ЭВМ. В главе 4 введено понятие асинхронности. Здесь обсуждаются проблемы, возникающие в случае совместного доступа к разделяемым ресурсам, а также описаны различные способы взаимоисключения, как аппаратные, так и программные, обеспечивающие решение этих проблем. Рассматриваются примитивы взаимоисключения, семафоры и мониторы, и то, каким образом их можно использовать для решения классических проблем параллелизма; приведено описание задачи «читатели и писатели», реализуемое при помощи рассмотренных средств. Здесь же объясняется, что такое тупик (дедлок), при котором выполнение различных процессов не может продолжаться, поскольку они ожидают событий, которые никогда не произойдут; представлены различные средства решения этой проблемы. В главе 5 обсуждаются различные проблемы управления памятью в системах физической (реальной) памяти, в главе 6 - виртуальной памяти. Прослеживается развитие систем реальной памяти - от систем, где вся память предоставлялась в распоряжение одного пользователя, до мультипрограммных систем с различными видами распределения памяти, описываются организация и управление виртуальной памятью. В главе 6 объясняется концепция виртуальной памяти и показано, каким образом благодаря применению методов поблочного отображения, страничной организации и сегментации памяти можно уменьшить объем информации отображения. Приводится подробное описание реализации виртуальной памяти и преобразования адресов в системах со страничной организацией и сегментацией памяти и обсуждаются различные стратегии управления системами виртуальной памяти. Рассматриваются стратегии вталкивания, размещения и выталкивания данных, причем обсуждаются стратегии вталкивания по требованию и упреждающего вталкивания. Основное внимание в этой главе уделяется стратегиям выталкивания (подкачки) страниц; рассматриваются принцип оптимальности и стратегии выталкивания страниц. В главе 7 обсуждаются понятия многозадачность и многонитевость и различия между ними, а также реализация многонитевой обработки и подкачка страниц памяти в операционной системе Windows 95/NT. В главе 8 речь идет об управлении процессорами, в частности, о проблемах планирования загрузки процессоров и о мультипроцессорном режиме. Основное внимание сосредоточено на стратегиях планирования; здесь обсуждается планирование на верхнем уровне, промежуточном и нижнем уровне, цели и критерии планирования, приоритетное планирование, статические и динамические приоритеты, «заслуженные» или «купленные» приоритеты, а также планирование по предельному сроку. Представлены различные алгоритмы планирования. Эта глава заканчивается анализом механизмов многоуровневых очередей с обратными связями. В главе 9 обсуждаются мультипроцессорные системы, разработанные как средство повышения производительности и надежности машин. Рассматривается использование достоинств параллелизма. Анализируются различные мультипроцессорные аппаратные архитектуры и варианты организации операционных систем, и архитектурные решения мультипроцессорных Flex/MP и TryFlex фирмы COMPAQ. В главе 10 рассматривается управление периферийными устройствами в различных архитектурах ЭВМ и организация программного обеспечения ввода-вывода. Глава 11 посвящена подсистеме управления данными. Рассматриваются логический и физический аспекты управления файлами, способы организации и управления внешней памятью. В главе 12 рассматриваются современные концепции и технологии проектирования операционных систем. Формулируются требования, предъявляемые к современным ОС, такие, как расширяемость, переносимость, совместимость, безопасность. Большое внимание уделяется описанию различных тенденций структурного построения ОС. Главы 13 и 14 описывают характеристики и области применения операционных систем UNIX и Windows NT, соответственно.
ГЛАВА 1
понятие и эволюция операционных систем
Операционная система неотъемлемая часть каждой современной ЭВМ и предназначена для организации и управления работой ЭВМ, в том числе:
ОС предоставляет пользователю некоторую расширенную или виртуальную машину, которую легче программировать и с которой легче работать, чем непосредственно с аппаратурой, составляющей реальную машину.
Основные функции управления:
1.1. Определение операционной системы
Это набор программ (обычных и микро), которые обеспечивают возможность использования аппаратуры компьютера. При этом аппаратура предоставляет сырую вычислительную мощность, а задача операционной системы состоит в предоставлении аппаратуры для пользователя в удобном для него виде.
Главные цели разработчиков операционной системы:
Современные вычислительные системы состоят из процессоров, памяти, таймеров, дисков, накопителей на магнитных лентах (МЛ), сетевой коммуникационной аппаратуры, принтеров и других устройств. Функцией ОС является распределение процессоров, памяти, устройств и данных между процессами, конкурирующими за эти ресурсы. ОС должна управлять всеми ресурсами вычислительной машины таким образом, чтобы обеспечить максимальную эффективность ее функционирования. Критерием эффективности может быть, например, пропускная способность или реактивность системы. Таким образом, ОС реализует:
Для реализации управления ресурсами разные ОС используют различные алгоритмы, что, в конечном счете, и определяет их облик в целом, включая характеристики производительности, область применения и даже пользовательский интерфейс. Так, например, алгоритм управления процессором в значительной степени определяет, является ли ОС системой разделения времени, системой пакетной обработки или системой реального времени.
1.2. История развития операционных систем
Поколения ОС, так же как и аппаратные средства отражают достижения в области электронных компонентов: 1-е поколение лампы, 2-е поколение транзисторы, 3-е поколение интегральные микросхемы (ИС), 4-е поколение - большие и сверхбольшие интегральные схемы БИС и СБИС. Поколения компьютеров отличаются:
Рассмотрим эволюцию операционных систем.
Нулевое поколение (40-е 50-е годы) ОС отсутствует. Полный доступ к ресурсам ЭВМ на машинном языке, все программы разрабатываются в двоичном коде. Этот период характеризуется высокой стоимостью приобретения и эксплуатации компьютеров и низкой стоимостью труда программистов. Компьютеры использовались в монопольном интерактивном режиме. Основная цель максимизировать использование аппаратного обеспечения. Основной режим работы компьютера простой и ожидание каких-либо действий программиста. При этом наблюдается недостаточное использование дорогостоящего вычислительного оборудования.
Первое поколение (60-е годы). Возникла система пакетной обработки. В каждый момент времени ЭВМ использовалась для решения одной прикладной программы. Пользователи уже не работают с ЭВМ на физическом уровне. Программы и данные принимает человек-оператор. Задание на обработку формируется в виде пакета, представляющего собой совокупность отдельных программ и данных, разделенных специальными символами. Пакет может быть составлен на перфокартах или МЛ. В машине постоянно находится управляющая программа, которая считывает последовательно пользовательские программы и данные из пакета и загружает их на выполнение. Результаты выводятся на внешнее устройство и составляют пакет результатов. Управляющая программа должна фиксировать время исполнения каждой программы, реагировать на определенные ситуации по управлению программами по мере их исполнения (прекращать выполнение). Другими словами, она должна выполнять внутрисистемные операции управления, которые пользователь осуществлял ранее на физическом уровне. Дополнительно эта программа должна автоматически переключать машину на исполнение программ из пакета по последовательной схеме (FIFO). Такую системную программу можно назвать простейшей ОС, обеспечивающей обработку программ в однопрограммном пакетном режиме.
Недостатки:
Этот недостаток однопрограммного режима был устранен в мультипрограммном пакетном режиме (1965-75 гг.) в ОС второго поколения. Главной целью и критерием эффективности систем пакетной обработки является максимальная пропускная способность, то есть решение максимального числа задач в единицу времени. Для этой цели в начале работы формируется пакет заданий, содержащих требования к системным ресурсам. Из этого пакета формируется мультипрограммная смесь из заданий, предъявляющих отличающиеся требования к ресурсам, для того, чтобы обеспечить сбалансированную нагрузку всех устройств ЭВМ. Так, например, в мультипрограммную смесь желательно вводить вычислительные задачи и задачи, интенсивно использующие ввод-вывод. В системах пакетной обработки переключение процессов с выполнения одной задачи на другую происходит только в том случае, если активная задача сама отказывается от процессора, например, для выполнения операции ввода/вывода, что делает невозможным выполнение интерактивных задач.
Особенностью этого поколения было и то, что ОС создавались как системы коллективного пользования с мультипрограммным режимом работы и как первые системы мультипроцессорного типа. В таких системах несколько пользовательских программ одновременно присутствуют в оперативной памяти компьютера, и центральный процессор (ЦП) динамически переключается с решения одной задачи на решение другой задачи. При этом появляется возможность одновременной загрузки ЦП и устройств ввода-вывода. В случае многопроцессорных систем единый вычислительный комплекс (ВК) содержит несколько процессоров, что повышает мощность вычислительной системы (ВС).
В то же время появились методы, обеспечивающие независимость программирования от внешних устройств. В программе необходимо указывать только тип устройства, а не программировать его физический адрес. Конкретный адрес устройства определялся в процессе выполнения программы. Это было серьезное достижение в развитии ОС.
В этот период были разработаны системы с разделением времени (РВ), предоставляющие пользователям возможность непосредственно взаимодействовать с компьютером при помощи терминалов телетайпного типа (электронная пишущая машинка, имеющая интерфейс с ЭВМ), а в последующем и с помощью дисплея. При работе с такими ОС используется диалоговый, или интерактивный режим. Каждому пользователю системы разделения времени предоставляется терминал, с которого он может вести диалог со своей программой. Пользователь вводит запрос, который обрабатывается, и ответ выводится на терминал, что позволяет увеличить эффективность и удобство работы пользователя. Пакетный режим обеспечивал увеличение пропускной способности и максимальную загрузку процессора, отлучая пользователя от ЭВМ, в то время как в режиме разделения времени (РРВ) каждый пользователь имеет непосредственный доступ к ЭВМ через свой терминал. Суть разделения времени максимально проста. Каждой программе, готовой к исполнению, для работы выделяется фиксированный, заранее определенный интервал времени, называемый квантом. Программа в течение одного кванта может быть не выполнена до конца, тогда она прерывается в момент окончания кванта и помещается в конец очереди. Из начала очереди извлекается другая программа, которой планируется фиксированный интервал. При этом ни один из пользователей, работающих за дисплеем параллельно друг с другом, никак не ощущает, что процессор мультиплексируется несколькими программами.
К этому же периоду относится появление первых систем реального времени (СРВ), в которых ЭВМ применяется для управления техническими объектами, такими, например, как станок, спутник, научная экспериментальная установка, или технологическими процессами, такими, как гальваническая линия, доменный процесс и т.п. Во всех этих случаях существует предельно допустимое время, в течение которого должна быть выполнена та или иная программа, управляющая объектом, в противном случае может произойти авария: спутник сойдет с орбиты, экспериментальные данные могут быть потеряны, толщина гальванического покрытия не будет соответствовать норме. Характерным для СРВ является обеспечение заранее заданных интервалов времени реакции на предусмотренные события для получения управляющего воздействия. Поскольку в технологических процессах промедление может привести к нежелательным и даже опасным последствиям, СРВ работают со значительной недогрузкой, так как важнейшей характеристикой является постоянная готовность системы ее реактивность.
Системное программное обеспечение (СПО) ОС этого периода решало множество проблем, связанных с защитой данных и результатов работы различных программ, защитой данных в оперативной памяти и распределением устройств. Кроме того, ОС должна управлять новыми устройствами, входящими в состав аппаратного обеспечения. Для решения этих задач системное программное обеспечение сформировалось в сложную систему, требующую для реализации своих возможностей значительных вычислительных ресурсов.
ОС третьего поколения (70-е-80-е гг.) были многорежимными системами, обеспечивающими пакетную обработку, разделение времени, режим реального времени и мультипроцессорный режим. Они были громоздкими, дорогостоящими («монстры» операционных систем). Например, стоимость разработки операционной системы OS/360 фирмой IBM соизмерима с затратами на реализацию американским национальным космическим агенством программы высадки человека на луну. Такие ОС, будучи прослойкой, между пользователем и аппаратурой ЭВМ, привели к значительному усложнению вычислительной обстановки. Для выполнения простейшей программы необходимо было изучать сложные языки управления заданием (JCL Job Control Language). К этому периоду относится появление вытесняющей многозадачности (Preemptive scheduling) и использование концепции баз данных для хранения больших объемов информации для организации распределенной обработки. Программисты перестали использовать перфокарты и магнитные ленты для хранения своих данных. Вводится приоритетное планирование (Prioritized scheduling) и выделение квот на использование ограниченных ресурсов компьютеров (процессорного времени, дисковой памяти, физической (оперативной) памяти). При использовании компьютеров широкое распространение получила концепция распределения времени (time sharing), но ограниченность ресурсов приводила к перегрузке компьютеров и к неприемлемому времени ожидания ответа или результатов работы. Программистам приходилось компенсировать это неудобство работой в ночное время.
Четвертое поколение с середины 70-х гг. Период характеризуется уменьшением стоимости компьютеров и увеличением стоимости труда программиста. Появление персональных компьютеров позволило установить компьютер практически каждому пользователю на рабочем столе. Благодаря широкому распространению вычислительных сетей и средств оперативной обработки (режим on-line), пользователи получают доступ к территориально распределенным компьютерам. Появились микропроцессоры, на основе которых создаются все новые и новые PC, которые могут быть использованы как автономно, так и в качестве терминалов более мощных вычислительных систем. При передаче информации по линиям связи усложняются проблемы защиты информации, шифрования данных. Возникло понятие сетевого компьютера (Network computer) , способного получать все ресурсы через компьютерную сеть. Понятие файловой системы распространяется на данные, доступные по различным сетевым протоколам.
Число людей, пользующихся компьютером, значительно возросло, что выдвигает требование дружественного интерфейса пользователя, ориентации на неподготовленного пользователя. Появились системы с управлением с помощью меню и элементов графического интерфейса. Начала широко распространяться концепция виртуальных машин. Пользователь более не заботится о физических деталях построения ЭВМ или сетей. Он имеет дело с функциональным эквивалентом компьютера, создаваемым для него ОС, представляющим виртуальную машину. Таким образом, возникла концепция виртуализации ресурсов ЭВМ.
Виртуальным ресурсом называется функциональный программно моделируемый эквивалент реального монопольного ресурса, допускающий его совместное использование многими процессами. Мультипрограммирование виртуализация центрального процессора. Буферный ввод-вывод виртуализация устройств ввода и вывода.
В настоящее время концепция виртуальных машин находит все большее распространение. Виртуальная машина это функциональный эквивалент реальной ЭВМ, обеспечивающий пользователей на основе одной ЭВМ множеством функционально эквивалентных ей ЭВМ.
Широкое внедрение получила концепция распределенной обработки данных. Развитием распределенной обработки данных стала технология Клиент - Сервер, в которой серверный процесс предоставляет возможность использовать свои ресурсы клиентскому процессу по соответствующему протоколу взаимодействия. Название сервера отображает вид ресурса, который предоставляется клиентским системам (сервер печати, сервер вычислений, сервер баз данных, сервер новостей, сервер FTP, сервер WWW и т.д.).
1.3. Основные характеристики ОС
Введем в рассмотрение ряд понятий. Вычислительный процесс представляет собой программу или задачу в стадии выполнения. Вычислительным ресурсом называется любой объект вычислительной системы, необходимый для выполнения процесса. Вычислительные ресурсы по способу возможного использования подразделяются на:
В мультипрограммных и мультипроцессорных системах требуется разделение всех ресурсов, что и породило их виртуализацию.
Особенности алгоритмов управления ресурсами. От эффективности алгоритмов управления локальными ресурсами компьютера во многом зависит эффективность всей ОС в целом. Поэтому, характеризуя ОС, часто приводят важнейшие особенности реализации функций ОС по управлению процессорами, памятью, внешними устройствами автономного компьютера. Так, например, в зависимости от особенностей использованного алгоритма управления процессором операционные системы делят на многозадачные и однозадачные, многопользовательские и однопользовательские, на системы, поддерживающие многонитевую обработку, и не поддерживающие ее, на многопроцессорные и однопроцессорные системы.
Поддержка многозадачности. По числу одновременно выполняемых задач операционные системы могут быть разделены на два класса:
однозадачные (например, MS-DOS, MSX) и
многозадачные (OC EC, OS/2, UNIX, Windows 95).
Однозадачные ОС в основном выполняют функцию предоставления пользователю виртуальной машины, делая более простым и удобным процесс взаимодействия пользователя с компьютером. Однозадачные ОС включают средства управления периферийными устройствами, средства управления файлами, средства общения с пользователем.
Многозадачные ОС, кроме вышеперечисленных функций, управляют разделением совместно используемых ресурсов, таких, как процессор, оперативная память, файлы и внешние устройства.
Поддержка многопользовательского режима. По числу одновременно работающих пользователей ОС делятся на:
однопользовательские (MS-DOS, Windows 3.x, ранние версии OS/2);
многопользовательские (UNIX, Windows NT).
Главным отличием многопользовательских систем от однопользовательских является наличие средств защиты информации каждого пользователя от несанкционированного доступа других пользователей. Следует заметить, что не всякая многозадачная система является многопользовательской, и не всякая однопользовательская ОС является однозадачной.
Вытесняющая и невытесняющая многозадачность. Важнейшим разделяемым ресурсом является процессорное время. Способ распределения процессорного времени между несколькими одновременно существующими в системе процессами (или нитями) во многом определяет специфику ОС. Среди множества существующих вариантов реализации многозадачности можно выделить две группы алгоритмов:
вытесняющая многозадачность (Windows NT, OS/2, UNIX);
невытесняющая многозадачность (NetWare, Windows 3.x).
Основным различием между вытесняющим и невытесняющим вариантами многозадачности является степень централизации механизма планирования процессов. В первом случае механизм планирования процессов целиком сосредоточен в операционной системе, а во втором - распределен между системой и прикладными программами. При невытесняющей многозадачности активный процесс выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст управление операционной системе для того, чтобы та выбрала из очереди другой готовый к выполнению процесс. При вытесняющей многозадачности решение о переключении процессора с одного процесса на другой принимается операционной системой, а не самим активным процессом.
Поддержка многонитевости. Важным свойством операционных систем является возможность распараллеливания вычислений в рамках одной задачи. Многонитевая ОС разделяет процессорное время не между задачами, а между их отдельными ветвями (нитями).
Многопроцессорная обработка. Другим важным свойством ОС является отсутствие или наличие в ней средств поддержки многопроцессорной обработки - мультипроцессирование. Мультипроцессирование приводит к усложнению всех алгоритмов управления ресурсами.
В наши дни становится общепринятым введение в ОС функций поддержки многопроцессорной обработки данных. Такие функции имеются в операционных системах Solaris 2.x фирмы Sun, Open Server 3.x компании Santa Crus Operations, OS/2 фирмы IBM, Windows NT фирмы Microsoft и NetWare 4.1 фирмы Novell.
Многопроцессорные ОС могут классифицироваться по способу организации вычислительного процесса в системе с многопроцессорной архитектурой: асимметричные ОС и симметричные ОС. Асимметричная ОС целиком выполняется только на одном из процессоров системы, распределяя прикладные задачи по остальным процессорам. Симметричная ОС полностью децентрализована и использует весь пул процессоров, разделяя их между системными и прикладными задачами.
Выше были рассмотрены характеристики ОС, связанные с управлением только одним типом ресурсов - процессором. Важное влияние на облик операционной системы в целом, на возможности ее использования в той или иной области оказывают особенности и других подсистем управления локальными ресурсами подсистем управления памятью, файлами, устройствами ввода-вывода.
Специфика ОС проявляется и в том, каким образом она реализует сетевые функции: распознавание и перенаправление в сеть запросов к удаленным ресурсам, передачу сообщений по сети, выполнение удаленных запросов. При реализации сетевых функций возникает комплекс задач, связанных с распределенным характером хранения и обработки данных в сети: ведение справочной информации обо всех доступных в сети ресурсах и серверах, адресация взаимодействующих процессов, обеспечение прозрачности доступа, тиражирование данных, согласование копий, поддержка безопасности данных.
1.4. Принципы построения ОС
ОС различаются по назначению, выполняемым функциям, формам реализации. Тем не менее в основу их создания заложены общие принципы.
ГЛАВА 2
АРХИТЕКТУРА ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЫ
Состав конкретной ОС во многом зависит от конкретной ориентации, сферы применения ОС. Современные ОС имеют подвижные границы и могут включать различные компоненты общесистемного программного обеспечения (ОСПО). Состав ОС в целом определяется современной архитектурой вычислительной системы (ВС), которая представляет собой иерархическую совокупность аппаратного обеспечения (АО) и программного обеспечения (ПО), реализующих процесс решения задач на ЭВМ. Каждый слой состоит из множества элементов и решает свои задачи.
АО определяет внешнюю архитектуру ЭВМ, в том числе:
В современной ЭВМ АО состоит из двух слоев:
В настоящее время каждый блок компьютера представляет собой микро-ЭВМ с некоторым функциональным набором команд (адаптер, контроллер, блок управления, блок сопряжения). Теперь для того, чтобы модифицировать функциональность компьютерного оборудования, можно перепрограммировать ПЗУ. Таким образом, можно изменить, например, базовую систему ввода/вывода (BIOS) IBM PC или протокол передачи данных модема.
Микропрограммная реализация ЭВМ обеспечивает:
Микропрограммный уровень, как правило, не доступен для ПО ВС и программируется с помощью программаторов (специальных устройств). Современные же ПЗУ (Flash ПЗУ) можно перепрограммировать с помощью пользовательской программы без использования специализированных устройств.
ПО специализирует АО на решение конкретных задач и состоит их четырех слоев. Базовое программное обеспечение (БПО) самый низкий уровень ПО ВС, который предназначается для обеспечения общего управления ЭВМ и организации работы всех системных и прикладных программ. В состав БПО включаются средства генерации ОС, управляющая программа, утилиты, комплекс программ технического обслуживания (КПТО).
Инструментальное программное обеспечение (ИПО) включает средства, предназначенные для автоматизации программирования:
ИПО включает системы программирования, редактирования текстов и отладки, редакторы исходных текстов, ассемблеры, компиляторы и интерпретаторы, редактор связей, абсолютный и перемещаемый загрузчик. Из числа этих средств общие для всех компоненты редактор связей и загрузчик, всегда включаются в состав ОС.
Задача редактора связей сборка модулей (частей программ), написанных в разное время и, возможно, разными людьми, на разных языках программирования, в единую программу.
Задача загрузчика размещение выполняемой программы в ОП и настройка перемещаемых (относительных) адресов констант по месту размещения.
Следует отметить, что трансляторы обычно не включаются в состав ОС и поставляются отдельно. Границу между ИПО и БПО трудно установить и они образуют общесистемное ПО (ОСПО). ОС MS DOS поставляется в составе:
ОС + утилиты + ASM + отладчик +редактор текстов + редактор связей.
Общесистемное программное обеспечение и аппаратное обеспечение образуют вычислительный комплекс.
Прикладное программное обеспечение (ППО) предназначается для автоматизации проектирования прикладных программных комплексов на основе универсальных программных средств, позволяющих решать целые классы задач.
ППО включает системы управления базами данных (СУБД) и Банков данных (БнД), системы телеобработки (СТО), различные объектно-проблемно-функционально-ориентированные пакеты прикладных программ (ППП), библиотеки программ, программные оболочки и т.д. Все они оформляются или поставляются в виде комплексов программных средств.
ППП это комплекс взаимосвязанных прикладных программ, позволяющих решать определенный класс задач. Следует отметить, что такие прикладные программы как СУБД, расширяют возможности систем управления данными ОС и СТО (системы телеобработки). Они объединяют информационно-программные ресурсы различных ЭВМ в единое целое и относятся по своему назначению к ОС и лишь их возникновение в более позднее время, в сравнении с ОС, относит их к ППО (хотя в современные версии ОС встраиваются средства работы в сети и СУБД).
Таким образом, граница между любыми уровнями ПС аморфна, так как в настоящее время существуют как сетевые ОС так и ОС интегрированные с СУБД.
Общая архитектура ВС представляет собой следующий комплекс (см. рис.2.1).
Приложение это программы и программные комплексы, решающие конкретные задачи, и обеспечивающие информационно вычисительные потребности конечных пользователей ВС, собственно то, ради чего создавалась ЭВМ.
Для работы с системными программами используются следующие языковые средства:
Рис.2.1. Архитектура ВС
Основным исполнительным компонентным ядром ОС, реализующим главное назначение ОС, - управление ресурсами ВС, является управляющая программа, общая структура и функции которой определяются обобщенной структурой вычислительного комплекса. Обобщенная структура управляющей программы имеет вид, представленный на рис. 2.2.
Структура ОС
В состав операционной системы входят следующие подсистемы:
Рис. 2.2. Обобщенная структура управляющей программы
Управление процессами
Процесс - это программа в стадии выполнения. Процессу необходимы определенные ресурсы, включая процессорное время, память, файлы и устройства ввода/вывода для выполнения своих задач. ОС отвечает за следующие действия в связи с управлением процессами:
Управление основной памятью
Память представляет собой большой массив слов или байт, каждый из которых имеет собственный адрес. Это хранилище данных, к которым обеспечивается быстрый доступ, распределенный между процессором и устройствами ввода/вывода. Основная память - энергозависимое устройство, которое теряет содержимое в случае выключения системы. ОС отвечает за следующие действия в связи с управлением памятью:
Управление внешней памятью
Поскольку основная память (первичная память) энергозависима и слишком мала для размещения всех данных и программ постоянно, ВС должна обеспечить вторичную память для сохранения основной памяти. Большинство современных ВС используют диски как средство оперативного хранения как программ, так и данных. ОС отвечает за следующие действия в связи с управлением внешней памятью:
Подсистема управления устройствами ввода/вывода
Подсистема ввода/вывода состоит из:
Подсистема управления файлами
Файл представляет собой набор взаимосвязанной информации, определенной при создании. Кроме собственно данных, файлы представляют программы, как в исходном, так и в объектном виде.
Подсистема ОС отвечает за следующие действия в связи с управлением файлами:
Защита системы
Защита системы предполагает наличие механизма для управления доступом программ, процессов и пользователей к системным и пользовательским ресурсам.
Механизм защиты должен:
Сетевое обеспечение
Распределенная система - набор процессоров, которые не распределяют память или каждый процессор имеет свою локальную память. Процессоры в системе соединены посредством компьютерной сети и обеспечивают пользователям доступ к различным системным ресурсам, позволяющим:
Командный интерфейс системы
Множество команд в ОС предназначено для выполнения функций управления, которые обеспечивают:
Программа, которая вводит и интерпретирует команды управления, в различных системах имет разные названия:
Функцией команды является прием и выполнение введенного утверждения.
Сервисы операционных систем:
Особенности методов построения
При описании операционной системы часто указываются особенности ее структурной организации и основные концепции, положенные в ее основу. К таким базовым концепциям относятся: способы построения ядра системы - монолитное ядро или микроядерный подход. Большинство ОС использует монолитное ядро, которое компонуется как одна программа, работающая в привилегированном режиме и использующая быстрые переходы с одной процедуры на другую, не требующие переключения из привилегированного режима в пользовательский, и наоборот. Альтернативой является построение ОС на базе микроядра, работающего также в привилегированном режиме и выполняющего только минимум функций по управлению аппаратурой, в то время как функции ОС более высокого уровня выполняют специализированные компоненты ОС - серверы, работающие в пользовательском режиме. При таком построении ОС работает более медленно, так как часто выполняются переходы между привилегированным режимом и пользовательским, зато система получается более гибкой - ее функции можно наращивать, модифицировать или сокращать, добавляя, модифицируя или исключая серверы пользовательского режима. Кроме того, серверы хорошо защищены друг от друга, как и любые пользовательские процессы.
Построение ОС на базе объектно-ориентированного подхода дает возможность использовать все его достоинства, хорошо зарекомендовавшие себя на уровне приложений, внутри операционной системы, а именно: аккумуляцию удачных решений в форме стандартных объектов; возможность создания новых объектов на базе имеющихся с помощью механизма наследования, хорошую защиту данных за счет их инкапсуляции во внутренние структуры объекта, что делает данные недоступными для несанкционированного использования извне, структуризированность системы, состоящей из набора хорошо определенных объектов.
Наличие нескольких прикладных сред дает возможность в рамках одной ОС одновременно выполнять приложения, разработанные для нескольких ОС.
Многие современные операционные системы поддерживают одновременно прикладные среды MS-DOS, Windows, UNIX (POSIX), OS/2 или хотя бы некоторое подмножество из этого популярного набора. Концепция множественных прикладных сред наиболее просто реализуется в ОС на базе микроядра, над которым работают различные серверы, часть которых реализует прикладную среду той или иной операционной системы.
Распределенная организация операционной системы позволяет упростить работу пользователей и программистов в сетевых средах. В распределенной ОС реализованы механизмы, которые дают возможность пользователю представлять и воспринимать сеть в виде традиционного однопроцессорного компьютера.
Характерными признаками распределенной организации ОС являются:
ГЛАВА 3
УПРАВЛЕНИЕ ПРОЦЕССАМИ
Подсистема управления процессами (УП) является наиболее интенсивно используемым компонентом ОС, входящим в состав ядра ОС, то есть резидентно размещенным в ОП и выполняющим следующие важнейшие функции:
Процессом называется программа в стадии или во время выполнения. В большинстве ОС процесс соответствует заданию пользователя. В системе существует одновременно много процессов. Даже в однопрограммной ОС существует системный и пользовательский процессы и можно выделить два типа состояний: пассивное и активное (пассивное, когда запуск не производится или работа завершена). В период своего существования процесс проходит через ряд дискретных состояний, подразделяющихся на основные и дополнительные состояния.
Основные состояния процесса:
Дополнительные состояния процесса:
Дополнительные состояния процессов кратковременны и обычно используются в ОС РВ (реального времени при перегрузках ЦП).
В однопроцессорных ЭВМ в каждый момент времени может выполняться только один процесс, и поэтому, когда один процесс активен, несколько процессов могут находиться в других состояниях, т.е. располагаться в соответствующих очередях (готовности, блокировки и др.). Очередью называется упорядоченный по приоритетам список процессов, ожидающих доступ к некоторому вычислительному ресурсу.
В ходе жизненного цикла каждый процесс переходит из одного состояния в другое в соответствии с алгоритмом планирования процессов, реализуемым в данной операционной системе. Диаграмма переходов процесса представлена на рис. 3.1.
Рис. 3.1. Диаграмма переходов процесса
Операции приостановки и возобновления играют важную роль в ОС РВ и используются в следующих случаях:
При приостановке процесс обязательно освобождает ОП, его копия сбрасывается на диск в специальный свопинг файл (swapping). Также могут быть освобождены и другие ресурсы.
Все смены состояний происходят по прерываниям.
Прерывание это событие/сигнал, привлекающий внимание ЦП и заставляющий его изменить текущий порядок исполнения команд процесса. Существуют аппаратные и программные прерывания.
Аппаратные прерывания инициируются аппаратурой (например, сигнал микросхемы таймера в IBM PC вырабатывается 18.2 раза в секунду), сигналом принтера, нажатием клавиш клавиатуры и многими другими причинами.
Программные прерывания инициируются процессом и на самом деле ничего не прерывают. Это обычные процедуры, которые используются программами для выполнения стандартной рутиной работы. Однако эти программы содержатся в ОС, и механизм прерываний дает возможность обратиться к ним из программ пользователей. Программные прерывания могут выдаваться внутри друг друга (быть вложенными). Например, аппаратные прерывания могут возникнуть при выполнении программных прерываний. Когда разрешенное прерывание вызывается, ЦП оставляет свою работу, выполняет прерывание, а затем возвращается в место прерывания. Управляет прерываниями обработчик прерываний (Interrupt Handler).
3.1. Операции над процессами
В соответствии с жизненным циклом процесса его выполнение может быть многократно прервано и продолжено. Для того, чтобы возобновить выполнение процесса, необходимо восстановить состояние его операционной среды. Состояние операционной среды отображается состоянием регистров и программного счетчика, режимом работы процессора, указателями на открытые файлы, информацией о незавершенных операциях ввода-вывода, кодами ошибок, выполняемых данным процессом системных вызовов, и т.д. Эта информация называется контекстом процесса.
Кроме этого, операционной системе для реализации планирования процессов требуется дополнительная информация: идентификатор процесса, состояние процесса, данные о степени привилегированности процесса, место нахождения кодового сегмента и другая информация. В некоторых ОС (например, в ОС UNIX) информацию такого рода, используемую ОС для планирования процессов, называют дескриптором или блоком управления процесса.
Дескриптор процесса по сравнению с контекстом содержит более оперативную информацию, которая должна быть легко доступна подсистеме планирования процессов. Контекст процесса содержит менее актуальную информацию и используется операционной системой только после того, как принято решение о возобновлении прерванного процесса.
Очереди процессов представляют собой дескрипторы отдельных процессов, объединенные в списки. Таким образом, каждый дескриптор, кроме всего прочего, содержит, по крайней мере, один указатель на другой дескриптор, соседствующий с ним в очереди. Такая организация очередей позволяет легко их переупорядочивать, включать и исключать процессы, переводить процессы из одного состояния в другое.
В этой связи подсистема управления процессом должна выполнять следующие операции над процессами:
Создание состоит из многих этапов:
В общем случае существующий процесс может породить новый процесс, и может иметь место иерархическая структура процессов. Задача может порождать подзадачу в мультипрограммном режиме, и в этом смысле мы имеем родительский и дочерний процессы.
Уничтожение процесса означает удаление его из системы. Ресурсы возвращаются системе, имя процесса удаляется из списка, блок управления процессом освобождается.
Блок управления процессом (Program Control Block PCB) является центральным объектом в ОС, который определяет процесс и содержит всю необходимую информацию о процессе.
PCB содержит определенные сведения.
Когда ОС переключает ЦП с процесса на процесс, используется область сохранения регистров в PСB, чтобы запомнить информацию, необходимую для возобновления процесса, когда он снова получит ЦП.
Обработка прерываний состоит в следующем:
3.2. Основная концепция обработки прерываний
В различных ЭВМ существует различный набор типов прерываний, которые можно разделить на 6 классов.
Планирование процессов включает в себя решение следующих задач:
Первые две задачи решаются программными средствами и будут рассмотрены в следующих разделах, а последняя выполняется, как правило, аппаратно.
3.3. Переключение контекста в EC ЭВМ
В основе процедуры переключения контекста лежит использование Program Status Word (PSW) или Слова Состояния Процесса (CCП) - это аппаратный регистр ЭВМ, который управляет работой активного процесса и содержит следующие данные:
Маска прерываний используется для запрещения определенных видов прерываний, когда осуществляется обработка текущего прерывания. Типы прерываний упорядочены по приоритетам. Определенный тип прерываний запрещает свой тип и младшие и разрешает старшие. ЦП реагирует только на разрешенные прерывания, обработка запрещенных прерываний либо задерживается, либо, в некоторых случаях, игнорируется.
В ЭВМ типа ЕС для работы с прерываниями используются 3 типа ССП, размещенных в фиксированных ячейках ОП.
Новое ССП для данного типа прерываний содержит постоянный адрес, по которому размещается обработчик прерываний данного типа.
Когда происходит разрешенное прерывание, осуществляется автоматическое переключение ССП следующим образом (рис.3.2):
Рис. 3.2. Переключение контекста
Аналогичная процедура происходит в MS DOS. С нулевого адреса ОП располагается таблица векторов прерываний.
Область векторов прерываний охватывает адреса от 0 до 3FFh в шестнадцатеричном исчислении. Каждый 4-х байтный участок этой области содержит адрес первой команды подпрограммы обработки прерываний (вектор прерываний), которая должна вызываться при возникновении прерывания конкретного типа (рис.3.3).
Рис. 3.3. Таблица вектора прерываний
Объем памяти векторов прерываний 256*4=1024 байт.
При возникновении прерываний ОС выполняет следующую последовательность операций:
Рис. 3.4 Регистр флагов состояний
Для работы с прерываниями используются следующие команды микропроцессора:
Sti - set interrupt (I=1, разрешить прерывание)
Cli - clear interrupt (I=0, запретить прерывание)
Если за командой CLI не следует STI, то машина “зависает”, так как клавиатура не реагирует на нажатие клавиш. Для программирования прерываний используется IMR - регистр маски прерываний.
Микросхема I8259 (устройство управления прерываниями) для I8086 имеет 8 уровней приоритетов (IRQ0 - IRQ7) (для старших моделей МП - 16).
Можно запретить аппаратные прерывания. Запрет (блокировка) может выполняться для ускорения критической части кода целиком.
Для маскирования аппаратного прерывания необходимо использовать порт 24H. В 1В устанавливаются биты, соответствующие номеру прерывания.
ГЛАВА 4.
УПРАВЛЕНИЕ АСИНХРОННЫМИ ПАРАЛЛЕЛЬНЫМИ
ПРОЦЕССАМИ
Процессам часто нужно взаимодействовать друг с другом, например, один процесс может передавать данные другому процессу, или несколько процессов могут обрабатывать данные из общего файла. Во всех этих случаях возникает проблема синхронизации процессов, которая может решаться приостановкой и активизацией процессов, организацией очередей, блокированием и освобождением ресурсов.
Одной из важных характеристик ОС является возможность одновременного выполнения взаимосвязанных процессов. Надо сказать, что в распараллеливании процессов состоит один из основных резервов повышения быстродействия и производительности ЭВМ.
Процессы называются параллельными, если они существуют одновременно. Одновременно выполняющиеся и не взаимосвязанные процессы называются параллельными процессами. Одновременно выполняющиеся, взаимодействующие и совместно использующие общие ресурсы, называются асинхронными параллельными процессами.
При управлении асинхронными параллельными процессами возникает две проблемы:
1. Проблема синхронизации параллельных процессов;
2. Проблема взаимной блокировки тупика («смертельное объятие»-deadlock)
Пример 1. Писатели читатели.
Пренебрежение вопросами синхронизации процессов, выполняющихся в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы. Рассмотрим, например, программу печати сообщений (принт-сервер) (рис.4.1).
Рис. 4.1. Кооперация программ при работе с общим ресурсом
Эта программа печатает по очереди все сообщения, которые последовательно в порядке поступления записывают в специальный общедоступный файл другие программы. Особая переменная N, также доступная всем процессам-клиентам, содержит номер первого свободного для записи сообщения. Процессы-клиенты читают эту переменную, записывают в соответствующую позицию сообщение и наращивают значение N на единицу.
Предположим, что в некоторый момент процесс R решил распечатать сообщение, для этого он прочитал значение переменной N (для определенности сделаем его равным 4). Процесс запомнил это значение, но поместить сообщение не успел, так как его выполнение было прервано (например, вследствие исчерпания кванта). Очередной процесс S, желающий распечатать сообщение, прочитал то же самое значение переменной N, поместил в четвертую позицию свое сообщение и нарастил значение переменной на единицу. Когда в очередной раз управление будет передано процессу R, то он, продолжая свое выполнение, в полном соответствии со значением текущей свободной позиции, полученным во время предыдущей итерации, запишет сообщение также в позицию 4, поверх сообщения процесса S. Таким образом, процесс S никогда не увидит свое сообщение распечатанным.
Особенности взаимодействия:
В связи с рассмотренной ситуацией важным понятием процессов является понятие "критическая секция" программы. Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным синхронизации. Чтобы исключить ситуацию, когда два или более процессов обрабатывают разделяемые данные, необходимо сделать так, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением.
Пример 2. Распределение ресурсов между параллельными процессами
Простая тупиковая ситуация возникает для группы общих ресурсов (тупик - "смертельное объятие"). Программа 1, захватив ресурс 1, для продолжения работы нуждается в ресурсе 2, который захватила и удерживает программа 2, для завершения работы которой, в свою очередь, требуется ресурс 1, удерживаемый программой 1 (рис.4.2).
Рис.4.2. Тупиковая ситуация
Таким образом, подсистема УП асинхронными параллельными процессами должна обеспечить решение двух следующих задач:
1. Синхронизацию и кооперирование процессов.
2. Предотвращение взаимной блокировки процессов по ресурсам.
Задача синхронизации АПП в ОС решается методом взаимоисключения процессов при выполнении их на критических участках. Для взаимоисключения процессов на критических участках используется три средства:
1. Примитивы взаимоисключения.
2. Семафоры.
3. Мониторы.
Примитивы взаимоисключения используются для обработки критических участков программы и определяются совокупностью логической переменной I, представляющей общий ресурс и принимающей два значения: 0 - свободен, 1 - занят, и командой TS, TS,I,B01 (проверить и установить).
а) читает логическую переменную I;
б) проверяет ее значение;
в) устанавливает новое значение I.
Следует заметить, что операция проверки и установки блокирующей переменной должна быть неделимой. Поясним это. Пусть в результате проверки переменной процесс определил, что ресурс свободен, но сразу после этого, не успев установить переменную в 0, был прерван. За время его приостановки другой процесс занял ресурс, вошел в свою критическую секцию, но также был прерван, не завершив работы с разделяемым ресурсом. Когда управление было возвращено первому процессу, он, считая ресурс свободным, установил признак занятости и начал выполнять свою критическую секцию. Таким образом, был нарушен принцип взаимного исключения, что потенциально может привести к нежелаемым последствиям.
Ниже в примере 3 перед входом в критическую секцию процесс проверяет, свободен ли ресурс. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной I устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом D, значение переменной I снова устанавливается равным 0.
Пример 3.
A. B.
Do while (TS I,B1) Do while (TS I,B1)
END END
<критический участок> <критический участок>
TS I,B0 TS I,B0
Обеспечивается исключительное право доступа к разделяемым ресурсам. При этом другим процессам приходится ожидать освобождения ресурса. Естественно, что процессы должны быстрее проходить критические участки и не должны блокироваться системой. Примитив взаимоисключения - самое простое решение.
Недостатки:
Для устранения расходования времени ЦП может быть использован так называемый аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по - своему, но в любом случае используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где x - идентификатор некоторого события. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(I), здесь I обозначает событие, заключающееся в освобождении ресурса I. Функция WAIT(I) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события I. Процесс, который в это время использует ресурс I, после выхода из критической секции выполняет системную функцию POST(I), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события I, в состояние ГОТОВНОСТЬ
Семафор развивает механизм примитивов и обобщает его. Автор
Е. Дейкстра. Семафор - это целочисленная неотрицательная переменная S счетчик ресурса, которую можно менять и опрашивать при помощи операций P и V, и очередь процессов к ресурсу Q(S). Над переменной определено три операции:
инициализация ресурса I(S) - задает число доступных ресурсов;
Операция P(S) выполняется следующим образом:
IF S>0 есть ресурс?
THEN S:=S-1 выдать ресурс
ELSE Q(S) ожидать очереди);
Операция V(S):
IF Q(S) очередь не пуста?
THEN вывести процесс из очереди выдать ресурс
ELSE S:=S+1 освободить ресурс;
Если семафор управляет одним ресурсом, то это двоичный семафор, и S принимает значение {0,1}. Если он управляет группой ресурсов, то в переменной S устанавливается число ресурсов. Для работы семафора необходимо один раз инициировать процесс и обрабатывать критические участки операциями P(S) и V(S).
Рассмотрим использование семафоров на классическом примере взаимодействия двух процессов, выполняющихся в режиме мультипрограммирования, один из процессов пишет данные в буферный пул, а другой считывает их из буферного пула. Пусть буферный пул состоит из N буферов, каждый из которых может содержать одну запись. Процесс "писатель" должен приостанавливаться, когда все буфера оказываются занятыми, и активизироваться при освобождении хотя бы одного буфера. Напротив, процесс "читатель" приостанавливается, когда все буферы пусты, и активизируется при появлении хотя бы одной записи.
Введем два семафора: e - число пустых буферов и f - число заполненных буферов. Предположим, что запись в буфер и считывание из буфера являются критическими секциями (как в примере с принт-сервером в начале данного раздела). Введем также двоичный семафор b, используемый для обеспечения взаимного исключения. Тогда процессы могут быть описаны следующим образом:
// Глобальные переменные
#define N 256
int e = N, f = 0, b = 1;
void Writer ()
{
while(1)
{
PrepareNextRecord(); /* подготовка новой записи */
P(e); /* Уменьшить число свободных буферов, если они есть */
/* в противном случае ждать, пока они освободятся */
P(b); /* Вход в критическую секцию */
AddToBuffer(); /* Добавить новую запись в буфер */
V(b); /* Выход из критической секции */
V(f); /* Увеличить число занятых буферов */
}
}
void Reader ()
{
while(1)
{
P(f); /* Уменьшить число занятых буферов, если они есть */
/* в противном случае ждать, пока они появятся */
P(b); /* Вход в критическую секцию */
GetFromBuffer(); /* Взять запись из буфера */
V(b); /* Выход из критической секции */
V(e); /* Увеличить число свободных буферов */
ProcessRecord(); /* Обработать запись */
}
}
Общая схема использования семафоров на критических участках для двух процессов приведена на рис.4.3.
Рис.4.3. Критические участки с использованием операций на семафоре
Достоинства использования операций на семафоре:
1.Пассивное ожидание (постановка в очередь и автоматическая выдача ресурсов).
2.Возможность управления группой однородных ресурсов.
Недостатки:
Неправильное либо умышленное использование операций на семафоре приводит к нарушению работоспособности параллельных систем.
Действительно, если в рассмотренном примере переставить местами операции P(e) и P(b) в программе "писатель", то при некотором стечении обстоятельств эти два процесса могут взаимно заблокировать друг друга. Так, пусть "писатель" первым войдет в критическую секцию и обнаружит отсутствие свободных буферов; он начнет ждать, когда "читатель" возьмет очередную запись из буфера, но "читатель" не сможет этого сделать, так как для этого необходимо войти в критическую секцию, вход в которую заблокирован процессом "писатель".
Монитор - это механизм организации параллелизма высокого уровня, который содержит множество переменных состояний, очередей и множество процедур, необходимых для реализации динамического распределения и доступа к общим ресурсам.
Монитор представляет собой централизованный семафор или совокупность семафоров, спрятанных от пользователей процессов в одном системном процессе, и потому, недоступным пользовательским программам, которые не могут их нарушить. Процессы, которые использует монитор для синхронизации, не имеют прямого доступа к переменным состояния, и могут воспользоваться ресурсами только путем вызова процедур монитора (или макрокоманд).
Монитор при создании автоматически инициирует число ресурсов и включает процедуры, позволяющие блокировать и активизировать процессы. Вход в монитор находится под жестким контролем системы и только через монитор осуществляется взаимоисключение процессов. Если процесс обращается к монитору и требуемый ресурс занят, то процесс переводится в состояние ожидания. Со временем некоторый процесс обращается к монитору для возвращения ресурса и монитор оповещает процесс о том, что может выделить ресурс и покинуть очередь. Режимом ожидания управляет сам монитор, который для гарантии получения ресурса процессом повышает приоритеты процессов критических областей. На рис.4.4 критический участок программируется в мониторе
Достоинства монитора:
Первая рассмотренная нами проблема, возникающая для асинхронных параллельных процессов, работающих с общим ресурсом - это проблема синхронизации процессов.
Рис. 4.4. Схема использования монитора
Вторая проблема - это проблема тупика, возникающая при выполнении асинхронных параллельных процессов, работающих с монопольными ресурсами (взаимоблокировка). Тупиком называется ситуация, когда процесс ждет наступления события (выделения ресурса), которое никогда не произойдет или может бесконечно откладываться.
Для возникновения тупика необходимо наличие 4-х условий:
1. Взаимоисключение, когда процессы требуют монопольного предоставления ресурса.
2. Ожидание дополнительного ресурса, когда процессы удерживают ресурсы и требуют дополнительных ресурсов.
3. Неперераспределяемости ресурсов, когда ресурсы нельзя отобрать у процессов до завершения их работы.
4. Кругового ожидания, когда существует кольцо процессов, удерживающих ресурсы друг друга.
Для решения проблемы тупиков должны выполняться определенные задачи:
1. Предотвращение тупиков.
Путем исключения одного из необходимых условий возникновения тупиков, кроме условий взаимоисключения (это объективное условие).
Путем обхода тупиков. Это решение основывается на том, что все процессы заранее указывают максимальное число требуемых ресурсов, и ОС контролирует возможность их совместного удовлетворения.
2. Обнаружение тупиков, когда возникающие тупики анализируются и прогнозируются с выдачей соответствующей информации операторам. Возможные тупики анализируются по графам распределения ресурсов. Существуют формальные, программно-реализованные методы распознавания тупиков, основанные на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки.
3. Восстановление после тупиков осуществляется путем вывода из системы одного или N процессов, вовлеченных в тупик и почти всегда с потерей полученных результатов работы. Не обязательно снимать с выполнения все заблокированные процессы. Можно снять только часть из них, при этом освобождаются ресурсы, ожидаемые остальными процессами, можно вернуть некоторые процессы в область свопинга, можно совершить "откат" некоторых процессов до так называемой контрольной точки, в которой запоминается вся информация, необходимая для восстановления выполнения программы с данного места. Контрольные точки расставляются в программе в местах, после которых возможно возникновение тупика.
В настоящее время проблема тупика является критическим фактором по следующим причинам:
ГЛАВА 5
УПРАВЛЕНИЕ ОСНОВНОЙ ПАМЯТЬЮ
Основная память (ОП), в которой размещаются процессы и которая имеет ограниченный объем, представляет собой самый ограниченный и дорогостоящий ресурс. Поэтому организация и управление ОП ЭВМ является одним из самых важных факторов, определяющих построение и развитие ОС.
Именно организация и управление ОП во многом определяют фактический уровень мультипрограммирования ОС, то есть возможность выполнения нескольких параллельных процессов.
Функциями ОС по управлению памятью являются: отслеживание свободной и занятой памяти, выделение памяти процессам и освобождение памяти при завершении процессов, вытеснение процессов из оперативной памяти на диск, когда размеры основной памяти не достаточны для размещения в ней всех процессов, и возвращение их в оперативную память, когда в ней освобождается место, а также настройка адресов программы на конкретную область физической памяти.
Основными задачами подсистемы управления памятью (УП) являются:
1.Эффективное размещение процессов в ОП.
2.Защита памяти процессов.
Основная цель УП - обеспечить максимальный уровень мультипрограммирования и, тем самым, максимальную загрузку ЦП.
Современные ЭВМ имеют 3-х уровневую иерархическую организацию запоминающих устройств (внутренние регистры процессора, различные типы сверхоперативной и оперативной памяти, диски, ленты), отличающихся средним временем доступа и стоимостью хранения данных в расчете на один бит (рис.5.1).
Рис.5.1. Иерархическая организация памяти ЭВМ
Пользователю хотелось бы иметь и недорогую, и быструю память. Кэш-память представляет некоторое компромиссное решение этой проблемы.
Кэш-память - это способ организации совместного функционирования двух типов запоминающих устройств, отличающихся временем доступа и стоимостью хранения данных, который позволяет уменьшить среднее время доступа к данным за счет динамического копирования в "быстрое" ЗУ наиболее часто используемой информации из "медленного" ЗУ. Кэш-памятью часто называют не только способ организации работы двух типов запоминающих устройств, но и одно из устройств - "быстрое" ЗУ.
Оно стоит дороже и, как правило, имеет сравнительно небольшой объем.. Важно, что механизм кэш-памяти является прозрачным для пользователя, который не должен сообщать никакой информации об интенсивности использования данных и не должен никак участвовать в перемещении данных из ЗУ одного типа в ЗУ другого типа, все это делается автоматически системными средствами.
Рассмотрим частный случай использования кэш-памяти для уменьшения среднего времени доступа к данным, хранящимся в оперативной памяти. Для этого между процессором и оперативной памятью помещается быстрое ЗУ, называемое просто кэш-памятью. В качестве такового может быть использована, например, ассоциативная память. Содержимое кэш-памяти представляет собой совокупность записей обо всех загруженных в нее элементах данных. Каждая запись об элементе данных включает в себя адрес, который этот элемент данных имеет в оперативной памяти, и управляющую информацию: признак модификации и признак обращения к данным за некоторый последний период времени.
В системах, оснащенных кэш-памятью, каждый запрос к оперативной памяти выполняется в соответствии со следующим алгоритмом:
Просматривается содержимое кэш-памяти с целью определения, не находятся ли нужные данные в кэш-памяти; кэш-память не является адресуемой, поэтому поиск нужных данных осуществляется по содержимому - значению поля "адрес в оперативной памяти", взятому из запроса.
Если данные обнаруживаются в кэш - памяти, то они считываются из нее, и результат передается в процессор. Если нужных данных нет, то они вместе со своим адресом копируются из оперативной памяти в кэш-память, и результат выполнения запроса передается в процессор. При копировании данных может оказаться, что в кэш-памяти нет свободного места, тогда выбираются данные, к которым в последний период было меньше всего обращений, для вытеснения из кэш-памяти. Если вытесняемые данные были модифицированы за время нахождения в кэш-памяти, то они переписываются в оперативную память. Если же эти данные не были модифицированы, то их место в кэш-памяти объявляется свободным.
На практике в кэш-память считывается не один элемент данных, к которому произошло обращение, а целый блок данных, это увеличивает вероятность так называемого "попадания в кэш", то есть нахождения нужных данных в кэш-памяти.
В реальных системах вероятность попадания в кэш составляет примерно 0,9. Высокое значение вероятности нахождения данных в кэш-памяти связано с наличием у данных объективных свойств: пространственной и временной локальности.
Пространственная локальность. Если произошло обращение по некоторому адресу, то с высокой степенью вероятности в ближайшее время произойдет обращение к соседним адресам.
Временная локальность. Если произошло обращение по некоторому адресу, то следующее обращение по этому же адресу с большой вероятностью произойдет в ближайшее время.
Все предыдущие рассуждения справедливы и для других пар запоминающих устройств, например, для оперативной памяти и внешней памяти. В этом случае уменьшается среднее время доступа к данным, расположенным на диске, и роль кэш-памяти выполняет буфер в оперативной памяти.
Физически ОП имеет линейную организацию и представляет собой последовательность адресуемых ячеек (байт, 1 байт = 8 бит) от 0 до N, которая делится на слова, блоки, сегменты. Номер является адресом ячейки памяти. Размер ОП определяется в килобайтах (1Кб=1024б), мегабайтах (1Мб=1024Кб), гигабайтах (1Гб=1024Мб), терабайтах (1Тб=1024 Гб) и т.д.
Слово- это единица обмена ОП с ЦП, определяемое разрядностью с ЦП.
Блок - это непрерывная область памяти с общим ключом защиты. В EC ЭВМ - размер блока 2К, поэтому процессом выдается память, кратная 2К.
Сегмент - это некоторый участок памяти (для IBM PC от 16б до 64Кб). Сегмент может содержать несколько блоков.
Для эффективного использования ОП необходимо определить стратегию управления памятью. ОС постоянно приходится решать задачу: когда, куда и за счет кого ввести в ОП процесс и данные. Существует три стратегии управления ОП:
1. Стратегия выборки - определяет, когда разместить в ОП очередной блок программы или данных:
а) выборка по запросу (требованию), когда очередной блок загружается по требованию процесса. При такой реализации невозможно в общем случае определить передачу управления в программе (настройка адресов должна быть выполнена после загрузки);
б) упреждающая выборка основана на свойствах последовательного выполнения программы и локальности циклов. В настоящее время это наиболее употребляемая стратегия.
2. Стратегия размещения, определяющая, куда помещать поступающую программу.
а) "первый подходящий" участок (эффективность по времени размещения);
б) "наиболее подходящий" участок (эффективность по объему);
в) "наименее подходящий" - странная стратегия со следующей аргументацией: после размещения процесса в больший свободный участок, оставшееся место также велико и может быть достаточно для размещения еще одной программы. Псевдоэффективность по мультипрограммированию.
3. Стратегия замещения определяет какой блок/сегмент программы или данных следует вытолкнуть из ОП для освобождения места для более приоритетных программ (в системах со свопингом). Естественно, что организация памяти тесно связана с мощностью ЦП, объемом ОП и режимом мультипрограммирования.
Существуют 4 вида организации реальной памяти:
1.Однопрограммная организация памяти с выделением непрерывной области одному пользователю. Это самая простая организация, которая использовалась на первых ЭВМ и на микро-ЭВМ, а также и на первых персональных компьютерах (PC) (рис. 5.2).
Рис. 5.2. Примеры организации памяти с выделением непрерывной области одному пользователю
Достоинства: простота защиты оперативной памяти. Для защиты требуется пара регистров, определяющих границы доступа ОП.
Недостатки: простаивает ЦП, а следовательно, и ОП, и устройства ввода/вывода. Неэффективное использование ЭВМ даже при наличии потока заданий, когда задания формируются в пакеты (режим PCP для ЕС ЭВМ).
2. Мультипрограммная организация с фиксированными разделами представлена на рис.5.3. ОП при загрузке ОС статически разбивается на ряд разделов фиксированного размера, в каждом из которых может выполняться одно задание (режим MFT OC в ЕС ЭВМ, MP∕Μ фирмы Digital Research для 8 и 16 разрядных процессоров Intel 8080, 8086).
Рис. 5.3. Мультипрограммная организация с фиксированными разделами
Задание (программа) может помещаться в любой свободный раздел, размер которого это допускает. Защита памяти осуществляется парой регистров для каждого раздела ОП.
Достоинства: большая загрузка ЦП и повышение пропускной способности ВС.
Недостатки:
1. Внешняя фрагментация, которая выражается в недостаточности разделов для больших программ, что требует перезагрузки ОС для назначения больших разделов.
2. Внутренняя фрагментация, при которой совокупная неиспользованная память может быть достаточной для выполнения программы, но разделена на несвязные участки и не может быть задействована для размещения процессов и данных.
3. Мультипрограммированная организация с переменными разделами, при которой ОП разделяется динамически между процессами по запросам заданий (программ) пользователей (рис.5.4).
Области памяти выделяются непрерывные из участков свободной памяти в соответствии с реализованными стратегиями размещения. При окончании заданий соседние свободные участки ОП объединяются. Защита памяти аналогичная режиму с фиксированными разделами.
Достоинства: повышается уровень мультипрограммирования, исчезает внутренняя фрагментация (выделяется памяти столько, сколько требуется).
Недостатки: внешняя фрагментация памяти - образование неиспользованных участков в целом может давать большие потери объема и мультипрограммирования
Рис. 5.4. Мультипрограммная организация с переменными разделами
.Проблема - совокупность свободных участков достаточна для выполнения программы, а поскольку они не смежные, то не могут быть использованы для размещения процессов или данных. Эта проблема в частности решается методом уплотнения памяти (“сборки мусора”). Такая процедура может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера. В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором - реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы представления в физическую должно выполняться динамически.
Недостатки этого метода:
а) используется время ЦП на уплотнение;
б) во время уплотнения ОС прекращает выполнение процессов пользователей (неприемлемо для СРВ).
Страничная организация памяти реализует концепцию несвязного распределения памяти ЭВМ и означает:
а) разделение ОП ЭВМ на блоки фиксированной длины размером от 1 до 4 Кб;
б) разделение адресного пространства программы загрузчиком на страницы фиксированного размера, равного длине блока;
в) динамически поблочно выделяется память программам в любом месте ЭВМ;
г) аппаратная поддержка соответствия номеров блоков ОП ЭВМ и страниц процесса по соответствующей таблице отображения страниц, пример которой приведен на рис.5.5.
Рис.5.5. Таблица отображения страниц (ТОС)
Достоинства:
1. Отсутствие внешней фрагментации (достаточно разделов для больших программ).
2. Внутренняя фрагментация ограничена размером блока ОП ЭВМ < 1 -4 Кб.
Общий итог развития форм организации реальной ОП - практически полная ликвидация фрагментации.
Общие недостатки реальной ОП:
(Физический) ограниченный объем реальной памяти и, соответственно, максимального объема выполняемой программы. Адресное пространство ЭВМ определяется разрядностью адресов, допустимых в архитектуре ЭВМ, а программа не может быть размером больше чем реальный объем ОП.
ЕC ЭВМ 24 - разрядные адресные регистры определяют допустимое адресное пространство размером 16 Мб, реально же устанавливается объем памяти 512 Кб - 8 Мб.
Pentium может адресовать своими 32-разрядными регистрами 4 Гб ОП, реально на компьютере устанавливается значительно меньший объем памяти (32-192 Мб). Нетрудно представить, какой огромный размер виртуальной ОП будет доступен с использованием анонсированного фирмой Intel 64-разрядного процессора Merced.
(Логический) неэффективное использование РОП ввиду необходимости загрузки в ОП задания пользователя целиком, в то время как 85% времени выполнения программ реализуется обычно 5-10% команд программ.
Все упомянутые проблемы привели к появлению концепции виртуальной памяти как воплощения идеи виртуализации ресурсов.
глава 6
УПРАВЛЕНИЕ ВИРТУАЛЬНОЙ ПАМЯТЬЮ
Уже достаточно давно пользователи столкнулись с проблемой размещения в памяти программ, размер которых превышал имеющуюся в наличии свободную память. Решением было разбиение программы на части, называемые оверлеями. Первым начинал выполняться 0-ой оверлей. Когда он заканчивал свое выполнение, он вызывал другой оверлей. Все оверлеи хранились на диске и перемещались между памятью и диском средствами операционной системы. Однако разбиение программы на части и планирование их загрузки в оперативную память должен был осуществлять программист.
Развитие методов организации вычислительного процесса в этом направлении привело к появлению метода, известного под названием виртуальная память. Виртуальным называется ресурс, который пользователю или пользовательской программе представляется обладающим свойствами, которыми он в действительности не обладает. Так, например, пользователю может быть предоставлена виртуальная оперативная память, размер которой превосходит всю имеющуюся в системе реальную оперативную память. Пользователь пишет программы так, как будто в его распоряжении имеется однородная оперативная память большого объема, но в действительности все данные, используемые программой, хранятся на одном или нескольких разнородных запоминающих устройствах, обычно на дисках, и при необходимости частями отображаются в реальную память
Итак, виртуальной памятью называется основная память процесса, адресное пространство которого соответствует диапазону непосредственной адресации системы команд ЭВМ и которая обычно не совпадает с объемом реальной памяти ЭВМ.
EC ЭВМ имеет 24 разрядную адресную шину, что позволяет адресовать 16 Мб оперативной памяти. Операционная система обеспечивает одновременную работу N процессам, выделяя каждому из них 16 Мб.
Начиная с процессоров Intel 386 (32 разрядный), для каждого процесса выделяется адресное пространство размером 4 Гб. При этом одновременно могут работать N процессов.
Управление виртуальной памятью имеет своей целью:
1. Обеспечить возможность создания и выполнения на ЭВМ программ максимально допустимого размера.
2. Облегчить жизнь программиста, сняв с него проблемы, связанные с ограниченным объемом реальной ОП (РОП).
3. Устранить временную фрагментацию, максимально эффективно используя ОП ЭВМ, которая образуется при отсутствии необходимого участка программы/данных в РОП и определяется временем, необходимым для размещения необходимых данных в РОП.
Суть концепции виртуальной памяти (ВП) заключается в том, что адресное пространство (АП) процесса отделяется от адресов реальной оперативной памяти и по необходимости динамически и по частям отображается в реальную память.
В ОС с реальной ОП привязка адресного пространства к реальным адресам осуществляется статически до выполнения программы на все время выполнения.
6.1. Концепция виртуальной памяти
В ВС с виртуальной памятью адресное пространство (АП) процесса (образ процесса) во время выполнения хранится во внешней памяти ЭВМ и загружается в реальную память по частям динамически, по необходимости, в любое свободное место РОП. Однако программа ничего не знает об этом, написана и выполняется так, как будто полностью находится в РОП.
Виртуальная память - это моделирование оперативной памяти во внешней памяти.
Механизм отображения виртуальных и реальных адресов устанавливает между ними соответствие и называется динамическим преобразованием адресов (ДПА) (рис.6.1).
Рис.6.1. Динамическое преобразование адресов
Компьютер здесь уже выступает как логическое устройство, а не физическая машина с уникальными характеристиками. ДПА поддерживается на аппаратно-микропрограммном уровне.
В МП Intel, начиная с 386 процессора, выполняется поддержка виртуальной памяти. Такая процедура выполняется для EC ЭВМ - ряд 2 и выше, для СМ ЭВМ- 1700, для IBM PC PC/386 и выше.
При управлении виртуальной памятью смежные виртуальные адреса не обязательно будут смежными реальными адресами (искусственная смежность). Программист освобождается от необходимости учитывать размещение своих процедур и данных в РОП. Он получает возможность писать программы наиболее естественным образом, прорабатывая лишь детали алгоритма и структуру программы, игнорируя конкретные особенности структуры аппаратных средств.
Механизм ДПА предполагает ведение таблиц, показывающих, какие ячейки ВП в текущий момент времени находятся в РОП и где именно. Поскольку индивидуальное отображение элементов информации (пословное или побайтовое) не имеет смысла (так как под таблицы отображения адресов потребовалось бы РОП больше, чем под процессы), то отображение адресов выполняется на уровне блоков ОП.
Проблема: какую часть процессов держать в ОП в некоторые моменты времени, выталкивая одни участки РОП и размещая другие.
Еще один вопрос, который необходимо решать: Каким сделать размер блока?
Увеличение размера блока приводит к уменьшению размера таблицы отображения блоков, но увеличивает время обмена и, наоборот, уменьшение размера блока приводит к увеличению таблиц и уменьшению времени обмена с внешней памятью. Блоки могут быть фиксированного размера (страницы) и переменного размера (сегменты). В этой связи существует четыре способа организации виртуальной памяти:
1. Динамическая страничная организация.
2. Сегментная организация.
3. Комбинированная сегментно-страничная организация.
4. Двухуровневая страничная организация.
Виртуальные адреса в страничных и сегментных системах являются двухкомпонентными и представляют собой упорядоченную пару (p,d), где p - номер блока (страницы либо сегмента), в которой размещается элемент, а d - смещение относительно начального адреса этого блока. Преобразование виртуального адреса V=(p,d) в адрес реальной памяти r осуществляется следующим образом (рис.6.2).
При активизации очередного процесса в специальный регистр процессора загружается адрес таблицы отображения блоков данного процесса. В соответствии с номером блока p из таблицы отображения блоков, считывается строка, в которой устанавливается соответствие между номерами виртуальных и физических страниц для страниц, загруженных в оперативную память, или делается отметка о том, что виртуальная страница выгружена на диск.
Рис. 6.2. Преобразование виртуального адреса в реальной адрес памяти
Кроме того, в таблице страниц содержится управляющая информация, такая, как признак модификации страницы, признак невыгружаемости (выгрузка некоторых страниц может быть запрещена), признак обращения к странице (используется для подсчета числа обращений за определенный период времени) и другие данные, формируемые и используемые механизмом виртуальной памяти. К считанному физическому адресу размещения выбранного блока добавляется размер смещения d и вычисляется требуемый реальный адрес.
Рассмотрим, в чем состоит стратегия управления виртуальной памятью. Аналогично управлению РОП, для управления ВП имеется три категории стратегий при имеющейся цели снизить ожидание страниц и располагать в РОП только используемые блоки.
Стратегия вталкивания, определяющая, когда следует переписать страницу или сегмент из внешней памяти в ОП.
а) вталкивание по запросу - система ожидает ссылки на страницу/сегмент от выполняющегося процесса (прерывание по отсутствию страницы);
аргументы «за»:
аргументы против:
б) упреждающее вталкивание предполагает, что система может предвидеть необходимость использования в дальнейшем страницы/сегмента. Если вероятность обращений высока и есть свободная ОП, то соответствующие блоки переписываются в ОП.
Достоинство: сокращается время ожидания.
В настоящее время быстродействие аппаратуры увеличивается, и неоптимальные решения не приводят к уменьшению эффективности вычислительных систем.
Стратегия размещения, определяющая, куда поместить поступающую страницу/сегмент. В страничных системах - тривиально: в любой свободный блок (страница имеет фиксированный размер). В сегментных системах те же самые стратегии, что и для реальной ОП (в первую подходящую область, в наиболее подходящую, в наименее подходящую).
Стратегия выталкивания (замещения), определяющая, какую страницу/сегмент удалить из ОП для освобождения места поступающей страницы.
Здесь основная проблема "пробуксовки", при которой вытолкнутая страница в следующий момент должна вновь размещаться в РОП.
Рассмотрим процедуры определения блоков для выталкивания из ОП.
а) выталкивание случайной страницы - в реальных системах не применяется;
б) выталкивание первой пришедшей страницы (FIFO First In First Out). Для ее реализации необходимо устанавливать временные метки страниц.
Аргумент: у страницы уже были возможности использовать свой шанс.
Фактически: большая вероятность заместить активно используемые страницы, поскольку присутствие страниц длительное время в ОП может означать, что к ним постоянно происходит обращение. Например, используемый редактор текстов.
в) выталкивание дольше всего неиспользованных страниц (NUR Not Used Resently).
Для реализации необходимо реализовать обновляемые временные метки. Эвристический аргумент: - недавнее прошлое - хороший ориентир на будущее.
Недостаток - существенные издержки: постоянное обновление временных меток.
г) выталкивание реже всего используемых страниц (RFU Rare Frequently Used) - предполагает наличие счетчиков страниц (менее интенсивно, нежели обновляемые временные метки). Интуитивно оправдано, но тоже может быть не рационально.
д) выталкивание не использующихся в последнее время страниц (LRU- Least Resently Used) - самый распространенный алгоритм с малыми издержками. Реализуется двумя аппаратными битами на страницу:
1. Признак обращения 0 - было
1 - не было.
2. Признак модификации записи 0 - неизменен.
1 - изменен.
Возможны следующие варианты комбинаций: {00,10,01,11}. Если изменений на странице не было, то страницу можно просто переписать, а не сохранять на диске.
6.2. Динамическая страничная организация
Динамическая страничная организация памяти - это страничная организация РОП с динамическим размещением страниц процессов по их запросам (Intel 386 размер страницы 4 Кб).
Достоинства:
Недостатки:
Для решения проблемы пробуксовки страниц важную роль играет не только стратегия выталкивания, но и размер страницы.
На выбор оптимального размера страницы влияют следующие факторы:
1. Малый размер приводит к увеличению таблицы отображения страниц, называемый табличной фрагментацией.
2. Большой размер страницы приводит к тому, что в ОП здесь помещены команды и данные, к которым не было обращений.
3. Ввод-вывод будет эффективен при больших размерах страниц.
4. Свойство локальности распространяется, как правило, на малые участки программ.
5. При малых размерах страниц потери на внутреннюю фрагментацию уменьшаются.
Вывод: необходимость небольших размеров страницы.
Экспериментальные результаты поведения программы в ВС со страничной организацией ВП показывают:
1. Когда процесс начинается выполняться, он обращается к большему проценту своих страниц.
2. При постоянном объеме выделенной ОП с увеличением размера страницы растет число прерываний по отсутствию нужной страницы.
3. С увеличением количества выделенных процессу блоков (страничных кадров) уменьшается число страничных прерываний, однако, когда процессу выделено достаточное число блоков, уменьшение прерываний стабилизируется (эффект насыщения).
4. Число команд, выполненных на странице до передачи управления другой странице, как правило, невелико.
6.3. Сегментная организация виртуальной памяти
В системе с сегментной организацией памяти снимается ограничение на фиксированный размер блока и выполняется соответствующее произвольное разбиение АП процесса на сегменты.
Сегмент - это единица логического разбиения программ (процедура, модуль, область данных), имеющая переменный размер и имя. Напомним, что страница - это физическая единица памяти.
Сегментная организация обеспечивает простое и естественное разделение общих сегментов между несколькими пользователями и защиту сегментов посредством связывания с ним прав доступа, подразделяющихся на:
Для сегментной организации в таблице отображения сегментов с каждым сегментом связан дескриптор, который содержит адрес размещения сегмента в ОП, его длину и права доступа (ERWA), признак обращения к сегменту за последний интервал времени, а также признак присутствия в РОП. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре.
В сегментной организации все сегменты имеют различный размер и могут размещаться в несмежных участках РОП.
Достоинства сегментной организации:
1. Уменьшение временной фрагментации, так как естественно учитывается свойство локальности программ.
2. Легко совмещается с использованием общих процессов, поскольку данные и программа целиком находятся в одном блоке.
3. Возможность обеспечить четкое управление доступом к сегменту со стороны общих процессов и их полную защиту.
Недостатки:
1. Более сложное управление и защита ОП. Здесь уже не достаточно пары граничных регистров, а необходимы ключи защиты индивидуальных сегментов памяти.
2. Может возникнуть временная фрагментация для больших размеров процедур и данных.
6.4. Комбинированная странично-сегментная организация памяти
Как видно из названия, данный метод представляет собой комбинацию страничного и сегментного распределения памяти и вследствие этого сочетает в себе достоинства обоих подходов. Виртуальное пространство процесса делится на сегменты, а каждый сегмент в свою очередь делится на виртуальные страницы, которые нумеруются в пределах сегмента. Оперативная память делится на физические страницы. Загрузка процесса выполняется операционной системой постранично, при этом часть страниц размещается в оперативной памяти, а часть - на диске. Для каждого сегмента создается своя таблица страниц, структура которой полностью совпадает со структурой таблицы страниц, используемой при страничном распределении. Для каждого процесса создается таблица сегментов, в которой указываются адреса таблиц страниц для всех сегментов данного процесса. Адрес таблицы сегментов загружается в специальный регистр процессора, когда активизируется соответствующий процесс.
Трехуровневая адресация использует две таблицы отображения (таблица сегментов + таблица страниц сегментов):
V=(S,P,d),
где S - номер сегмента; P- номер страницы; d - смещение.
Динамическое управление адресами здесь выполняется более сложно в два этапа, и поэтому в таких системах применяется высокоскоростная ассоциативная память, по типу кэш-памяти.
Обычная адресуемая память - это память, к которой обращаются по адресу и выбирают значение.
Ассоциативная память - это параллельная память, к которой осуществляется одновременный доступ по всем ячейкам памяти по значению и выбирается в результате либо адрес соответствующей ячейки, либо связанные с этой ячейкой другие значения.
В качестве примера использования ассоциативной таблицы на рис.6.3 представлена схема преобразования адреса на одном из этапов при комплексном использовании таблиц.
Рис.6.3. Преобразование адреса страницы при чисто ассоциативном отображении
Достоинства странично-сегментной организации:
6.5. Двухуровневая страничная организация
Двухуровневая страничная организация образуется из гиперстраниц, традиционно называющихся сегментами, которые в свою очередь подразделяются на страницы.
Виртуальный адрес состоит также состоит из трех компонентов (гиперстраница, страница, смещение).
Достоинства двухуровневой страничной организации:
Пример: ЕС ЭВМ ряд 2.
Страницы 2 - 4 Кб; гиперстраница 64 - 1024 Кб
В общем случае информация постоянно находится на более низком уровне иерархической структуры памяти, а механизм управления иерархией обеспечивает передачу на верхний уровень наиболее вероятной для обработки информации. В этом случае верхний уровень работает как кэш по отношению к нижнему уровню. Вначале идея кеширования памяти рассмаривалась применительно к взаимодействию между ЦП и ОП, а затем распространилась на все уровни иерархии памяти.
глава 7
МНОГОЗАДАЧНОСТЬ И многонитевость
7.1. Понятие многонитевости
Многозадачность является важнейшим свойством ОС. Для поддержки этого свойства ОС определяет и оформляет для себя те внутренние единицы работы, между которыми и будет разделяться процессор и другие ресурсы компьютера. Эти внутренние единицы работы в разных ОС носят разные названия - задача, задание, процесс, нить. В некоторых случаях сущности, обозначаемые этими понятиями, принципиально отличаются друг от друга.
Говоря о процессах, мы отмечали, что операционная система поддерживает их обособленность: у каждого процесса имеется свое виртуальное адресное пространство, каждому процессу назначаются свои ресурсы - файлы, окна, семафоры и т.д. Такая обособленность нужна для того, чтобы защитить один процесс от другого, поскольку они, совместно используя все ресурсы машины, конкурируют с друг другом.
В общем случае процессы принадлежат разным пользователям, разделяющим один компьютер, и ОС берет на себя роль арбитра в спорах процессов за ресурсы.
При мультипрограммировании повышается пропускная способность системы, но отдельный процесс никогда не может быть выполнен быстрее, чем если бы он выполнялся в однопрограммном режиме (всякое разделение ресурсов замедляет работу одного из участников за счет дополнительных затрат времени на ожидание освобождения ресурса). Однако задача, решаемая в рамках одного процесса, может обладать внутренним параллелизмом, который, в принципе, позволяет ускорить ее решение. Например, в ходе выполнения задачи происходит обращение к внешнему устройству, и на время этой операции можно не блокировать полностью выполнение процесса, а продолжить вычисления по другой "ветви" процесса.
Для этих целей современные ОС предлагают использовать сравнительно новый механизм многонитевой обработки (multithreading). При этом вводится новое понятие - "нить" (thread), а понятие "процесс" в значительной степени меняет смысл.
Мультипрограммирование теперь реализуется на уровне нитей, и задача, оформленная в виде нескольких нитей в рамках одного процесса, может быть выполнена быстрее за счет псевдопараллельного (или параллельного в мультипроцессорной системе) выполнения ее отдельных частей. Например, если электронная таблица была разработана с учетом возможностей многонитевой обработки, то пользователь может запросить пересчет своего рабочего листа и одновременно продолжать заполнять таблицу. Особенно эффективно можно использовать многонитевость для выполнения распределенных приложений, например, многонитевый сервер может параллельно выполнять запросы сразу нескольких клиентов.
Нити, относящиеся к одному процессу, не настолько изолированы друг от друга, как процессы в традиционной многозадачной системе, между ними легко организовать тесное взаимодействие. Действительно, в отличие от процессов, которые принадлежат разным, вообще говоря, конкурирующим приложениям, все нити одного процесса всегда принадлежат одному приложению, поэтому программист, пишущий это приложение, может заранее продумать работу множества нитей процесса таким образом, чтобы они могли взаимодействовать, а не бороться за ресурсы.
В традиционных ОС понятие "нить" тождественно понятию "процесс". В действительности часто бывает желательно иметь несколько нитей, разделяющих единое адресное пространство, но выполняющихся квазипараллельно, благодаря чему нити становятся подобными процессам (за исключением разделяемого адресного пространства).
Нити иногда называют облегченными процессами или мини-процессами. Действительно, нити во многих отношениях подобны процессам. Каждая нить выполняется строго последовательно и имеет свой собственный программный счетчик и стек. Нити, как и процессы, могут, например, порождать нити-потомки, могут переходить из состояния в состояние. Подобно традиционным процессам (то есть процессам, состоящим из одной нити), нити могут находиться в одном из следующих состояний: ВЫПОЛНЕНИЯ, ОЖИДАНИЯ и ГОТОВНОСТИ. Пока одна нить заблокирована, другая нить того же процесса может выполняться. Нити разделяют процессор так, как это делают процессы, в соответствии с различными вариантами планирования.
Однако различные нити в рамках одного процесса не настолько независимы, как отдельные процессы. Все такие нити имеют одно и то же адресное пространство. Это означает, что они разделяют одни и те же глобальные переменные. Поскольку каждая нить может иметь доступ к каждому виртуальному адресу, одна нить может использовать стек другой нити. Между нитями нет полной защиты, потому что, во-первых, это невозможно, а во-вторых, не нужно. Все нити одного процесса всегда решают общую задачу одного пользователя, и аппарат нитей используется здесь для более быстрого решения задачи путем ее распараллеливания. При этом программисту очень важно получить в свое распоряжение удобные средства организации взаимодействия частей одной задачи. Кроме разделения адресного пространства, все нити разделяют также набор открытых файлов, таймеров, сигналов и т.п.
Итак, нити имеют собственные:
Нити разделяют:
Многонитевая обработка повышает эффективность работы системы по сравнению с многозадачной обработкой. Например, в многозадачной среде Windows можно одновременно работать с электронной таблицей и текстовым редактором. Однако, если пользователь запрашивает пересчет своего рабочего листа, электронная таблица блокируется до тех пор, пока эта операция не завершится, что может потребовать значительного времени. В многонитевой среде в случае, если электронная таблица была разработана с учетом, предоставляемых программисту, возможностей многонитевой обработки, этой проблемы не возникает, и пользователь всегда имеет доступ к электронной таблице.
Некоторые прикладные задачи легче программировать, используя параллелизм, например задачи типа "писатель-читатель", в которых одна нить выполняет запись в буфер, а другая считывает записи из него. Поскольку они разделяют общий буфер, не стоит их делать отдельными процессами.
Другой пример использования нитей - это управление сигналами, такими, как прерывание с клавиатуры (del или break). Вместо обработки сигнала прерывания одна нить назначается для постоянного ожидания поступления сигналов. Таким образом, использование нитей может сократить необходимость в прерываниях пользовательского уровня. В этих примерах не столь важно параллельное выполнение, сколь важна ясность программы.
Наконец, в мультипроцессорных системах для нитей из одного адресного пространства имеется возможность организовать выполнение параллельно на разных процессорах. Это действительно один из главных путей реализации разделения ресурсов в таких системах.
С другой стороны, правильно сконструированные программы, которые используют нити, должны работать одинаково хорошо как на однопроцессорной машине в режиме разделения времени между нитями, так и в мультипроцессорных системах.
7.2. Реализация многонитевой обработки в WINDOWS 95
В операционной ситстеме Windows 95 понятию «нить» соответствует “поток,” и многонитевая обработка представляет собой многопоточную обработку. Подробнее рассмотрим, как выполняется многопоточная обработка и управление памятью в Windows 95.
Планировщик процессов Windows 95 отвечает за выделение системных ресурсов приложениям и другим процессам и за распределение времени.
В Windows 95 применяются кооперативная многозадачность (cooperative multitasking) и вытесняющая (preemptive multitasking).
В Windows 3.1 применяется только кооперативная многозадачность. ОС требовала, чтобы приложение периодически проверяло очередь сообщений и передавало управление другим приложениям. Этого обычно не происходило, и программы захватывали все процессорное время.
Кооперативный режим применяется в Windows 95 исключительно из соображений совместимости с Win - 16 - приложениями.
В Win-32 используется вытесняющая многозадачность. ОС сама решает, у какой программы отобрать управление и какой передать. В Win-32 приложение может использовать многопоточность, что упрощает реализацию одновременного исполнения нескольких программ..
Процесс состоит, как минимум, из одного потока. Поток - часть кода программы, которую можно использовать одновременно с другими частями кода.
В Win-32 можно инициировать несколько процессов, что позволяет улучшить рабочие характеристики приложений.
В Windows 95 каждое открытое окно - поток. И если выполняется копирование между двумя окнами папок,то оно выполняется потоком окна - приемника. При этом можно выполнять операции с другими окнами.
В текстовом процессоре для увеличения скорости обработки реализуется несколько потоков. Первый поток обрабатывает ввод с клавиатуры, другой - проверку орфографии, третий - фоновую печать и т. д.
7.3. Подкачка страниц памяти
Windows 95, как и Windows NT, использует виртуальную память с подкачкой страниц по запросам. Эта система базируется на линейной модели адресного пространства с применением 32-разрядной адресации.
Каждому процессу выделяется свое виртуальное адресное пространство размером 4 Гб. Верхнее (2 Гб) - резервируются системой. Нижнее (2 Гб) - отдаются программе. При этом все виртуальное АП (ВАП) разбивается на равные блоки или страницы.
Подкачка страниц по запросу (demand paging) перемещает пространство из физической памяти в страничные файлы на диске. Если процессу необходима какая-либо информация, то она перекачивается обратно в физическую память.
Блок подкачки памяти проецирует виртуальные адреса с адресного пространства процесса на физические страницы памяти компьютера. При этом физическая организация памяти скрыта от потоков процесса. Поэтому виртуальная память процесса представляется потоку куда проще, чем реальная организация физической памяти.
Для поддержки 16-разрядных программ Win 3.1 и MS DOS в архитектуре процессора intell используется механизм разбиения памяти на сегменты. Адрес ячейки памяти складывается из 16 - битного сегмента и 16-- битного смещения внутри сегмента. Поскольку размер сегмента всего 64 Kб, и приложения, и ОС должны тратить слишком много времени на вычисление физического адреса информации.
IBM 386 поддерживает линейную модель памяти для 32 - разрядных ОС и Win - 32 приложений. Модель линейной адресации упрощает разработку программ и устраняет недостатки, присущие архитектуре сегментированной памяти.
Виртуальная память - термин, указывающий на то, что ОС способна выделить, куда большие объемы, чем на самом деле имеется у компьютера. Каждому процессу представляется уникальное адресное пространство - набор адресов, доступных потокам данных процесса. Его размер 4Гб. Из них 2Гб резерв для самой системы. Размещение системных компонент представлено на рис. 7.1.
Рис. 7.1. Структура памяти Windows 95
глава 8
УПРАВЛЕНИЕ ПРОЦЕССОРАМИ И ЗАДАНИЯМИ В ОДНОПРОЦЕССОРНОМ ВЫЧИСЛИТЕЛЬНОМ КОМПЛЕКСЕ
Подсистемы управления процессорами и заданиями в ОС выполняют сходные функции: планирование загрузки процессоров и планирование загрузки вычислительных комплексов, имеют сходные механизмы планирования, работающие на разных уровнях - процессов и заданий пользователя соответственно.
В однопроцессорной ЭВМ подсистема управления процессорами выполняет единственную функцию - диспетчирования процессов, то есть планирует загрузку ЦП.
Подсистема управления заданиями управляет прохождением заданий в ВС и выполняет следующие функции:
1. Предоставление языковых средств управления работами в вычислительной системе (Job Control Language (JCL) в ОС ЕС ЭВМ, Shell в UNIX).
2. Ввод и интерпретация заданий/команд.
3. Выделение и освобождение необходимых ресурсов.
4. Планирование заданий на выполнение.
5. Сбор и предоставление информации о состоянии заданий.
В однопроцессорном вычислительном комплексе существует три основных уровня планирования:
1. Планирование на верхнем уровне или планирование заданий.
На этом уровне осуществляется выбор заданий пользователем для выполнения и их запуск. Выбранные задания становятся готовыми процессами. Эту работу выполняет системный компонент - планировщик заданий.
2. Планирование на нижнем уровне или диспетчирование процессов.
Здесь осуществляется выбор готового процесса для выполнения, то есть предоставление ему ЦП. Выбранный процесс становится активным. Эту работу выполняет системный компонент - диспетчер.
3. Планирование на промежуточном уровне.
На данном уровне определяется, каким процессам будет разрешено состязаться за захват ЦП, то есть быть готовыми, и какие процессы будут кратковременно приостановлены (задержаны) для оптимизации загрузки системы. Промежуточное планирование управляет текущей производительностью вычислительной системы.
В соответствии с тремя уровнями планирования, из которых два обязательны, существует двух и трехуровневые системы планирования.
Типичная двухуровневая система планирования представлена на рис.8.1.
Рис.8.1. Двухуровневая процедура планирования
Двухуровневая процедура вводится в системах с ограниченным мультипрограммированием, что определяется ограниченными ресурсами и производительностью вычислительной системы. Это основная схема для ВС с реальной ОП без поддержки систем реального времени (СРВ).
В вычислительных системах с ВП, допускающих неограниченный уровень мультипрограммирования и СРВ, требующих высокой реактивности системы, используется трехуровневая система планирования, представленная на рис.8.2.
Рис. 8.2. Трехуровневая система планирования
Эффективное планирование заданий и процессов является сложной проблемой, поскольку должно учитываться много противоречивых требований, таких, как:
Для того чтобы реализовать перечисленные требования, механизм планирования должен знать и учитывать следующие факторы:
Существует множество различных алгоритмов планирования процессов, преследующих различные цели и обеспечивающих различное качество мультипрограммирования. Среди этого множества алгоритмов рассмотрим подробнее две группы наиболее часто встречающихся алгоритмов: алгоритмы, основанные на приоритетах, и алгоритмы, основанные на квантовании.
В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если:
а) процесс завершился и покинул систему;
б) произошла ошибка;
в) процесс перешел в состояние ОЖИДАНИЕ;
г) исчерпан квант процессорного времени, отведенный данному процессу.
Процесс, который исчерпал свой квант, переводится в состояние ГОТОВНОСТЬ и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение, в соответствии с определенным правилом, выбирается новый процесс из очереди готовых. Таким образом, ни один процесс не занимает процессор надолго, поэтому квантование широко используется в системах разделения времени.
Кванты, выделяемые процессам, могут быть одинаковыми для всех процессов или различными. Кванты, выделяемые одному процессу, могут быть фиксированной величины или изменяться в разные периоды жизни процесса. Процессы, которые не полностью использовали выделенный им квант (например, из-за ухода на выполнение операций ввода-вывода), могут получить или не получить компенсацию в виде привилегий при последующем обслуживании.
По-разному может быть организована очередь готовых процессов: циклически, по правилу "первый пришел - первый обслужился" (FIFO) или по правилу "последний пришел - первый обслужился" (LIFO).
Многие современные системы планирования основываются на системе приоритетов, которая воплощается в соответствующих дисциплинах планирования. Приоритет - это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии.
Приоритеты подразделяются на статические, назначаемые извне системы администрацией ВЦ, и динамические, присваиваемые системой автоматически в соответствии с поведением, потребностями в ресурсах и прочими характеристиками процессов.
Начальные значения динамических приоритетов обычно устанавливаются на основе статического, но действуют в течение короткого времени. Существует две разновидности приоритетных алгоритмов: алгоритмы, использующие относительные приоритеты, и алгоритмы, использующие абсолютные приоритеты.
В обоих случаях выбор процесса на выполнение из очереди готовых осуществляется одинаково: выбирается процесс, имеющий наивысший приоритет. По-разному решается проблема определения момента смены активного процесса. В системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ОЖИДАНИЕ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности.
Во многих операционных системах алгоритмы планирования построены с использованием как квантования, так и приоритетов. Например, в основе планирования лежит квантование, но величина кванта и/или порядок выбора процесса из очереди готовых определяется приоритетами процессов.
Для установления значений приоритетов заданий и процессов используются следующие дисциплины планирования и их различные комбинации:
Приоритет =
Приоритет отдает меньшее предпочтение коротким заданиям и без предубеждения относится к длинным. Чем реже процесс получает ЦП, тем выше его приоритет. Задания с вводом/выводом повышают приоритет.
Сеть представляет собой упорядоченную структуру очередей готовых процессов, работающих с различными дисциплинами обслуживания. Каждый процесс входит в сеть очередей с конца верхней очереди и перемещается по FIFO пока не получит ЦП. Процесс выполняется. Если в течение кванта процесс запросил выполнение операции ввода/вывода, то он после завершения операции будет установлен в очередь готовых процессов текущего уровня.
Рис. 8.3. Сеть многоуровневых очередей
Если в течение выделенного кванта времени процесс не завершился, то он устанавливается в очередь готовых процессов следующего уровня, у которого понижен приоритет и увеличен квант времени. Таким образом, чем больше время работы процесса, тем больший квант времени выделяется, но меньше приоритет, что приводит к получению ЦП реже, но на более длительный период.
Таким образом, сеть многоуровневых очередей - это адаптивный механизм планирования, который реагирует на изменение поведения системы.
В ОС OS/2, UNIX приоритеты устанавливаются с помощью класса приоритета и уровня приоритета в классе. Есть три класса приоритета и 32 различных уровня приоритета для класса.
Существует три класса приоритета:
критический или высокий - для программ управления процессом или связью с другими компьютерами;
обыкновенный - для большинства программ пользователя;
запасной или низкий - задачи и процессы из этого класса выполняются, если в очереди нет критических или обыкновенных задач.
глава 9
УПРАВЛЕНИЕ ПРОЦЕССОРАМИ И ЗАДАНИЯМИ В
МУЛЬТИПРОЦЕССОРНЫХ ВЫЧИСЛИТЕЛЬНЫХ КОМПЛЕКСАХ
Современной тенденцией развития вычислительной техники является построение вычислительных комплексов, содержащих несколько ЦП, называемых мультипроцессорными вычислительными системами. Мультипроцессорная обработка это способ организации вычислений в системах с несколькими процессорами, при котором несколько задач (процессов, нитей) могут одновременно выполняться на разных процессорах системы.
Целью построения мультипроцессорных вычислительных систем является:
Существует два вида мультипроцессорных вычислительных систем:
Рис. 9.1. Системы со слабо связанными процессорами
Рис.9.2. Мультипроцессорная система
Мультипроцессорная организация системы приводит к усложнению всех алгоритмов управления ресурсами.
Например, необходимо планировать процессы не для одного, а для нескольких процессоров, что гораздо сложнее. Сложности возрастают при возрастании количества конфликтов по обращению к устройствам ввода/вывода, данным общей памяти и совместно используемым программам. Все эти проблемы должны решать ОС путем синхронизации, ведения очередей, планирования процессов.
Итак, в отличие от однопроцессорных ОС, подсистемы управления процессами и заданиями должны выполнять следующие основные функции:
- организацию взаимодействия центральных процессоров (синхронизация);
- управление загрузкой процессоров (диспетчирование).
Существует несколько способов взаимодействия ЦП:
В мультипроцессорных системах с подчиненными процессорами один ЦП является главным, остальные - подчиненными (ведущий - ведомые). Это самая простая организация не намного сложнее однопроцессорной системы. Операционная система выполняется только на главном процессоре. Этот ЦП осуществляет ввод - вывод и управляет загрузкой подчиненных процессоров. Подчиненные процессоры выполняют только программы пользователя. Узкое место - главный процессор. Он должен иметь большую мощность (производительность), чем подчиненные процессоры, чтобы последние не простаивали.
В мультипроцессорной системе с равноправными процессорами каждый ЦП имеет собственную ОС и управляет собственными ресурсами и устройствами ввода/вывода по типу многомашинных комплексов. В такой организации для управления всей системы существуют таблицы с глобальной системной информацией, доступ к которой строго контролируется методом взаимного исключения. Каждый ЦП берет из общей операции задание и выполняет его до завершения. Во время исполнения взаимодействие между ЦП не предусматривается. Данную систему характеризует высокая надежность, но не достаточно высокий уровень распараллеливания.
Симметричная организация мультипроцессорной системы наиболее сложна и эффективна. Здесь все ЦП - идентичны. Каждый из них может управлять работой любого периферийного устройства и обращаться к любому устройству памяти. В таких системах в общей области памяти существует две очереди: очередь готовых процессов и очередь готовых процессоров.
В любой момент времени любой готовый процесс может выполняться на любом готовом процессоре. Процессы во время своего исполнения мигрируют между ЦП. ОС также перемещается по процессорам, но в каждый момент времени может находиться только на одном процессоре.
Симметричное мультипроцессирование реализуется общей для всех процессоров ОС. Все процессы равноправно участвуют в управлении вычислительным процессом и в выполнении прикладных задач. Например, сигнал прерывания от устройства, на которое выводит данные прикладной процесс, выполняемый на некотором процессоре, может быть обработан совсем другим процессором.
Разные процессоры могут в какой-то момент времени выполнять как разные, так и одинаковые модули общей ОС. Для этого программные модули ОС должны обладать свойством повторной входимости реентерабельности. ОС полностью децентрализована. Освободившийся процессор сам запускает планировщик задач, который выбирает из общей системной очереди задачу для выполнения. Все ресурсы выделяются для задачи по мере потребности и не закрепляются за процессором. При таком подходе все процессоры работают с одной и той же динамически выравниваемой загрузкой. В решении одной задачи могут участвовать сразу несколько процессоров, если она допускает распараллеливание, например, путем предоставления нескольких нитей (потоков для WINDOWS NT фирмы Microsoft, UNIX - SOLARIS компании Sun, базирующийся на UNIX System V Release 4).
Достоинства этой организации:
Недостаток - возрастает число конфликтов по системному обслуживанию, так как ОС имеется только в одном экземпляре.
Фирма COMPAQ, сотрудничая с NOVELL, выпустила OS-NETWARE from COMPAQ. SCO UNIX оптимизирована под серверы COMPAQ и поддерживает многопроцессорность с помощью утилиты SCO MPX, которая эффективно использует симметричную многопроцессорную архитектуру.
Рассмотрим архитектуру двухпроцессорной вычислительной системы фирмы COMPAQ. В основу решения положены два принципа:
Первое - за счет наращивания разрядности шин. Второе - за счет кэширования. Первоначально IBM PC/XT/AT имели один 8/16 - разрядный канал передачи данных, к которому посредством шины подключались все основные компоненты системы: процессор, память, устройство ввода/вывода (рис. 9.3)
Рис.9.3 Архитектура однопроцессорной системы
По сути, канал представляет собой расширение шины процессора, и повышение производительности канала за счет применения новых, более быстродействующих процессоров оказалось невозможным из-за сохранения совместимости с существующими устройствами, рассчитанными на работу с 8 МГц шиной ISA. Шина стала «узким местом» и ограничивала скорость доступа ЦП к памяти.
Решение фирмы Сompaq
Разделение шины ЦП - память (что позволило повысить ее разрядность до 32) и шины ISA это является решением фирмы Compaq.Повысилась пропускная способность канала (CPU-RAM за счет применения внешней кэш - памяти для каждого процесса. Выборка команд из внешней кэш - памяти выполняется одновременно с передачей данных между ОЗУ и ВНУ в режиме прямого доступа к памяти (ПДП) в результате распараллеливания работы системы. Это условно симметричная многопроцессорная система, которая позволяет одинаково разделять задачи между процессорами. Асимметрия состоит в том, что аппаратные прерывания от ВНУ может воспринимать только один (первичный) процессор.
Развитием стало внедрение архитектуры Tri Flex, которая легла в основу Systempro/x2. Еще больше параллелизма и оптимизации проходимости каналов передачи между основными подсистемами компьютера. Выделены уже три отдельные высокоскоростные шины. Основной выигрыш производительности - за счет используемой 64 разрядной шины CPU.
Высокоэффективное кэш - ОЗУ (64 - разрядное.) минимизирует частоту обращения к основной памяти. Когда процессору понадобиться доступ к ней, в его распоряжении 128-разрядная шина (267 Мб/сек). Специальная схема контроллера (управление потоком данных) содержит 256 - разрядные многоступенчатые буферы, способные накапливать и самостоятельно осуществлять до 16 операций ввода/вывода по шине EISA (рис.9.4).
Рис. 9.4. Архитектура FLEX/MP
глава 10
УПРАВЛЕНИЕ ПЕРИФЕРИЙНЫМИ УСТРОЙСТВАМИ
Одной из главных функций ОС является управление всеми устройствами ввода-вывода компьютера. ОС должна передавать устройствам команды, перехватывать прерывания и обрабатывать ошибки; она также должна обеспечивать интерфейс между устройствами и остальной частью системы. В целях развития интерфейс должен быть одинаковым для всех типов устройств (независимость от устройств).
Подсистема управления периферийными устройствами (УПУ) предназначена для выполнения следующих функций:
10.1. Физическая организация периферийных устройств
В общем случае ПУ называют средство ввода/вывода, способное осуществлять передачу информации между ЦП или ОП компьютера и внешними носителями информации. Многообразие внешних носителей и способов кодирования информации обусловили существование большого числа периферийных различных устройств, каждое из которых характеризуется:
Внешние устройства состоят из механической и электронной компонент и критической для скорости является механическая часть.
Постоянная забота об эффективном использовании ЦП, снижении его простоев во время выполнения операций ввода/вывода привели к росту автономии устройств ввода/вывода и появлению специализированных процессоров ввода/вывода, называемых каналами (chanel).
Канал ввода/вывода (КВВ) - это специализированный процессор, осуществляющий обмен данными между ОП и ПУ и работающий независимо от ЦП. В системах ввода/вывода с каналами ЦП лишь запускает операцию ввода/вывода и по окончании ввода/вывода через прерывания от канала уведомляется об окончании операции ввода/вывода.
КВВ решают проблему согласования быстродействия ЭВМ и устройств ввода/вывода. Канал может управлять одним устройством с высокой пропускной способностью (типа дисковода) или быть распределенным между несколькими устройствами с меньшей пропускной способностью (это, например, модемы). Обычно к каналу подключается совокупность быстродействующих или медленно действующих устройств, которыми канал управляет поочередно или одновременно.
По способам параллельного выполнения запросов ЦП на ввод-вывод каналы ввода/вывода подразделяются на три типа:
1. Байт-мультиплексные каналы, допускающие одновременный побайтовый обмен с несколькими медленными устройствами.
2. Селекторные каналы, допускающие поочередный, быстрый обмен с ПУ блоками ввода/вывода, каждый из которых имеет свой адрес.
3. Блок-мультиплексные каналы, допускающие одновременный блочный обмен данными с несколькими устройствами.
Как мы уже замечали, КВВ решает только проблему различия быстродействия ПУ и ЦП. Для решения же проблемы стандартного интерфейса ПУ с внутрисистемной шиной (магистралью) ЭВМ предназначено устройство управления (УУ) ПУ, называемое контроллером или адаптером устройства.
Контроллер ПУ - устройство управления, обеспечивающее стандартный интерфейс и подключение ПУ к системным магистралям ЭВМ. Если интерфейс между контроллером и устройством стандартизован, то независимые производители могут выпускать совместимые как контроллеры, так и устройства.
Контроллеры бывают как групповые, так и одиночные. Групповые контроллеры обеспечивают подключение группы однотипных устройств. Такие контроллеры обеспечивают в каждый момент времени передачу информации с одним устройством с одновременным выполнением других операций, не связанных с передачей данных, других устройств (например, перемотку магнитной ленты, перемещение головки НМД).
Разделение функций между контроллером и периферийным устройством зависит от типа ПУ: логические функции (соединение и синхронизация операций, передача сигналов об окончании операции или исключительных ситуациях) выполняются контроллером, а физические (передача данных) - периферийным устройством.
Операционная система обычно взаимодействует не с устройством, а с контроллером. Контроллер, как правило, выполняет простые функции, например, преобразует поток бит в блоки, состоящие из байт, и осуществляют контроль и исправление ошибок. Каждый контроллер имеет несколько регистров, которые используются для взаимодействия с центральным процессором. В некоторых компьютерах такие регистры являются частью физического адресного пространства, а специальные операции ввода-вывода отсутствуют. В других компьютерах адреса регистров ввода-вывода, называемых часто портами, образуют собственное адресное пространство за счет введения специальных операций ввода-вывода:
ОС выполняет ввод-вывод, записывая команды в регистры контроллера. Например, контроллер гибкого диска IBM PC принимает 15 команд, таких, как READ, WRITE, SEEK, FORMAT и т.д. Когда команда принята, процессор оставляет контроллер и занимается другой работой. При завершении команды контроллер организует прерывание для того, чтобы передать управление процессору операционной системы, которая должна проверить результаты операции. Процессор получает результаты и статус устройства, читая информацию из регистров контроллера.
В настоящее время распространены три основные схемы организации ввода/вывода, соответствующие конфигурациям микро-, мини- и больших ЭВМ (рис. 10.1, 10.2, 10.3 соответственно).
Рис. 10.1. Схема организации ввода/вывода для персональных ЭВМ
В этой конфигурации шина разделяется между различными устройствами и выполняется побайтная передача информации между ЦП и памятью. Оперативная память подключается непосредственно на магистраль.
УПДП - устройство прямого доступа памяти (DMA-direct memory access) обеспечивает пересылку блоков данных независимо от ЦП и упрощает канал ввода/вывода.
На больших ЭВМ контроллер может быть связан с несколькими каналами ввода/вывода, а периферийное устройство - с несколькими контроллерами.
Контроллер также может иметь несколько адресов и путей доступа.
Адресация периферийных устройств на больших ЭВМ осуществляется составным адресом, включающим: номер канала, номер котроллера, номер устройства на контроллере:
0 0 F
№ канала №контр. № устройства.
В мини- и микро-ЭВМ для адресации устройств используются зарезервированные ячейки памяти.
Доступ к периферийным устройствам здесь осуществляется как обычный доступ к ячейкам ОП, что значительно упрощает программирование ввода/вывода.
Рис. 10.2. Схема организации ввода/ вывода для мини ЭВМ
Рис. 10.3. Схема организации ввода/вывода для многомашинного
комплекса
10.2. Организация программного обеспечения ввода-вывода
Основная идея организации программного обеспечения ввода-вывода состоит в разбиении его на несколько уровней, причем нижние уровни обеспечивают экранирование особенностей аппаратуры от верхних, а те в свою очередь обеспечивают удобный интерфейс для пользователей.
Ключевым принципом является независимость от устройств. Вид программы не должен зависеть от того, читает ли она данные с гибкого диска или с жесткого диска. Очень близкой к идее независимости от устройств является идея единообразного именования, то есть для именования устройств должны быть приняты единые правила.
Другим важным вопросом для программного обеспечения ввода-вывода является обработка ошибок. Вообще говоря, ошибки следует обрабатывать как можно ближе к аппаратуре. Если контроллер обнаруживает ошибку чтения, то он должен попытаться ее скорректировать. Если же это ему не удается, то исправлением ошибок должен заняться драйвер устройства. Многие ошибки могут исчезать при повторных попытках выполнения операций ввода-вывода, например, ошибки, вызванные наличием пылинок на головках чтения или на диске. И только если нижний уровень не может справиться с ошибкой, он сообщает об ошибке верхнему уровню.
Еще один ключевой вопрос - это использование блокирующих (синхронных) и неблокирующих (асинхронных) передач. Большинство операций физического ввода-вывода выполняется асинхронно - процессор начинает передачу и переходит на другую работу, пока не наступает прерывание. Пользовательские программы намного легче писать, если операции ввода-вывода блокирующие - после команды READ программа автоматически приостанавливается до тех пор, пока данные не попадут в буфер программы. ОС выполняет операции ввода/вывода асинхронно, но представляет их для пользовательских программ в синхронной форме.
Последняя проблема состоит в том, что одни устройства являются разделяемыми, а другие - выделенными. Диски - это разделяемые устройства, так как одновременный доступ нескольких пользователей к диску не представляет собой проблему. Принтеры - это выделенные устройства, потому что нельзя смешивать строчки, печатаемые различными пользователями. Наличие выделенных устройств создает для операционной системы некоторые проблемы. Для решения поставленных проблем целесообразно разделить программное обеспечение ввода-вывода на четыре слоя:
Независимый от устройств слой операционной системы
Это компонент представляет собой супервизор ввода/вывода, через который процессы пользователя получают доступ к операциям ввода/вывода.
Точная граница между драйверами и независимыми от устройств программами определяется системой, так как некоторые функции, которые могли бы быть реализованы независимым способом, в действительности выполнены в виде драйверов для повышения эффективности или по другим причинам.
Типичными функциями для независимого от устройств слоя являются:
Остановимся на некоторых функциях данного перечня. Верхним слоям программного обеспечения неудобно работать с блоками разной величины, поэтому данный слой обеспечивает единый размер блока, например, за счет объединения нескольких различных блоков в единый логический блок. В связи с этим верхние уровни имеют дело с абстрактными устройствами, которые используют единый размер логического блока независимо от размера физического сектора.
При создании файла или заполнении его новыми данными необходимо выделить ему новые блоки. Для этого ОС должна вести список или битовую карту свободных блоков диска. На основании информации о наличии свободного места на диске может быть разработан алгоритм поиска свободного блока, независимый от устройства и реализуемый программным слоем, находящимся выше слоя драйверов.
Обработка прерываний
Прерывания должны быть скрыты как можно глубже в недрах операционной системы, чтобы как можно меньшая часть ОС имела с ними дело. Наилучший способ состоит в разрешении процессу, инициировавшему операцию ввода-вывода, блокировать себя до завершения операции и наступления прерывания. Процесс может блокировать себя, используя, например, вызов DOWN для семафора, или вызов WAIT для переменной условия, или вызов RECEIVE для ожидания сообщения. При наступлении прерывания процедура обработки прерывания выполняет разблокирование процесса, инициировавшего операцию ввода-вывода, используя вызовы UP, SIGNAL или посылая процессу сообщение. В любом случае эффект от прерывания будет состоять в том, что ранее заблокированный процесс теперь продолжит свое выполнение.
Драйверы устройств
Драйвером устройства называется программа управления функционированием периферийными устройствами, которая выполняет следующие функции:
Весь зависимый от устройства код помещается в драйвер устройства. Каждый драйвер управляет устройствами одного типа или, может быть, одного класса. В операционной системе только драйвер устройства знает о конкретных особенностях какого-либо устройства. Например, только драйвер диска имеет дело с дорожками, секторами, цилиндрами, временем установления головки и другими факторами, обеспечивающими правильную работу диска.
Драйвер устройства принимает запрос от супервизора или программного слоя и решает, как его выполнить. Типичным запросом является чтение n блоков данных. Если драйвер был свободен во время поступления запроса, то он начинает выполнять запрос немедленно. Если же он был занят обслуживанием другого запроса, то вновь поступивший запрос присоединяется к очереди уже имеющихся запросов, и он будет выполнен, когда наступит его очередь. С точки зрения пользователя, драйверы являются невидимыми, так как пользователи получают доступ к вводу/выводу через супервизор с применением функций и команд ввода/вывода используемых систем программирования.
Первый шаг в реализации запроса ввода-вывода, например, для диска, состоит в преобразовании его из абстрактной формы в конкретную. Для дискового драйвера это означает преобразование номеров блоков в номера цилиндров, головок, секторов, проверку, работает ли мотор, находится ли головка над нужным цилиндром. Короче говоря, он должен решить, какие операции контроллера нужно выполнить и в какой последовательности.
После передачи команды контроллеру драйвер должен решить, блокировать ли себя до окончания заданной операции или нет. Если операция занимает значительное время, как при печати некоторого блока данных, то драйвер блокируется до тех пор, пока операция не завершится, и обработчик прерывания не разблокирует его. Если команда ввода-вывода выполняется быстро (например, прокрутка экрана), то драйвер ожидает ее завершения без блокирования. Драйверы могут работать с периферийными устройствами тремя основными способами:
По опросу готовности драйвер выполняет следующие действия:
По опросу готовности реализуется синхронный ввод-вывод, при котором отсутствует параллелизм между обработкой и передачей информации. ЦП находится в активном ожидании завершения операции ввода/вывода. Такой способ работы драйверов используется в однопрограммных однопользовательских ОС.
Достоинство - простота. Недостаток - синхронный ввод-вывод, отсутствие параллелизма между вводом/выводом и обработкой.
При работе по прерываниям действия выполняются в следующей последовательности:
Достоинство - асинхронный ввод-вывод, то есть параллельная работа ЦП и ПУ. Используется в мультипрограммных системах.
При работе по прямому доступу к памяти (ПДП) (Direct Memory Access-DMA)действия выполняются в следующем порядке:
Пользовательский слой программного обеспечения
Хотя большая часть программного обеспечения ввода-вывода находится внутри ОС, некоторая его часть содержится в библиотеках, связанных с пользовательскими программами. Системные вызовы, включающие вызовы ввода-вывода, обычно делаются библиотечными процедурами. Если программа, написанная на языке С, содержит вызов count = write (fd, buffer, nbytes), то библиотечная процедура write будет связана с программой. Набор подобных процедур является частью системы ввода-вывода. В частности, форматирование ввода или вывода выполняется библиотечными процедурами. Примером может служить функция printf языка С, которая принимает строку формата и, возможно, некоторые переменные в качестве входной информации, затем строит строку символов ASCII и делает вызов write для вывода этой строки. Стандартная библиотека ввода-вывода содержит большое число процедур, которые выполняют ввод-вывод и работают как часть пользовательской программы.
Другой категорией программного обеспечения ввода/вывода является подсистема спулинга (spooling). Спулинг - это способ работы с выделенными устройствами в мультипрограммной системе. Рассмотрим типичное устройство, требующее спулинга - строчный принтер. Хотя технически легко позволить каждому пользовательскому процессу открыть специальный файл, связанный с принтером, такой способ опасен из-за того, что пользовательский процесс может монополизировать принтер на произвольное время. Вместо этого создается специальный процесс - монитор, который получает исключительные права на использование этого устройства. Также создается специальный каталог, называемый каталогом спулинга. Для того чтобы напечатать файл, пользовательский процесс помещает выводимую информацию в этот файл и помещает его в каталог спулинга. Процесс-монитор по очереди распечатывает все файлы, содержащиеся в каталоге спулинга.
В ОС MS-DOS стандартный набор ПУ поддерживается базовой системой ввода/вывода (БСВВ), расположенной в ПЗУ, в числе прочих задач выполняет функции обслуживания системных вызовов и прерываний. Дополнительные устройства MS-DOS поддерживаются модулем расширенной системы ввода/вывода, посредством перечисления в файле конфигурации CONFIG.SYS дополнительных драйверов в формате команды
DEVICE = путь имя файла параметры.
глава 11
ПОДСИСТЕМА УПРАВЛЕНИЯ ДАННЫМИ
Система управления данными играет центральную роль в ОС, поскольку она должна управлять и хранить информацию и программы, принадлежащие как пользователям, так и самой системе. Причем, с концептуальной точки зрения, целесообразно не различать хранимую информацию и периферийные устройства как источники или получатели информации во время выполнения программы, что тесно связывает систему управления данными (СУД) с системой управления вводом/выводом (СУВВ) в единое целое. Здесь имеется в виду обеспечение возможности взаимодействовать с устройствами ввода/вывода как с файлами.
Основными понятиями СУД являются файл, том и каталог. Причем существует логический и физический аспект этих понятий.
Логический файл - это организованная совокупность однородных элементов информации или однотипных записей для хранения информации в ИВС, которой присвоено имя.
Физический файл - это область внешней памяти, хранящей информацию, и дескриптор файла, используемый для доступа к файлу и хранящий данные о физическом размещении и характеристиках файла.
Файл состоит из записей или последовательности байт. Запись содержит информацию о свойствах одного объекта, значение которого определяется в виде полей (атрибутов). Одно или несколько полей записи, однозначно идентифицирующих запись файла, образуют ключ записи.
Сменяемое устройство внешней памяти, используемое для хранения информации, называется томом памяти. Чтобы получить доступ к информации, нужно установить том на соответствующее периферийное устройство, связать его с СУД, указать ОС метку - имя тома.
Сменные тома позволяют:
Примерами томов являются: МЛ - тома с последовательным доступом и МД, дискеты - тома с прямым доступом.
Сменный том в целях безопасности и удобства должен:
В соответствии с этим тома прямого доступа (ТПД) имеют:
Логическим или виртуальным томом памяти (ВТП) называется область внешней памяти (раздел) на физическом томе, организованный аналогично тому прямого доступа, то есть имеющий свою метку и совокупность хранящихся файлов. Появление ВТП обусловлено появлением накопителей на магнитном диске (НМД) большой емкости, многопользовательских режимов и концепции виртуальных машин.
Большая емкость ТПД, размещение на них файлов многих пользователей создали в СУД следующие трудности:
Это привело к появлению на ТПД иерархических, многоуровневых каталогов (справочников) файлов, где корневой, главный каталог - это оглавление тома, а подчиненные или каталоги нижнего уровня - это справочники группы файлов, объединенных по какому-либо признаку. Можно сказать, что каталог является виртуальным оглавлением раздела ТПД внешней памяти.
Итак, файл, том и каталоги - это логические объекты, обрабатываемые пользователем и программами ВС, и одновременно физические объекты, каждый из которых занимает некоторое пространство ТПД. В соответствии с этим СУД подразделяется на два уровня представления информации.
11.1. Система управления файлами
Файловая система - это часть операционной системы, назначение которой состоит в том, чтобы обеспечить пользователю удобный интерфейс при работе с данными, хранящимися на диске, и обеспечить совместное использование файлов несколькими пользователями и процессами.
В широком смысле понятие "файловая система" включает:
СУФ реализует выполнение следующих базовых функций.
Кроме того, может быть масса сервисных функций проверки и модификации различных характеристик файлов, каталогов, томов, зависящих от конкретной реализации СУФ.
Файлы бывают разных типов: обычные файлы, специальные файлы, файлы-каталоги.
Обычные файлы в свою очередь подразделяются на текстовые и двоичные. Текстовые файлы состоят из строк символов, представленных в ASCII-коде. Это могут быть документы, исходные тексты программ и т.п. Текстовые файлы можно прочитать на экране и распечатать на принтере. Двоичные файлы не используют ASCII-коды, они часто имеют сложную внутреннюю структуру, например, объектный код программы или архивный файл. Все операционные системы должны уметь распознавать хотя бы один тип файлов - их собственные исполняемые файлы.
В разных файловых системах могут использоваться в качестве атрибутов разные характеристики, например:
Специальные файлы - это файлы, ассоциированные с устройствами ввода-вывода, которые позволяют пользователю выполнять операции ввода-вывода, используя обычные команды записи в файл или чтения из файла. Эти команды обрабатываются вначале программами файловой системы, а затем на некотором этапе выполнения запроса преобразуются ОС в команды управления соответствующим устройством. Специальные файлы так же, как и устройства ввода-вывода, делятся на блок-ориентированные и на байт-ориентированные.
Для пользователей файл обозначается с помощью идентификаторов - внешних имен (могут быть и внутренние имена файлов). Пользователи дают файлам символьные имена, при этом учитываются ограничения ОС как на используемые символы, так и на длину имени. До недавнего времени эти границы были весьма узкими. Так, в популярной файловой системе FAT длина имен ограничивается известной схемой 8.3 (8 символов - собственно имя, 3 символа - расширение имени), а в ОС UNIX System V имя не может содержать более 14 символов. Однако пользователю гораздо удобнее работать с длинными именами, поскольку они позволяют дать файлу действительно мнемоническое название, по которому даже через достаточно большой промежуток времени можно будет вспомнить, что содержит этот файл. Поэтому современные файловые системы, как правило, поддерживают длинные символьные имена файлов. Например, Windows NT в своей новой файловой системе NTFS устанавливает, что имя файла может содержать до 255 символов, не считая завершающего нулевого символа.
При переходе к длинным именам возникает проблема совместимости с ранее созданными приложениями, использующими короткие имена. Чтобы приложения могли обращаться к файлам в соответствии с принятыми ранее соглашениями, файловая система должна уметь предоставлять короткие эквивалентные имена (псевдонимы) файлам, имеющим длинные имена. Таким образом, одной из важных задач становится проблема генерации соответствующих коротких имен.
Длинные имена поддерживаются не только новыми файловыми системами, но и новыми версиями хорошо известных файловых систем. Например, в ОС Windows 95 используется файловая система VFAT, представляющая собой существенно измененный вариант FAT. Среди многих других усовершенствований одним из главных достоинств VFAT является поддержка длинных имен. Кроме проблемы генерации коротких эквивалентных имен, при реализации нового варианта FAT важной задачей была задача хранения длинных имен при условии, что принципиально метод хранения и структура данных на диске не должны были измениться.
Для решения проблем поиска и размещения файлов в СУФ используются иерархические, многоуровневые каталоги файлов, двухуровневые имена файлов и средства фильтрации.
Простой одноуровневый каталог представляет собой оглавление тома (используется в однопользовательских ОС - рис.11.1).
Иерархический, многоуровневый каталог (древовидный или сетевой) - это совокупность каталогов и дескрипторов файлов различной глубины (рис.11.2).
Рис.11.1. Простой одноуровневый каталог
Рис.11.2. Иерархический многоуровневый каталог
Каталоги образуют дерево, если файлу разрешено входить только в один каталог, и сеть - если файл может входить сразу в несколько каталогов. В MS-DOS каталоги образуют древовидную структуру, а в UNIX'е - сетевую. Как и любой другой файл, каталог имеет символьное имя и однозначно идентифицируется составным именем, содержащим цепочку символьных имен всех каталогов, через которые проходит путь от корня до данного каталога.
Каждый каталог группирует по определенным принципам файлы пользователей, которые могут быть защищены паролем. Для упрощения работы имеется понятие текущего каталога, определяющего список доступных файлов и подкаталогов и позволяющего обращаться к файлам по собственным именам.
ОС обеспечивает определение нескольких текущих каталогов (путей доступа), которые в заданной последовательности просматривается при обращении к файлу по имени:
PATH C:\; C:\nc; D:\ альтернативные маршруты.
В процессе диалога ОС для группировки и удобства работы с файлами используются 2-х и 3-х компонентные идентификаторы:
<префикс>: <имя файла> .суффикс/расщирение.
Например, в MS-DOS C:\sys\forrmat.com.
Такие средства классификации упрощают автоматическую обработку файлов. Обычно программы работают со своими типами файлов, поэтому зачастую суффикс или расширение можно не указывать.
Средства фильтрации позволяют определять операции над целым классом файлов, посредством указания вместо имени файла специальных символов (* или !). Например, имя *.exe представляет все файлы текущего подкаталога, имеющие расширение exe.
Важной характеристикой СУФ является обеспечение независимости программ от используемых ПУ и файлов. Для этого вводится понятие потока ввода/вывода как средства отсроченного установления связи программы с конкретными файлами и ПУ.
Поток ввода/вывода - это объект, который обладает всеми характеристиками устройства ввода/вывода, но не является реально существующим. Программа работает не с файлами, а потоками ввода/вывода.
В операционной системе MS-DOS, например, по умолчанию в качестве входного потока данных рассматривается клавиатура, а выходной поток направляется на дисплей. Для переопределения потоков ввода/вывода используются следующие символы:
< - для определения входного потока;
>- для определения выходного потока;
>> - для модификации (добавления) ранее определенного выходного потока.
Выполнение команды DIR>LPT приведет выводу содержимого текущего каталога на принтер.
Транспортировка потоков позволяет сцепить несколько программ по стандартному входу-выходу. По сути дела образуется буфер, позволяющий двум процессам связываться по схеме “производитель потребитель”. Таким образом, выходные данные одной программы являются входными для другой программы, обеспечивая естественное взаимодействие.
Команда DIR|SORT выведет на дисплей отсортированный список файлов, полученный командой DIR.
11.2. Способы доступа и организации файлов
С точки зрения внутренней структуры (логической организации) файл - это совокупность однотипных записей, каждая из которых информирует о свойствах одного объекта. Записи могут быть фиксированной длины, переменной длины или неопределенной длины. Записи переменной длины в своем составе содержат длину записи, а неопределенной длины специальный символ конца записи.
При этом каждая запись может иметь идентификатор, представляющий собой ключ, который может быть сложным и состоять из нескольких полей.
Существует три способа доступа к данным, расположенным во внешней памяти:
Для организации доступа записи должны быть определенным образом расположены и взаимосвязаны во внешней памяти. Есть несколько способов логической организации памяти.
Последовательный
Записи располагаются в физическом порядке и обеспечивают доступ в физической последовательности. Таким образом, для обработки записи с номером N+1 необходимо последовательно обратиться к записям с номером 1, 2,….,N. Это универсальный способ организации файла периферийного устройства. Используется так же для организации входного/выходного потока.
Индексно-последовательный.
Записи располагаются в логической последовательности в соответствии со значением ключей записи. Физически записи располагаются в различных местах файла. Логическая последовательность файла фиксируется в специальной таблице индексов, в которой значение ключей связывается с физическим адресом записи. При такой организации доступ к записям осуществляется логически последовательно в порядке возрастания или убывания значения ключа или по значению ключа.
Индексный.
Место записи в файле, ее физический адрес, определяется алгоритмом преобразования для ключа. Доступ к записям возможен только прямой. Алгоритм преобразования ключа называется хешированием. Ключ, использующий алгоритм хеширования, преобразуется в номер записи.
Прямой.
Это организация, при которой осуществляется прямой доступ по порядковому номеру записи или по физическому адресу.
Библиотечный
Организация, в которой файл состоит из последовательных подфайлов (разделов), первый из которых является оглавлением и содержит имена и адреса остальных подфайлов. При такой организации осуществляется комбинированныйдоступ: индексный прямой к разделу и последовательный в разделах.
Определить права доступа к файлу - значит определить для каждого пользователя набор операций, которые он может применить к данному файлу. В разных файловых системах может быть определен свой список дифференцируемых операций доступа. Этот список может включать следующие операции:
В самом общем случае права доступа могут быть описаны матрицей прав доступа, в которой столбцы соответствуют всем файлам системы, строки - всем пользователям, а на пересечении строк и столбцов указываются разрешенные операции. В некоторых системах пользователи могут быть разделены на отдельные категории. Для всех пользователей одной категории определяются единые права доступа. Например, в системе UNIX все пользователи подразделяются на три категории: владельца файла, членов его группы и всех остальных. Различают два основных подхода к определению прав доступа:
11.3. Управление внешней памятью
Физически том дисковой памяти - это отдельный носитель внешней памяти, представляющий собой совокупность блоков данных. Блок - это единица физической передачи данных (единица обмена данных с устройством). Запись - это единица ввода/вывода программы. Блок может содержать несколько логических записей, что минимизирует число операций ввода/вывода (рис.11.3).
Рис. 11.3. Коэффициент блокирования 7
Физически файл - это совокупность выделенных блоков памяти (область внешней памяти). Существует два вида организации накопителей на магнитном диске:
1. Трековый, в котором весь диск подразделяется на треки (дорожки) фиксированной длины, на которых размещаются блоки переменного размера. Адресом блока является тройка:
Единицей выделения памяти является трек или цилиндр. Цилиндр представляет собой область памяти, образованную всеми дорожками, доступными на магнитных поверхностях без перемещения магнитных головок.
2.Секторный, в котором диск разбивается на блоки фиксированного размера, обычно кратного 256 байтам. Адресом блока является его порядковый номер на носителе.
Работа с дисковой памятью включает в себя 4 основные процедуры:
Инициализация тома состоит из:
11.4. Способы распределения памяти на диске
Выделение и освобождение места для файлов на томе аналогично стратегии размещения ОП.
Популярным способом, используемым, например, в файловой системе FAT операционной системы MS-DOS, является использование связанного списка индексов. С каждым блоком (кластером) связывается некоторый элемент - индекс. Индексы располагаются в отдельной области диска (в MS-DOS это таблица FAT). Если некоторый блок распределен файлу, то индекс этого блока содержит номер следующего блока данного файла. При этом для каждого файла в каталоге имеется поле, в котором отмечается номер начального индекса для кластера, входящего в файл. Последний индекс содержит специальный маркер конца файла. Такая физическая организация сохраняет все достоинства предыдущего способа и снимает отмеченный недостаток: для доступа к произвольному месту файла достаточно прочитать только блок индексов, отсчитать нужное количество блоков файла по цепочке и определить номер нужного блока.
В заключение рассмотрим задание физического расположения файла путем простого перечисления номеров блоков, занимаемых этим файлом. ОС UNIX использует вариант данного способа, позволяющий обеспечить фиксированную длину адреса независимо от размера файла. Для хранения адреса файла выделено 13 полей. Если размер файла меньше или равен 10 блокам, то номера этих блоков непосредственно перечислены в первых десяти полях адреса. Если размер файла больше 10 блоков, то следующее, 11-е поле содержит адрес блока, в котором могут быть расположены еще 128 номеров следующих блоков файла. Если файл больше, чем 10+128 блоков, то используется 12-е поле, в котором находится номер блока, содержащего 128 номеров блоков, которые содержат по 128 номеров блоков данного файла. И, наконец, если файл больше 10+128+128(128, то используется последнее, 13-е поле для тройной косвенной адресации, что позволяет задать адрес файла, имеющего размер максимум: 10+ 128 + 128(128 + 128(128(128.
В некоторых файловых системах запросы к внешним устройствам, в которых адресация осуществляется блоками (диски, ленты), перехватываются промежуточным программным слоем-подсистемой буферизации. Подсистема буферизации представляет собой буферный пул, располагающийся в оперативной памяти, и комплекс программ, управляющих этим пулом и позволяющий выполнять опережающее считывание блоков файла при последовательном доступе. Каждый буфер пула имеет размер, равный одному блоку. При поступлении запроса на чтение некоторого блока подсистема буферизации просматривает свой буферный пул и, если находит требуемый блок, то копирует его в буфер запрашивающего процесса. Операция ввода-вывода считается выполненной, хотя физического обмена с устройством не происходило. Очевиден выигрыш во времени доступа к файлу. Если же нужный блок в буферном пуле отсутствует, то он считывается с устройства и одновременно с передачей запрашивающему процессу копируется в один из буферов подсистемы буферизации. При отсутствии свободного буфера на диск вытесняется наименее используемая информация. Таким образом, подсистема буферизации работает по принципу кэш-памяти. Кроме того, буферизация позволяет одновременно обрабатывать программой текущий блок и читать/писать в другие буфера следующий блок.
глава 12
Современные концепции и технологии проектирования операционных систем
12.1. Требования, предъявляемые к ОС 90-х годов
Операционная система является сердцевиной системного программного обеспечения, она создает среду для выполнения приложений и во многом определяет, какими полезными для пользователя свойствами эти приложения будут обладать. В связи с этим рассмотрим требования, которым должна удовлетворять современная ОС.
Очевидно, что главным требованием, предъявляемым к операционной системе, является способность выполнения основных функций: эффективного управления ресурсами и обеспечения удобного интерфейса для пользователя и прикладных программ. Современная ОС, как правило, должна реализовывать мультипрограммную обработку, виртуальную память, свопинг, поддерживать многооконный интерфейс, а также выполнять многие другие совершенно необходимые функции. Кроме этих функциональных требований, к операционным системам предъявляются не менее важные рыночные требования. К этим требованиям относятся:
Расширяемость. Код должен быть написан таким образом, чтобы можно было легко внести дополнения и изменения, если это потребуется, и не нарушить целостность системы.
Переносимость. Код должен легко переноситься с процессора одного типа на процессор другого типа и с аппаратной платформы (которая включает наряду с типом процессора и способ организации всей аппаратуры компьютера) одного типа на аппаратную плат форму другого типа.
Надежность и отказоустойчивость. Система должна быть защищена как от внутренних, так и от внешних ошибок, сбоев и отказов. Ее действия должны быть всегда предсказуемыми, а приложения не должны наносить вред ОС.
Совместимость. ОС должна иметь средства для выполнения прикладных программ, написанных для других операционных систем. Кроме того, пользовательский интерфейс должен быть совместим с существующими системами и стандартами.
Безопасность. ОС должна обладать средствами защиты ресурсов одних пользователей от других.
Производительность. Система должна обладать настолько хорошим быстродействием и временем реакции, насколько это позволяет аппаратная платформа.
Рассмотрим более подробно некоторые из этих требований.
Расширяемость
В то время как аппаратная часть компьютера устаревает за несколько лет, полезная жизнь операционных систем может измеряться десятилетиями. Примером может служить ОС UNIX. Поэтому операционные системы всегда эволюционно изменяются со временем, и эти изменения более значимы, чем изменения аппаратных средств. Изменения ОС обычно представляют собой приобретение ею новых свойств. Например, поддержка новых устройств, таких, как CD-ROM, возможность связи с сетями нового типа, поддержка многообещающих технологий, таких, как графический интерфейс пользователя или объектно-ориентированное программное окружение, использование более чем одного процессора. Сохранение целостности кода, какие бы изменения не вносились в операционную систему, является главной целью разработки.
Расширяемость может достигаться за счет модульной структуры ОС, при которой программы строятся из набора отдельных модулей, взаимодействующих только через функциональный интерфейс. Новые компоненты могут быть добавлены в операционную систему модульным путем, они выполняют свою работу, используя интерфейсы, поддерживаемые существующими компонентами.
Использование объектов для представления системных ресурсов также улучшает расширяемость системы. Объекты - это абстрактные типы данных, над которыми можно производить только те действия, которые предусмотрены специальным набором объектных функций. Объекты позволяют единообразно управлять системными ресурсами. Добавление новых объектов не разрушает существующие объекты и не требует изменений существующего кода.
Прекрасные возможности для расширения предоставляет подход к структурированию ОС по типу клиент-сервер с использованием микроядерной технологии. В соответствии с этим подходом ОС строится как совокупность привилегированной управляющей программы и набора непривилегированных услуг-серверов. Основная часть ОС может оставаться неизменной, в то время как могут быть добавлены новые серверы или улучшены старые.
Средства вызова удаленных процедур (RPC) также дают возможность расширить функциональные возможности ОС. Новые программные процедуры могут быть добавлены в любую машину сети и немедленно поступить в распоряжение прикладных программ на других машинах сети.
Некоторые ОС для улучшения расширяемости поддерживают загружаемые драйверы, которые могут быть добавлены в систему во время ее работы. Новые файловые системы, устройства и сети могут поддерживаться путем написания драйвера устройства, драйвера файловой системы или транспортного драйвера и загрузки его в систему.
Переносимость
Требование переносимости кода тесно связано с расширяемостью. Расширяемость позволяет улучшать операционную систему, в то время как переносимость дает возможность перемещать всю систему на машину, базирующуюся на другом процессоре или аппаратной платформе , делая при этом по возможности небольшие изменения в коде. Хотя ОС часто описываются либо как переносимые, либо как непереносимые, переносимость - это не бинарное состояние. Вопрос не в том, может ли быть система перенесена, а в том, насколько легко можно это сделать. Написание переносимой ОС аналогично написанию любого переносимого кода - нужно следовать некоторым правилам.
Во-первых, большая часть кода должна быть написана на языке, который имеется на всех машинах, куда вы хотите переносить систему. Обычно это означает, что код должен быть написан на языке высокого уровня, предпочтительно стандартизованном, например, на языке С. Программа, написанная на Ассемблере, не является переносимой, если только вы не собираетесь переносить ее на машину, обладающую командной совместимостью с вашей.
Во-вторых, следует учесть, в какое физическое окружение программа должна быть перенесена. Различная аппаратура требует различных решений при создании ОС. Например, ОС, построенная на 32-битовых адресах, не может быть перенесена на машину с 16-битовыми адресами (разве что с огромными трудностями).
В-третьих, важно минимизировать или, если возможно, исключить те части кода, которые непосредственно взаимодействуют с аппаратными средствами. Зависимость от аппаратуры может иметь много форм. Некоторые очевидные формы зависимости включают прямое манипулирование регистрами и другими аппаратными средствами.
В-четвертых, если аппаратно - зависимый код не может быть полностью исключен, то он должен быть изолирован в нескольких хорошо локализуемых модулях. Аппаратно-зависимый код не должен быть распределен по всей системе. Например, можно спрятать аппаратно-зависимую структуру в программно-задаваемые данные абстрактного типа. Другие модули системы будут работать с этими данными, а не с аппаратурой, используя набор некоторых функций. Когда ОС переносится, то изменяются только эти данные и функции, которые ими манипулируют. Для легкого переноса ОС при ее разработке должны быть соблюдены следующие требования:
1. Переносимый язык высокого уровня. Большинство переносимых ОС написано на языке С (стандарт ANSI X3.159-1989). Разработчики выбирают С, потом что он стандартизован и потому что С - компиляторы широко доступны. Ассемблер используется только для тех частей системы, которые должны непосредственно взаимодействовать с аппаратурой (например, обработчик прерываний), или для частей, которые требуют максимальной скорости (например, целочисленная арифметика повышенной точности). Однако непереносимый код должен быть тщательно изолирован внутри тех компонентов, где он используется.
2. Изоляция процессора. Некоторые низкоуровневые части ОС должны иметь доступ к процессорно-зависимым структурам данных и регистрам. Однако код, который делает это, должен содержаться в небольших модулях, которые могут быть заменены аналогичными модулями для других процессоров.
3. Изоляция платформы. Зависимость от платформы заключается в различиях между рабочими станциями разных производителей, построенными на одном и том же процессоре (например, MIPS R4000). Должен быть введен программный уровень, абстрагирующий аппаратуру (кэши, контроллеры прерываний ввода-вывода и т. п.) вместе со слоем низкоуровневых программ таким образом, чтобы высокоуровневый код не нуждался в изменении при переносе с одной платформы на другую.
Совместимость
Одним из аспектов совместимости является способность ОС выполнять программы, написанные для других ОС или для более ранних версий данной операционной системы, а также для другой аппаратной платформы.
Необходимо разделять вопросы двоичной совместимости и совместимости на уровне исходных текстов приложений. Двоичная совместимость достигается в том случае, когда можно взять исполняемую программу и запустить ее на выполнение на другой ОС. Для этого необходимы: совместимость на уровне команд процессора, совместимость на уровне системных вызовов и даже на уровне библиотечных вызовов, если они являются динамически связываемыми.
Совместимость на уровне исходных текстов требует наличия соответствующего компилятора в составе программного обеспечения, а также совместимости на уровне библиотек и системных вызовов. При этом необходима перекомпиляция имеющихся исходных текстов в новый выполняемый модуль.
Совместимость на уровне исходных текстов важна в основном для разработчиков приложений, в распоряжении которых эти исходные тексты всегда имеются. Но для конечных пользователей практическое значение имеет только двоичная совместимость, так как только в этом случае они могут использовать один и тот же коммерческий продукт, поставляемый в виде двоичного исполняемого кода, в различных операционных средах и на различных машинах.
Обладает ли новая ОС двоичной совместимостью или совместимостью исходных текстов с существующими системами - зависит от многих факторов. Самый главный из них - архитектура процессора, на котором работает новая ОС. Если процессор, на который переносится ОС, использует тот же набор команд (возможно с некоторыми добавлениями) и тот же диапазон адресов, тогда двоичная совместимость может быть достигнута достаточно просто.
Гораздо сложнее достичь двоичной совместимости между процессорами, основанными на разных архитектурах. Для того чтобы один компьютер выполнял программы другого (например, DOS-программу на Mac), этот компьютер должен работать с машинными командами, которые ему изначально непонятны. Например, процессор типа 680x0 на Mac должен исполнять двоичный код, предназначенный для процессора 80x86 в PC. Процессор 80x86 имеет свои собственные дешифратор команд, регистры и внутреннюю архитектуру. Процессор 680x0 не понимает двоичный код 80x86, поэтому он должен выбрать каждую команду, декодировать ее, чтобы определить, для чего она предназначена, а затем выполнить эквивалентную подпрограмму, написанную для 680x0. Так как, к тому же, у 680x0 нет в точности таких же регистров, флагов и внутреннего арифметико-логического устройства, как в 80x86, он должен имитировать все эти элементы с использованием своих регистров или памяти. И он должен тщательно воспроизводить результаты каждой команды, что требует специально написанных подпрограмм для 680x0, гарантирующих, что состояние эмулируемых регистров и флагов после выполнения каждой команды будет в точности таким же, как и на реальном 80x86.
Это простая, но очень медленная работа, так как микрокод внутри процессора 80x86 исполняется на значительно более быстродействующем уровне, чем эмулирующие его внешние команды 680x0. За время выполнения одной команды 80x86 на 680x0 реальный 80x86 может выполнить десятки команд. Следовательно, если процессор, производящий эмуляцию, не настолько быстр, чтобы компенсировать все потери при эмуляции, то программы, исполняющиеся под эмуляцией, будут очень медленными.
Выходом в таких случаях является использование так называемых прикладных сред. Учитывая, что основную часть программы, как правило, составляют вызовы библиотечных функций, прикладная среда имитирует библиотечные функции целиком, используя заранее написанную библиотеку функций аналогичного назначения, а остальные команды эмулирует каждую по отдельности.
Соответствие стандартам POSIX также является средством обеспечения совместимости программных и пользовательских интерфейсов. Во второй половине 80-х гг. правительственные агентства США начали разрабатывать POSIX как стандарты на поставляемое оборудование при заключении правительственных контрактов в компьютерной области. POSIX - это "интерфейс переносимой ОС, базирующейся на UNIX". POSIX - собрание международных стандартов интерфейсов ОС в стиле UNIX. Использование стандарта POSIX (IEEE стандарт 100 3.1 - 1988) позволяет создавать программы стиле UNIX, которые могут легко переноситься из одной системы в другую.
Безопасность
В дополнение к стандарту POSIX также определены требования компьютерной безопасности для приложений. Многие из этих требований являются желаемыми свойствами для любой многопользовательской системы. Правила безопасности определяют такие свойства, как защита ресурсов одного пользователя от других и установление квот по ресурсам для предотвращения захвата одним пользователем всех системных ресурсов (таких, как память).
Обеспечение защиты информации от несанкционированного доступа является обязательной функцией сетевых операционных систем. В большинстве популярных систем гарантируется степень безопасности данных, соответствующая уровню С2 в системе стандартов США. Основы стандартов в области безопасности были заложены "Критериями оценки надежных компьютерных систем". Этот документ, изданный в США в 1983 году Национальным центром компьютерной безопасности (NCSC - National Computer Security Center), часто называют Оранжевой Книгой. В соответствии с требованиями Оранжевой Книги, безопасной считается такая система, которая "посредством специальных механизмов защиты контролирует доступ к информации таким образом, что только имеющие соответствующие полномочия лица или процессы, выполняющиеся от их имени, могут получить доступ на чтение, запись, создание или удаление информации".
Иерархия уровней безопасности, приведенная в Оранжевой Книге, помечает низший уровень безопасности как D, а высший - как А. В класс D попадают системы, оценка которых выявила их несоответствие требованиям всех других классов.
Основными свойствами, характерными для С - систем, являются: наличие подсистемы учета событий, связанных с безопасностью, и избирательный контроль доступа. Уровень С делится на 2 подуровня: уровень С1, обеспечивающий защиту данных от ошибок пользователей, но не от действий злоумышленников, и более строгий уровень С2. На уровне С2 должны присутствовать средства секретного входа, обеспечивающие идентификацию пользователей путем ввода уникального имени и пароля перед тем, как им будет разрешен доступ к системе. Избирательный контроль доступа, требуемый на этом уровне, позволяет владельцу ресурса определить, кто имеет доступ к ресурсу, и что он может с ним делать. Владелец делает это путем предоставляемых прав доступа пользователю или группе пользователей. Средства учета и наблюдения (auditing) обеспечивают возможность обнаружить и зафиксировать важные события, связанные с безопасностью, или любые попытки создать, получить доступ или удалить системные ресурсы. Защита памяти заключается в том, что память инициализируется перед тем как повторно используется. На этом уровне система не защищена от ошибок пользователя, но поведение его может быть проконтролировано по записям в журнале, оставленным средствами наблюдения и аудитинга.
Системы уровня В основаны на помеченных данных и распределении пользователей по категориям, то есть реализуют мандатный контроль доступа. Каждому пользователю присваивается рейтинг защиты, и он может получать доступ к данным только в соответствии с этим рейтингом. Этот уровень, в отличие от уровня С, защищает систему от ошибочного поведения пользователя.
Уровень А является самым высоким уровнем безопасности, он требует, в дополнение ко всем требованиям уровня В, выполнения формального, математически обоснованного доказательства соответствия системы требованиям безопасности.
Различные коммерческие структуры (например, банки) особо выделяют необходимость учетной службы, аналогичной той, что предлагают государственные рекомендации С2. Любая деятельность, связанная с безопасностью, может быть отслежена и тем самым учтена. Это как раз то, что требует С2, и то, что обычно нужно банкам. Однако коммерческие пользователи, как правило, не хотят расплачиваться производительностью за повышенный уровень безопасности. А - уровень безопасности занимает своими управляющими механизмами до 90% процессорного времени. Более безопасные системы не только снижают эффективность, но и существенно ограничивают число доступных прикладных пакетов, которые соответствующим образом могут выполняться в подобной системе. Например, для ОС Solaris (версия UNIX) есть несколько тысяч приложений, а для ее аналога В - уровня - только сотня.
12.2. Тенденции в структурном построении ОС
Как уже отмечалось выше, для удовлетворения требований, предъявляемых к современной ОС, большое значение имеет ее структурное построение. Операционные системы прошли длительный путь развития от монолитных систем к хорошо структурированным модульным системам, способным к развитию, расширению и легкому переносу на новые платформы.
Монолитные системы
В общем случае "структура" монолитной системы представляет собой отсутствие структуры. ОС написана как набор процедур, каждая из которых может вызывать другие, когда ей это нужно. При использовании этой техники каждая процедура системы имеет хорошо определенный интерфейс в терминах параметров и результатов, и каждая вольна вызвать любую другую для выполнения некоторой нужной для нее полезной работы. Для построения монолитной системы необходимо скомпилировать все отдельные процедуры, а затем связать их вместе в единый объектный файл с помощью компоновщика (примерами могут служить ранние версии ядра UNIX или Novell NetWare). Каждая процедура видит любую другую процедуру ( в отличие от структуры, содержащей модули, в которой большая часть информации является локальной для модуля, и процедуры модуля можно вызвать только через специально определенные точки входа). Однако даже такие монолитные системы могут быть немного структурированными. При обращении к системным вызовам, поддерживаемым ОС, параметры помещаются в строго определенные места, такие, как регистры или стек, а затем выполняется специальная команда прерывания, известная как вызов ядра или вызов супервизора. Эта команда переключает машину из режима пользователя в режим ядра, называемый также режимом супервизора, и передает управление ОС. Затем ОС проверяет параметры вызова для того, чтобы определить, какой системный вызов должен быть выполнен. После этого ОС индексирует таблицу, содержащую ссылки на процедуры, и вызывает соответствующую процедуру. Такая организация ОС предполагает следующую структуру:
В этой модели для каждого системного вызова имеется одна сервисная процедура. Утилиты выполняют функции, которые нужны нескольким сервисным процедурам. Это деление процедур на три слоя показано на рис. 12.1.
Рис. 12.1. Простая структуризация монолитной ОС
Модель клиент - сервер и микроядра
Модель клиент-сервер - это подход к структурированию ОС. В широком смысле модель клиент-сервер предполагает наличие программного компонента - потребителя какого-либо сервиса - клиента, и программного компонента - поставщика этого сервиса - сервера. Взаимодействие между клиентом и сервером стандартизуется, так что сервер может обслуживать клиентов, реализованных различными способами и, может быть, разными производителями. При этом главным требованием является то, чтобы они запрашивали услуги сервера понятным ему способом. Инициатором обмена обычно является клиент, который посылает запрос на обслуживание серверу, находящемуся в состоянии ожидания запроса. Один и тот же программный компонент может быть клиентом по отношению к одному виду услуг и сервером для другого вида услуг. Модель клиент-сервер является, скорее, удобным концептуальным средством ясного представления функций того или иного программного элемента в той или иной ситуации, нежели технологией. Эта модель успешно применяется не только при построении ОС, но и на всех уровнях программного обеспечения и имеет в некоторых случаях более узкий, специфический смысл, сохраняя, естественно, при этом все свои общие черты.
Применительно к структурированию ОС идея состоит в разбиении ее на несколько процессов - серверов, каждый из которых выполняет отдельный набор сервисных функций, например, управление памятью, создание или планирование процессов. Каждый сервер выполняется в пользовательском режиме. Клиент, которым может быть либо другой компонент ОС, либо прикладная программа, запрашивает сервис, посылая сообщение на сервер. Ядро ОС (называемое здесь микроядром), работая в привилегированном режиме, доставляет сообщение нужному серверу, сервер выполняет операцию, после чего ядро возвращает результаты клиенту с помощью другого сообщения (рис. 12.2).
Рис. 12.2. Структура ОС клиент - сервер
Подход с использованием микроядра заменил вертикальное распределение функций операционной системы на горизонтальное. Компоненты, лежащие выше микроядра, хотя и используют сообщения, пересылаемые через микроядро, взаимодействуют друг с другом непосредственно. Микроядро играет роль регулировщика. Оно проверяет сообщения, пересылает их между серверами и клиентами, и предоставляет доступ к аппаратуре.
Данная теоретическая модель является идеализированным описанием системы клиент-сервер, в которой ядро состоит только из средств передачи сообщений. В действительности различные варианты реализации модели клиент-сервер в структуре ОС могут существенно различаться по объему работ, выполняемых в режиме ядра.
Микроядро реализует жизненно важные функции, лежащие в основе операционной системы. Это базис для менее существенных системных служб и приложений. Именно вопрос о том, какие из системных функций считать несущественными, и, соответственно, не включать их в состав ядра, является предметом спора среди соперничающих сторонников идеи микроядра. В общем случае подсистемы, бывшие традиционно неотъемлемыми частями операционной системы - файловые системы, управление окнами и обеспечение безопасности, становятся периферийными модулями, взаимодействующими с ядром и друг с другом.
Главный принцип разделения работы между микроядром и окружающими его модулями - включать в микроядро только те функции, которым абсолютно необходимо исполняться в режиме супервизора и в привилегированном пространстве. Под этим обычно подразумеваются машиннозависимые программы (включая поддержку нескольких процессоров), некоторые функции управления процессами, обработка прерываний, поддержка пересылки сообщений, некоторые функции управления устройствами ввода-вывода, связанные с загрузкой команд в регистры устройств. Эти функции операционной системы трудно, если не невозможно, выполнить программам, работающим в пространстве пользователя.
Есть два пути решения этой проблемы. Один путь - разместить несколько таких чувствительных к режиму работы процессора серверов в пространстве ядра, что обеспечит им полный доступ к аппаратуре и в то же время связь с другими процессами с помощью обычного механизма сообщений. Такой подход был использован, например, при разработке Windows NT: кроме микроядра, в привилегированном режиме работает часть Windows NT, называемая executive управляющей программой. Она включает ряд компонентов, которые управляют виртуальной памятью, объектами, вводом-выводом и файловой системой (включая сетевые драйверы), взаимодействием процессов и, частично, системой безопасности.
Другой путь заключается в том, чтобы оставить в ядре только небольшую часть сервера, представляющую собой механизм реализации решения, а часть, отвечающую за принятие решения, переместить в пользовательскую область. В соответствии с этим подходом, например, в микроядре Mach, на базе которого разработана Workplace OS, размещается только часть системы управления процессами (и нитями), реализующая диспетчеризацию (то есть непосредственно переключение с процесса на процесс), а все функции, связанные с анализом приоритетов, выбором очередного процесса для активизации, принятием решения о переключении на новый процесс и другие аналогичные функции выполняются вне микроядра. Этот подход требует тесного взаимодействия между внешним планировщиком и резидентным диспетчером.
Здесь важно сделать различие: запуск процесса или нити требует доступа к аппаратуре, так что по логике - это функция ядра. Но ядру все равно, какую из нитей запускать, поэтому решения о приоритетах нитей и дисциплине постановки в очередь может принимать работающий вне ядра планировщик.
Кроме уже представленных соображений, перемещение планировщика на пользовательский уровень может понадобиться для чисто коммерческих целей. Некоторые производители ОС (например, IBM и OSF со своими вариантами микроядра Mach) планируют лицензировать свое микроядро другим поставщикам, которым может потребоваться заменить исходный планировщик на другой, поддерживающий, например, планирование в задачах реального времени или реализующий какой-то специальный алгоритм планирования. А вот другая ОС - Windows NT, также использующая микроядерную концепцию, - воплотила понятие приоритетов реального времени в своем планировщике, резидентно расположенном в ядре, и это не дает возможности заменить ее планировщик на другой.
Как и управление процессами, управление памятью может распределяться между микроядром и сервером, работающим в пользовательском режиме. Например, в Workplace OS микроядро управляет аппаратурой страничной памяти. Пейджер (система управления страничной памятью), работающий вне ядра, определяет стратегию замещения страниц (т.е. решает, какие страницы следует удалить из памяти для размещения страниц, выбранных с диска в ответ на прерывание по отсутствию необходимой страницы), а микроядро выполняет перемещение выбранных пейджером страниц. Как и планировщик процессов, пейджер является заменяемой составной частью.
Драйверы устройств также могут располагаться как внутри ядра, так и вне его. При размещении драйверов устройств вне микроядра для обеспечения возможности разрешения и запрещения прерываний, часть программы драйвера должна исполняться в пространстве ядра. Отделение драйверов устройств от ядра делает возможной динамическую конфигурацию ОС. Кроме динамической конфигурации, есть и другие причины рассматривать драйверы устройств в качестве процессов пользовательского режима. СУБД, например, может иметь свой драйвер, оптимизированный под конкретный вид доступа к диску, но его нельзя будет подключить, если драйверы будут расположены в ядре. Этот подход также способствует переносимости системы, так как функции драйверов устройств могут быть во многих случаях абстрагированы от аппаратной части.
В настоящее время именно операционные системы, построенные с использованием модели клиент-сервер и концепции микроядра, в наибольшей степени удовлетворяют требованиям, предъявляемым к современным ОС.
Высокая степень переносимости обусловлена тем, что весь машинно-зависимый код изолирован в микроядре, поэтому для переноса системы на новый процессор требуется меньше изменений, и все они логически сгруппированы вместе.
Технология микроядер является основой построения множественных прикладных сред, которые обеспечивают совместимость программ, написанных для разных ОС. Абстрагируя интерфейсы прикладных программ от расположенных ниже операционных систем, микроядра позволяют гарантировать, что вложения в прикладные программы не пропадут в течение нескольких лет, даже если будут сменяться операционные системы и процессоры.
Расширяемость также является одним из важных требований к современным операционным системам. Является ли операционная система маленькой, как DOS, или большой, как UNIX, для нее неизбежно настанет необходимость приобрести свойства, не заложенные в ее конструкцию. Увеличивающаяся сложность монолитных операционных систем делала трудным, если вообще возможным, внесение изменений в ОС с гарантией надежности ее последующей работы. Ограниченный набор четко определенных интерфейсов микроядра открывает путь к упорядоченному росту и эволюции ОС.
Обычно операционная система выполняется только в режиме ядра, а прикладные программы - только в режиме пользователя, за исключением тех случаев, когда они обращаются к ядру за выполнением системных функций. В отличие от обычных систем, система, построенная на микроядре, выполняет свои серверные подсистемы в режиме пользователя, как обычные прикладные программы. Такая структура позволяет изменять и добавлять серверы, не влияя на целостность микроядра.
Иногда имеется потребность и в сокращении возможностей ОС. На Windows NT или UNIX перешло бы большее число пользователей, если бы для этих операционных систем не требовалось 16 Мб оперативной памяти и 70 Мб и более пространства на жестком диске. Микроядро не обязательно подразумевает небольшую систему. Надстроенные службы, типа файловой системы и системы управления окнами, добавят к ней немало. Конечно же, не всем нужна безопасность класса C2 или распределенные вычисления. Если важные, но предназначенные для определенных потребителей свойства можно исключать из состава системы, то базовый продукт подойдет более широкому кругу пользователей.
Использование модели клиент-сервер повышает надежность. Каждый сервер выполняется в виде отдельного процесса в своей собственной области памяти и таким образом защищен от других процессов. Более того, поскольку серверы выполняются в пространстве пользователя, они не имеют непосредственного доступа к аппаратуре и не могут модифицировать память, в которой хранится управляющая программа. И если отдельный сервер может потерпеть крах, то он может быть перезапущен без останова или повреждения остальной части ОС.
Эта модель хорошо подходит для распределенных вычислений, так как отдельные серверы могут работать на разных процессорах мультипроцессорного компьютера или даже на разных компьютерах. При получении от процесса сообщения микроядро может обработать его самостоятельно или переслать другому процессу. Так как микроядру все равно, пришло ли сообщение от локального или удаленного процесса, подобная схема передачи сообщений является элегантным базисом для RPC. Однако такая гибкость не дается даром. Пересылка сообщений не так быстра, как обычные вызовы функций, и ее оптимизация является критическим фактором успеха операционной системы на основе микроядра. Windows NT, например, в некоторых случаях заменяет перенос сообщений на коммуникационные каналы с общей памятью, имеющие более высокую пропускную способность. Хотя это и стоит дороже в смысле потребления фиксированной памяти микроядра, данная альтернатива может помочь сделать модель пересылки сообщений более практичной.
Объектно-ориентированный подход
Хотя технология микроядер и заложила основы модульных систем, способных развиваться регулярным образом, она не смогла в полной мере обеспечить возможности расширения систем. В настоящее время этой цели в наибольшей степени соответствует объектно-ориентированный подход, при котором каждый программный компонент является функционально изолированным от других.
Основным понятием этого подхода является "объект". Объект - это единица программ и данных, взаимодействующая с другими объектам посредством приема и передачи сообщений. Объект может быть представлением как некоторых конкретных вещей - прикладной программы или документа, так и некоторых абстракций - процесса, события.
Программы (функции) объекта определяют перечень действий, которые могут быть выполнены над данными этого объекта. Объект-клиент может обратиться к другому объекту, послав сообщение с запросом на выполнение какой-либо функции объекта-сервера.
Объекты могут описывать сущности, которые они представляют, с разной степенью детализации. Для обеспечения преемственности при переходе к более детальному описанию разработчикам предлагается механизм наследования свойств уже существующих объектов, то есть механизм, позволяющий порождать более конкретные объекты из более общих. Например, при наличии объекта "текстовый документ" разработчик может легко создать объект "текстовый документ в формате Word 6.0", добавив соответствующее свойство к базовому объекту. Механизм наследования позволяет создать иерархию объектов, в которой каждый объект более низкого уровня приобретает все свойства своего предка.
Внутренняя структура данных объекта скрыта от наблюдения. Нельзя произвольно изменять данные объекта. Для того, чтобы получить данные из объекта или поместить данные в объект, необходимо вызывать соответствующие объектные функции. Это изолирует объект от того кода, который использует его. Разработчик может обращаться к функциям других объектов, или строить новые объекты путем наследования свойств других объектов, ничего не зная о том, как они сконструированы. Это свойство называется инкапсуляцией.
Таким образом, объект предстает для внешнего мира в виде "черного ящика" с хорошо определенным интерфейсом. С точки зрения разработчика, использующего объект, пока внешняя реакция объекта остается без изменений, не имеют значения никакие изменения во внутренней реализации. Это дает возможность легко заменять одну реализацию объекта другой, например, в случае смены аппаратных средств; при этом сложное программное окружение, в котором находятся заменяемые объекты, не потребует никаких изменений.
С другой стороны, способность объектов представать в виде "черного ящика" позволяет упаковывать в них и представлять в виде объектов уже существующие приложения, ничего в них не изменяя.
Использование объектно-ориентированного подхода особенно эффективно при создании активно развивающегося программного обеспечения, например, при разработке приложений, предназначенных для выполнения на разных аппаратных платформах.
Полностью объектно-ориентированные операционные системы очень привлекательны для системных программистов, так как, используя объекты системного уровня, программисты смогут проникать вглубь операционных систем для приспособления их к своим нуждам, не нарушая целостность системы.
Но особенно большие перспективы имеет этот подход в реализации распределенных вычислительных сред. В настоящее время разные пакеты, работающие в данный момент в сети, представляют собой статически связанные наборы программ; в будущем, с использованием объектно-ориентированного подхода, они могут превратиться в единую совокупность динамически связываемых объектов, где каждый объект оперативно устанавливает и разрывает связи с другими объектами для выполнения актуальных в данный момент задач. Приложения, созданные для такой сетевой среды, основанной на объектах, могут выполняться, динамически обращаясь к множеству объектов, независимо от их местонахождения в сети и независимо от их операционной среды.
Поскольку любое объектно-ориентированное приложение представляет собой набор объектов, разработчику желательно иметь стандартные средства для управления объектами и организации их взаимодействия. При использовании и разработке объектно-ориентированных приложений в неоднородных распределенных средах нужны также средства, упрощающие доступ к объектам сети. При возникновении запроса к какому-либо объекту распределенной среды, независимо от того, находится требуемый объект на том же компьютере или на одном из удаленных, прозрачным образом должен быть выполнен поиск объекта, передача ему сообщения, и возврат ответа. Для обеспечения прозрачного обнаружения объектов все они должны быть снабжены ссылками, хранящимися в каталогах. Отсюда вытекает очень сложная проблема организации службы каталогов, позволяющей программистам именовать и искать объекты в сети, которая, вообще говоря, может быть разбросана по всему миру.
Однако, несмотря на упомянутые сложности и проблемы, объектно-ориентированный подход является одной из самых перспективных тенденций в конструировании программного обеспечения.
Объектно-ориентированный подход к построению операционных систем, придающий порядок процессу добавления модульных расширений к небольшому ядру, был принят на вооружение многими известными фирмами, такими, как Microsoft, Apple, IBM, Novell/USL (UNIX Systems Laboratories) и Sun Microsystems, все они развернули свои операционные системы в этом направлении. Taligent, совместное предприятие IBM и Apple, надеется опередить всех со своей от начала до конца объектно-ориентированной операционной системой. Тем временем Next поставляет Motorola- и Intel-версии NextStep, наиболее продвинутой объектно-ориентированной операционной системы из имеющихся. Хотя NextStep и не имеет объектной ориентированности сверху донизу, как это планируется в разработках Taligent, но она доступна уже сегодня.
Одним из первых применений объектных систем для большинства пользователей станут основанные на объектах прикладные программы. К объектно-ориентированным технологиям этого уровня, уже имеющимся сейчас или доступным в ближайшем будущем относятся:
Множественные прикладные среды
В то время как некоторые идеи (например, объектно-ориентированный подход) непосредственно касаются только разработчиков и лишь косвенно влияют на конечного пользователя, концепция множественных прикладных сред приносит пользователю долгожданную возможность выполнять на своей ОС программы, написанные для других операционных систем и других процессоров.
И сейчас дополнительное программное обеспечение позволяет пользователям некоторых ОС запускать чужие программы (например, Mac и UNIX позволяют выполнять программы для DOS и Windows). Но в зарождающемся поколении операционных систем средства для выполнения чужих программ становятся стандартной частью системы. Выбор операционной системы больше не будет сильно ограничивать выбор прикладных программ. Хотя столкновение пользовательских интерфейсов программ для Mac, Windows и UNIX на одном и том же экране и заставит пользователя немного потрудиться, но все равно, множественные прикладные среды операционных систем скоро станут такими же стандартными, как мыши и меню.
Множественные прикладные среды обеспечивают совместимость данной ОС с приложениями, написанными для других ОС и процессоров, на двоичном уровне, а не на уровне исходных текстов. Для пользователя, купившего в свое время пакет для MS DOS (например, Lotus 1-2-3) важно, чтобы он мог запускать этот полюбившийся ему пакет без каких-либо изменений и на своей новой машине, построенной, например, на RISC-процессоре и работающей под управлением, например, Windows NT.
При реализации множественных прикладных сред разработчики сталкиваются с противоречивыми требованиями. С одной стороны, задачей каждой прикладной среды является выполнение программы по возможности так, как если бы она выполнялась на "родной" ОС. Но потребности этих программ могут входить в конфликт с конструкцией современной операционной системы. Специализированные драйверы устройств могут противоречить требованиям безопасности. Могут конфликтовать схемы управления памятью и оконные системы. Чисто экономические вопросы (например, стоимость лицензирования программ и угроза судебного преследования) также могут повлиять на дизайн чужих прикладных сред. Но самой большой потенциальной проблемой является производительность - прикладная среда должна выполнять программы с приемлемой скоростью.
Этому требованию не могут удовлетворить широко используемые ранее эмулирующие системы. Для сокращения времени на выполнение чужих программ прикладные среды используют имитацию программ на уровне библиотек. Эффективность этого подхода связана с тем, что большинство сегодняшних программ работают под управлением GUI (графических интерфейсов пользователя) типа Windows, Mac или UNIX Motif, при этом приложения тратят большую часть времени, производя некоторые хорошо предсказуемые вещи. Они непрерывно выполняют вызовы библиотек GUI для манипулирования окнами и для других, связанных с GUI, действий. И это то, что позволяет прикладным средам возместить время, потраченное на эмулирование команды за командой. Тщательно сделанная прикладная среда имеет в своем составе библиотеки, имитирующие внутренние библиотеки GUI, но написанные на родном коде, то есть она совместима с программным интерфейсом другой ОС. Иногда такой подход называют трансляцией для того, чтобы отличать его от более медленного процесса эмулирования кода по одной команде за раз.
Например, для Windows-программы, работающей на Mac, при интерпретировании команд 80x86 производительность может быть очень низкой. Но когда производится вызов функции открытия окна, модуль прикладной среды может переключить его на перекомпилированную для 680x0 подпрограмму открытия окна. Так как библиотекам GUI не нужно дешифрировать и имитировать каждую команду, то в частях программы, относящихся к вызовам GUI ABI (Application Binary Interface - двоичный интерфейс прикладного программирования), производительность может резко вырасти. В результате на таких участках кода скорость работы программы может достичь (а возможно, и превзойти) скорость работы на своем родном процессоре.
Сегодня в типичных программах значительная часть кода занята вызовом GUI ABI. Apple утверждает, что программы для Mac тратят до 90 процентов процессорного времени на выполнение подпрограмм из Mac toolbox, а не на уникальные для этих программ действия. Sun Select говорит, что программы для Windows тратят от 60 до 80 процентов времени на работу в ядре Windows. В результате при эмуляции программы на основе GUI потери производительности могут быть значительно меньше. SunSelect заявляет, что его новая прикладная среда Windows, WABI (Windows Application Binary Interface - двоичный интерфейс прикладных программ Windows), благодаря сильно оптимизированным библиотекам, на некоторых платформах при исполнении одних и тех же тестов может обогнать настоящий Microsoft Windows.
С позиции использования прикладных сред более предпочтительным является способ написания программ, при котором программист для выполнения некоторой функции обращается с вызовом к операционной системе, а не пытается более эффективно реализовать эквивалентную функцию самостоятельно, работая напрямую с аппаратурой. Отбить у программистов охоту "обращаться к металлу" сможет наличие в библиотеках мощных и сложных программ, к которым гораздо проще обращаться, чем писать самому.
Модульность операционных систем нового поколения позволяет намного легче реализовать поддержку множественных прикладных сред. В отличие от старых операционных систем, состоящих из одного большого блока для всех практических применений, разбитого произвольным образом на части, новые системы являются модульными, с четко определенными интерфейсами между составляющими. Это делает создание дополнительных модулей, объединяющих эмуляцию процессора и трансляцию библиотек, значительно более простым.
К усовершенствованным операционным системам, явно содержащим средства множественных прикладных сред, относятся: IBM OS/2 2.x и Workplace OS, Microsoft Windows NT, PowerOpen компании PowerOpen Association и версии UNIX от Sun Microsystems, IBM и Hewlett-Packard. Кроме того, некоторые компании переделывают свои интерфейсы пользователя в виде модулей прикладных сред, а другие поставщики предлагают продукты для эмуляции и трансляции прикладных сред, работающие в качестве прикладных программ.
Использование множественных прикладных сред обеспечит пользователям большую свободу выбора операционных систем и более легкий доступ к более качественному программному обеспечению.
глава 13
История и общая характеристика
семейства операционных систем UNIX
UNIX, будучи в настоящее время стандартом по “де-факто” для использования в качестве серверов различного применения, имеет долгую и интересную историю. Начавшись как несерьезный и почти "игрушечный" проект молодых исследователей, UNIX стал многомиллионной индустрией, включив в свою орбиту университеты, многонациональные корпорации, правительства и международные организации стандартизации.
UNIX зародился в лаборатории Bell Labs фирмы AT&T более 20 лет назад. В то время Bell Labs занималась разработкой многопользовательской системы разделения времени MULTICS (Multiplexed Information and Computing Service) совместно с MIT и General Electric, но эта система потерпела неудач отчасти из-за слишком амбициозных целей, не соответствовавших уровню компьютеров того времени, а отчасти и из-за того, что она разрабатывалась на языке PL/1, а компилятор PL/1 задерживался и вообще плохо работал после своего запоздалого появления. Поэтому Bell Labs вообще отказалась от участия в проекте MULTICS, что дало возможность одному из ее исследователей, Кену Томпсону, заняться поисковой работой в направлении улучшения операционной среды Bell Labs. Томпсон, а также сотрудник Bell Labs Денис Ритчи и некоторые другие разрабатывали новую файловую систему, многие черты которой вели свое происхождение от MULTICS. Для проверки новой файловой системы Томпсон написал ядро ОС и некоторые программы для компьютера GE-645, который работал под управлением мультипрограммной системы разделения времени GECOS. У Кена Томпсона была написанная им еще во времена работы над MULTICS игра "Space Travel" - "Космическое путешествие". Он запускал ее на компьютере GE- 645, но она работала на нем не очень хорошо из-за невысокой эффективности разделения времени. Кроме этого, машинное время GE-645 стоило слишком дорого. В результате Томпсон и Ритчи решили перенести игру на стоящую в углу без дела машину PDP-7 фирмы DEC, имеющую 4096 18-битных слов, телетайп и хороший графический дисплей. Но у PDP-7 было неважное программное обеспечение, и, закончив перенос игры, Томпсон решил реализовать на PDP-7 ту файловую систему, над который он работал на GE-645. Из этой работы и возникла первая версия UNIX, хотя она и не имела в то время никакого названия. Но она уже включала характерную для UNIX файловую систему, основанную на индексных дескрипторах inode, имела подсистему управления процессами и памятью, а также позволяла двум пользователям работать в режиме разделения времени. Система была написана на Ассемблере. Имя UNIX (Uniplex Information and Computing Services) было дано ей еще одним сотрудником Bell Labs, Брайаном Керниганом, который первоначально назвал ее UNICS, подчеркивая ее отличие от многопользовательской MULTICS. Вскоре UNICS начали называть UNIX.
Первыми пользователями UNIX'а стали сотрудники отдела патентов Bell Labs, которые нашли ее удобной средой для создания текстов.
Большое влияние на судьбу UNIX оказала перепись ее на языке высокого уровня С, разработанного Денисом Ритчи специально для этих целей. Это произошло в 1973 году, UNIX насчитывал к этому времени уже 25 инсталляций, и в Bell Labs была создана специальная группа поддержки UNIX.
Широкое распространение UNIX получил с 1974 года, после описания этой системы Томпсоном и Ритчи в компьютерном журнале CACM. UNIX получил широкое распространение в университетах, так как для них он поставлялся бесплатно вместе с исходными кодами на С. Широкое распространение эффективных C-компиляторов сделало UNIX уникальной для того времени ОС из-за возможности переноса на различные компьютеры. Университеты внесли значительный вклад в улучшение UNIX и дальнейшую его популяризацию. Еще одним шагом на пути получения признания UNIX как стандартизованной среды стала разработка Денисом Ритчи библиотеки ввода-вывода stdio. Благодаря использованию этой библиотеки для компилятора С программы для UNIX стали легко переносимыми.
Широкое распространение UNIX породило проблему несовместимости его многочисленных версий. Очевидно, что для пользователя весьма неприятен тот факт, что пакет, купленный для одной версии UNIX, отказывается работать на другой версии UNIX. Периодически делались и делаются попытки стандартизации UNIX, но они пока имеют ограниченный успех. Процесс сближения различных версий UNIX и их расхождения носит циклический характер. Перед лицом новой угрозы со стороны какой-либо другой операционной системы различные производители UNIX-версий сближают свои продукты, но затем конкурентная борьба вынуждает их делать оригинальные улучшения, и версии снова расходятся. В этом процессе есть и положительная сторона - появление новых идей и средств, улучшающих как UNIX, так и многие другие операционные системы, перенявшие у него за долгие годы его существования много полезного.
Наибольшее распространение получили две несовместимые линии версий UNIX: линия AT&T - UNIX System V и линия университета Berkeley-BSD. Многие фирмы на основе этих версий разработали и поддерживают свои версии UNIX: SunOS и Solaris фирмы Sun Microsystems, UX фирмы Hewlett-Packard, XENIX фирмы Microsoft, AIX фирмы IBM, UnixWare фирмы Novell (проданный теперь компании SCO), и список этот можно еще долго продолжать.
Наибольшее влияние на унификацию версий UNIX оказали такие стандарты, как SVID фирмы AT&T, POSIX, созданные под эгидой IEEE, и XPG4 консорциума X/Open. В этих стандартах сформулированы требования к интерфейсу между приложениями и ОС, что дает возможность приложениям успешно работать под управлением различных версий UNIX.
Независимо от версии, общими для UNIX чертами являются:
Существует большое количество вариантов операционной системы UNIX: как общий для сегодняшнего дня стандарт UNIX System V Release 4.2, так и фирменные реализации, учитывающие особенности аппаратных платформ. К последним относятся HP-UX, Sun Solaris, IBM AIX, DEC Ultrix, SCO UNIX, Linux, Dynix и многие другие.
глава 14
История Windows NT
В конце 1988-г. Microsoft поручила Дэвиду Катлеру (David Cutler) возглавить новый проект в области программного обеспечения: создать новую ОС фирмы Microsoft для 90-х годов. (Дэвид Катлер - главный консультант фирмы DEC, который 17 лет проработал там, разрабатывая ОС и компиляторы: VAX/ VMS, ОС для MicroVAX I, OS RSX-11M, компиляторы VAX PL/1, VAX C). Он собрал команду инженеров для разработки ОС новой технологии (New Technology - NT).
Первоначально планировалось разработать NT с пользовательским и программным (API) интерфейсами в стиле OS/2, однако OS/2 плохо продавалась, а Windows 3.0 имела большой и постоянный успех на рынке. Увидев рыночные ориентиры и сложности, связанные с развитием и поддержкой двух несовместимых систем, Microsoft решила изменить свой курс и направить своих инженеров в сторону стратегии единой цельной операционной системы. Эта стратегия состоит в том, чтобы разрабатывать семейство базирующихся на Windows операционных систем, которые охватывали бы множество типов компьютеров, от самых маленьких ноутбуков до самых больших мультипроцессорных рабочих станций. Windows NT, как было названо следующее поколение Windows-систем, занимает самое высокое место в семействе Windows. Она поддерживает графический интерфейс (GUI) пользователя Windows, а также является первой базирующейся на Windows операционной системой фирмы Microsoft, поддерживающей Win32 API, 32 битный программный интерфейс для разработки новых приложений. Win32 API делает доступными для приложений улучшенные свойства ОС, такие как многонитевые процессы, синхронизацию, безопасность, I/O, управление объектами.
В июле 1993 года появились первые ОС семейства NT - Windows NT 3.1 и Windows NT Advanced Server 3.1.
14.1. Версии Windows NT
Windows NT 3.1
Операционная система Windows NT с самого начала проектировалась с учетом всех требований, предъявляемых к современным ОС: расширяемости, переносимости, надежности, совместимости, производительности. Эти свойства были достигнуты за счет применения передовых технологий структурного проектирования, таких, как клиент-сервер, микроядра, объекты.
В отличие от Windows, в которой реализована многозадачность без вытеснения (non-preemptive multitasking), в Windows NT используется механизм многозадачности с вытеснением (preemptive multitasking).
Windows NT поддерживает симметричную многопроцессорную организацию вычислительного процесса, в соответствии с которой ОС может выполняться на любом свободном процессоре или на всех процессорах одновременно, разделяя память между ними. Учитывая, что многозадачность реализуется на уровне нитей, разные части одного и того же процесса могут действительно выполняться параллельно. Следовательно, многонитевые серверы могут обслуживать более одного клиента.
Для управления нитями Windows NT Server использует механизм приоритетов. В определенные моменты производится оценка приоритетов и перераспределение нитей по процессорам, в результате чего последовательные стадии одного потока программы могут выполняться разными процессорами или откладываться до высвобождения очередного процессора.
Windows NT Server поддерживает до 16 параллельных процессоров, что актуально для таких серверов, как Symmetry 750 фирмы Sequent с 16 процессорами Intel 486/50 МГц. Следует, однако, иметь в виду, что реализация СМП в Windows NT Server нацелена на оптимизацию производительности и не обеспечивает резервирования в целях повышения отказоустойчивости. В случае выхода из строя одного из процессоров система останавливается.
В Windows NT Server в полной мере реализован потенциал масштабируемости архитектуры СМП. Однопроцессорную систему можно легко развивать, наращивая число процессоров, без замены версии ОС или приложений.
При управлении устройствами ввода/вывода Windows NT Server использует асинхронный подход. Для завершения процесса и начала выполнения новой задачи не нужно ждать поступления сигнала об окончании таких операций, как чтение или запись. Каждый процесс создается с использованием одной нити, которая служит специфическим отображением выполнения программы процессором. Впоследствии программа может создавать новые нити, и Windows NT Server будет распределять их и управлять ими, не привлекая к этому приложения высокого уровня.
Для того чтобы прикладная программа могла использовать несколько потоков, не нужно предусматривать этого в ее алгоритме. Отдельный поток создается для каждой операции. Например, в одном потоке программа может воспроизводить сложную графическую форму, а другой использовать для редактирования объемного чертежа. Каждый из этих потоков (или, с точки зрения пользователя, операций) работает на отдельном процессоре, не требуя никаких управляющих вмешательств со стороны приложения. Потоки внутри процесса используют общую область памяти и, следовательно, не должны специально обмениваться данными.
В соответствии с требованием совместимости, Windows NT обеспечивает среду выполнения не только для приложений с исходным программным интерфейсом Win32 API. При выполнении на процессорах фирмы Intel защищенные подсистемы Windows NT обеспечивают двоичную совместимость существующих приложений фирмы Microsoft, включая MS-DOS, Win16, OS/2. На MIPS RISC процессорах двоичная совместимость достигается для приложений MS-DOS и 16-битных Windows-приложений (с использованием эмуляции). Windows NT обеспечивает также совместимость на уровне исходных текстов для POSIX-приложений, которые твердо придерживаются интерфейса, определенного в стандарте IEEE 1003.1.
Помимо совместимости программных интерфейсов, Windows NT поддерживает существующие файловые системы, включая файловую систему MS-DOS (FAT), файловую систему CD-ROM, файловую систему OS/2 (HPFS) и собственную новую файловую систему (NTFS).
В отличие от большинства других операционных систем, Windows NT изначально разрабатывался с учетом возможности работы в сети. В результате этого функции совместного использования файлов, устройств и объектов встроены в интерфейс с пользователем. Администраторы могут централизованно управлять и контролировать работу сетей в масштабах крупных предприятий. Особенно важно отметить возможность распространения работы приложений типа клиент-сервер на многокомпьютерные системы.
Windows NT 3.5
Версия Windows NT 3.5, как и предыдущая, Windows NT 3.1, разработана в двух конфигурациях: для рабочей станции Windows NT Workstation 3.5 и для сервера - Windows NT Server 3.5. Windows NT 3.5 имеет многочисленные усовершенствования и нововведения по сравнению с Windows NT 3.1: улучшенное автораспознавание аппаратуры, возможность ручного выбора и конфигурирования сетевых адаптеров, если автоматическое распознавание не дает положительного результата.
Встроенная совместимость с NetWare. Возможность выполнения роли шлюза к сетям NetWare, так что Windows NT-компьютеры могут получать доступ к файлам, принтерам и серверам приложений NetWare. В Windows NT, начиная с версии 3.5, входит Microsoft Compatible Workstation Service for NetWare, который позволяет осуществлять доступ к файлам, каталогам и принтерам на сервере Novell NetWare. Транспортный протокол Microsoft NWLink IPX/SPX обеспечивает связь между компьютером с Windows NT и NetWare файл-сервером и сервером печати. Он поддерживает работу с файлами и с очередями печати на NetWare сервере.
Встроенная поддержка TCP/IP. Новая высокопроизводительная Microsoft-реализация протоколов TCP/IP, которая обеспечивает простое, мощное решение для межсетевого взаимодействия. Microsoft поддерживает протокол TCP/IP, начиная с 1991 года, когда был выпущен первый стек для Microsoft LAN Manager 2.1. В Windows NT также имеется поддержка этого протокола, начиная с самой первой версии этой операционной системы. Помимо этого имеются базовые утилиты, такие, как ftp, tftp, telnet, команды r*, arp, route и finger. С выходом версии 3.5 появились новые ключевые свойства, которые, с одной стороны, упростили конфигурирование и обслуживание, а с другой - улучшили свойства TCP/IP.
Значительные улучшения средств удаленного доступа RAS, включающие поддержку IPX/SPX и TCP/IP, использование стандартов Point to Point Protocol (PPP) и Serial Line IP (SLIP). Сервер RAS может теперь поддерживать до 256 соединений (вместо 64 в версии 3.1).
Поддержка длинных имен файлов в файловой системе FAT. Windows NT поддерживает работу с тремя файловыми системами: NTFS, FAT и HPFS. Таким образом, если до установки Windows NT на компьютере были установлены MS-DOS или OS/2, то нет никакой необходимости переформатировать диск. Система преобразует FAT или HPFS в NTFS, сохранив всю информацию на диске. Обратное преобразование невозможно. Здесь уместно заметить, что если вы хотите установить NTFS только затем, чтобы использовать длинные (до 255 символов) имена файлов, то для этих целей прекрасно подойдут и FAT и HPFS. Если для последней это естественное свойство, то возможность использования длинных имен файлов на FAT была введена только в версии Windows NT начиная с 3.5. Вы можете спокойно называть файлы и каталоги именами, выходящими за пределы традиционного для MS-DOS правила "8.3", нисколько не опасаясь, что эти файлы не будут доступны при работе в MS-DOS. Для таких файлов и каталогов будут назначены вторые, "короткие" имена.
Полная поддержка хранения встроенных объектов OLE 2.x и поиска составных документов. Эти возможности включают связывание, встраивание, связывание со встроенными объектами, технологии "drag-and-drop" и OLE-Automation.
В операционную систему Windows NT 3.5 встроены графические возможности трехмерной графики OpenGL API. OpenGL - это независимая от операционной системы промышленно-стандартная библиотека графических функций, разработанная фирмой Silicon Graphics для своих рабочих станций. В настоящее время OpenGL признана Architecture Review Board, включающей такие фирмы, как DEC, IBM, Intel, Microsoft и Silicon Graphics. Технология OpenGL была лицензирована Microsoft для предоставления этого мощного 32-разрядного API пользователям Windows NT. Развитые функции этой библиотеки требуются в том случае, когда необходима визуализация крупных проектов и данных. Типичные задачи, требующие ее использования - это САПР, системы механического и промышленного дизайна, программы статистического и научного анализа.
Приложения, разработанные для MS Windows 3.x и MS-DOS, выполняются более надежно, так как каждое приложение теперь работает в своем адресном пространстве.
Доменная организация. В сетях на основе Windows NT Server рабочие станции подключаются к выделенным серверам. Именованные собрания серверов могут быть сгруппированы в домены. Такой метод организации сети упрощает централизованное управление сетью и позволяет использовать Windows NT Server в качестве сетевой операционной системы масштаба предприятия. Если администратор однажды завел учетную информацию о пользователе домена, то последний имеет возможность зарегистрироваться с любой рабочей станции в этом домене. Для этого достаточно ввести имя, имя домена и пароль при регистрации, и Windows NT Workstation опознает пользователя и воссоздаст его рабочую среду. В серверных сетях, как правило, все совместно используемые каталоги располагаются на выделенных серверах, а совместно используемые принтеры подключены к специализированным серверам печати. Однако это ни в коей мере не ограничивает возможностей пользователя по предоставлению ресурсов его рабочей станции в совместное использование так, как это обычно делается в одноранговых сетях. Windows NT Server предоставляет возможность пользователям различных доменов совместно использовать ресурсы путем установления доверительных отношений между доменами. Если домен А и домен Б полностью доверяют друг другу, то пользователь домена А может зарегистрироваться в домене Б и осуществлять доступ к ресурсам его сервера. Аналогично пользователь домена Б может использовать ресурсы любого из серверов домена А.
Клиентами в сети с Windows NT Server могут являться компьютеры с различными операционными системами. Стандартно поддерживаются: MS-DOS, OS/2, Windows for Workgroups, клоны UNIX, Macintosh, Windows NT Workstation. Программное обеспечение возможных клиентов включается в стандартную поставку Windows NT Server.
Microsoft является одним из лидеров в установлении общественных стандартов на socket-интерфейсы для Windows. Windows Sockets является открытой спецификацией, определяющей программный интерфейс Windows к сетевым протоколам. Этот интерфейс также является частью Microsoft Windows Open Services Architecture (WOSA). Он уже знаком сетевым программистам, работающим под UNIX с расширениями на базе Windows, и стал стандартным методом разработчиков, пишущих Windows-приложения для обеспечения удаленного вызова процедур (RPC) не только через TCP/IP, но и через IPX и NetBEUI. В 1993 году Microsoft создал свой Internet FTP сервер, работающий на базе Windows NT Advanced Server. Этот сервер можно найти в Internet как ftp.microsoft.com. В настоящее время в среднем 25 000 пользователей подключаются к этому серверу еженедельно и загружают с него общим числом около 75 000 файлов в неделю.
Взаимодействие с UNIX в Windows NT обеспечивается посредством поддержки общих стандартных сетевых протоколов (включая TCP/IP), стандартных способов распределенной обработки, стандартных файловых систем и совместного использования данных, а также благодаря простоте переноса приложений. Несмотря на то, что система Windows NT была разработана для поддержки работы по схеме клиент-сервер, для совместимости с UNIX-хостами встроена эмуляция терминалов.
SNMP. В Windows NT имеется ряд средств для интеграции в системы, использующие протокол SNMP (Simple Network Management Protocol), что позволяет выполнять удаленное администрирование Windows NT с помощью, например, SUN Net Manager и HP OpenView. Поддержка графических и текстовых терминалов.
В Windows NT входят мощные API гибкой поддержки сред распределенных вычислений:
Для работы с Windows NT Workstation (Server) 3.5 требуется:
Дополнительно могут быть установлены звуковая карта, накопители на магнитных лентах, принтеры, графопостроители, модемы и другие периферийные устройства.
Полный список техники, прошедшей тестирование на совместимость с Windows NT, прилагается к системе.
Windows NT 4.0
При разработке Windows NT 4.0 Microsoft решила пожертвовать стабильностью ради производительности. С этой целью были внесены изменения в архитектуру: библиотеки менеджера окон и GDI, а также драйверы графических адаптеров были перенесены из пользовательского режима в режим ядра. Это изменение означает некоторый отход от принятой в предыдущих версиях Windows NT 3.х концепции микроядра.
Перенос графической библиотеки и драйверов в область ядра повышает скорость выполнения графического ввода-вывода. Эти изменения особенно сказались на скорости выполнения приложений Win32, в то время как приложения Windows-16 и графические приложения MS DOS работают примерно так же, как и в версии 3.5.
В то же время описанные изменения делают операционную систему в принципе менее надежной. Действительно, поскольку программное обеспечение графических адаптеров, как правило, разрабатывается фирмами-производителями этого оборудования и это программное обеспечение часто меняется (вместе с оборудованием), то от него трудно ожидать той надежности, которая требуется для модулей операционной системы.
Кроме архитектурных, в Windows NT 4.0 имеются и другие, не менее кардинальные изменения:
Microsoft добавила в Windows NT 4.0 много технических средств, чтобы сделать эту операционную систему пригодной для использования в качестве платформы для Web-сервера.
Одно из усовершенствований связано с тем, что повышающаяся роль Internet и клиент-серверных систем ведет к росту числа мобильных пользователей. Microsoft в связи с этим улучшила RAS (улучшила поддержку ISDN) и предоставила средства безопасной работы с RAS через Internet. В RAS реализованы протоколы PPTP (создает зашифрованный трафик через Internet) и Multilink PPP (позволяет объединять несколько каналов в один). Клиентами могут быть Windows NT 4.0 Workstation или Windows 95. Важным аргументом в борьбе за Internet является включение в стандартную поставку Windows NT 4.0 Web-сервера производства Microsoft - Internet Information Server, возможности которого сравнимы, а по ряду тестов и превосходят аналогичный популярный продукт Server Netscape для NT.
14.2. Структура: NT executive и защищенные подсистемы
При разработке структуры Windows NT была в значительной степени использована концепция микроядра. В соответствии с этой идеей ОС разделена на несколько подсистем, каждая из которых выполняет отдельный набор сервисных функций. Каждый сервер выполняется в пользовательском режиме, выполняя цикл проверки запроса от клиента на одну из его сервисных функций. Клиент, которым может быть либо другой компонент ОС, либо прикладная программа, запрашивает сервис, посылая сообщение на сервер.
Ядро ОС (или микроядро), работая в привилегированном режиме, доставляет сообщение нужному серверу, затем сервер выполняет операцию, после этого ядро возвращает результаты клиенту с помощью другого сообщения.
Структурно Windows NT может быть представлена в виде двух частей: часть операционной системы, работающая в режиме пользователя, и часть операционной системы, работающая в режиме ядра (рис.14.1).
Часть Windows NT, работающая в режиме ядра, называется executive - исполнительной частью. Она включает ряд компонент, которые управляют виртуальной памятью, объектами (ресурсами), вводом-выводом и файловой системой (включая сетевые драйверы), взаимодействием процессов и частично системой безопасности. Эти компоненты взаимодействуют между собой с помощью межмодульной связи. Каждая компонента вызывает другие с помощью набора тщательно специфицированных внутренних процедур.
Вторую часть Windows NT, работающую в режиме пользователя, составляют серверы. Серверы Windows NT называются защищенными подсистемами, так как каждый из них выполняется в отдельном процессе, память которого отделена от других процессов системой управления виртуальной памятью NT executive. Так как подсистемы автоматически не могут совместно использовать память, они общаются друг с другом посредством посылки сообщений. Сообщения могут передаваться как между клиентом и сервером, так и между двумя серверами. Все сообщения проходят через исполнительную часть Windows NT. Ядро Windows NT планирует нити защищенных подсистем точно так же, как и нити обычных прикладных процессов.
Поддержку защищенных подсистем обеспечивает исполнительная часть Windows NT - executive, которая работает в пространстве ядра и никогда не сбрасывается на диск. Ее составными частями являются:
Рис. 14.1. Структура Windows NT
Исполнительная часть, в свою очередь, основывается на службах нижнего уровня, предоставляемых ядром (его можно назвать и микроядром) NT. В функции ядра входит:
Ядро работает в привилегированном режиме и никогда не удаляется из памяти. Обратиться к ядру можно только посредством прерывания. Ядро расположено над уровнем аппаратных абстракций (Hardware Abstraction Level - HAL), который концентрирует в одном месте большую часть машинно-зависимых процедур. HAL располагается между NT executive и аппаратным обеспечением и скрывает от системы такие детали, как контроллеры прерываний, интерфейсы ввода/вывода и механизмы взаимодействия между процессорами. Такое решение позволяет легко переносить Windows NT с одной платформы на другую путем замены только слоя HAL.
При создании NT разработчики руководствовались задачами улучшения производительности и сетевых возможностей, а также требованием поддержки определенного набора прикладных сред. Эта цель была достигнута продуманным разделением функций между модулями ядра и остальными модулями. Например, передача данных в файловую систему и по сети производится быстрее в пространстве ядра, поэтому внутри ядра NT выделены буфера для небольших по объему (от 16 до 32 Кб) операций чтения и записи, являющихся типичными для приложений клиент-сервер и распределенных приложений. Размещение этих функций ввода-вывода внутри ядра, может, и нарушает академическую чистоту микроядра NT, но соответствует цели создания NT.
Защищенные подсистемы Windows NT работают в пользовательском режиме и создаются Windows NT во время загрузки операционной системы. Сразу после создания они начинают бесконечный цикл своего выполнения, отвечая на сообщения, поступающие к ним от прикладных процессов и других подсистем. Среди защищенных подсистем можно выделить подкласс, называемый подсистемами окружения. Подсистемы окружения реализуют интерфейсы приложений операционной системы (API). Другие типы подсистем, называемые интегральными подсистемами, исполняют необходимые операционной системе задачи. Например, большая часть системы безопасности Windows NT реализована в виде интегральной подсистемы, сетевые серверы также выполнены как интегральные подсистемы.
Наиболее важной подсистемой окружения является Win32 - подсистема, которая обеспечивает доступ для приложений к 32-bit Windows API. Дополнительно эта система обеспечивает графический интерфейс с пользователем и управляет вводом/выводом данных пользователя. Также поддерживаются подсистемы POSIX, OS/2,16-разрядная Windows и MS-DOS.
Каждая защищенная подсистема работает в режиме пользователя, вызывая системный сервис NT executive для выполнения привилегированных действий в режиме ядра. Сетевые серверы могут выполняться как в режиме пользователя, так и в режиме ядра, в зависимости от того, как они разработаны.
Подсистемы связываются между собой путем передачи сообщений. Когда, например, пользовательское приложение вызывает какую-нибудь API-процедуру, подсистема окружения, обеспечивающая эту процедуру, получает сообщение и выполняет ее либо обращаясь к ядру, либо посылая сообщение другой подсистеме. После завершения процедуры подсистема окружения посылает приложению сообщение, содержащее возвращаемое значение. Посылка сообщений и другая деятельность защищенных подсистем невидимы для пользователя.
Основным средством, скрепляющим все подсистемы Windows NT в единое целое, является механизм вызова локальных процедур (Local Procedure Call - LPC). LPC представляет собой оптимизированный вариант более общего средства - удаленного вызова процедур (RPC), которое используется для связи клиентов и серверов, расположенных на разных машинах сети.
Средства LPC поддерживают несколько способов передачи данных между клиентами и серверами: Один обычно используется для передачи коротких сообщений, другой - для длинных сообщений, а третий оптимизирован специально для использования подсистемой Win32. Каждая подсистема устанавливает порт - канал связи, посредством которого с ней могут связываться другие процессы. Порты реализуются как объекты.
Windows NT использует защищенные подсистемы для того, чтобы:
Таким образом, реализация частей ОС в виде серверов, выполняющихся в режиме пользователя, является важнейшей частью проекта Windows NT и оказывает глубокое воздействие на все функционирование системы.
Концентрация машинно-зависимых программ внутри микроядра делает перенос NT на разнообразные процессоры относительно легким. Но в то время, как некоторые микроядра (Mach и Chorus) предполагается поставлять в качестве самостоятельного программного продукта, из операционной системы Windows NT ядро вряд ли может быть вычленено для отдельного использования. Это является одной из причин того, что некоторые специалисты не считают Windows NT истинно микроядерной ОС в том смысле, в котором таковыми являются Mach и Chorus. Те же критики отмечают также, что NT не исключает, как это положено, все надстроенные службы из пространства ядра и что драйверы устройств в NT по минимуму взаимодействуют с ядром, предпочитая работать непосредственно с лежащим ниже слоем аппаратной абстракции HAL.
Множественные прикладные среды
При разработке NT важнейшим рыночным требованием являлось обеспечение поддержки по крайней мере двух уже существующих программных интерфейсов OS/2 и POSIX, а также возможности добавления других API в будущем.
Заметим, что для того, чтобы программа, написанная для одной ОС, могла быть выполнена в рамках другой ОС, недостаточно лишь обеспечить совместимость API. Кроме этого необходимо обеспечить ей "родное" окружение: структуру процесса, средства управления памятью, средства обработки ошибок и исключительных ситуаций, механизмы защиты ресурсов и семантику файлового доступа. Отсюда ясно, что поддержка нескольких прикладных программных сред является очень сложной задачей, тесно связанной со структурой операционной системы. Эта задача была успешно решена в Windows NT, при этом в полной мере был использован опыт разработчиков ОС Mach из университета Карнеги-Меллона, которые смогли в своей клиент-серверной реализации UNIX'а отделить базовые механизмы операционной системы от серверов API различных ОС.
Windows NT поддерживает пять прикладных сред операционных систем: MS-DOS, 16-разрядный Windows, OS/2 1.x, POSIX и 32-разрядный Windows (Win32). Все пять прикладных сред реализованы как подсистемы окружения. Каждая работает в собственном защищенном пользовательском пространстве. Подсистема Win32 обеспечивает поддержку дисплея, клавиатуры и мыши для четырех оставшихся подсистем.
16-битовые приложения DOS и Windows работают на VDM (Virtual DOS Machines - виртуальные машины DOS), каждая из которых эмулирует полный 80x86 процессор с MS-DOS. В NT VDM является приложением Win32, значит, как и обычные модули прикладных сред для UNIX, приложения DOS и 16-битовой Windows расположены в слое непосредственно над подсистемой Win32.
Подсистемы OS/2 и POSIX построены по-другому. В качестве полноценных подсистем NT они могут взаимодействовать с подсистемой Win32 для получения доступа к вводу и выводу, но также могут обращаться непосредственно к исполнительной системе NT за другими средствами операционной системы. Подсистема OS/2 может выполнять многие имеющиеся приложения OS/2 символьного режима, включая OS/2 SQL Server, и поддерживает именованные каналы и NetBIOS.
Однако возможности подсистемы POSIX весьма ограничены, несмотря на непосредственный доступ ее к службам ядра. Приложения POSIX должны быть откомпилированы специально для Windows NT. Windows NT не поддерживает двоичный код, предназначенный для других POSIX-совместимых систем, таких, как UNIX. К тому же подсистема POSIX NT не поддерживает непосредственно печать, не поддерживает сетевой доступ, за исключением доступа к удаленным файловым системам, и не поддерживает многие средства Win32, например, отображение на память файлов и графику.
На рис.14.2 показана структура, обеспечивающая в Windows NT поддержку множественных прикладных сред.
NT executive выполняет базовые функции операционной системы и является той основой, на которой подсистемы окружения реализуют поддержку своих приложений. Все подсистемы равноправны и могут вызвать "родные" функции NT для создания соответствующей среды для своих приложений.
Каждая подсистема окружения имеет свое представление о том, что такое, например, процесс или описатель файла, поэтому структуры данных, используемые в каждом окружении, могут не совпадать. Следовательно, как только подсистема Win32 передала прикладной процесс другой подсистеме окружения, данное приложение становится клиентом этой подсистемы вплоть до завершения процесса. При этом подсистема Win32 перенаправляет входные сообщения от пользователя этому приложению, а также отображает вывод приложения на экране.
Рис. 14.2. Реализация множественных прикладных сред в Windows NT
Объектно-ориентированный подход
Хотя NT и не является полностью объектно-ориентированной, в ее основе лежат объекты. Единообразная форма именования, совместного использования и учета системных ресурсов, простой и дешевый способ обеспечения безопасности системы и ее модификации - все эти преимущества могут быть достигнуты при использовании объектной модели.
В Windows NT любой ресурс системы, который одновременно может быть использован более чем одним процессом, включая файлы, совместно используемую память и физические устройства, реализован в виде объекта и управляется рядом функций. Такой подход сокращает число изменений, которые необходимо внести в операционную систему в процессе ее эксплуатации. Если, скажем, изменилось что-то в аппаратуре, то все, что необходимо сделать - заменить соответствующий объект. Аналогично, если требуется поддержка новых ресурсов, то надо добавить только новый объект, не изменяя при этом остального кода операционной системы.
Наиболее фундаментальное отличие между объектом и обыкновенной структурой данных заключается в том, что внутренняя структура данных объекта скрыта от наблюдения. Вы должны вызвать объектную функцию для того, чтобы получить данные из объекта или поместить данные в объект. Вы не можете непосредственно изменять данные, находящиеся внутри объекта. Это отделяет средства реализации объекта от кода, который только использует его, такая техника позволяет легко изменять в последствии реализацию объектов.
Группа разработчиков NT executive решила использовать объекты для представления системных ресурсов, потому что объекты обеспечивают централизованные средства для выполнения трех важных (и часто утомительных) задач ОС:
Не все структуры данных в NT executive являются объектами. Объектами являются только такие данные, которые нужно разделять, защищать, именовать или делать видимыми для программ пользовательского режима (с помощью системных функций). Структуры, которые используются только одним компонентом executive для выполнения внутренних функций, не являются объектами.
Несмотря на всестороннее использование объектов для представления разделяемых ресурсов, Windows NT не является объектно-ориентированной системой в строгом смысле. Большая часть кода операционной системы написана на С с целью обеспечения переносимости. Несмотря на то, что С не поддерживает непосредственно объектно-ориентированные конструкции, такие, как динамическое связывание типов данных, полиморфные функции или наследование классов, эти инструментальные средства были использованы из-за их широкой распространенности.
Менеджер объектов - это компонент NT executive, который отвечает за создание, удаление, защиту и слежение за NT-объектами. Менеджер объектов централизует операции управления ресурсами, которые в противном случае будут разбросаны по всей ОС.
Менеджер объектов NT выполняет следующие функции:
Процессы пользовательского режима, включая подсистемы окружения, должны иметь описатель объекта перед тем, как их нити смогут использовать этот объект. Использование описателей для работы с системными ресурсами не является новой идеей. Например, библиотек и С и Паскаля (а также других языков) возвращают описатели для открытых файлов. Аналогично приложениям Win32 используют различные типы описателей для управления окнами, курсором мыши, иконками. В обоих случаях описатели служат косвенными указателями на системные ресурсы; эта косвенность предохраняет прикладные программы от рутинной работы непосредственно с системными структурами данных.
Каждый NT-объект является объектом определенного типа. Тип определяет данные, которые хранит объект, и "родные" системные функции, которые могут к нему применяться. Для того чтобы управлять различными объектами единообразно, менеджер объектов требует, чтобы каждый объект содержал несколько полей стандартной информации в определенном месте объекта. До тех пор, пока эти данные имеются, менеджер объектов не заботится о том, что еще хранится в объекте. Каждый объект состоит из двух частей - заголовка объекта и тела объекта, которые содержат стандартные и переменные данные объекта соответственно. Менеджер объектов работает с заголовком объекта, а другие компоненты executive работают с телами объектов тех типов, которые они сами создают. Заголовок объекта используется менеджером без учета типа объекта. В заголовке объекта любого типа содержится имя, каталог, дескриптор безопасности, квоты на использование ресурсов, счетчик открытых описателей, база данных открытых описателей, признак постоянный/временный, режим пользователя/ядра, указатель на тип объекта.
Кроме заголовка объекта, каждый объект имеет тело объекта, формат и содержание которого уникально определяется типом этого объекта; у всех объектов одного и того же типа одинаковый формат тела. При создании объекта исполнительная часть может оперировать данными в телах всех объектов этого типа.
Процессы и нити
В разных ОС процессы реализуются по-разному. Эти различия заключаются в том, какими структурами данных представлены процессы, как они именуются, какими способами защищены друг от друга и какие отношения существуют между ними. Процессы Windows NT имеют следующие характерные свойства:
Адресное пространство каждого процесса защищено от вмешательства в него любого другого процесса. Это обеспечивается механизмами виртуальной памяти. Операционная система, конечно, тоже защищена от прикладных процессов. Чтобы выполнить какую-либо процедуру ОС или прочитать что-либо из ее области памяти, нить должна выполняться в режиме ядра. Пользовательские процессы получают доступ к функциям ядра посредством системных вызовов. В пользовательском режиме выполняются не только прикладные программы, но и защищенные подсистемы Windows NT.
В Windows NT процесс - это просто объект, создаваемый и уничтожаемый менеджером объектов. Объект-процесс, как и другие объекты, содержит заголовок, который создает и инициализирует менеджер объектов. Менеджер процессов определяет атрибуты, хранимые в теле объекта-процесса, а также обеспечивает системный сервис, который восстанавливает и изменяет эти атрибуты.
В число атрибутов тела объекта-процесса входят:
Напомним, что нить является выполняемой единицей, которая располагается в адресном пространстве процесса и использует ресурсы, выделенные процессу. Подобно процессу нить в Windows NT реализована в форме объекта и управляется менеджером объектов.
Объект нить имеет следующие атрибуты:
Кроме перечисленных, имеются и некоторые другие атрибуты.
Как видно из перечня, многие атрибуты объекта-нити аналогичны атрибутам объекта-процесса. Весьма сходны и сервисные функции, которые могут быть выполнены над объектами-процессами и объектами-нитями: создание, открытие, завершение, приостановка, запрос и установка информации, запрос и установка контекста и другие функции.
Алгоритм планирования процессов и нитей
В Windows NT реализована вытесняющая многозадачность, при которой операционная система не ждет, когда нить сама захочет освободить процессор, а принудительно снимает ее с выполнения после того, как та израсходовала отведенное ей время (квант), или если в очереди появилась нить с более высоким приоритетом.
При такой организации разделения процессора ни одна нить не займет процессор на очень долгое время. В ОС Windows NT нить в ходе своего существования может иметь одно из шести состояний (рис.14.3).
Жизненный цикл нити начинается в тот момент, когда программа создает новую нить. Запрос передается NT executive, менеджер процессов выделяет память для объекта-нити и обращается к ядру, чтобы инициализировать объект-нить ядра. После инициализации нить проходит через следующие состояния:
Рис. 14.3. Граф состояний нити
Диспетчер ядра использует для определения порядка выполнения нитей алгоритм, основанный на приоритетах, в соответствии с которым каждой нити присваивается число - приоритет, и нити с более высоким приоритетом выполняются раньше нитей с меньшим приоритетом. В самом начале нить получает приоритет от процесса, который создает ее. В свою очередь, процесс получает приоритет в тот момент, когда его создает подсистема той или иной прикладной среды. Значение базового приоритета присваивается процессу системой по умолчанию или системным администратором. Нить наследует этот базовый приоритет и может изменить его, немного увеличив или уменьшив. На основании приоритета, называемого приоритетом планирования, начинается выполнение нити. В ходе выполнения приоритет планирования может меняться.
Windows NT поддерживает 32 уровня приоритетов, разделенных на два класса - класс реального времени и класс переменных приоритетов. Нити реального времени, приоритеты которых находятся в диапазоне от 16 до 31, являются более приоритетными процессами и используются для выполнения задач, критичных ко времени.
Каждый раз, когда необходимо выбрать нить для выполнения, диспетчер прежде всего просматривает очередь готовых нитей реального времени и обращается к другим нитям, только когда очередь нитей реального времени пуста. Большинство нитей в системе попадают в класс нитей с переменными приоритетами, диапазон приоритетов которых от 0 до 15. Этот класс имеет название "переменные приоритеты" потому, что диспетчер настраивает систему, выбирая (понижая или повышая) приоритеты нитей этого класса.
Алгоритм планирования нитей в Windows NT объединяет в себе обе базовых концепции - квантование и приоритеты. Как и во всех других алгоритмах, основанных на квантовании, каждой нити назначается квант, в течение которого она может выполняться. Нить освобождает процессор, если:
Использование динамических приоритетов, изменяющихся во времени, позволяет реализовать адаптивное планирование, при котором не дискриминируются интерактивные задачи, часто выполняющие операции ввода-вывода и недоиспользующие выделенные им кванты. Если нить полностью исчерпала свой квант, то ее приоритет понижается на некоторую величину. В то же время приоритет нитей, которые перешли в состояние ожидания, не использовав полностью выделенный им квант, повышается. Приоритет не изменяется, если нить вытеснена более приоритетной нитью.
Для того, чтобы обеспечить хорошее время реакции системы, алгоритм планирования использует наряду с квантованием концепцию абсолютных приоритетов. В соответствии с этой концепцией при появлении в очереди готовых нитей такой, у которой приоритет выше, чем у выполняющейся в данный момент, происходит смена активной нити на нить с самым высоким приоритетом.
В многопроцессорных системах при диспетчеризации и планировании нитей играет роль их процессорная совместимость: после того, как ядро выбрало нить с наивысшим приоритетом, оно проверяет, какой процессор может выполнить данную нить и, если атрибут нити “процессорная совместимость" не позволяет нити выполняться ни на одном из свободных процессоров, то выбирается следующая в порядке приоритетов нить.
14.3 Области использования Windows NT
Windows NT Workstation прежде всего может использоваться как клиент в сетях Windows NT Server, а также в сетях NetWare, UNIX, Vines. Она может быть рабочей станцией и в одноранговых сетях, выполняя одновременно функции и клиента, и сервера. Windows NT Workstation может применяться в качестве ОС автономного компьютера при необходимости обеспечения повышенной производительности, секретности, а также при реализации сложных графических приложений, например, в системах автоматизированного проектирования.
Windows NT Server может быть использован прежде всего как сервер в корпоративной сети. Здесь весьма полезной оказывается его возможность выполнять функции контроллера доменов, позволяя структурировать сеть и упрощать задачи администрирования и управления. Он используется также в качестве файл-сервера, принт - сервера, сервера приложений, сервера удаленного доступа и сервера связи (шлюза). Кроме того, Windows NT Server может быть использован как платформа для сложных сетевых приложений, особенно тех, которые построены с использованием технологии клиент-сервер.
Так, под управлением Windows NT Server может работать сервер баз данных Microsoft SQL Server, а также серверы баз данных других известных фирм, такие, как Oracle и Sybase, Adabas и InterBase.
На платформе Windows NT Server может быть установлена новая мощная система администрирования Microsoft System Management Server, функцией которой является инвентаризация аппаратной и программной конфигурации компьютеров сети, автоматическая установка программных продуктов на рабочие станции, удаленное управление любым компьютером и мониторинг сети.
Windows NT Server может использоваться как сервер связи с мейнфреймами. Для этого создан специальный продукт Microsoft SNA Server, позволяющий легко объединить в одной сети IBM PC-совместимые рабочие станции и мощные мейнфреймы.
Наконец, Windows NT Server является платформой для нового производительного почтового сервера Microsoft Exchange.
Литература
ОГЛАВЛЕНИЕ
Анатолий Алексеевич Дубаков
ОПЕРАЦИОННЫЕ СИСТЕМЫ
Учебное пособие
Научный редактор
кандидат технических наук, доцент Г.Д. Дубина
Подписано к печати
Формат 60х84/16. Бумага ксероксная.
Плоская печать. Усл. печ. л. 8,14. Уч.-изд. л. 7,37.
Тираж экз. 3аказ . Цена свободная.
ИПФ ТПУ. Лицензия ЛТ № 1 от 18.07.94.
Типография ТПУ. 634034, Томск, пр. Ленина, 30.