Введение

 

Эта книга — не о конкретной операционной системе и даже не о конкретном типе операционных систем. В ней операционные системы (ОС) рассматрива­ются с самых общих позиций, а описываемые фундаментальные концепции и принципы построения справедливы для большинства ОС.

Действительно, различия между существующими ОС не столь существенны, как это может показаться на первый взгляд. Разработчики операционных систем жи­вут в едином мире без жестких границ, не препятствующих миграции хорошо за­рекомендовавших себя концепций и механизмов из одной системы в другую. В результате в подавляющем большинстве ОС нам встречаются одни и те же принципы управления ресурсами компьютера: мультипрограммирование и мультипроцессирование, виртуальная память и свопинг, отображаемые в память файлы и удаленный вызов процедур. Это позволяет при изучении ОС эффек­тивно использовать подход «от общего к частному», отделяя детали реализации от основополагающей идеи.

С другой стороны, авторы старались избегать сухого академического изложения материала. Принципиальные положения иллюстрируются примерами механиз­мов конкретных ОС, как правило, наиболее распространенных или тех, которые стали вехами на пути развития вычислительной техники: UNIX, OS/360, Windows NT, MS-DOS, NetWare, OS/2.

Эту книгу авторы рассматривают как своего рода дополнение и продолжение своей предыдущей книги (Компьютерные сети. Принципы, технологии, протоко­лы. Олифер В. Г., Олифер Н. А. - СПб: Питер, 1999). Такая взаимосвязь объяс­няется тем, что для понимания работы сети необходимо знать не только устрой­ство транспортной инфраструктуры сети (именно этим вопросам посвящена предыдущая книга), но и принципы организации сетевых служб операционных систем, которые рассматриваются в данной книге.

 

Для кого эта книга

 

В первую очередь эта книга адресуется студентам и аспирантам различных спе­циальностей направления «Информатика и вычислительная техника» как учебное пособие по курсам «Операционные системы» и «Организация вычислитель­ных процессов». В основу книги положен многолетний опыт одного из авторов по преподаванию указанных курсов на кафедре вычислительной техники в МИРЭА.

Кроме того, книга может быть полезна и для специалистов: программистов, ко­торые хотят более эффективно использовать системные средства, сетевых адми­нистраторов, которым нужны знания принципов работы ОС для оптимизации операционной сетевой среды, специалистам по коммуникационному оборудова­нию, создающим транспортную инфраструктуру сети. Авторы убедились в этом, проводя в течение ряда лет курсы в Московском центре информационных техно­логий для специалистов-практиков, повышавших свою квалификацию в области операционных систем.

И наконец, книга может заинтересовать всех, кто имеет дело с компьютерами и хочет больше узнать о том, как устроены современные операционные системы.

 

Структура книги

 

Первые три главы вводят читателя в проблематику операционных систем. После рассмотрения основных этапов эволюции ОС обсуждается назначение современ­ной операционной системы. Затем исследуются функциональная и структурная организация ОС, а также основные подсистемы и компоненты, используемые для управления как локальными, так и разделяемыми сетевыми ресурсами. При этом рассматриваются классическая многослойная организация ОС с монолит­ным ядром, а также микроядерная архитектура.

Следующие пять глав (с четвертой по восьмую) посвящены концепциям и меха­низмам управления локальными ресурсами компьютера: процессором, памятью и внешними устройствами. Изучаются понятия процесса и потока, различные дисциплины планирования и диспетчеризации, применяемые в системах пакет­ной обработки, разделения времени и реального времени. Достаточно подробно рассматриваются различные схемы реализации механизма прерываний и его роль в организации вычислительного процесса.

Методы управления памятью рассматриваются в исторической ретроспективе — от самых простых схем с фиксированными разделами до современной сегментно-страничной организации памяти. Детально исследуются концепции вирту­альной памяти и кэширования данных.

При рассмотрении файловой системы и внешних устройств применяется совре­менных подход, согласно которому файловая система является неотъемлемой частью подсистемы ввода-вывода, состоящей из драйверов различного уровня, объединенных общим менеджером. В качестве примеров используются наиболее распространенные файловые системы, такие как ufs, NTFS и FAT. Изучаются та­кие важные функции файловых систем, как устойчивость к сбоям и отказам, а также контроль доступа к хранимым данным.

Управление локальными ресурсами тесно связано с аппаратными средствами организации вычислительного процесса. Шестая глава полностью посвящена  подробному описанию такого рода средств, встроенных в процессоры семейства Pentium. На примере этого процессора показано взаимодействие программных и аппаратных средств компьютера при планировании процессов и потоков, рас­пределении памяти, защите данных на разных уровнях.

В последних трех главах рассматриваются сетевые функции ОС. Сначала обсуж­дается концепция распределенных вычислений, типы многозвенных приложений и средства их реализации — системы передачи сообщений и удаленного вызо­ва процедур. Теоретические схемы иллюстрируются конкретными механизмами, такими как сокеты Беркли и механизмы Sun RPC и DCE RPC. Концепция распределенных вычислений широко используется при изучении се­тевой файловой службы, одного из основных компонентов любой сетевой ОС. Рассматриваются различные протоколы взаимодействия клиентской и сервер­ной частей файловой службы, такие как NFS, SMB, FTP и NCP. Далее изучают­ся назначение и архитектура службы каталогов как центрального элемента со­временной ОС. Отдельный раздел посвящен проблеме взаимодействия сетевых служб в гетерогенной среде с использованием методов трансляции, мультиплек­сирования и инкапсуляции протоколов.

Завершает книгу глава, посвященная сетевой безопасности. Она включает опи­сание основных угроз, возникающих при работе в сети, и различных подходов, используемых для защиты данных. Рассматриваются базовые технологии сете­вой безопасности: шифрование, аутентификация, авторизация, цифровая под­пись, цифровые сертификаты, аудит, защищенный канал. Совместная работа различных технологий безопасности иллюстрируется на примере интегрирован­ной системы защиты данных Kerberos.

В конце каждой главы даются выводы, а также приводятся задачи и упражнения. Книга снабжена индексным указателем и списком рекомендуемой литературы.

 

От издательства

 

Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение!

Подробную информацию о наших книгах вы найдете на Web-сайте издательства http://www.piter.com.

 

 

ГЛАВА 1  

Эволюция операционных систем

 

История любой отрасли науки или техники позволяет не только удовлетворить естественное любопытство, но и глубже понять сущность основных достижений этой отрасли, осознать существующие тенденции и правильно оценить перспектив­ность тех или иных направлений развития. За почти полувековой период своего существования операционные системы прошли сложный путь, насыщенный многими важными событиями. Огромное влияние на развитие операционных систем оказали успехи в совершенствовании элементной базы и вычислитель­ной аппаратуры, поэтому многие этапы развития ОС тесно связаны с появлени­ем новых типов аппаратных платформ, таких как мини-компьютеры или персо­нальные компьютеры. Серьезную эволюцию операционные системы претерпели в связи с новой ролью компьютеров в локальных и глобальных сетях. Важней­шим фактором развития ОС стал Интернет. По мере того как эта Сеть приоб­ретает черты универсального средства массовых коммуникаций, ОС становятся все более простыми и удобными в использовании, включают развитые средства поддержки мультимедийной информации, снабжаются надежными средствами защиты. 

 

Появление первых операционных систем

 

Идея компьютера была предложена английским математиком Чарльзом Бэбиджем (Charles Babage) в середине девятнадцатого века. Его механическая «анали­тическая машина» так и не смогла по-настоящему заработать, потому что тех­нологии того времени не удовлетворяли требованиям, необходимым для изготовления нужных деталей точной механики. Конечно, никакой речи об опе­рационной системе для этого «компьютера» не шло.

Настоящее рождение цифровых вычислительных машин произошло вскоре по­сле окончания Второй мировой войны. В середине 40-х были созданы первые

ламповые вычислительные устройства. В то время одна и та же группа людей участвовала и в проектировании, и в эксплуатации, и в программировании вы­числительной машины. Это была скорее научно-исследовательская работа в об­ласти вычислительной техники, а не использование компьютеров в качестве инструмента решения каких-либо практических задач из других прикладных об­ластей. Программирование осуществлялось исключительно на машинном языке. Не было никакого системного программного обеспечения, кроме библиотек ма­тематических и служебных подпрограмм, которые программист мог использо­вать для того, чтобы не писать каждый  раз коды, вычисляющие значение ка­кой-либо математической функции или управляющие стандартным устройством ввода-вывода. Операционные системы все еще не появились, все задачи органи­зации вычислительного процесса решались вручную каждым программистом с пульта управления, который представлял собой примитивное устройство ввода-вывода, состоящее из кнопок, переключателей и индикаторов.

С середины 50-х годов начался новый период в развитии вычислительной техни­ки, связанный с появлением новой технической базы — полупроводниковых эле­ментов. Выросло быстродействие процессоров, увеличились объемы оператив­ной и внешней памяти. Компьютеры стали более надежными, теперь они могли непрерывно работать настолько долго, чтобы на них можно было возложить вы­полнение действительно практически важных задач.

Наряду с совершенствованием аппаратуры заметный прогресс наблюдался так­же в области автоматизации программирования и организации вычислительных работ. В эти годы появились первые алгоритмические языки, и таким образом к библиотекам математических и служебных подпрограмм добавился новый тип системного программного обеспечения — трансляторы.

Выполнение каждой программы стало включать большое количество вспомога­тельных работ: загрузка нужного транслятора (АЛГОЛ, ФОРТРАН, КОБОЛ и т. п.), запуск транслятора и получение результирующей программы в машин­ных кодах, связывание программы с библиотечными подпрограммами, загрузка программы в оперативную память, запуск программы, вывод результатов на пе­риферийное устройство. Для организации эффективного совместного использо­вания трансляторов, библиотечных программ и загрузчиков в штат многих вы­числительных центров были введены должности операторов, профессионально выполнявших работу по организации вычислительного процесса для всех поль­зователей этого центра.

Но как бы быстро и надежно ни работали операторы, они никак не могли состя­заться в производительности с работой устройств компьютера. Большую часть времени процессор простаивал в ожидании, пока оператор запустит очередную задачу. А поскольку процессор представлял собой весьма дорогое устройство, то низкая эффективность его использования означала низкую эффективность ис­пользования компьютера в целом. Для решения этой проблемы были разработа­ны первые системы пакетной обработки, которые автоматизировали всю после­довательность действий оператора по организации вычислительного процесса.

Ранние системы пакетной обработки явились прообразом современных опера­ционных систем, они стали первыми системными программами, предназначен­ными не для обработки данных, а для управления вычислительным процессом.

В ходе реализации систем пакетной обработки был разработан формализованный язык управления заданиями, с помощью которого программист сообщал системе и оператору, какие действия и в какой последовательности он хочет выполнить на вычислительной машине. Типовой набор директив обычно включал признак начала отдельной работы, вызов транслятора, вызов загрузчика, признаки нача­ла и конца исходных данных.

Оператор составлял пакет заданий, которые в дальнейшем без его участия по­следовательно запускались на выполнение управляющей программой — монито­ром. Кроме того, монитор был способен самостоятельно обрабатывать наиболее часто встречающиеся при работе пользовательских программ аварийные ситуа­ции, такие как отсутствие исходных данных, переполнение регистров, деление на ноль, обращение к несуществующей области памяти и т. д. Пакет обычно пред­ставлял собой набор перфокарт, но для ускорения работы он мог переноситься на более удобный и емкий носитель, например на магнитную ленту или магнит­ный диск. Сама программа-монитор в первых реализациях также хранилась на перфокартах или перфоленте, а в более поздних — на магнитной ленте и магнит­ных дисках.

Ранние системы пакетной обработки значительно сократили затраты времени на вспомогательные действия по организации вычислительного процесса, а значит, был сделан еще один шаг по повышению эффективности использования компь­ютеров. Однако при этом программисты-пользователи лишились непосредствен­ного доступа к компьютеру, что снижало эффективность их работы — внесение любого исправления требовало значительно больше времени, чем при интерак­тивной работе за пультом машины.

 

 

 

Появление мультипрограммных операционных

систем для мэйнфреймов

 

Следующий важный период развития операционных систем относится к 1965— 1975 годам.

В это время в технической базе вычислительных машин произошел переход от отдельных полупроводниковых элементов типа транзисторов к интегральным микросхемам, что открыло путь к появлению следующего поколения компьюте­ров. Большие функциональные возможности интегральных схем сделали воз­можным реализацию на практике сложных компьютерных архитектур, таких, например, как IBM/360.

В этот период были реализованы практически все основные механизмы, прису­щие современным ОС: мультипрограммирование, мультипроцессирование, под­держка многотерминального многопользовательского режима, виртуальная па­мять, файловые системы, разграничение доступа и сетевая работа. В эти годы начинается расцвет системного программирования. Из направления прикладной математики, представляющего интерес для узкого круга специалистов, системное программирование превращается в отрасль индустрии, оказывающую непо­средственное влияние на практическую деятельность миллионов людей.

Революционным событием данного этапа явилась промышленная реализация мультипрограммирования. (Заметим, что в виде концепции и эксперименталь­ных систем этот способ организации вычислений существовал уже около десяти лет.) В условиях резко возросших возможностей компьютера по обработке и хранению данных выполнение только одной программы в каждый момент вре­мени оказалось крайне неэффективном. Решением стало мультипрограммирова­ние — способ организации вычислительного процесса, при котором в памяти компьютера находилось одновременно несколько программ, попеременно выпол­няющихся на одном процессоре. Эти усовершенствования значительно улуч­шили эффективность вычислительной системы: компьютер теперь мог исполь­зоваться почти постоянно, а не менее половины времени работы компьютера, как это было раньше.

Мультипрограммирование было реализовано в двух вариантах — в системах па­кетной обработки и разделения времени.

Мультипрограммные системы пакетной обработки так же, как и их однопрограммные предшественники, имели своей целью обеспечение максимальной за­грузки аппаратуры компьютера, однако решали эту задачу более эффективно. В мультипрограммном пакетном режиме процессор не простаивал, пока одна программа выполняла операцию ввода-вывода (как это происходило при после­довательном выполнении программ в системах ранней пакетной обработки), а переключался на другую готовую к выполнению программу. В результате до­стигалась сбалансированная загрузка всех устройств компьютера, а следователь­но, увеличивалось число задач, решаемых в единицу времени.

В мультипрограммных системах пакетной обработки пользователь по-прежнему был лишен возможности интерактивно взаимодействовать со своими програм­мами. Для того чтобы хотя бы частично вернуть пользователям ощущение непо­средственного взаимодействия с компьютером, был разработан другой вариант мультипрограммных систем — системы разделения времени. Этот вариант рас­считан на мпоготермипалъпые системы, когда каждый пользователь работает за своим терминалом. В числе первых операционных систем разделения времени, разработанных в середине 60-х годов, были TSS/360 (компания IBM), CTSS и MULTICS (Массачусетский технологический институт совместно с Bell Labs и компанией General Electric). Вариант мультипрограммирования, применяемый в системах разделения времени, был нацелен на создание для каждого отдельного пользователя иллюзии единоличного владения вычислительной машиной за счет периодического выделения каждой программе своей доли процессорного време­ни. В системах разделения времени эффективность использования оборудова­ния ниже, чем в системах пакетной обработки, что явилось платой за удобства работы пользователя.

Многотерминальный режим использовался не только в системах разделения вре­мени, но и в системах пакетной обработки. При этом не только оператор, но и все пользователи получали возможность формировать свои задания и управлять их выполнением со своего терминала. Такие операционные системы получили название систем удаленного ввода заданий. Терминальные комплексы могли рас-

полагаться на большом расстоянии от процессорных стоек, соединяясь с ними с

помощью различных глобальных связей — модемных соединений телефонных сетей или выделенных каналов. Для поддержания удаленной работы термина­лов в операционных системах появились специальные программные модули, реализующие различные (в то время, как правило, нестандартные) протоколы связи. Такие вычислительные системы с удаленными терминалами, сохраняя централизованный характер обработки данных, в какой-то степени являлись прообразом современных сетей, а соответствующее системное программное обес­печение — прообразом сетевых операционных систем.

К этому времени можно констатировать существенное изменение в распределе­нии функций между аппаратными и программными средствами компьютера. Операционные системы становились неотъемлемыми элементами компьютеров, играя роль «продолжения» аппаратуры. В первых вычислительных машинах программист, напрямую взаимодействуя с аппаратурой, мог выполнить загрузку программных кодов, используя пультовые переключатели и лампочки индикато­ров, а затем вручную запустить программу на выполнение, нажав кнопку «пуск». В компьютерах 60-х годов большую часть действий по организации вычисли­тельного процесса взяла на себя операционная система. (Б большинстве совре­менных компьютеров не предусмотрено даже теоретической возможности выпол­нения какой-либо вычислительной работы без участия операционной системы. После включения питания автоматически происходит поиск, загрузка и запуск операционной системы, а в случае ее отсутствия компьютер просто останавлива­ется.)

Реализация мультипрограммирования потребовала внесения очень важных изме­нений в аппаратуру компьютера, непосредственно направленных на поддержку нового способа организации вычислительного процесса. При разделении ресур­сов компьютера между программами необходимо обеспечить быстрое переклю­чение процессора с одной программы на другую а также надежно защитить коды и данные одной программы от непреднамеренной или преднамеренной порчи другой программой. В процессорах появился привилегированный и пользова­тельский режимы работы, специальные регистры для быстрого переключения с одной программы на другую, средства защиты областей памяти, а также разви­тая система прерываний.

В привилегированном режиме, предназначенном для работы программных моду­лей операционной системы, процессор мог выполнять все команды, в том числе и те из них, которые позволяли осуществлять распределение и защиту ресурсов компьютера. Программам, работающим в пользовательском режиме, некоторые команды процессора были недоступны. Таким образом, только ОС могла управ­лять аппаратными средствами и исполнять роль монитора и арбитра для пользо­вательских программ, которые выполнялись в непривилегированном, пользова­тельском режиме.

Система прерываний позволяла синхронизировать работу различных устройств компьютера, работающих параллельно и асинхронно, таких как каналы ввода-вывода, диски, принтеры и т. п. Аппаратная поддержка операционных систем стала с тех пор неотъемлемым свойством практически любых компьютерных систем, включая персональные компьютеры. 

Еще одной важной тенденцией этого периода является создание семейств про­граммно-совместимых машин и операционных систем для них. Примерами се­мейств программно-совместимых машин, построенных на интегральных микро­схемах, являются серии машин ШМ/360 и IBM/370 (аналоги этих семейств советского производства — машины серии ЕС), PDP-11 (советские аналоги — СМ-3, СМ-4, СМ-1420). Вскоре идея программно-совместимых машин стала об­щепризнанной.

Программная совместимость требовал» и совместимости операционных систем. Однако такая совместимость подразумевает возможность работы на больших и на малых вычислительных системах, с большим и с малым количеством разно­образной периферии, в коммерческой области и в области научных исследо­ваний. Операционные системы, построенные с намерением удовлетворить всем этим противоречивым требованиям, оказались чрезвычайно сложными. Они со­стояли из многих миллионов ассемблерных строк, написанных тысячами про­граммистов, и содержали тысячи ошибок, вызывающих нескончаемый поток ис­правлений. Операционные системы этого поколения были очень дорогими. Так, разработка OS/360, объем кода для которой составил 8 Мбайт, стоила компании IBM 80 миллионов долларов.

Однако несмотря на необозримые размеры и множество проблем, OS/360 и дру­гие ей подобные операционные системы этого поколения действительно удовле­творяли большинству требований потребителей. За это десятилетие был сделан огромный шаг вперед и заложен прочный фундамент для создания современных операционных систем.

 

Операционные системы и глобальные сети

 

В начале 70-х годов появились первые сетевые операционные системы, которые в отличие от многотерминальных ОС позволяли не только рассредоточить поль­зователей, но и организовать распределенное хранение и обработку данных меж­ду несколькими компьютерами, связанными электрическими связями. Любая сетевая операционная система, с одной стороны, выполняет все функции локаль­ной операционной системы, а с другой стороны, обладает некоторыми дополни­тельными средствами, позволяющими ей взаимодействовать по сети с опера­ционными системами других компьютеров. Программные модули, реализующие сетевые функции, появлялись в операционных системах постепенно, по мере развития сетевых технологий, аппаратной базы компьютеров и возникновения новых задач, требующих сетевой обработки.

Хотя теоретические работы по созданию концепций сетевого взаимодействия ве­лись почти с самого появления вычислительных машин, значимые практические результаты по объединению компьютеров в сети были получены в конце 60-х, когда с помощью глобальных связей и техники коммутации пакетов удалось реа­лизовать взаимодействие машин класса мэйнфреймов и суперкомпьютеров. Эти дорогостоящие компьютеры часто хранили уникальные данные и программы, доступ к которым необходимо было обеспечить широкому кругу пользователей, находившихся в различных городах на значительном расстоянии от вычисли­тельных центров.

В 1969 году Министерство обороны США инициировало работы по объеди­нению суперкомпьютеров оборонных и научно-исследовательских центров в единую сеть. Эта сеть получила название ARPANET и явилась отправной точ­кой для создания самой известной ныне глобальной сети — Интернета. Сеть ARPANET объединяла компьютеры разных типов, работавшие под управлением различных ОС с добавленными модулями, реализующими коммуникационные протоколы, общие для всех компьютеров сети.

В 1974 году компания IBM объявила о создании собственной сетевой архитекту­ры для своих мэйнфреймов, получившей название SNA (System Network Archi­tecture). Эта многоуровневая архитектура, во многом подобная стандартной мо­дели OSI, появившейся несколько позже, обеспечивала взаимодействие типа «терминал-терминал», «терминал-компьютер» и «компьютер-компьютер» по гло­бальным связям. Нижние уровни архитектуры были реализованы специализи­рованными аппаратными средствами, наиболее важным из которых является процессор телеобработки. Функции верхних уровней SNA выполнялись программ­ными модулями. Один из них составлял основу программного обеспечения про­цессора телеобработки. Другие модули работали на центральном процессоре в составе стандартной операционной системы IBM для мэйнфреймов.

В это же время в Европе велись активные работы по созданию и стандартизации сетей Х.25. Эти сети с коммутацией пакетов не были привязаны к какой-либо конкретной операционной системе. После получения статуса международного стандарта в 1974 году протоколы Х.25 стали поддерживаться многими операци­онными системами. С 1980 года компания IBM включила поддержку протоко­лов Х.25 в архитектуру SNA и в свои операционные системы.

 

Операционные системы мини-компьютеров и первые

 локальные сети

 

К середине 70-х годов наряду с мэйнфреймами широкое распространение полу­чили мини-компьютеры, такие как PDP-11, Nova, HP. Мини-компьютеры пер­выми использовали преимущества больших интегральных схем, позволившие реализовать достаточно мощные функции при сравнительно невысокой стоимо­сти компьютера.

Архитектура мини-компьютеров была значительно упрощена по сравнению с мэйнфреймами, что нашло отражение и в их операционных системах. Многие функции мультипрограммных многопользовательских ОС мэйнфреймов были усечены, учитывая ограниченность ресурсов мини-компьютеров. Операционные системы мини-компьютеров часто стали делать специализированными, например только для управления в реальном времени (ОС RT-11 для мини-компьютеров PDP-11) или только для поддержания режима разделения времени (RSX-11M для тех же компьютеров). Эти операционные системы не всегда были многополь­зовательскими, что во многих случаях оправдывалось невысокой стоимостью компьютеров.

Важной вехой в истории мини-компьютеров и вообще в истории операционных систем явилось создание ОС UNIX. Первоначально эта ОС предназначалась для поддержания режима разделения времени в мини-компьютере PDP-7. С середины 70-х годов началось массовое использование ОС UNIX. К этому времени про­граммный код для UNIX был на 90 % написан на языке высокого уровня С. Широ­кое распространение эффективных С-компиляторов сделало UNIX уникальной для того времени ОС, обладающей возможностью сравнительно легкого переноса на различные типы компьютеров. Поскольку эта ОС поставлялась вместе с исход­ными кодами, то она стала первой открытой ОС, которую могли совершенство­вать простые пользователи-энтузиасты. Хотя UNIX была первоначально разра­ботана для мини-компьютеров, гибкость, элегантность, мощные функциональные возможности и открытость позволили ей занять прочные позиции во всех клас­сах компьютеров: суперкомпьютерах, мэйнфреймах, мини-компьютерах, серверах и рабочих станциях на базе RISC-процессоров, персональных компьютерах.

Доступность мини-компьютеров и вследствие этого их распространенность на предприятиях послужили мощным стимулом для создания локальных сетей. Предприятие могло себе позволить иметь несколько мини-компьютеров, находя­щихся в одном здании или даже в одной комнате. Естественно, возникала по­требность в обмене информацией между ними и в совместном использовании дорогого периферийного оборудования.

Первые локальные сети строились с помощью нестандартного коммуникацион­ного оборудования, в простейшем случае — путем прямого соединения последо­вательных портов компьютеров. Программное обеспечение также было нестан­дартным и реализовывалось в виде пользовательских приложений. Первое сетевое приложение для ОС UNIX — программа UUCP (UNIX-to-UNIX Copy program) — появилась в 1976 году и начала распространяться с версией 7 AT&T UNIX с 1978 года. Эта программа позволяла копировать файлы с одного компь­ютера на другой в пределах локальной сети через различные аппаратные интер­фейсы — RS-232, токовую петлю и т. п., а кроме того, могла работать через гло­бальные связи, например модемные.

 

Развитие операционных систем в 80-е годы

 

К наиболее важным событиям этого десятилетия можно отнести разработку стека TCP/IP, станозление Интернета, стандартизацию технологий локальных сетей, появление персональных компьютеров и операционных систем для них.

Рабочий вариант стека протоколов TCP/IP был создан в конце 70-х годов. Этот стек представлял собой набор общих протоколов для разнородной вычислитель­ной среды и предназначался для связи экспериментальной сети ARPANET с другими «сателлитными» сетями. В 1983 году стек протоколов TCP/IP был принят Министерством обороны США в качестве военного стандарта. Переход ком­пьютеров сети ARPANET на стек TCP/IP ускорила его реализация для операци­онной системы BSD UNIX. С этого времени началось совместное существование UNIX и протоколов TCP/IP, а практически все многочисленные версии Unix стали сетевыми.

Внедрение протоколов TCP/IP в ARPANET придало этой сети все основные черты, которые отличают современный Интернет. В 1983 году сеть ARPANET была разделена на две части; MILNET, поддерживающую военные ведомства США, и новую ARPANET. Для обозначения составной сети ARPANET и MILNET стало использоваться название Internet, которое в русском языке со временем (и с легкой руки локализаторов Microsoft) превратилось в Интернет. Интернет стал отличным полигоном для испытаний многих сетевых операцион­ных систем, позволившим проверить в реальных условиях возможности их взаи­модействия, степень масштабируемости, способность работы при экстремальной нагрузке, создаваемой сотнями и тысячами пользователей. Стек протоколов TCP/IP также ждала завидная судьба. Независимость от производителей, гиб­кость и эффективность, доказанные успешной работой в Интернете, а также от­крытость и доступность стандартов сделали протоколы TCP/IP не только глав­ным транспортным механизмом Интернета, но и основным стеком большинства сетевых операционных систем.

Все десятилетие было отмечено постоянным появлением новых, все более совер­шенных версий ОС UNIX. Среди них были и фирменные версии UNIX: SunOS, HP-UX, Irix, AIX и многие другие, в которых производители компьютеров адап­тировали код ядра и системных утилит для своей аппаратуры. Разнообразие вер­сий породило проблему их совместимости, которую периодически пытались ре­шить различные организации. В результате были приняты стандарты POSIX и XPG, определяющие интерфейсы ОС для приложений, а специальное подразде­ление компании AT&T выпустило несколько версий UNIX System III и UNIX System V, призванных консолидировать разработчиков на уровне кода ядра.

Начало 80-х годов связано с еще одним знаменательным для истории операци­онных систем событием — появлением персональных компьютеров. С точки зре­ния архитектуры персональные компьютеры ничем не отличались от класса мини-компьютеров типа PDP-11, но их стоимость была существенно ниже. Если мини-компьютер позволил иметь собственную вычислительную машину отделу предприятия или университету, то персональный компьютер дал такую воз­можность отдельному человеку. Компьютеры стали широко использоваться неспециалистами, что потребовало разработки «дружественного» программного обеспечения, и предоставление этих «дружественных» функций стало прямой обязанностью операционных систем. Персональные компьютеры послужили так­же мощным катализатором для бурного роста локальных сетей, создав для этого отличную материальную основу в виде десятков и сотен компьютеров, принад­лежащих одному предприятию и расположенных в пределах одного здания. В результате поддержка сетевых функций стала для ОС персональных компью­теров необходимым условием.

Однако и дружественный интерфейс, и сетевые функции появились у операци­онных систем персональных компьютеров не сразу. Первая версия наиболее популярной операционной системы раннего этапа развития персональных компью­теров — MS-DOS компании Microsoft — была лишена этих возможностей. Это была однопрограммная однопользовательская ОС с интерфейсом командной стро­ки, способная стартовать с дискеты. Основными задачами для нее были управле­ние файлами, расположенными на гибких и жестких дисках в UNIX-подобной иерархической файловой системе, а также поочередный запуск программ. MS-DOS не была защищена от программ пользователя, так как процессор Intel 8088 не поддерживал привилегированного режима. Разработчики первых персональ­ных компьютеров считали, что при индивидуальном использовании компьютера и ограниченных возможностях аппаратуры нет смысла в поддержке мультипро­граммирования, поэтому в процессоре не были предусмотрены привилегирован­ный режим и другие механизмы поддержки мультипрограммных систем.

Недостающие функции для MS-DOS и подобных ей ОС компенсировались внеш­ними программами, предоставлявшими пользователю удобный графический ин­терфейс (например, Norton Commander) или средства тонкого управления дис­ками (например, PC Tools). Наибольшее влияние на развитие программного обеспечения для персональных компьютеров оказала операционная среда Win­dows компании Microsoft, представлявшая собой надстройку над MS-DOS.

Сетевые функции также реализовывались в основном сетевыми оболочками, ра­ботавшими поверх ОС. При сетевой работе всегда необходимо поддерживать многопользовательский режим, при котором один пользователь — интерактив­ный, а остальные получают доступ к ресурсам компьютера по сети. В таком слу­чае от операционной системы требуется хотя бы некоторый минимум функцио­нальной поддержки многопользовательского режима. История сетевых средств MS-DOS началась с версии 3.1. Эта версия MS-DOS добавила к файловой систе­ме необходимые средства блокировки файлов и записей, которые позволили бо­лее чем одному пользователю иметь доступ к файлу. Пользуясь этими функция­ми, сетевые оболочки могли обеспечить разделение файлов между сетевыми пользователями.

Вместе с выпуском версии MS-DOS 3.1 в 1984 году компания Microsoft также выпустила продукт, называемый Microsoft Networks, который обычно нефор­мально называют MS-NET. Некоторые концепции, заложенные в MS-NET, та­кие как введение в структуру базовых сетевых компонентов — редиректора и се­тевого сервера, успешно перешли в более поздние сетевые продукты Microsoft: LAN Manager, Windows for Workgroups, а затем и в Windows NT.

Сетевые оболочки для персональных компьютеров выпускали и другие компа­нии: IBM, Artisoft, Performance Technology и другие.

Иной путь выбрала компания Novell. Она изначально сделала ставку на разра­ботку операционной системы со встроенными сетевыми функциями и добилась на этом пути выдающихся успехов. Ее сетевые операционные системы NetWare на долгое время стали эталоном производительности, надежности и защищенно­сти для локальных сетей.

Первая сетевая операционная система компании Novell появилась на рынке в 1983 году и называлась OS-Net. Эта ОС предназначалась для сетей, имевших звездообразную топологию, центральным элементом которых был специализированный компьютер на базе микропроцессора Motorola 68000. Немного позже, когда фирма IBM выпустила персональные компьютеры PC XT, компания Novell разработала новый продукт — NetWare 86, рассчитанный на архитектуру микро­процессоров семейства Intel 8088.

С самой первой версии ОС NetWare распространялась как операционная систе­ма для центрального сервера локальной сети, которая за счет специализации на выполнении функций файл-сервера обеспечивает максимально возможную для данного класса компьютеров скорость удаленного доступа к файлам и повышен­ную безопасность данных. За высокую производительность пользователи сетей Novell NetWare расплачиваются стоимостью — выделенный файл-сервер не мо­жет использоваться в качестве рабочей станции, а его специализированная ОС имеет весьма специфический прикладной программный интерфейс (API), что требует от разработчиков приложений особых знаний, специального опыта и зна­чительных усилий.

В отличие от Novell большинство других компаний развивали сетевые средства для персональных компьютеров в рамках операционных систем с универсаль­ным интерфейсом API, то есть операционных систем общего назначения. Такие системы по мере развития аппаратных платформ персональных компьютеров стали все больше приобретать черты операционных систем мини-компьютеров.

В 1987 году в результате совместных усилий Microsoft и IBM появилась первая многозадачная операционная система для персональных компьютеров с процес­сором Intel 80286, в полной мере использующая возможности защищенного ре­жима — OS/2. Эта система была хорошо продуманна. Она поддерживала вытес­няющую многозадачность, виртуальную память, графический пользовательский интерфейс (не с первой версии) и виртуальную машину для выполнения DOS-приложений. Фактически она выходила за пределы простой многозадачности с ее концепцией распараллеливания отдельных процессов, получившей название многопоточности.

OS/2 с ее развитыми функциями многозадачности и файловой системой HPFS со встроенными средствами многопользовательской защиты оказалась хорошей платформой для построения локальных сетей персональных компьютеров. Наи­большее распространение получили сетевые оболочки LAN Manager компании Microsoft и LAN Server компании IBM, разработанные этими компаниями на ос­нове одного базового кода. Эти оболочки уступали по производительности фай­ловому серверу NetWare и потребляли больше аппаратных ресурсов, но имели важ­ные достоинства — они позволяли, во-первых, выполнять на сервере любые программы, разработанные для OS/2, MS-DOS и Windows, а во-вторых, исполь­зовать компьютер, на котором они работали, в качестве рабочей станции.

Сетевые разработки компаний Microsoft и IBM привели к появлению NetBIOS — очень популярного транспортного протокола и одновременно интерфейса при­кладного программирования для локальных сетей, получившего применение практически во всех сетевых операционных системах для персональных компь­ютеров. Этот протокол и сегодня применяется для создания небольших локаль­ных сетей.

Не очень удачная рыночная судьба OS/2 не позволила системам LAN Manager и LAN Server захватить заметную долю рынка, но принципы работы этих сетевых систем во многом нашли свое воплощение в более удачливой операционной сис­теме 90-х годов — Microsoft Windows NT, содержащей встроенные сетевые компо­ненты, некоторые из которых имеют приставку LM — от LAN Manager.

В 80-е годы были приняты основные стандарты на коммуникационные техноло­гии для локальных сетей: в 1980 году — Ethernet, в 1985 — Token Ring, в кон­це 80-х — FDDI. Это позволило обеспечить совместимость сетевых операцион­ных систем на нижних уровнях, а так же стандартизовать интерфейс ОС с драй­верами сетевых адаптеров.

Для персональных компьютеров применялись не только специально разработан­ные для них операционные системы, подобные MS-DOS, NetWare и OS/2, но и адаптировались уже существующие ОС. Появление процессоров Intel 80286 и особенно 80386 с поддержкой мультипрограммирования позволило перенести на платформу персональных компьютеров ОС UNIX. Наиболее известной систе­мой этого типа была версия UNIX компании Santa Cruz Operation (SCO UNIX).

 

 

 

Особенности современного этапа развития операционных систем

 

В 90-е годы практически все операционные системы, занимающие заметное ме­сто на рынке, стали сетевыми. Сетевые функции сегодня встраиваются в ядро ОС, являясь ее неотъемлемой частью. Операционные системы получили средст­ва для работы со всеми основными технологиями локальных (Ethernet, Fast Ethernet, Gigabit Ethernet, Token Ring, FDDI, ATM) и глобальных (Х.25, frame relay, ISDN, ATM) сетей, а также средства для создания составных сетей (IP, IPX, AppleTalk, RIP, OSPF, NLSP). В операционных системах используются средства мультиплексирования нескольких стеков протоколов, за счет которого компьютеры могут поддерживать одновременную сетевую работу с разнородны­ми клиентами и серверами. Появились специализированные ОС, которые пред­назначены исключительно для выполнения коммуникационных задач. Например, сетевая операционная система IOS компании Cisco Systems, работающая в маршрутизаторах, организует в мультипрограммном режиме выполнение набора про­грамм, каждая из которых реализует один из коммуникационных протоколов.

Во второй половине 90-х годов все производители операционных систем резко усилили поддержку средств работы с Интернетом (кроме производителей UNIX-систем, в которых эта поддержка всегда была существенной). Кроме самого сте­ка TCP/IP в комплект поставки начали включать утилиты, реализующие такие популярные сервисы Интернета, как telnet, ftp, DNS и Web. Влияние Интерне­та проявилось и в том, что компьютер превратился из чисто вычислительного устройства в средство коммуникаций с развитыми вычислительными возмож­ностями.

Особое внимание в течение всего последнего десятилетия уделялось корпора­тивным сетевым операционным системам. Их дальнейшее развитие представля­ет одну из наиболее важных задач и в обозримом будущем. "Корпоративная one-

рационная система отличается способностью хорошо и устойчиво работать в крупных сетях, которые характерны для больших предприятий, имеющих от­деления в десятках городов и, возможно, в разных странах. Таким сетям органи­чески присуща высокая степень гетерогенности программных и аппаратных средств, поэтому корпоративная ОС должна бес проблемно взаимодействовать с операционными системами разных типов и работать на различных аппаратных платформах. К настоящему времени достаточно явно определилась тройка лиде­ров в классе корпоративных ОС — это Novell NetWare 4.x и 5.0, Microsoft Windows NT 4.0 и Windows 2000, а также UNIX-системы различных производи­телей аппаратных платформ.

Для корпоративной ОС очень важно наличие средств централизованного адми­нистрирования и управления, позволяющих в единой базе данных хранить учет­ные записи о десятках тысяч пользователей, компьютеров, коммуникационных устройств и модулей программного обеспечения, имеющихся в корпоративной сети. В современных операционных системах средства централизованного адми­нистрирования обычно базируются на единой справочной службе. Первой успеш­ной реализацией справочной службы корпоративного масштаба была система StreetTalk компании Banyan. К настоящему времени наибольшее признание получила справочная служба NDS компании Novell, выпущенная впервые в 1993 году для первой корпоративной версии NetWare 4.O. Роль централизован­ной справочной службы настолько велика, что именно по качеству справочной службы оценивают пригодность операционной системы для работы в корпора­тивном масштабе. Длительная задержка выпуска Windows NT 2000 во многом была связана с созданием для этой ОС масштабируемой справочной службы Active Directory, без которой этому семейству ОС трудно было претендовать на звание истинно корпоративной ОС.

Создание многофункциональной масштабируемой справочной службы является стратегическим направлением эволюции ОС. От успехов этого направления во многом зависит и дальнейшее развитие Интернета. Такая служба нужна для пре­вращения Интернета в предсказуемую и управляемую систему, например для обеспечения требуемого качества обслуживания трафика пользователей, под­держки крупных распределенных приложений, построения эффективной почто­вой системы и т. п.

На современном этапе развития операционных систем на передний план вышли средства обеспечения безопасности. Это связано с возросшей ценностью инфор­мации, обрабатываемой компьютерами, а также с повышенным уровнем угроз, существующих при передаче данных по сетям, особенно по публичным, таким как Интернет. Многие операционные системы обладают сегодня развитыми средствами защиты информации, основанными на шифрации данных, аутенти­фикации и авторизации.

Современным операционным системам присуща многоплатформенностъ, то есть способность работать на совершенно различных типах компьютеров. Многие операционные системы имеют специальные версии для поддержки кластерных архитектур, обеспечивающих высокую производительность и отказоустойчивость. Исключением пока является ОС NetWare, все версии которой разработаны для

платформы Intel, а реализации функций NetWare в виде оболочки для других ОС, например NetWare for AIX, успеха на имели.

В последние годы получила дальнейшее развитие долговременная тенденция по­вышения удобства работы человека с компьютером. Эффективность работы че­ловека становится основным фактором, определяющим эффективность вычисли­тельной системы в целом. Усилия человека не должны тратиться на настройку параметров вычислительного процесса, как это происходило в ОС предыдущих поколений. Например, в системах пакетной обработки для мэйнфреймов каж­дый пользователь должен был с помощью языка управления заданиями опре­делить большое количество параметров, относящихся к организации вычисли­тельных процессов в компьютере. Так, для системы OS/360 язык управления заданиями JCL предусматривал возможность определения пользователем более 40 параметров, среди которых были приоритет задания, требования к основной памяти, предельное время выполнения задания, перечень используемых устройств ввода-вывода и режимы их работы.

Современная операционная система берет на себя выполнение задачи выбора параметров операционной среды, используя для этой цели различные адаптив­ные алгоритмы. Например, тайм-ауты в коммуникационных протоколах часто определяются в зависимости от условий работы сети. Распределение оператив­ной памяти между процессами осуществляется автоматически с помощью меха­низмов виртуальной памяти в зависимости от активности этих процессов и ин­формации о частоте использования ими той или иной страницы. Мгновенные приоритеты процессов определяются динамически в зависимости от предысто­рии, включающей, например, время нахождения процесса в очереди, процент ис­пользования выделенного кванта времени, интенсивность ввода-вывода и т. п. Даже в процессе установки большинство ОС предлагают режим выбора пара­метров по умолчанию, который гарантирует пусть не оптимальное, но всегда приемлемое качество работы систем.

Постоянно повышается удобство интерактивной работы с компьютером путем включения в операционную систему развитых графических интерфейсов, исполь­зующих наряду с графикой звук и видеоизображение. Это особенно важно для превращения компьютера в терминал новой публичной сети, которой постепен­но становится Интернет, так как для массового пользователя терминал должен быть почти таким же понятным и удобным, как телефонный аппарат. Пользова­тельский интерфейс операционной системы становится все более интеллекту­альным, направляя действия человека в типовых ситуациях и принимая за него рутинные решения.

Уровень удобств в использования ресурсов, которые сегодня предоставляют поль­зователям, администраторам и разработчикам приложений операционные сис­темы изолированных компьютеров, для сетевых операционных систем являет­ся только заманчивой перспективой. Пока пользователи и администраторы сети тратят значительное время на попытки выяснить, где находится тот или иной ре­сурс, разработчики сетевых приложений прилагают много усилий для определе­ния местоположения данных и программных модулей в сети. Операционные системы будущего должны обеспечить высокий уровень прозрачности сетевых ресурсов, взяв на себя задачу организации распределенных вычислений, превратив сеть в виртуальный компьютер. Именно этот смысл вкладывают в лаконич­ный лозунг «Сеть — это компьютер» специалисты компании Sun, но для превра­щения лозунга в жизнь разработчикам операционных систем нужно пройти еще немалый путь.

 

ГЛАВА 2  

Назначение и функции операционной системы

 

Сегодня существует большое количество разных типов операционных систем, отличающихся областями применения, аппаратными платформами и методами реализации. Естественно, это обуславливает и значительные функциональные различия этих ОС. Даже у конкретной операционной системы набор выполняе­мых функций зачастую определить не так просто — та функция, которая сегодня выполняется внешним по отношению к ОС компонентом, завтра может стать ее неотъемлемой частью и наоборот. Поэтому при изучении операционных систем очень важно из всего многообразия выделить те функции, которые присущи всем операционным системам как классу продуктов.

 

Операционные системы

для автономного компьютера

 

Операционная система компьютера представляет собой комплекс взаимосвязан­ных программ, который действует как интерфейс между приложениями и поль­зователями с одной стороны, и аппаратурой компьютера с другой стороны. В со­ответствии с этим определением ОС выполняет две группы функций:

□  предоставление пользователю или программисту вместо реальной аппарату­ры компьютера расширенной виртуальной машины, с которой удобней рабо­тать и которую легче программировать;

□  повышение эффективности использования компьютера путем рационального управления его ресурсами в соответствии с некоторым критерием.

 

ОС как виртуальная машина

 

Для того чтобы успешно решать свои задачи, современный пользователь или даже прикладной программист может обойтись без досконального знания аппарат­ного устройства компьютера. Ему не обязательно быть в курсе того, как функ­ционируют различные электронные блоки и электромеханические узлы компью­тера. Более того, очень часто пользователь может не знать даже системы команд процессора. Пользователь-программист привык иметь дело с мощными высоко­уровневыми функциями, которые ему предоставляет операционная система.

Так, например, при работе с диском программисту, пишущему приложение для работы под управлением ОС, или конечному пользователю ОС достаточно пред­ставлять его в виде некоторого набора файлов, каждый из которых имеет имя. Последовательность действий при работе с файлом заключается в его открытии, выполнении одной или нескольких операций чтения или записи, а затем в за­крытии файла. Такие частности, как используемая при записи частотная моду­ляция или текущее состояние двигателя механизма перемещения магнитных головок чтения/записи, не должны волновать программиста. Именно операци­онная система скрывает от программиста большую часть особенностей аппарату­ры и предоставляет возможность простой и удобной работы с требуемыми фай­лами.

Если бы программист работал непосредственно с аппаратурой компьютера, без участия ОС, то для организации чтения блока данных с диска программисту при­шлось бы использовать более десятка команд с указанием множества парамет­ров: номера блока на диске, номера сектора на дорожке и т. п. А после заверше­ния операции обмена с диском он должен был бы предусмотреть в своей про­грамме анализ результата выполненной операции. Учитывая, что контроллер диска способен распознавать более двадцати различных вариантов завершения операции, можно считать программирование обмена с диском на уровне аппара­туры не самой тривиальной задачей. Не менее обременительной выглядит и ра­бота пользователя, если бы ему для чтения файла с терминала потребовалось за­давать числовые адреса дорожек и секторов.

Операционная система избавляет программистов не только от необходимости напрямую работать с аппаратурой дискового накопителя, предоставляя им про­стой файловый интерфейс, но и берет на себя все другие рутинные операции,

связанные с управлением другими аппаратными устройствами компьютера: фи­зической памятью, таймерами, принтерами и т. д.

В результате реальная машина, способная выполнять только небольшой набор элементарных действий, определяемых ее системой команд, превращается в вир­туальную машину, выполняющую широкий набор гораздо более мощных функ­ций. Виртуальная машина тоже управляется командами, но это уже команды другого, более высокого уровня: удалить файл с определенным именем, запус­тить на выполнение некоторую прикладную программу, повысить приоритет за­дачи, вывести текст из файла на печать. Таким образом, назначение ОС состоит в предоставлении пользователю/программисту некоторой расширенной вирту­альной машины, которую легче программировать и с которой легче работать, чем

непосредственно с аппаратурой, составляющей реальный компьютер или реаль­ную сеть.

 

ОС как система управления ресурсами

 

Операционная система не только предоставляет пользователям и программистам удобный интерфейс к аппаратным средствам компьютера, но и является меха­низмом, распределяющим ресурсы компьютера.

К числу основных ресурсов современных вычислительных систем могут быть отнесены такие ресурсы, как процессоры, основная память, таймеры, наборы дан­ных, диски, накопители на магнитных лентах, принтеры, сетевые устройства и некоторые другие. Ресурсы распределяются между процессами. Процесс (задача) представляет собой базовое понятие большинства современных ОС и часто кратко определяется как программа в стадии выполнения. Программа — это статический объект, представляющий собой файл с кодами и данными. Процесс — это динамический объект, который возникает в операционной системе после того, как пользователь или сама операционная система решает «запустить программу на выполнение», то есть создать новую единицу вычислительной работы. На­пример, ОС может создать процесс в ответ на команду пользователя run prgl.exe, где prgl.exe — это имя файла, в котором хранится код программы.

ПРИМЕЧАНИЕ ----------------------------------------------------------------------------------------------

Во многих современных ОС для обозначения минимальной единицы работы ОС исполь­зуют термин «нить», или «поток», при этом изменяется суть термина «процесс». Подроб­нее об этом рассказывается в главе 4 «Процессы и потоки». В остальных главах мы будем придерживаться упрощенного толкования, в соответствии с которым для обозначения вы­полняемой программы будет использоваться только термин «процесс».

 

Управление ресурсами вычислительной системы с целью наиболее эффектив­ного их использования является назначением операционной системы. Например, мультипрограммная операционная система организует одновременное выполне­ние сразу нескольких процессов на одном компьютере, поочередно переключая процессор с одного процесса на другой, исключая простои процессора, вызывае­мые обращениями процессов к вводу-выводу. ОС также отслеживает и разреша­ет конфликты, возникающие при обращении нескольких процессов к одному и тому же устройству ввода-вывода или к одним и тем же данным.

Критерий эффективности, в соответствии с которым ОС организует управление ресурсами компьютера, может быть различным. Например, в одних системах важен такой критерий, как пропускная способность вычислительной системы, в других — время ее реакции. Соответственно выбранному критерию эффектив­ности операционные системы по-разному организуют вычислительный процесс.

Управление ресурсами включает решение следующих общих, не зависящих от типа ресурса задач:

□ планирование ресурса — то есть определение, какому процессу, когда и в ка­ком количестве (если ресурс может выделяться частями) следует выделить данный ресурс;

□  удовлетворение запросов на ресурсы;

□  отслеживание состояния и учет использования ресурса — то есть поддержа­ние оперативной информации о том, занят или свободен ресурс и какая доля ресурса уже распределена;

 □разрешение конфликтов между процессами.

 

Для решения этих общих задач управления ресурсами разные ОС используют различные алгоритмы, особенности которых в конечном счете и определяют об­лик ОС в целом, включая характеристики производительности, область приме­нения и даже пользовательский интерфейс. Например, применяемый алгоритм управления процессором в значительной степени определяет, может ли ОС ис­пользоваться как система разделения времени, система пакетной обработки или система реального времени.

Задача организации эффективного совместного использования ресурсов несколь­кими процессами является весьма сложной, и сложность эта порождается в ос­новном случайным характером возникновения запросов на потребление ресур­сов. В мультипрограммной системе образуются очереди заявок от одновременно выполняемых программ к разделяемым ресурсам компьютера: процессору, стра­нице памяти, к принтеру, к диску. Операционная система организует обслужива­ние этих очередей по разным алгоритмам: в порядке поступления, на основе приоритетов, кругового обслуживания и т. д. Анализ и определение оптималь­ных дисциплин обслуживания заявок является предметом специальной области прикладной математики — теории массового обслуживания. Эта теория иногда используется для оценки эффективности тех или иных алгоритмов управления очередями в операционных системах. Очень часто в ОС реализуются и эмпири­ческие алгоритмы обслуживания очередей, прошедшие проверку практикой.

Таким образом, управление ресурсами составляет важную часть функций любой операционной системы, в особенности мультипрограммной. В отличие от функ­ций расширенной машины большинство функций управления ресурсами вы­полняются операционной системой автоматически и прикладному программи­сту недоступны.

 

 

 

 

 

Функциональные компоненты операционной

системы автономного компьютера

 

Функции операционной системы автономного компьютера обычно группируют­ся либо в соответствии с типами локальных ресурсов, которыми управляет ОС, либо в соответствии со специфическими задачами, применимыми ко всем ресур­сам. Иногда такие группы функций называют подсистемами. Наиболее важными подсистемами управления ресурсами являются подсистемы управления процес­сами, памятью, файлами и внешними устройствами, а подсистемами, общими для всех ресурсов, являются подсистемы пользовательского интерфейса, защиты данных и администрирования.

 

Управление процессами

 

Важнейшей частью операционной системы, непосредственно влияющей на функ­ционирование вычислительной машины, является подсистема управления про­цессами.

Для каждого вновь создаваемого процесса ОС генерирует системные информа­ционные структуры, которые содержат данные о потребностях процесса в ресур­сах вычислительной системы, а также о фактически выделенных ему ресурсах. Таким образом, процесс можно также определить как некоторую заявку на по­требление системных ресурсов.

Чтобы процесс мог быть выполнен, операционная система должна назначить ему область оперативной памяти, в которой будут размещены коды и данные процес­са, а также предоставить ему необходимое количество процессорного времени. Кроме того, процессу может понадобиться доступ к таким ресурсам, как файлы и устройства ввода-вывода.

В информационные структуры процесса часто включаются вспомогательные данные, характеризующие историю пребывания процесса в системе (например, какую долю времени процесс потратил на операции ввода-вывода, а какую на вычисления), его текущее состояние (активное или заблокированное), степень привилегированности процесса (значение приоритета). Данные такого рода мо­гут учитываться операционной системой при принятии решения о предоставле­нии ресурсов процессу.

В мультипрограммной операционной системе одновременно может существо­вать несколько процессов. Часть процессов порождается по инициативе пользо­вателей и их приложений, такие процессы обычно называют пользовательскими. Другие процессы, называемые системными, инициализируются самой операци­онной системой для выполнения своих функций.

Поскольку процессы часто одновременно претендуют на одни и те же ресурсы, то в обязанности ОС входит поддержание очередей заявок процессов на ресур­сы, например очереди к процессору, к принтеру, к последовательному порту.

Важной задачей операционной системы является защита ресурсов, выделенных данному процессу, от остальных процессов. Одним из наиболее тщательно защи­щаемых ресурсов процесса являются области оперативной памяти, в которой хранятся коды и данные процесса. Совокупность всех областей оперативной па­мяти, выделенных операционной системой процессу, называется его адресным пространством. Говорят, что каждый процесс работает в своем адресном про­странстве, имея в виду защиту адресных пространств, осуществляемую ОС. За­щищаются и другие типы ресурсов, такие как файлы, внешние устройства и т. д. Операционная система может не только защищать ресурсы, выделенные одному процессу, но и организовывать их совместное использование, например разре­шать доступ к некоторой области памяти нескольким процессам.

На протяжении периода существования процесса его выполнение может быть многократно прервано и продолжено. Для того чтобы возобновить выполнение процесса, необходимо восстановить состояние его операционной среды. Состоя­ние операционной среды идентифицируется состоянием регистров и программного счетчика, режимом работы процессора, указателями на открытые файлы, информацией о незавершенных операциях ввода-вывода, кодами ошибок выпол­няемых данным процессом системных вызовов и т. д. Эта информация называет­ся контекстом процесса. Говорят, что при смене процесса происходит переклю­чение контекстов.

Операционная система берет на себя также функции синхронизации процессов, позволяющие процессу приостанавливать свое выполнение до наступления ка­кого-либо события в системе, например завершения операции ввода-вывода, осуществляемой по его запросу операционной системой.

В операционной системе нет однозначного соответствия между процессами и программами. Один и тот же программный файл может породить несколько па­раллельно выполняемых процессов, а процесс может в ходе своего выполнения сменить программный файл и начать выполнять другую программу.

Для реализации сложных программных комплексов полезно бывает организо­вать их работу в виде нескольких параллельных процессов, которые периодиче­ски взаимодействуют друг с другом и обмениваются некоторыми данными. Так как операционная система защищает ресурсы процессов и не позволяет одному процессу писать или читать из памяти другого процесса, то для оперативного взаимодействия процессов ОС должна предоставлять особые средства, которые называют средствами межпроцессного взаимодействия.

Таким образом, подсистема управления процессами планирует выполнение про­цессов, то есть распределяет процессорное время между несколькими одновре­менно существующими в системе процессами, занимается созданием и уничто­жением процессов, обеспечивает процессы необходимыми системными ресурсами, поддерживает синхронизацию процессов, а также обеспечивает взаимодействие между процессами.

 

Управление памятью

 

Память является для процесса таким же важным ресурсом, как и процессор, так как процесс может выполняться процессором только в том случае, если его коды и данные (не обязательно все) находятся в оперативной памяти.

Управление памятью включает распределение имеющейся физической памяти между всеми существующими в системе в данный момент процессами, загрузку кодов и данных процессов в отведенные им области памяти, настройку адресно-зависимых частей кодов процесса на физические адреса выделенной области, а также защиту областей памяти каждого процесса.

Существует большое разнообразие алгоритмов распределения памяти. Они мо­гут отличаться, например, количеством выделяемых процессу областей памяти (в одних случаях память выделяется процессу в виде одной непрерывной облас­ти, а в других — в виде нескольких несмежных областей), степенью свободы гра­ницы областей (она может быть жестко зафиксирована на все время существова­ния процесса или же динамически перемещаться при выделении процессу дополнительных объемов памяти). В некоторых системах распределение памяти выполняется страницами фиксированного размера, а в других — сегментами пе­ременной длины.

Одним из наиболее популярных способов управления памятью в современных операционных системах является так называемая виртуальная память. Наличие в ОС механизма виртуальной памяти позволяет программисту писать програм­му так, как будто в его распоряжении имеется однородная оперативная память большого объема, часто существенно превышающего объем имеющейся физиче­ской памяти. В действительности все данные, используемые программой, хра­нятся на диске и при необходимости частями (сегментами или страницами) ото­бражаются в физическую память. При перемещении кодов и данных между оперативной памятью и диском подсистема виртуальной памяти выполняет трансляцию виртуальных адресов, полученных в результате компиляции и ком­поновки программы, в физические адреса ячеек оперативной памяти. Очень важно, что все операции по перемещению кодов и данных между оперативной памятью и дисками, а также трансляция адресов выполняются ОС прозрачно для программиста.

Защита памяти — это избирательная способность предохранять выполняемую задачу от записи или чтения памяти, назначенной другой задаче. Правильно на­писанные программы не пытаются обращаться к памяти, назначенной другим. Однако реальные программы часто содержат ошибки, в результате которых та­кие попытки иногда предпринимаются. Средства защиты памяти, реализован­ные в операционной системе, должны пресекать несанкционированный доступ процессов к чужим областям памяти.

Таким образом, функциями ОС по управлению памятью являются отслежива­ние свободной и занятой памяти; выделение памяти процессам и освобождение памяти при завершении процессов; защита памяти; вытеснение процессов из оперативной памяти на диск, когда размеры основной памяти недостаточны для размещения в ней всех процессов, и возвращение их в оперативную память, ко­гда в ней освобождается место, а также настройка адресов программы на кон­кретную область физической памяти.

 

Управление файлами и внешними устройствами

 

Способность ОС к «экранированию» сложностей реальной аппаратуры очень ярко проявляется в одной из основных подсистем ОС — файловой системе. Опе­рационная система виртуализирует отдельный набор данных, хранящихся на внешнем накопителе, в виде файла — простой неструктурированной последова­тельности байтов, имеющей символьное имя. Для удобства работы с данными файлы группируются в каталоги, которые, в свою очередь, образуют группы — каталоги более высокого уровня. Пользователь может с помощью ОС выполнять над файлами и каталогами такие действия, как поиск по имени, удаление, вывод содержимого на внешнее устройство (например, на дисплей), изменение и сохра­нение содержимого.

Чтобы представить большое количество наборов данных, разбросанных случай­ным образом по цилиндрам и поверхностям дисков различных типов, в виде хо­рошо всем знакомой и удобной иерархической структуры файлов и каталогов, операционная система должна решить множество задач. Файловая система ОС выполняет преобразование символьных имен файлов, с которыми работает пользователь или прикладной программист, в физические адреса данных на диске, ор­ганизует совместный доступ к файлам, защищает их от несанкционированного доступа.

При выполнении своих функций файловая система тесно взаимодействует с под­системой управления внешними устройствами, которая по запросам файловой системы осуществляет передачу данных между дисками и оперативной памятью.

Подсистема управления внешними устройствами, называемая также подсисте­мой ввода-вывода, исполняет роль интерфейса ко всем устройствам, подключен­ным к компьютеру. Спектр этих устройств очень обширен. Номенклатура вы­пускаемых накопителей на жестких, гибких и оптических дисках, принтеров, сканеров, мониторов, плоттеров, модемов, сетевых адаптеров и более специаль­ных устройств ввода-вывода, таких как, например, аналого-цифровые преобразо­ватели, может насчитывать сотни моделей. Эти модели могут существенно отличаться набором и последовательностью команд, с помощью которых осуще­ствляется обмен информацией с процессором и памятью компьютера, скоростью работы, кодировкой передаваемых данных, возможностью совместного исполь­зования и множеством других деталей.

Программа, управляющая конкретной моделью внешнего устройства и учиты­вающая все его особенности, обычно называется драйвером этого устройства (от английского drive — управлять, вести). Драйвер может управлять единствен­ной моделью устройства, например модемом U-1496E компании ZyXEL, или же группой устройств определенного типа, например любыми Hayes-совместимыми модемами. Для пользователя очень важно, чтобы операционная система включа­ла как можно больше разнообразных драйверов, так как это гарантирует возмож­ность подключения к компьютеру большого числа внешних устройств различ­ных производителей. От наличия подходящих драйверов во многом зависит успех операционной системы на рынке (например, отсутствие многих необходи­мых драйверов внешних устройств было одной из причин низкой популярности OS/2).

Созданием драйверов устройств занимаются как разработчики конкретной ОС, так и специалисты компаний, выпускающих внешние устройства. Операционная система должна поддерживать хорошо определенный интерфейс между драйве­рами и остальной частью ОС, чтобы разработчики из компаний-производителей устройств ввода-вывода могли поставлять вместе со своими устройствами драй­веры для данной операционной системы.

Прикладные программисты могут пользоваться интерфейсом драйверов при раз­работке своих программ, но это не очень удобно — такой интерфейс обычно представляет собой низкоуровневые операции, обремененные большим количе­ством деталей.

Поддержание высокоуровневого унифицированного интерфейса прикладного программирования к разнородным устройствам ввода-вывода является одной из наиболее важных задач ОС. Со времени появления ОС UNIX такой унифи­цированный интерфейс в большинстве операционных систем строится на основе концепции файлового доступа. Эта концепция заключается в том, что обмен с любым внешним устройством выглядит как обмен с файлом, имеющим имя и представляющим собой неструктурированную последовательность байтов. В ка­честве файла может выступать как реальный файл на диске, так и алфавитно-цифровой терминал, печатающее устройство или сетевой адаптер. Здесь мы опять имеем дело со свойством операционной системы подменять реальную ап­паратуру удобными для пользователя и программиста абстракциями.

 

Защита данных и администрирование

 

Безопасность данных вычислительной системы обеспечивается средствами от­казоустойчивости ОС, направленными на защиту от сбоев и отказов аппара­туры и ошибок программного обеспечения, а также средствами защиты от не­санкционированного доступа. В последнем случае ОС защищает данные от оши­бочного или злонамеренного поведения пользователей системы.

Первым рубежом обороны при защите данных от несанкционированного досту­па является процедура логического входа. Операционная система должна убе­диться, что в систему пытается войти пользователь, вход которого разрешен ад­министратором. Функции защиты ОС вообще очень тесно связаны с функциями администрирования, так как именно администратор определяет права пользо­вателей при их обращении к разным ресурсам системы — файлам, каталогам, принтерам, сканерам и т. п. Кроме того, администратор ограничивает возможно­сти пользователей в выполнении тех или иных системных действий. Например, пользователю может быть запрещено выполнять процедуру завершения работы ОС, устанавливать системное время, завершать чужие процессы, создавать учет­ные записи пользователей, изменять права доступа к некоторым каталогам и файлам. Администратор может также урезать возможности пользовательского интерфейса, убрав, например, некоторые пункты из меню операционной систе­мы, выводимого на дисплей пользователя.

Важным средством защиты данных являются функции аудита ОС, заключаю­щиеся в фиксации всех событий, от которых зависит безопасность системы. На­пример, попытки удачного и неудачного логического входа в систему, операции доступа к некоторым каталогам и файлам, использование принтеров и т. п. Спи­сок событий, которые необходимо отслеживать, определяет администратор ОС.

Поддержка отказоустойчивости реализуется операционной системой, как прави­ло, на основе резервирования. Чаще всего в функции ОС входит поддержание нескольких копий данных на разных дисках или разных дисковых накопите­лях. Резервируются также принтеры и другие устройства ввода-вывода. При от­казе одного из избыточных устройств операционная система должна быстро и прозрачным для пользователя образом произвести реконфигурацию системы и продолжить работу с резервным устройством. Особым случаем обеспечения отка­зоустойчивости является использование нескольких процессоров, то есть мультипроцессирование, когда система продолжает работу при отказе одного из про­цессоров, хотя и с меньшей производительностью. (Необходимо отметить, что многие ОС использует мультипроцессорную конфигурацию компьютера только для ускорения работы и при отказе одного из процессоров прекращают работу.)

Поддержка отказоустойчивости также входит в обязанности системного админи­стратора. В состав ОС обычно входят утилиты, позволяющие администратору

выполнять регулярные операции резервного копирования для обеспечения бы­строго восстановления важных данных.

 

Интерфейс прикладного программирования

 

Прикладные программисты используют в своих приложениях обращения к ОС, когда для выполнения тех или иных действий им требуется особый статус, кото­рым обладает только операционная система. Например, в большинстве современ­ных ОС все действия, связанные с правлением аппаратными средствами компь­ютера, может выполнять только ОС. Помимо этих функций прикладной про­граммист может воспользоваться набором сервисных функций ОС, которые уп­рощают написание приложений. Функции такого типа реализуют универсальные действия, часто требующиеся в различных приложениях, такие, например, как обработка текстовых строк. Эти функции могли бы быть выполнены и самим приложением, однако гораздо проще использовать уже готовые, отлаженные процедуры, включенные в состав операционной системы. В то же время даже при наличии в ОС соответствующей функции программист может реализовать ее самостоятельно в рамках приложения, если предложенный операционной сис­темой вариант его не вполне устраивает.

Возможности операционной системы доступны прикладному программисту в виде набора функций, называющегося интерфейсом прикладного программирова­ния {Application Programming Interface, API). От конечного пользователя эти функции скрыты за оболочкой алфавитно-цифрового или графического пользо­вательского интерфейса.

Для разработчиков приложений все особенности конкретной операционной сис­темы представлены особенностями ее API. Поэтому операционные системы с различной внутренней организацией, но с одинаковым набором функций API кажутся им одной и той же ОС, что упрощает стандартизацию операционных систем и обеспечивает переносимость приложений между внутренне различны­ми ОС, соответствующими определенному стандарту на API. Например, следо­вание общим стандартам API UNIX, одним из которых является стандарт Posix, позволяет говорить о некоторой обобщенной операционной системе UNIX, хотя многочисленные версии этой ОС от разных производителей иногда существенно отличаются внутренней организацией.

Приложения выполняют обращения к функциям API с помощью системных вы­зовов. Способ, которым приложение получает услуги операционной системы, очень похож на вызов подпрограмм. Информация, нужная ОС и состоящая обычно из идентификатора команды и данных, помещается в определенное место памяти, в регистры и/или стек. Затем управление передается операционной системе, кото­рая выполняет требуемую функцию и возвращает результаты через память, ре­гистры или стеки. Если операция проведена неуспешно, то результат включает индикацию ошибки.

Способ реализации системных вызовов зависит от структурной организации ОС, которая, в свою очередь, тесно связана с особенностями аппаратной платформы. Кроме того, он зависит от языка программирования. При использовании ассемб­лера программист устанавливает значения регистров и/или областей памяти, а затем выполняет специальную инструкцию вызова сервиса или программного прерывания для обращения к некоторой функции ОС. При использовании язы­ков высокого уровня функции ОС вызываются тем же способом, что и написан­ные пользователем подпрограммы, требуя задания определенных аргументов в определенном порядке.

 

Пользовательский интерфейс

 

Операционная система должна обеспечивать удобный интерфейс не только для прикладных программ, но и для человека, работающего за терминалом. Этот че­ловек может быть конечным пользователем, администратором ОС или програм­мистом.

В ранних операционных системах пакетного режима функции пользовательско­го интерфейса были сведены к минимуму и не требовали наличия терминала. Команды языка управления заданиями набивались на перфокарты, а результаты выводились на печатающее устройство.

Современные ОС поддерживают развитые функции пользовательского интер­фейса для интерактивной работы за терминалами двух типов: алфавитно-цифро­выми и графическими.

При работе за алфавитно-цифровым терминалом пользователь имеет в своем распоряжении систему команд, мощность который отражает функциональные возможности данной ОС. Обычно командный язык ОС позволяет запускать и останавливать приложения, выполнять различные операции с файлами и ката­логами, получать информацию о состоянии ОС (количество работающих про­цессов, объем свободного пространства на дисках и т. п.), администрировать сис­тему. Команды могут вводиться не только в интерактивном режиме с терминала, но и считываться из так называемого командного файла, содержащего некоторую последовательность команд.

Программный модуль ОС, ответственный за чтение отдельных команд или же последовательности команд из командного файла, иногда называют командным интерпретатором.

Ввод команды может быть упрощен, если операционная система поддерживает графический пользовательский интерфейс. В этом случае пользователь для вы­полнения нужного действия с помощью мыши выбирает на экране нужный

 

Сетевые операционные системы

 

Операционная система компьютерной сети во многом аналогична ОС автоном­ного компьютера — она также представляет собой комплекс взаимосвязанных программ, который обеспечивает удобство работы пользователям и программи­стам путем предоставления им некоторой виртуальной вычислительной систе­мы, и реализует эффективный способ разделения ресурсов между множеством выполняемых в сети процессов.

Компьютерная сеть — это набор компьютеров, связанных коммуникационной системой и снабженных соответствующим программным обеспечением, позво­ляющим пользователям сети получать доступ к ресурсам этого набора компью­теров. Сеть могут образовывать компьютеры разных типов, которыми могут быть небольшие микропроцессоры, рабочие станции, мини-компьютеры, персо­нальные компьютеры или суперкомпьютеры. Коммуникационная система может включать кабели, повторители, коммутаторы, маршрутизаторы и другие устрой­ства, обеспечивающие передачу сообщений между любой парой компьютеров сети. Компьютерная сеть позволяет пользователю работать со своим компьюте­ром как с автономным и добавляет к этому возможность доступа к информаци­онным и аппаратным ресурсам других компьютеров сети.

При организации сетевой работы операционная система играет роль интерфейса, экранирующего от пользователя все детали низкоуровневых программно-аппа­ратных средств сети. Например, вместо числовых адресов компьютеров сети, таких как МАС-адрес и IP-адрес, операционная система компьютерной сети по­зволяет оперировать удобными для запоминания символьными именами. В ре­зультате в представлении пользователя сеть с ее множеством сложных и запу­танных реальных деталей превращается в достаточно понятный набор разделяе­мых ресурсов.

 

Сетевые и распределенные ОС

 

В зависимости от того, какой виртуальный образ создает операционная система для того, чтобы подменить им реальную аппаратуру компьютерной сети, разли­чают сетевые ОС и распределенные ОС.

Сетевая ОС предоставляет пользователю некую виртуальную вычислительную систему, работать с которой гораздо проще, чем с реальной сетевой аппаратурой. В то же время эта виртуальная система не полностью скрывает распределенную природу своего реального прототипа, то есть является виртуальной сетью.

При использовании ресурсов компьютеров сети пользователь сетевой ОС всегда помнит, что он имеет дело с сетевыми ресурсами и что для доступа к ним нужно выполнить некоторые особые операции, например отобразить удаленный раз­деляемый каталог на вымышленную локальную букву дисковода или поставить перед именем каталога еще и имя компьютера, на котором тот расположен. Пользователи сетевой ОС обычно должны быть в курсе того, где хранятся их файлы, и должны использовать явные команды передачи файлов для перемеще­ния файлов с одной машины на другую.

Работая в среде сетевой ОС, пользователь хотя и может запустить задание на любой машине компьютерной сети, всегда знает, на какой машине выполняется его задание. По умолчанию пользовательское задание выполняется на той маши­не, на которой пользователь сделал логический вход. Если же он хочет выпол­нить задание на другой машине, то ему нужно либо выполнить логический вход в эту машину, используя команду типа remote login, либо ввести специальную команду удаленного выполнения, в которой он должен указать информацию, идентифицирующую удаленный компьютер.

Магистральным направлением развития сетевых операционных систем является достижение как можно более высокой степени прозрачности сетевых ресурсов. В идеальном случае сетевая ОС должна представить пользователю сетевые ре­сурсы в виде ресурсов единой централизованной виртуальной машины. Для та­кой операционной системы используют специальное название — распределенная ОС, или истинно распределенная ОС.

Распределенная ОС, динамически и автоматически распределяя работы по раз­личны машинам системы для обработки, заставляет набор сетевых машин ра­ботать как виртуальный унипроцессор. Пользователь распределенной ОС, вооб­ще говоря, не имеет сведений о том, на какой машине выполняется его работа.

Распределенная ОС существует как единая операционная система в масштабах вычислительной системы. Каждый компьютер сети, работающей под управлени­ем распределенной ОС, выполняет часть функций этой глобальной ОС. Распре­деленная ОС объединяет все компьютеры сети в том смысле, что они работают в тесной кооперации друг с другом для эффективного использования всех ресур­сов компьютерной сети.

 

 

 

Два значения термина «сетевая ОС»

 

В настоящее время практически все сетевые операционные системы еще очень далеки от идеала истинной распределенное™. Степень автономности каждого компьютера в сети, работающей под управлением сетевой операционной систе­мы, значительно выше по сравнению с компьютерами, работающими под управ­лением распределенной ОС.

В результате сетевая ОС может рассматриваться как набор операционных сис­тем отдельных компьютеров, составляющих сеть. На разных компьютерах сети могут выполняться одинаковые или разные ОС. Например, на всех компьютерах сети может работать одна и та же ОС UNIX. Более реалистичным вариантом яв­ляется сеть, в которой работают разные ОС, например часть компьютеров рабо­тает под управлением UNIX, часть — под управлением NetWare, а остальные — под управлением Windows NT и Windows 98. Все эти операционные системы функционируют независимо друг от друга в том смысле, что каждая из них при­нимает независимые решения о создании и завершении своих собственных про­цессов и управлении локальными ресурсами. Но в любом случае операционные системы компьютеров, работающих в сети, должны включать взаимно согласо­ванный набор коммуникационных протоколов для организации взаимодействия процессов, выполняющихся на разных компьютерах сети, и разделения ресурсов этих компьютеров между пользователями сети.

Если операционная система отдельного компьютера позволяет ему работать в сети, то есть предоставлять свои ресурсы в общее пользование и/или потреблять ре­сурсы других компьютеров сети, то такая операционная система отдельного ком­пьютера также называется сетевой ОС.

Таким образом, термин «сетевая операционная система» используется в двух зна­чениях: во-первых, как совокупность ОС всех компьютеров сети и, во-вторых, как операционная система отдельного компьютера, способного работать в сети. Исходя из этого определения следует, что такие операционные системы, как, на-

пример, Windows NT, NetWare, Solaris, HP-UX, являются сетевыми, поскольку все они обладают средствами, которые позволяют их пользователям работать в сети.

 

Функциональные компоненты сетевой ОС

 

На рис. 2.1 показаны основные функциональные компоненты сетевой ОС:

□   средства управления локальными ресурсами компьютера реализуют все функ­ции ОС автономного компьютера (распределение оперативной памяти между процессами, планирование и диспетчеризацию процессов, управление про­цессорами в мультипроцессорных машинах, управление внешней памятью, интерфейс с пользователем и т. д.);

□   сетевые средства, в свою очередь, можно разделить на три компонента:

О средства предоставления локальных ресурсов и услуг в общее пользова­ние — серверная часть ОС;

О средства запроса доступа к удаленным ресурсам и услугам — клиентская часть ОС;

О транспортные средства ОС, которые совместно с коммуникационной сис­темой обеспечивают передачу сообщений между компьютерами сети.

 

 

Упрощенно работа сетевой ОС происходит следующим образом. Предположим, что пользователь компьютера А решил разместить свой файл на диске другого компьютера сети — компьютера В. Для этого он набирает на клавиатуре соответ­ствующую команду и нажимает клавишу Enter. Программный модуль ОС, отве­чающий за интерфейс с пользователем, принимает эту команду и передает ее клиентской части ОС компьютера А.

Клиентская часть ОС не может получить непосредственный доступ к ресурсам другого компьютера — в данном случае к дискам и файлам компьютера В. Она может только «попросить» об этом серверную часть ОС, работающую на том компьютере, которому принадлежат эти ресурсы. Эти «просьбы» выражаются в виде сообщений, передаваемых по сети. Сообщения могут содержать не только

команды на выполнение некоторых действий, но и собственно данные, например содержимое некоторого файла.

Управляют передачей сообщений между клиентской и серверными частями по коммуникационной системе сети транспортные средства ОС. Эти средства вы­полняют такие функции, как формирование сообщений, разбиение сообщения на части (пакеты, кадры), преобразование имен компьютеров в числовые адреса, организацию надежной доставки сообщений, определение маршрута в сложной сети и*т. д. и т. п. Правила взаимодействия компьютеров при передаче сообще­ний по сети фиксируются в коммуникационных протоколах, таких как Ethernet, Token Ring, IP, IPX и пр. Чтобы два компьютера смогли обмениваться сообще­ниями по сети, транспортные средства их ОС должны поддерживать некоторый общий набор коммуникационных протоколов. Коммуникационные протоколы переносят сообщения клиентских и серверных частей ОС по сети, не вникая в их содержание.

На стороне компьютера В, на диске которого пользователь хочет разместить свой файл, должна работать серверная часть ОС, постоянно ожидающая прихода за­просов из сети на удаленный доступ к ресурсам этого компьютера. Серверная часть, приняв запрос из сети, обращается к локальному диску и записывает в один из его каталогов указанный файл. Конечно, для выполнения этих действий требуется не одно, а целая серия сообщений, переносящих между компьютерами команды ОС и части передаваемого файла.

Очень удобной и полезной функцией клиентской части ОС является способность отличить запрос к удаленному файлу от запроса к локальному файлу. Если кли­ентская часть ОС умеет это делать, то приложения не должны заботиться о том, с локальным или удаленным файлом они работают, — клиентская программа сама распознает и перенаправляет (redirect) запрос к удаленной машине. Отсюда и название, часто используемое для клиентской части сетевой ОС, — редирек­тор. Иногда функции распознавания выделяются в отдельный программный мо­дуль, в этом случае редиректором называют не всю клиентскую часть, а только этот модуль.

Клиентские части сетевых ОС выполняют также преобразование форматов за­просов к ресурсам. Они принимают запросы от приложений на доступ к сетевым ресурсам в локальной форме, то есть в форме, принятой в локальной части ОС. В сеть же запрос передается клиентской частью в другой форме, соответствую­щей требованиям серверной части ОС, работающей на компьютере, где располо­жен требуемый ресурс. Клиентская часть также осуществляет прием ответов от серверной части и преобразование их в локальный формат, так что для приложе­ния выполнение локальных и удаленных запросов неразличимо.

 

Сетевые службы и сетевые сервисы

 

Совокупность серверной и клиентской частей ОС, предоставляющих доступ к кон­кретному типу ресурса компьютера через сеть, называется сетевой службой. В при­веденном выше примере клиентская и серверная части ОС, которые совместно обеспечивают доступ через сеть к файловой системе компьютера, образуют файло­вую службу.

Говорят, что сетевая служба предоставляет пользователям сети некоторый набор услуг. Эти услуги иногда называют также сетевым сервисом (от англоязычного тер­мина «service»). Необходимо отметить, что этот термин в технической литературе переводится и как «сервис», и как «услуга», и как «служба». Хотя указанные терми­ны иногда используются как синонимы, следует иметь в виду, что в некоторых слу­чаях различие в значениях этих терминов носит принципиальный характер. Далее в тексте под «службой» мы будем понимать сетевой компонент, который реализует некоторый набор услуг, а под «сервисом» — описание того набора услуг, который предоставляется данной службой. Таким образом, сервис — это интерфейс между потребителем услуг и поставщиком услуг (службой).  

Каждая служба связана с определенным типом сетевых ресурсов и/или определен­ным способом доступа к этим ресурсам. Например, служба печати обеспечивает доступ пользователей сети к разделяемым принтерам сети и предоставляет сервис печати, а почтовая служба предоставляет доступ к информационному ресурсу сети — электронным письмам. Способом доступа к ресурсам отличается, например, служба удаленного доступа — она предоставляет пользователям компьютерной сети доступ ко всем ее ресурсам через коммутируемые телефонные каналы. Для получения уда­ленного доступа к конкретному ресурсу, например к принтеру, служба удаленного доступа взаимодействует со службой печати. Наиболее важными для пользователей сетевых ОС являются файловая служба и служба печати.

Среди сетевых служб можно выделить такие, которые ориентированы не на про­стого пользователя, а на администратора. Такие службы используются для орга­низации работы сети. Например, служба Bindery операционной системы Novell NetWare 3.x позволяет администратору вести базу данных о сетевых пользовате­лях компьютера, на котором работает эта ОС. Более прогрессивным является подход с созданием централизованной справочной службы, или, по-другому, служ­бы каталогов, которая предназначена для ведения базы данных не только обо всех пользователях сети, но и обо всех ее программных и аппаратных компо­нентах. В качестве примеров службы каталогов часто приводятся NDS компании Novell и StreetTalk компании Banyan. Другими примерами сетевых служб, пре­доставляющих сервис администратору, являются служба мониторинга сети, по­зволяющая захватывать и анализировать сетевой трафик, служба безопасности, в функции которой может входить, в частности, выполнение процедуры логиче­ского входа с проверкой пароля, служба резервного копирования и архивирова­ния.

От того, насколько богатый набор услуг предлагает операционная система ко­нечным пользователям, приложениям и администраторам сети, зависит ее пози­ция в общем ряду сетевых ОС.

Сетевые службы по своей природе являются клиент-серверными системами. По­скольку при реализации любого сетевого сервиса естественно возникает источ­ник запросов (клиент) и исполнитель запросов (сервер), то и любая сетевая служба содержит в своем составе две несимметричные части — клиентскую и серверную (рис. 2.2). Сетевая служба может быть представлена в операцион­ной системе либо обеими (клиентской и серверной) частями, либо только одной из них.

 

 

Обычно говорят, что сервер предоставляет свои ресурсы клиенту, а клиент ими пользуется. Необходимо отметить, что при предоставлении сетевой службой не­которой услуги используются ресурсы не только сервера, но и клиента. Клиент может затрачивать значительную часть своих ресурсов (дискового пространства, процессорного времени и т. п.) на поддержание работы сетевой службы. Напри­мер, при реализации почтовой службы на диске клиента может храниться ло­кальная копия базы данных, содержащей его обширную переписку. В этом случае клиент выполняет большую работу при формировании сообщений в различных форматах, в том числе и сложном мультимедийном, поддерживает ведение ад­ресной книги и выполняет еще много различных вспомогательных работ.

Принципиальной же разницей между клиентом и сервером является то, что ини­циатором выполнения работы сетевой службой всегда выступает клиент, а сер­вер всегда находится в режиме пассивного ожидания запросов. Например, поч­товый сервер осуществляет доставку почты на компьютер пользователя только при поступлении запроса от почтового клиента.

Обычно взаимодействие между клиентской и серверной частями стандартизует­ся, так что один тип сервера может быть рассчитан на работу с клиентами разно­го типа, реализованными различными способами и, может быть, разными произ­водителями. Единственное условие для этого — клиенты и сервер должны поддерживать общий стандартный протокол взаимодействия.

 

Встроенные сетевые службы и сетевые оболочки

 

На практике сложилось несколько подходов к построению сетевых операцион­ных систем, различающихся глубиной внедрения сетевых служб в операцион­ную систему (рис. 2.3):

□  сетевые службы глубоко встроены в ОС;

□  сетевые службы объединены в виде некоторого набора — оболочки;

□  сетевые службы производятся и поставляются в виде отдельного продукта.

Первые сетевые ОС представляли собой совокупность уже существующей ло­кальной ОС и надстроенной над ней сетевой оболочки. При этом в локальную ОС встраивался минимум сетевых функций, необходимых для работы сетевой оболочки, которая выполняла основные сетевые функции.

Однако в дальнейшем разработчики сетевых ОС посчитали более эффективным подход, при котором сетевая ОС с самого начала работы над ней задумывается и проектируется специально для работы в сети. Сетевые функции у этих ОС глу­боко встраиваются в основные модули системы, что обеспечивает ее логическую стройность, простоту эксплуатации и модификации, а также высокую произво­дительность. Важно, что при таком подходе отсутствует избыточность. Если все сетевые службы хорошо интегрированы, то есть рассматриваются как неотъем­лемые части ОС, то все внутренние механизмы такой операционной системы мо­гут быть оптимизированы для выполнения сетевых функций. Например, ОС Windows NT компании Microsoft за счет встроенности сетевых средств обеспе­чивает более высокие показатели производительности и защищенности инфор­мации по сравнению с сетевой ОС LAN Manager той же компании, являющейся надстройкой над локальной операционной системой OS/2. Другими примерами сетевых ОС со встроенными сетевыми службами являются все современные вер­сии UNIX, NetWare, OS/2 Warp.

 

 

Другой вариант реализации сетевых служб — объединение их в виде некоторого на­бора (оболочки), при этом все службы такого набора должны быть между собой со­гласованы, то есть в своей работе они могут обращаться друг к другу, могут иметь в своем составе общие компоненты, например общую подсистему аутентификации пользователей или единый пользовательский интерфейс. Для работы оболочки не­обходимо наличие некоторой локальной операционной системы, которая бы выпол­няла обычные функции, необходимые для управления аппаратурой компьютера, и в среде которой выполнялись бы сетевые службы, составляющие эту оболочку. Оболочка представляет собой самостоятельный программный продукт и, как всякий

 

продукт, имеет название, номер версии и другие соответствующие характеристики. В качестве примеров сетевой оболочки можно указать, в частности, LAN Server и LAN Manager.

Одна и та же оболочка может предназначаться для работы над совершенно разны­ми операционными системами. В таких случаях оболочка должна строиться с уче­том специфики той операционной системы, над которой она будет работать. Так, LAN Server, например, существует в различных вариантах; для работы над опе­рационными системами VAX VMS, VM, OS/400, AIX, OS/2.

Сетевые оболочки часто подразделяются на клиентские и серверные. Оболочка, которая преимущественно содержит клиентские части сетевых служб, называет­ся клиентской. Например, типичным набором программного обеспечения рабо­чей станции в сети NetWare является система MS-DOS с установленной над ней клиентской оболочкой NetWare, состоящей из клиентских частей файловой служ­бы и службы печати, а также компонента, поддерживающего пользовательский интерфейс.

Серверная сетевая оболочка, примерами которой могут служить те же LAN Server и LAN Manager, а также NetWare for UNIX, File and Print Services for NetWare, ориентирована на выполнение серверных функций. Серверная оболочка как ми­нимум содержит серверные компоненты двух основных сетевых служб — файло­вой службы и службы печати. Именно такой набор серверных компонентов реа­лизован в упомянутых выше продуктах NetWare for UNIX и File and Print Services for NetWare. Некоторые же оболочки содержат настолько широкий на­бор сетевых служб, что их называют сетевыми операционными системами. Так, ни один обзор сетевых операционных систем не будет достаточно полным, если в нем отсутствует информация о LAN Server, LAN Manager, ENS, являющихся сетевыми оболочками. Таким образом, термин «сетевая операционная система» приобретает еще одно значение — набор сетевых служб, способных согласованно работать в общей операционной среде.

С одним типом ресурсов могут быть связаны разные службы, отличающиеся прото­колом взаимодействия клиентских и серверных частей. Так, например, встроенная файловая служба Windows NT реализует протокол SMB, используемый во всех ОС компании Microsoft, а дополнительная файловая служба, входящая в состав обо­лочки File and Print Services for NetWare для той же Windows NT, работает по про­токолу NCP, «родному» для сетей NetWare. Кроме того, в стандартную поставку Windows NT входит сервер FTP, предоставляющий услуги файлового сервера для UNIX-систем. Ничто не мешает приобрести и установить для работы в среде Win­dows NT и другие файловые службы, такие, например, как NFS, кстати имеющей несколько реализаций, выполненных разными фирмами. Наличие нескольких ви­дов файловых услуг позволяет работать в сети приложениям, разработанным для разных операционных систем.

Сетевые оболочки создаются как для локальных, так и для сетевых операци­онных систем. Действительно, почему бы не дополнить набор сетевых служб, встроенных в сетевую ОС, другими службами, составляющими некоторую сете­вую оболочку. Например, сетевая оболочка ENS (Enterprise Network Ser.vic.es), содержащая базовый набор сетевых служб операционной системы Banyan VINES,

может работать над сетевыми ОС UNIX и NetWare (конечно, для каждой из этих операционных систем требуется собственный вариант ENS).

Существует и третий способ реализации сетевой службы — в виде отдельного про­дукта Например, сервер удаленного управления WinFrame — продукт компании Citrix — предназначен для .работы в среде Windows NT. Он дополняет возможности встроенного в Windows NT сервера удаленного доступа Remote Access Server. Анало­гичную службу удаленного доступа для NetWare также можно приобрести отдельно,

купив программный продукт NetWare Connect.

С течением времени сетевая служба может получить разные формы реализации. Так, например, компания Novell планирует поставлять справочную службу NDS, первоначально встроенную в сетевую ОС NetWare, для других ОС. Для этого служба NDS будет переписана в виде отдельных продуктов, каждый из которых будет учитывать специфику соответствующей ОС. Уже имеются версии NDS для работы в средах SCO UNIX и HP-UX, Solaris 2.5 и Windows NT. А справочная служба StreetTalk уже давно существует и в виде встроенного модуля сетевой ОС Bаyаn Vines, и в составе оболочки ENS, и в виде отдельного продукта для различных операционных систем.

 

Одноранговые и серверные сетевые операционные системы

 

В зависимости от того, как распределены функции между компьютерами сети, они могут выступать в трех разных ролях:

□   компьютер, занимающийся исключительно обслуживанием запросов других компьютеров, играет роль выделенного сервера сети;

□   компьютер, обращающийся с запросами к ресурсам другой машины, исполня­ет роль клиентского узла;

□   компьютер, совмещающий функции клиента и сервера, является одноранго­вым узлом.

Очевидно, что сеть не может состоять только из клиентских или только из сервер­ных узлов. Сеть, оправдывающая свое назначение и обеспечивающая взаимодей­ствие компьютеров, может быть построена по одной из трех следующих схем:

□   сеть на основе одноранговых узлов — одноранговая сеть;

О сеть на основе клиентов и серверов — сеть с выделенными серверами;

□   сеть, включающая узлы всех типов, — гибридная сеть.

Каждая из этих схем обладает своими достоинствами и недостатками, опреде­ляющими их области применения.

 

ОС в одноранговых сетях

 

В одноранговых сетях (рис. 2.4) все компьютеры равны в возможностях досту­па к ресурсам друг друга. Каждый пользователь может по своему желанию объявить какой-либо ресурс своего компьютера разделяемым, после чего другие пользователи могут его использовать. В одноранговых сетях на всех компьюте­рах устанавливается такая операционная система, которая предоставляет всем компьютерам в сети потенциально равные возможности. Сетевые операционные системы такого типа называются одноранговыми ОС. Очевидно, что одноранго­вые ОС должны включать как серверные, так и клиентские компоненты сетевых служб (на рисунке они обозначены буквами соответственно С и К). Примерами одноранговых ОС могут служить LANtastic, Personal Ware, Windows for Work­groups, Windows NT Workstation, Windows 95/98.

 

 

           

 

При потенциальном равноправии всех компьютеров в одноранговой сети часто возникает функциональная несимметричность. Обычно в сети имеются пользова­тели, которые не желают предоставлять свои ресурсы в совместное пользование. В таком случае серверные возможности их операционных систем не активизиру­ются и компьютеры выполняют роль «чистых» клиентов (на рисунке неисполь­зуемые компоненты ОС изображены затемненными).

В то же время администратор может закрепить за некоторыми компьютерами сети только функции по обслуживанию запросов остальных компьютеров, пре­вратив их таким образом в «чистые» серверы, за которыми не работают пользо­ватели. В такой конфигурации одноранговые сети становятся похожи на сети с выделенными серверами, но это только внешняя схожесть — между этими дву­мя типами сетей остается существенное внутреннее различие. Изначально в од­норанговых сетях специализация ОС не зависит от того, какую функциональную роль выполняет компьютер — клиента или сервера. Изменение роли компьютера в одноранговой сети достигается за счет того, что функции серверной или кли­ентской частей просто не используются.

Одноранговые сети проще в организации и эксплуатации, по этой схеме органи­зуется работа в небольших сетях, в которых количество компьютеров не превы­шает 10-20. В этом случае нет необходимости в применении централизованных средств администрирования — нескольким пользователям нетрудно договорить­ся между собой о перечне разделяемых ресурсов и паролях доступа к ним.

Однако в больших сетях средства централизованного администрирования, хра­нения и обработки данных, а особенно защиты данных становятся необходимы­ми, и такие возможности легче обеспечить в сетях с выделенными серверами.

 

ОС в сетях с выделенными серверами

 

В сетях с выделенными серверами (рис. 2.5) используются специальные вариан­ты сетевых ОС, которые оптимизированы для работы в роли серверов и называ­ются серверными ОС. Пользовательские компьютеры в этих сетях работают под

управлением клиентских ОС.

 

 

Специализация операционной системы для работы в качестве сервера является естественным способом повышения эффективности серверных операций. А не­обходимость такого повышения часто ощущается весьма остро, особенно в крупной сети. При существовании в сети сотен или даже тысяч пользователей интенсив­ность запросов к совместно используемым ресурсам может быть очень большой, и сервер должен справляться с этим потоком запросов без больших задержек. Очевидным решением этой проблемы является использование в качестве серве­ра компьютера с мощной аппаратной платформой и операционной системой, оп­тимизированной для серверных функций.

Чем меньше функций выполняет ОС, тем более эффективно можно их реализо­вать, поэтому для оптимизации серверных операций разработчики ОС вынужде­ны ущемлять некоторые другие ее функции, причем иногда вплоть до полного их отбрасывания. Одним из ярких примеров такого подхода является серверная ОС NetWare. Ее разработчики поставили перед собой цель оптимизировать выполне­ние файлового сервиса и сервиса печати. Для этого они полностью исключили из системы многие элементы, важные для универсальной ОС, в частности графиче­ский интерфейс пользователя, поддержку универсальных приложений, защиту приложений мультипрограммного режима друг от друга, механизм виртуальной памяти. Все это позволило добиться уникальной скорости файлового доступа и вывело эту операционную систему в лидеры серверных ОС на долгое время.

Однако слишком узкая специализация некоторых серверных ОС является одно­временно и их слабой стороной. Так, отсутствие в NetWare универсального интерфейса программирования и средств защиты приложений не позволяет ис­пользовать ее в качестве среды для выполнения приложений, приводит к необ­ходимости включения в сеть других серверных ОС, когда требуется выполнение функций, отличных от файлового сервиса и сервиса печати.

Поэтому разработчики многих серверных операционных систем отказываются от функциональной ограниченности и включают в состав серверных ОС все компо­ненты, позволяющие использовать их в качестве универсального сервера и даже в качестве клиентской ОС. Такие серверные ОС снабжаются развитым графиче­ским пользовательским интерфейсом и поддерживают универсальный API. Это сближает их с одноранговыми операционными системами, но существует несколь­ко отличий, которые оправдывают отнесение их к классу серверных ОС:

□  поддержка мощных аппаратных платформ, в том числе мультипроцессорных;

□  поддержка большого числа одновременно выполняемых процессов и сетевых соединений;

□ включение в состав ОС компонентов централизованного администрирования сети (например, справочной службы или службы аутентификации и автори­зации пользователей сети);

□ более широкий набор сетевых служб.

Клиентские операционные системы в сетях с выделенными серверами обычно освобождены от серверных функций, что значительно упрощает их организацию. Разработчики клиентских ОС уделяют основное внимание пользовательскому интерфейсу и клиентским частям сетевых служб. Наиболее простые клиентские ОС поддерживают только базовые сетевые службы — обычно файловую службу и службу печати. В то же время существуют так называемые универсальные кли­енты, которые поддерживают широкий набор клиентских частей, позволяющих им работать практически со всеми серверами сети.

Многие компании, разрабатывающие сетевые ОС, выпускают два варианта од­ной и той же операционной системы. Один вариант предназначен для работы в качестве серверной ОС, а другой — в качестве клиентской. Эти варианты чаще всего основаны на одном и том же базовом коде, но отличаются набором служб и утилит, а также параметрами конфигурации, некоторые из которых устанавлива­ются по умолчанию и не поддаются изменению.

Например, операционная система Windows NT выпускается в варианте для ра­бочей станции — Windows NT Workstation — и в варианте для выделенного сер­вера — Windows NT Server. Оба эти варианта операционной системы включают клиентские и серверные части многих сетевых служб.

Так, ОС Windows NT Workstation кроме выполнения функций сетевого клиента может предоставлять сетевым пользователям файловый сервис, сервис печати, сервис удаленного доступа и другие сервисы, а следовательно, может служить основой для одноранговой сети. С другой стороны, ОС Windows NT Server содер­жит все необходимые средства, которые позволяют использовать компьютер под ее управлением в качестве клиентской рабочей станции. Под управлением ОС Windows NT Server имеется возможность локально запускать прикладные про­граммы, которые могут потребовать выполнения клиентских функций ОС при появлении запросов к ресурсам других компьютеров сети. Windows NT Server имеет такой же развитый графический интерфейс, как и Windows NT Worksta­tion, что позволяет с равным успехом использовать эти ОС для интерактивной работы пользователя или администратора.

Однако вариант Windows NT Server имеет больше возможностей для предостав­ления ресурсов своего компьютера другим пользователям сети, так как поддер­живает более широкий набор функций, большее количество одновременных соединений с клиентами, централизованное управление сетью, более развитые средства защиты. Поэтому имеет смысл применять Windows NT Server в качест­ве ОС для выделенных серверов, а не клиентских компьютеров.

В больших сетях наряду с отношениями клиент-сервер сохраняется необходи­мость и в одноранговых связях, поэтому такие сети чаще всего строятся по гиб­ридной схеме (рис. 2.6).

 

Требования к современным операционным системам

 

Главным требованием, предъявляемым к операционной системе, является вы­полнение ею основных функций эффективного управления ресурсами и обеспечение удобного интерфейса для пользователя и прикладных программ. Совре­менная ОС, как правило, должна поддерживать мультипрограммную обработку, виртуальную память, свопинг, многооконный графический интерфейс пользова­теля, а также выполнять многие другие необходимые функции и услуги. Кроме этих требований функциональной полноты к операционным системам предъяв­ляются не менее важные эксплуатационные требования, которые перечислены ниже.

Расширяемость. В то время как аппаратная часть компьютера устаревает за несколько лет, полезная жизнь операционных систем может измеряться деся­тилетиями. Примером может служить ОС UNIX. Поэтому операционные системы всегда изменяются со временем эволюционно, и эти изменения бо­лее значимы, чем изменения аппаратных средств. Изменения ОС обычно за­ключаются в приобретении ею новых свойств, например поддержке новых типов внешних устройств или новых сетевых технологий. Если код ОС написан таким образом, что дополнения и изменения могут вноситься без на­рушения целостности системы, то такую ОС называют расширяемой. Расши­ряемость достигается за счет модульной структуры ОС, при которой про­граммы строятся из набора отдельных модулей, взаимодействующих только через функциональный интерфейс.

□  Переносимость. В идеале код ОС должен легко переноситься с процессора одного типа на процессор другого типа и с аппаратной платформы (которые различаются не только типом процессора, но и способом организации всей аппаратуры компьютера) одного типа на аппаратную платформу другого типа. Переносимые ОС имеют несколько вариантов реализации для разных платформ, такое свойство ОС называют также многоплатформениостъю.

□   Совместимость. Существует несколько «долгоживущих» популярных опера­ционных систем (разновидности UNIX, MS-DOS, Windows 3.x, Windows NT, OS/2), для которых наработана широкая номенклатура приложений. Некото­рые из них пользуются широкой популярностью. Поэтому для пользователя, переходящего по тем или иным причинам с одной ОС на другую, очень при­влекательна возможность запуска в новой операционной системе привычно­го приложения. Если ОС имеет средства для выполнения прикладных про­грамм, написанных для других операционных систем, то про нее говорят, что она обладает совместимостью с этими ОС. Следует различать совместимость на уровне двоичных кодов и совместимость на уровне исходных текстов. По­нятие совместимости включает также поддержку пользовательских интер­фейсов других ОС.

Надежность и отказоустойчивость. Система должна быть защищена как от внутренних, так и от внешних ошибок, сбоев и отказов. Ее действия должны быть всегда предсказуемыми, а приложения не должны иметь возможности наносить вред ОС. Надежность и отказоустойчивость ОС прежде всего опре­деляются архитектурными решениями, положенными в ее основу, а также ка­чеством ее реализации (отлаженностью кода). Кроме того, важно, включает ли ОС программную поддержку аппаратных средств обеспечения отказо­устойчивости, таких, например, как дисковые массивы или источники беспе­ребойного питания.

□  Безопасность. Современная ОС должна защищать данные и другие ресурсы вычислительной системы от несанкционированного доступа. Чтобы ОС обла­дала свойством безопасности, она должна как минимум иметь в своем составе средства аутентификации — определения легальности пользователей, автори­зации — предоставления легальным пользователям дифференцированных прав доступа к ресурсам, аудита — фиксации всех «подозрительных» для безопас­ности системы событий. Свойство безопасности особенно важно для сетевых ОС. В таких ОС к задаче контроля доступа добавляется задача защиты дан­ных, передаваемых по сети.

□  Производительность. Операционная система должна обладать настолько хо­рошим быстродействием и временем реакции, насколько это позволяет аппа­ратная платформа. На производительность ОС влияет много факторов, среди которых основными являются архитектура ОС, многообразие функций, каче­ство программирования кода, возможность исполнения ОС на высокопроиз­водительной (многопроцессорной) платформе.

 

ГЛАВА 3  

Архитектура операционной системы

 

Любая сложная система должна иметь понятную и рациональную структуру, то есть разделяться на части — модули, имеющие вполне законченное функцио­нальное назначение с четко оговоренными правилами взаимодействия. Ясное понимание роли каждого отдельного модуля существенно упрощает работу по модификации и развитию системы. Напротив, сложную систему без хорошей структуры чаще проще разработать заново, чем модернизировать.

Функциональная сложность операционной системы неизбежно приводит к слож­ности ее архитектуры, под которой понимают структурную организацию ОС на основе различных программных модулей. Обычно в состав ОС входят исполняе­мые и объектные модули стандартных для данной ОС форматов, библиотеки разных типов, модули исходного текста программ, программные модули специ­ального формата (например, загрузчик ОС, драйверы ввода-вывода), конфигура­ционные файлы, файлы документации, модули справочной системы и т. д.

Большинство современных операционных систем представляют собой хорошо структурированные модульные системы, способные к развитию, расширению и переносу на новые платформы. Какой-либо единой архитектуры ОС не сущест­вует, но существуют универсальные подходы к структурированию ОС.

 

Ядро и вспомогательные модули ОС

 

Наиболее общим подходом к структуризации операционной системы является разделение всех ее модулей на две группы:

□  ядро — модули, выполняющие основные функции ОС;

□  модули, выполняющие вспомогательные функции ОС.

Модули ядра выполняют такие базовые функции ОС, как управление процесса­ми, памятью, устройствами ввода-вывода и т. п. Ядро составляет сердцевину

операционной системы, без него ОС является полностью неработоспособной и не сможет выполнить ни одну из своих функций.

В состав ядра входят функции, решающие внутрисистемные задачи организации вычислительного процесса, такие как переключение контекстов, загрузка/вы­грузка станиц, обработка прерываний. Эти функции недоступны для приложе­ний. Другой класс функций ядра служит для поддержки приложений, создавая для них так называемую прикладную программную среду. Приложения могут об­ращаться к ядру с запросами — системными вызовами — для выполнения тех или иных действий, например для открытия и чтения файла, вывода графиче­ской информации на дисплей, получения системного времени и т. д. Функции ядра, которые могут вызываться приложениями, образуют интерфейс приклад­ного программирования — API.

Функции, выполняемые модулями ядра, являются наиболее часто используемы­ми функциями операционной системы, поэтому скорость их выполнения опре­деляет производительность всей системы в целом. Для обеспечения высокой скорости работы ОС все модули ядра или большая их часть постоянно находят­ся в оперативной памяти, то есть являются резидентными.

Ядро является движущей силой всех вычислительных процессов в компьютер­ной системе, и крах ядра равносилен краху всей системы. Поэтому разработчики операционной системы уделяют особое внимание надежности кодов ядра, в ре­зультате процесс их отладки может растягиваться на многие месяцы.

Обычно ядро оформляется в виде программного модуля некоторого специально­го формата, отличающегося от формата пользовательских приложений.

 

ПРИМЕЧАНИЕ ----------------------------------------------------------------------------------------------

Термин «ядро» в разных ОС трактуется по-разному. Одним из определяющих свойств ядра является работа в привилегированном режиме. Этот вопрос будет рассмотрен в сле­дующем разделе.

 

Остальные модули ОС выполняют весьма полезные, но менее обязательные функции. Например, к таким вспомогательным модулям могут быть отнесены программы архивирования данных на магнитной ленте, дефрагментации диска, текстового редактора. Вспомогательные модули ОС оформляются либо в виде приложений, либо в виде библиотек процедур.

Поскольку некоторые компоненты ОС оформлены как обычные приложения, то есть в виде исполняемых модулей стандартного для данной ОС формата, то час­то бывает очень сложно провести четкую грань между операционной системой и приложениями (рис. 3.1).

Решение о том, является ли какая-либо программа частью ОС или нет, принима­ет производитель ОС. Среди многих факторов, способных повлиять на это реше­ние, немаловажными являются перспективы того, будет ли программа иметь массовый спрос у потенциальных пользователей данной ОС.

Некоторая программа может существовать определенное время как пользова­тельское приложение, а потом стать частью ОС, или наоборот. Ярким примером такого изменения статуса программы является Web-браузер компании Microsoft, который сначала поставлялся как отдельное приложение, затем стал частью операционных систем Windows NT 4.0 и Windows 95/98, а сегодня существует большая вероятность того, что по решению суда этот браузер снова превратится в самостоятельное приложение.

 

 

 

Вспомогательные модули ОС обычно подразделяются на следующие группы:

□  утилиты — программы, решающие отдельные задачи управления и сопрово­ждения компьютерной системы, такие, например, как программы сжатия дис­ков, архивирования данных на магнитную ленту;

системные обрабатывающие программы — текстовые или графические редак­торы, компиляторы, компоновщики, отладчики;

□  программы предоставления пользователю дополнительных услуг — специаль­ный вариант пользовательского интерфейса, калькулятор и даже игры;

□  библиотеки процедур различного назначения, упрощающие разработку при­ложений, например библиотека математических функций, функций ввода-вывода и т. д.

Как и обычные приложения, для выполнения своих задач утилиты, обрабаты­вающие программы и библиотеки ОС, обращаются к функциям ядра посредст­вом системных вызовов (рис. 3.2).

Разделение операционной системы на ядро и модули-приложения обеспечивает легкую расширяемость ОС. Чтобы добавить новую высокоуровневую функцию, достаточно разработать новое приложение, и при этом не требуется модифици­ровать ответственные функции, образующие ядро системы. Однако внесение из­менений в функции ядра может оказаться гораздо сложнее, и сложность эта зависит от структурной организации самого ядра. В некоторых случаях каждое ис­правление ядра может потребовать его полной перекомпиляции.

 

 

 

Модули ОС, оформленные в виде утилит, системных обрабатывающих программ и библиотек, обычно загружаются в оперативную память только на время вы­полнения своих функций, то есть являются транзитными. Постоянно в опера­тивной памяти располагаются только самые необходимые коды ОС, составляю­щие ее ядро. Такая организация ОС экономит оперативную память компьютера.

Важным свойством архитектуры ОС, основанной на ядре, является возможность защиты кодов и данных операционной системы за счет выполнения функции ядра в привилегированном режиме.

 

Ядро в привилегированном режиме

 

Для надежного управления ходом выполнения приложений операционная сис­тема должна иметь по отношению к приложениям определенные привилегии. Иначе некорректно работающее приложение может вмешаться в работу ОС и, например, разрушить часть ее кодов. Все усилия разработчиков операционной системы окажутся напрасными, если их решения воплощены в незащищенные от приложений модули системы, какими бы элегантными и эффективными эти решения ни были. Операционная система должна обладать исключительными полномочиями также для того, чтобы играть роль арбитра в споре приложений за ресурсы компьютера в мультипрограммном режиме. Ни одно приложение не должно иметь возможности без ведома ОС получать дополнительную область памяти, занимать процессор дольше разрешенного операционной системой периода времени, непосредственно управлять совместно используемыми внешни­ми устройствами.

Обеспечить привилегии операционной системе невозможно без специальных средств аппаратной поддержки. Аппаратура компьютера должна поддерживать как минимум два режима работы — пользовательский режим (user mode) и приви­легированный режим, который также называют режимом ядра (kernel mode), или режимом супервизора (supervisor mode). Подразумевается, что операционная сис­тема или некоторые ее части работают в привилегированном режиме, а приложе­ния — в пользовательском режиме.

Так как ядро выполняет все основные функции ОС, то чаще всего именно ядро становится той частью ОС, которая работает в привилегированном режиме (рис. 3.3). Иногда это свойство — работа в привилегированном режиме — служит основным определением понятия «ядро».

 

 

Приложения ставятся в подчиненное положение за счет запрета выполнения в пользовательском режиме некоторых критичных команд, связанных с переклю­чением процессора с задачи на задачу, управлением устройствами ввода-вывода, доступом к механизмам распределения и защиты памяти. Выполнение некото­рых инструкций в пользовательском режиме запрещается безусловно (очевидно, что к таким инструкциям относится инструкция перехода в привилегированный режим), тогда как другие запрещается выполнять только при определенных ус­ловиях. Например, инструкции ввода-вывода могут быть запрещены приложе­ниям при доступе к контроллеру жесткого диска, который хранит данные, общие для ОС и всех приложений, но разрешены при доступе к последовательному порту, который выделен в монопольное владение для определенного приложе­ния. Важно, что условия разрешения выполнения критичных инструкций нахо­дятся под полным контролем ОС и этот контроль обеспечивается за счет набора инструкций, безусловно запрещенных для пользовательского режима.

Аналогичным образом обеспечиваются привилегии ОС при доступе к памяти. Например, выполнение инструкции доступа к памяти для приложения разреша­ется, если инструкция обращается к области памяти, отведенной данному прило­жению операционной системой, и запрещается при обращении к областям памя­ти, занимаемым ОС или другими приложениями. Полный контроль ОС над доступом к памяти достигается за счет того, что инструкция или инструкции кон­фигурирования механизмов защиты памяти (например, изменения ключей за­щиты памяти в мэйнфреймах IBM или указателя таблицы дескрипторов памяти в процессорах Pentium) разрешается выполнять только в привилегированном режиме.

Очень важно, что механизмы защиты памяти используются операционной сис­темой не только для защиты своих областей памяти от приложений, но и для за­щиты областей памяти, выделенных ОС какому-либо приложению, от осталь­ных приложений. Говорят, что каждое приложение работает в своем адресном пространстве. Это свойство позволяет локализовать некорректно работающее приложение в собственной области памяти, так что его ошибки не оказывают влияния на остальные приложения и операционную систему.

Между количеством уровней привилегий, реализуемых аппаратно, и количест­вом уровней привилегий, поддерживаемых ОС, нет прямого соответствия. Так, на базе четырех уровней, обеспечиваемых процессорами компании Intel, опера­ционная система OS/2 строит трехуровневую систему привилегий, а операцион­ные системы Windows NT, UNIX и некоторые другие ограничиваются двух­уровневой системой.

С другой стороны, если аппаратура поддерживает хотя бы два уровня привиле­гий, то ОС может на этой основе создать программным способом сколь угодно развитую систему защиты.

Эта система может, например, поддерживать несколько уровней привилегий, обра­зующих иерархию. Наличие нескольких уровней привилегий позволяет более тонко распределять полномочия как между модулями операционной системы, так и между самими приложениями. Появление внутри операционной системы более привилегированных и менее привилегированных частей позволяет повы­сить устойчивость ОС к внутренним ошибкам программных кодов, так как такие ошибки будут распространяться только внутри модулей с определенным уров­нем привилегий. Дифференциация привилегий в среде прикладных модулей по­зволяет строить сложные прикладные комплексы, в которых часть более при­вилегированных модулей может, например, получать доступ к данным менее привилегированных модулей и управлять их выполнением.

На основе двух режимов привилегий процессора ОС может построить сложную систему индивидуальной защиты ресурсов, примером которой является типич­ная система защиты файлов и каталогов. Такая система позволяет задать для любого пользователя определенные права доступа к каждому из файлов и ката­логов.

Повышение устойчивости операционной системы, обеспечиваемое переходом ядра в привилегированный режим, достигается за счет некоторого замедления выполнения системных вызовов. Системный вызов привилегированного ядра инициирует переключение процессора из пользовательского режима в привиле­гированный, а при возврате к приложению — переключение из привилегирован­ного режима в пользовательский (рис. 3.4). Во всех типах процессоров из-за до­полнительной двукратной задержки переключения переход на процедуру со сменой режима выполняется медленнее, чем вызов процедуры без смены ре­жима.

 

 

Архитектура ОС, основанная на привилегированном ядре и приложениях поль­зовательского режима, стала, по существу, классической. Ее используют многие популярные операционные системы, в том числе многочисленные версии UNIX, VAX VMS, IBM OS/390, OS/2, и с определенными модификациями — Win­dows NT.

В некоторых случаях разработчики ОС отступают от этого классического вари­анта архитектуры, организуя работу ядра и приложений в одном и том же ре­жиме. Так, известная специализированная операционная система NetWare компании Novell использует привилегированный режим процессоров Intel x86/ Pentium как для работы ядра, так и для работы своих специфических приложе­ний — загружаемых модулей NLM (рис. 3.5). При таком построении ОС обра­щения приложений к ядру выполняются быстрее, так как нет переключения ре­жимов, однако при этом отсутствует надежная аппаратная защита памяти, занимаемой модулями ОС, от некорректно работающего приложения. Разра­ботчики NetWare пошли на такое потенциальное снижение надежности своей операционной системы, поскольку ограниченный набор ее специализирован­ных приложений позволяет компенсировать этот архитектурный недостаток за счет тщательной отладки каждого приложения.

 

 

В одном режиме работают также ядро и приложения тех операционных систем, которые разработаны для процессоров, вообще не поддерживающих привилеги­рованного режима работы. Наиболее популярным процессором такого типа был процессор Intel 8088/86, послуживший основой для персональных компьютеров компании IBM. Операционная система MS-DOS, разработанная компанией Mic­rosoft для этих компьютеров, состояла из двух модулей msdos.sys и io.sys, состав­лявших ядро системы (хотя название «ядро» для этих модулей не употребля­лось, по своей сути они им являлись), к которым с системными вызовами обращались командный интерпретатор command.com, системные утилиты и при­ложения. Архитектура MS-DOS соответствует архитектуре ОС, приведенной на рис. 3.2. Некорректно написанные приложения вполне могли разрушить основ­ные модули MS-DOS, что иногда и происходило, но область использования MS-DOS (и многих подобных ей ранних операционных систем для персональных компьютеров, таких как MSX, СР/М) и не предъявляла высоких требований к надежности ОС.

ПРИМЕЧАНИЕ ----------------------------------------------------------------------------------------------

Появление в более поздних версиях процессоров Intel (начиная с 80286) возможности ра­боты в привилегированном режиме не было использовано разработчиками MS-DOS. Эта ОС всегда работает на процессорах данного типа в так называемом реальном режиме, в ко­тором эмулируется процессор 8086/88. Не следует считать, что реальный режим является синонимом пользовательского режима, а привилегированный режим — его альтернативой. Реальный режим был реализован только для совместимости поздних моделей процессо­ров с ранней моделью 8086/88 и альтернативой ему является защищенный режим работы процессора, в котором становятся доступными все особенности процессоров поздних мо­делей, в том числе и работа на одном из четырех уровней привилегий.

 

Многослойная структура ОС

 

Вычислительную систему, работающую под управлением ОС на основе ядра, можно рассматривать как систему, состоящую из трех иерархически расположен­ных слоев: нижний слой образует аппаратура, промежуточный — ядро, а утили­ты, обрабатывающие программы и приложения, составляют верхний слой систе­мы (рис. 3.6). Слоистую структуру вычислительной системы принято изобра­жать в виде системы концентрических окружностей, иллюстрируя тот факт, что каждый слой может взаимодействовать только со смежными слоями. Действи­тельно, при такой организации ОС приложения не могут непосредственно взаи­модействовать с аппаратурой, а только через слои ядра.

 

 

Многослойный подход является универсальным и эффективным способом де­композиции сложных систем любого типа, в том числе и программных. В соот­ветствии с этим подходом система состоит из иерархии слоев. Каждый слой об­служивает вышележащий слой, выполняя для него некоторый набор функций, которые образуют межслойный интерфейс (рис. 3.7). На основе функций ниже­лежащего слоя следующий (вверх по иерархии) слой строит свои функции — бо­лее сложные и более мощные, которые, в свою очередь, оказываются прими­тивами для создания еще более мощных функций вышележащего слоя. Строгие правила касаются только взаимодействия между слоями системы, а между моду­лями внутри слоя связи могут быть произвольными. Отдельный модуль может выполнить свою работу либо самостоятельно, либо обратиться к другому моду­лю своего слоя, либо обратиться за помощью к нижележащему слою через меж­слойный интерфейс.

Такая организация системы имеет много достоинств. Она существенно упрощает разработку системы, так как позволяет сначала определить «сверху вниз» функ­ции слоев и межслойные интерфейсы, а затем при детальной реализации посте­пенно наращивать мощность функций слоев, двигаясь «снизу вверх». Кроме того, при модернизации системы можно изменять модули внутри слоя без необходи­мости производить какие-либо изменения в остальных слоях, если при этих внутренних изменениях межслойные интерфейсы остаются в силе.

 

 

Поскольку ядро представляет собой сложный многофункциональный комплекс, то многослойный подход обычно распространяется и на структуру ядра.

Ядро может состоять из следующих слоев.

□   Средства аппаратной поддержки ОС. До сих пор об операционной системе говорилось как о комплексе программ, но, вообще говоря, часть функций ОС может выполняться и аппаратными средствами. Поэтому иногда можно встретить определение операционной системы как совокупности программ­ных и аппаратных средств, что и отражено на рис. 3.8. К операционной систе­ме относят, естественно, не все аппаратные устройства компьютера, а только средства аппаратной поддержки ОС, то есть те, которые прямо участвуют в организации вычислительных процессов: средства поддержки привилегиро­ванного режима, систему прерываний, средства переключения контекстов процессов, средства защиты областей памяти и т. п.

□  Машинно-зависимые компоненты ОС. Этот слой образуют программные мо­дули, в которых отражается специфика аппаратной платформы компьютера. В идеале этот слой полностью экранирует вышележащие слои ядра от осо­бенностей аппаратуры. Это позволяет разрабатывать вышележащие слои на основе машинно-независимых модулей, существующих в единственном эк­земпляре для всех типов аппаратных платформ, поддерживаемых данной ОС. Примером экранирующего слоя может служить слой HAL операционной сис­темы Windows NT.

□  Базовые механизмы ядра. Этот слой выполняет наиболее примитивные опера­ции ядра, такие как программное переключение контекстов процессов, дис­петчеризацию прерываний, перемещение страниц из памяти на диск и обрат­но и т. п. Модули данного слоя не принимают решении о распределении ресурсов — они только отрабатывают принятые «наверху» решения, что и дает повод называть их исполнительными механизмами для модулей верхних слоев. Например, решение о том, что в данный момент нужно прервать вы­полнение текущего процесса А и начать выполнение процесса В, принимает­ся менеджером процессов на вышележащем слое, а слою базовых механизмов передается только директива о том, что нужно выполнить переключение с контекста текущего процесса на контекст процесса В.

□  Менеджеры ресурсов. Этот слой состоит из мощных функциональных моду­лей, реализующих стратегические задачи по управлению основными ресурса­ми вычислительной системы. Обычно на данном слое работают менеджеры (называемые также диспетчерами) процессов, ввода-вывода, файловой систе­мы и оперативной памяти. Разбиение на менеджеры может быть и несколько иным, например менеджер файловой системы иногда объединяют с менедже­ром ввода-вывода, а функции управления доступом пользователей к системе в целом и ее отдельным объектам поручают отдельному менеджеру безопас­ности. Каждый из менеджеров ведет учет свободных и используемых ресур­сов определенного типа и планирует их распределение в соответствии с за­просами приложений. Например, менеджер виртуальной памяти управляет перемещением страниц из оперативной памяти на диск и обратно. Менеджер должен отслеживать интенсивность обращений к страницам, время пребыва­ния их в памяти, состояния процессов, использующих данные, и многие дру­гие параметры, на основании которых он время от времени принимает реше­ния о том, какие страницы необходимо выгрузить и какие — загрузить. Для исполнения принятых решений менеджер обращается к нижележащему слою базовых механизмов с запросами о загрузке (выгрузке) конкретных страниц. Внутри слоя менеджеров существуют тесные взаимные связи, отражающие тот факт, что для выполнения процессу нужен доступ одновременно к не­скольким ресурсам — процессору, области памяти, возможно, к определенно­му файлу или устройству ввода-вывода. Например, при создании процесса менеджер процессов обращается к менеджеру памяти, который должен выделит процессу определенную область памяти для его кодов и данных.

Интерфейс системных вызовов. Этот слой является самым верхним слоем ядра и взаимодействует непосредственно с приложениями и системными утили­тами, образуя прикладной программный интерфейс операционной системы. Функции API, обслуживающие системные вызовы, предоставляют доступ к ресурсам системы в удобной и компактной форме, без указания деталей их физического расположения. Например, в операционной системе UNIX с по­мощью системного вызова fd = open("/doc/a.txt", О_RDONLY) приложение от­крывает файл a.txt, хранящийся в каталоге /doc, а с помощью системного вызова read(fd, buffer, count) читает из этого файла в область своего адрес­ного пространства, имеющую имя buffer, некоторое количество байт. Для осуществления таких комплексных действий системные вызовы обычно об­ращаются за помощью к функциям слоя менеджеров ресурсов, причем для выполнения одного системного вызова может понадобиться несколько та­ких обращений.

 

 

Приведенное разбиение ядра ОС на слои является достаточно условным. В ре­альной системе количество слоев и распределение функций между ними может быть и иным. В системах, предназначенных для аппаратных платформ одного типа, например ОС NetWare, слой машинно-зависимых модулей обычно не выделяется, сливаясь со слоем базовых механизмов и, частично, со слоем менедже­ров ресурсов. Не всегда оформляются в отдельный слой базовые механизмы — в этом случае менеджеры ресурсов не только планируют использование ресур­сов, но и самостоятельно реализуют свои планы.

Возможна и противоположная картина, когда ядро состоит из большего количе­ства слоев. Например, менеджеры ресурсов, составляя определенный слой ядра, в свою очередь, могут обладать многослойной структурой. Прежде всего это от­носится к менеджеру ввода-вывода нижний слой которого составляют драйве­ры устройств, например драйвер жесткого диска или драйвер сетевого адаптера, а верхние слои — драйверы файловых систем или протоколов сетевых служб, имеющие дело с логической организацией информации.

Способ взаимодействия слоев в реальной ОС также может отклоняться от опи­санной выше схемы. Для ускорения работы ядра в некоторых случаях происхо­дит непосредственное обращение с верхнего слоя к функциям нижних слоев, минуя промежуточные. Типичным примером такого «неправильного» взаимо­действия является начальная стадия обработки системного вызова. На многих аппаратных платформах для реализации системного вызова используется инст­рукция программного прерывания. Этим приложение фактически вызывает мо­дуль первичной обработки прерываний, который находится в слое базовых механизмов, а уже этот модуль вызывает нужную функцию из слоя системных вызовов. Сами функции системных вызовов также иногда нарушают субордина­цию иерархических слоев, обращаясь прямо к базовым механизмам ядра.

Выбор количества слоев ядра является ответственным и сложным делом: увели­чение числа слоев ведет к некоторому замедлению работы ядра за счет допол­нительных накладных расходов на межслойное взаимодействие, а уменьшение числа слоев ухудшает расширяемость и логичность системы. Обычно операци­онные системы, прошедшие долгий путь эволюционного развития, например многие версии UNIX, имеют неупорядоченное ядро с небольшим числом четко выделенных слоев, а у сравнительно «молодых» операционных систем, таких как Windows NT, ядро разделено на большее число слоев и их взаимодействие фор­мализовано в гораздо большей степени.

 

Аппаратная зависимость и переносимость ОС

 

Многие операционные системы успешно работают на различных аппаратных плат­формах без существенных изменений в своем составе. Во многом это объясняет­ся тем, что, несмотря на различия в деталях, средства аппаратной поддержки ОС большинства компьютеров приобрели сегодня много типовых черт, а именно эти средства в первую очередь влияют на работу компонентов операционной систе­мы. В результате в ОС можно выделить достаточно компактный слой машинно-зависимых компонентов ядра и сделать остальные слои ОС общими для разных аппаратных платформ.

 

Типовые средства аппаратной поддержки ОС

 

Четкой границы между программной и аппаратной реализацией функций ОС не существует — решение о том, какие функции ОС будут выполняться про­граммно, а какие аппаратно, принимается разработчиками аппаратного и про­граммного обеспечения компьютера. Тем не менее практически все современные аппаратные платформы имеют некоторый типичный набор средств аппаратной поддержки ОС, в который входят следующие компоненты:

□  средства поддержки привилегированного режима;

□  средства трансляции адресов;

  средства переключения процессов;

□  система прерываний;

□  системный таймер;

□  средства защиты областей памяти.

Средства поддержки привилегированного режима обычно основаны на системном регистре процессора, часто называемом «словом состояния» машины или про­цессора. Этот регистр содержит некоторые признаки, определяющие режимы работы процессора, в том числе и признак текущего режима привилегий. Смена режима привилегий выполняется за счет изменения слова состояния машины в результате прерывания или выполнения привилегированной команды. Число градаций привилегированности может быть разным у разных типов процессо­ров, наиболее часто используются два уровня (ядро-пользователь) или четыре (например, ядро-супервизор-выполнение-пользователь у платформы VAX или 0-1-2-3 у процессоров Intel x86/Pentium). В обязанности средств поддержки привилегированного режима входит выполнение проверки допустимости вы­полнения активной программой инструкций процессора при текущем уровне привилегированности.

Средства трансляции адресов выполняют операции преобразования виртуаль­ных адресов, которые содержатся в кодах процесса, в адреса физической памяти. Таблицы, предназначенные при трансляции адресов, обычно имеют большой объем, поэтому для их хранения используются области оперативной памяти, а аппаратура процессора содержит только указатели на эти области. Средства трансляции адресов используют данные указатели для доступа к элементам таб­лиц и аппаратного выполнения алгоритма преобразования адреса, что значи­тельно ускоряет процедуру трансляции по сравнению с ее чисто программной реализацией.

Средства переключения процессов предназначены для быстрого сохранения кон­текста приостанавливаемого процесса и восстановления контекста процесса, который становится активным. Содержимое контекста обычно включает содер­жимое всех регистров общего назначения процессора, регистра флагов операций (то есть флагов нуля, переноса, переполнения и т. п.), а также тех системных регистров и указателей, которые связаны с отдельным процессом, а не операци­онной системой, например указателя на таблицу трансляции адресов процесса. Для хранения контекстов приостановленных процессов обычно используются области оперативной памяти, которые поддерживаются указателями процессора.

Переключение контекста выполняется по определенным командам процессора, например по команде перехода на новую задачу. Такая команда вызывает авто­матическую загрузку данных из сохраненного контекста в регистры процессора, после чего процесс продолжается с прерванного ранее места.

Система прерываний позволяет компьютеру реагировать на внешние события, синхронизировать выполнение процессов и работу устройств ввода-вывода, бы­стро переходить с одной программы на другую, Механизм прерываний нужен для того, чтобы оповестить процессор о возникновении в вычислительной систе­ме некоторого непредсказуемого события или события, которое не синхронизи­ровано с циклом работы процессора. Примерами таких событий могут служить завершение операции ввода-вывода внешним устройством (например, запись блока данных контроллером диска), некорректное завершение арифметической операции (например, переполнение регистра), истечение интервала астрономи­ческого времени. При возникновении, условий прерывания его источник (кон­троллер внешнего устройства, таймер, арифметический блок процессора и т. п.) выставляет определенный электрический сигнал. Этот сигнал прерывает выпол­нение процессором последовательности команд, задаваемой исполняемым кодом, и вызывает автоматический переход на заранее определенную процедуру, назы­ваемую процедурой обработки прерываний. В большинстве моделей процессоров отрабатываемый аппаратурой переход на процедуру обработки прерываний со­провождается заменой слова состояния машины (или даже всего контекста про­цесса), что позволяет одновременно с переходом по нужному адресу выполнить переход в привилегированный режим. После завершения обработки прерывания обычно происходит возврат к исполнению прерванного кода.

Прерывания играют важнейшую роль в работе любой операционной системы, являясь ее движущей силой. Действительно, большая часть действий ОС ини­циируется прерываниями различного типа. Даже системные вызовы от приложе­ний выполняются на многих аппаратных платформах с помощью специальной инструкции прерывания, вызывающей переход к выполнению соответствующих процедур ядра (например, инструкция int в процессорах Intel или SVC в мэйн­фреймах IBM).

Системный таймер, часто реализуемый в виде быстродействующего регистра-счетчика, необходим операционной системе для выдержки интервалов времени. Для этого в регистр таймера программно загружается значение требуемого ин­тервала в условных единицах, из которого затем автоматически с определенной частотой начинает вычитаться по единице. Частота «тиков» таймера, как пра­вило, тесно связана с частотой тактового генератора процессора. (Не следует путать таймер ни с тактовым генератором, который вырабатывает сигналы, син­хронизирующие все операции в компьютере, ни с системными часами — рабо­тающей на батареях электронной схеме, — которые ведут независимый отсчет времени и календарной даты.) При достижении нулевого значения счетчика тай­мер инициирует прерывание, которое обрабатывается процедурой операционной системы. Прерывания от системного таймера используются ОС в первую оче­редь для слежения за тем, как отдельные процессы расходуют время процессора. Например, в системе разделения времени при обработке очередного прерывания от таймера планировщик процессов может принудительно передать управление

другому процессу, если данный процесс исчерпал выделенный ему квант вре­мени.

Средства защиты областей памяти обеспечивают на аппаратном уровне про­верку возможности программного кода осуществлять с данными определенной области памяти такие операции, как чтение, запись или выполнение (при пере­дачах управления). Если аппаратура компьютера поддерживает механизм транс­ляции адресов, то средства защиты областей памяти встраиваются в этот ме­ханизм. Функции аппаратуры по защите памяти обычно состоят в сравнении уровней привилегий текущего кода процессора и сегмента памяти, к которому производится обращение.

 

Машинно-зависимые компоненты ОС

 

Одна и та же операционная система не может без каких-либо изменений уста­навливаться на компьютерах, отличающихся типом процессора или/и способом организации всей аппаратуры. В модулях ядра ОС не могут не отразиться такие особенности аппаратной платформы, как количество типов прерываний и фор­мат таблицы ссылок на процедуры обработки прерываний, состав регистров об­щего назначения и системных регистров, состояние которых нужно сохранять в контексте процесса, особенности подключения внешних устройств и многие другие.

Однако опыт разработки операционных систем показывает: ядро можно спроек­тировать таким образом, что только часть модулей будут машинно-зависимыми, а остальные не будут зависеть от особенностей аппаратной платформы. В хоро­шо структурированном ядре машинно-зависимые модули локализованы и об­разуют программный слой, естественно примыкающий к слою аппаратуры, как это и показано на рис. 3.8. Такая локализация машинно-зависимых модулей существенно упрощает перенос операционной системы на другую аппаратную платформу.

Объем машинно-зависимых компонентов ОС зависит от того, насколько велики отличия в аппаратных платформах, для которых разрабатывается ОС. Напри­мер, ОС, построенная на 32-битовых адресах, для переноса на машину с 16-бито­выми адресами должна быть практически переписана заново. Одно из наиболее очевидных отличий — несовпадение системы команд процессоров — преодолева­ется достаточно просто. Операционная система программируется на языке высо­кого уровня, а затем соответствующим компилятором вырабатывается код для конкретного типа процессора. Однако во многих случаях различия в организа­ции аппаратуры компьютера лежат гораздо глубже и преодолеть их таким обра­зом не удается. Например, однопроцессорный и двухпроцессорный компьютеры требуют применения в ОС совершенно разных алгоритмов распределения про­цессорного времени. Аналогично отсутствие аппаратной поддержки виртуаль­ной памяти приводит к принципиальному различию в реализации подсистемы управления памятью. В таких случаях не обойтись без внесения в код операци­онной системы специфики аппаратной платформы, для которой эта ОС предна­значается.

Для уменьшения количества машинно-зависимых модулей производители опе­рационных систем обычно ограничивают универсальность машинно-независи­мых модулей. Это означает, что их независимость носит условный характер и распространяется только на несколько типов процессоров и созданных на основе этих процессоров аппаратных платформ. По этому пути пошли, например, разра­ботчики ОС Windows NT, ограничив количество типов процессоров для своей системы четырьмя и поставляя различные варианты кодов ядра для однопроцес­сорных и многопроцессорных компьютеров.

Особое место среди модулей ядра занимают низкоуровневые драйверы внешних устройств. С одной стороны эти драйверы, как и высокоуровневые драйверы, входят в состав менеджера ввода-вывода, то есть принадлежат слою ядра, зани­мающему достаточно высокое место в иерархии слоев. С другой стороны, низ­коуровневые драйверы отражают все особенности управляемых внешних уст­ройств, поэтому их можно отнести и к слою машинно-зависимых модулей. Такая двойственность низкоуровневых драйверов еще раз подтверждает схематичность модели ядра со строгой иерархией слоев.

Для компьютеров на основе процессоров Intel x86/Pentium разработка экрани­рующего машинно-зависимого слоя ОС несколько упрощается за счет встроен­ной в постоянную память компьютера базовой системы ввода-вывода — BIOS. BIOS содержит драйверы для всех устройств, входящих в базовую конфигура­цию компьютера: жестких и гибких дисков, клавиатуры, дисплея и т. д. Эти драйверы выполняют весьма примитивные операции с управляемыми устройст­вами, например чтение группы секторов данных с определенной дорожки диска, но за счет этих операций экранируются различия аппаратных платформ персо­нальных компьютеров и серверов на процессорах Intel разных производителей. Разработчики операционной системы могут пользоваться слоем драйверов BIOS как частью машинно-зависимого слоя ОС, а могут и заменить все или часть драйверов BIOS компонентами ОС.

 

Переносимость операционной системы

 

Если код операционной системы может быть сравнительно легко перенесен с процессора одного типа на процессор другого типа и с аппаратной платформы одного типа на аппаратную платформу другого типа, то такую ОС называют пе­реносимой (portable), или мобильной.

Хотя ОС часто описываются либо как переносимые, либо как непереносимые, мобильность — это не бинарное состояние, а понятие степени. Вопрос не в том, может ли быть система перенесена, а в том, насколько легко можно это сделать. Для того чтобы обеспечить свойство мобильности ОС, разработчики должны следовать следующим правилам.

□ Большая часть кода должна быть написана на языке, трансляторы которого имеются на всех машинах, куда предполагается переносить систему. Такими языками являются стандартизованные языки высокого уровня. Большинство переносимых ОС написано на языке С, который имеет много особенностей, полезных для разработки кодов операционной системы, и компиляторы кото­рого широко доступны. Программа, написанная на ассемблере, является переносимой только в тех случаях, когда перенос операционной системы плани­руется на компьютер, обладающий той же системой команд. В остальных случаях ассемблер используется только для тех непереносимых частей систе­мы, которые должны непосредственно взаимодействовать с аппаратурой (на­пример, обработчик прерываний), или для частей, которые требуют максималь­ной скорости (например, целочисленная арифметика повышенной точности).

□ Объем машинно-зависимых частей кода, которые непосредственно взаимодейст­вуют с аппаратными средствами, должен быть по возможности минимизиро­ван. Так, например, следует всячески избегать прямого манипулирования ре­гистрами и другими аппаратными средствами процессора. Для уменьшения аппаратной зависимости разработчики ОС должны также исключить возмож­ность использования по умолчанию стандартных конфигураций аппаратуры или их характеристик. Аппаратно-зависимые параметры можно «спрятать» в программно-задаваемые данные абстрактного типа. Для осуществления всех необходимых действий по управлению аппаратурой, представленной этими параметрами, должен быть написан набор аппаратно-зависимых функций. Каждый раз, когда какому-либо модулю ОС требуется выполнить некоторое действие, связанное с аппаратурой, он манипулирует абстрактными данными, используя соответствующую функцию из имеющегося набора. Когда ОС пе­реносится, то изменяются только эти данные и функции, которые ими мани­пулируют. Например, в ОС Windows NT диспетчер прерываний преобразует аппаратные уровни прерываний конкретного типа процессора в стандартный набор уровней прерываний IRQL, с которыми работают остальные модули операционной системы. Поэтому при переносе Windows NT на новую плат­форму нужно переписать, в частности, те коды диспетчера прерываний, кото­рые занимаются отображением уровней прерывания на абстрактные уровни IRQL, а те модули ОС, которые пользуются этими абстрактными уровнями, изменений не потребуют.

□ Аппаратно-зависимый код должен быть надежно изолирован в нескольких модулях, а не быть распределен по всей системе. Изоляции подлежат все час­ти ОС, которые отражают специфику как процессора, так и аппаратной плат­формы в целом. Низкоуровневые компоненты ОС, имеющие доступ к процес­сорно-зависимым структурам данных и регистрам, должны быть оформлены в виде компактных модулей, которые могут быть заменены аналогичными модулями для других процессоров. Для снятия платформенной зависимо­сти, возникающей из-за различий между компьютерами разных производите­лей, построенными на одном и том же процессоре (например, MIPS R4000), должен быть введен хорошо локализованный программный слой машинно-зависимых функций.

В идеале слой машинно-зависимых компонентов ядра полностью экранирует ос­тальную часть ОС от конкретных деталей аппаратной платформы (кэши, кон­троллеры прерываний ввода-вывода и т. п.), по крайней мере для того набора платформ, который поддерживает данная ОС. В результате происходит подмена реальной аппаратуры некой унифицированной виртуальной машиной, одинако­вой для всех вариантов аппаратной платформы. Все слои операционной систе­мы, которые лежат выше слоя машинно-зависимых компонентов, могут быть написаны для управления именно этой виртуальной аппаратурой. Таким образом, у разработчиков появляется возможность создавать один вариант машинно-не­зависимой части ОС (включая компоненты ядра, утилиты, системные обраба­тывающие программы) для всего набора поддерживаемых платформ (рис. 3.9).

 

 

 

Микроядерная архитектура

 

Концепция

 

Микроядерная архитектура является альтернативой классическому способу по­строения операционной системы. Под классической архитектурой в данном случае понимается рассмотренная выше структурная организация ОС, в соот­ветствии с которой все основные функции операционной системы, составляю­щие многослойное ядро, выполняются в привилегированном режиме. При этом некоторые вспомогательные функции ОС оформляются в виде приложений и выполняются в пользовательском режиме наряду с обычными пользователь­скими программами (становясь системными утилитами или обрабатывающими программами). Каждое приложение пользовательского режима работает в собст­венном адресном пространстве и защищено тем самым от какого-либо вмеша­тельства других приложений. Код ядра, выполняемый в привилегированном ре­жиме, имеет доступ к областям памяти всех приложений, но сам полностью от них защищен. Приложения обращаются к ядру с запросами на выполнение сис­темных функций.

Суть микроядерной архитектуры состоит в следующем. В привилегированном режиме остается работать только очень небольшая часть ОС, называемая микро­ядром (рис. 3.10). Микроядро защищено от остальных частей ОС и.приложений. В состав микроядра обычно входят машинно-зависимые модули, а также моду­ли, выполняющие базовые (но не все!) функции ядра по управлению процессами, обработке прерываний, управлению виртуальной памятью, пересылке сообщений и управлению устройствами ввода-вывода, связанные с загрузкой или чтением реги­стров устройств. Набор функций микроядра обычно соответствует функциям слоя базовых механизмов обычного ядра. Такие функции операционный системы трудно, если не невозможно, выполнить в пространстве пользователя.

 

 

 

Все остальные более высокоуровневые функции ядра оформляются в виде при­ложений, работающих в пользовательском режиме. Однозначного решения о том, какие из системных функций нужно оставить в привилегированном режиме, а какие перенести в пользовательский, не существует. В общем случае многие ме­неджеры ресурсов, являющиеся неотъемлемыми частями обычного ядра — фай­ловая система, подсистемы управления виртуальной памятью и процессами, менеджер безопасности и т. п., — становятся «периферийными» модулями, рабо­тающими в пользовательском режиме.

Работающие в пользовательском режиме менеджеры ресурсов имеют принципи­альные отличия от традиционных утилит и обрабатывающих программ операци­онной системы, хотя при микроядерной архитектуре все эти программные ком­поненты также оформлены в виде приложений. Утилиты и обрабатывающие программы вызываются в основном пользователями. Ситуации, когда одному приложению требуется выполнение функции (процедуры) другого приложения, возникают крайне редко. Поэтому в операционных системах с классической ар­хитектурой отсутствует механизм, с помощью которого одно приложение могло бы вызвать функции другого.

Совсем другая ситуация возникает, когда в форме приложения оформляется часть операционной системы. По определению, основным назначением такого прило­жения является обслуживание запросов других приложений, например создание

процесса, выделение памяти, проверка прав доступа к ресурсу и т. д. Именно по­этому менеджеры ресурсов, вынесенные в пользовательский режим, называются серверами ОС, то есть модулями, основным назначением которых является об­служивание запросов локальных приложений и других модулей ОС. Очевидно, что для реализации микроядерной архитектуры необходимым условием являет­ся наличие в операционной системе удобного и эффективного способа вызова процедур одного процесса из другого. Поддержка такого механизма и является одной из главных задач микроядра, щ

Схематично механизм обращения к функциям ОС, оформленным в виде серве­ров, выглядит следующим образом (рис. 3.11). Клиент, которым может быть либо прикладная программа, либо другой компонент ОСТ запрашивает выполне­ние некоторой функции у соответствующего сервера, посылая ему сообщение. Непосредственная передача сообщений между приложениями невозможна, так как их адресные пространства изолированы друг от друга. Микроядро, выпол­няющееся в привилегированном режиме, имеет доступ к адресным пространст­вам каждого из этих приложений и поэтому может работать в качестве посред­ника. Микроядро сначала передает сообщение, содержащее имя и параметры вызываемой процедуры нужному серверу, затем сервер выполняет запрошенную операцию, после чего ядро возвращает результаты клиенту с помощью другого сообщения. Таким образом, работа микроядерной операционной системы соот­ветствует известной модели клиент-сервер, в которой роль транспортных средств выполняет микроядро.

 

 

Преимущества и недостатки микроядерной архитектуры

 

Операционные системы, основанные на концепции микроядра, в высокой степе­ни удовлетворяют большинству требований, предъявляемых к современным ОС, обладая переносимостью, расширяемостью, надежностью и создавая хорошие предпосылки для поддержки распределенных приложений. За эти достоинства

приходится платить снижением производительности, и это является основным недостатком микроядерной архитектуры.

Высокая степень переносимости обусловлена тем, что весь машинно-зависимый код изолирован в микроядре, поэтому для переноса системы на новый процессор требуется меньше изменений и все они логически сгруппированы вместе.

Расширяемость присуща микроядерной ОС в очень высокой степени. В тради­ционных системах даже при наличии многослойной структуры нелегко удалить один слой и поменять его на другой по причине множественности и размытости интерфейсов между слоями. Добавление новых функций и изменение сущест­вующих требует хорошего знания операционной системы и больших затрат вре­мени. В то же время ограниченный набор четко определенных интерфейсов микроядра открывает путь к упорядоченному росту и эволюции ОС. Добавление новой подсистемы требует разработки нового приложения, что никак не затраги­вает целостность микроядра. Микроядерная структура позволяет не только до­бавлять, но и сокращать число компонентов операционной системы, что также бывает очень полезно. Например, не всем пользователям нужны средства без­опасности или поддержки распределенных вычислений, а удаление их из тра­диционного ядра чаще всего невозможно. Обычно традиционные операционные системы позволяют динамически добавлять в ядро или удалять из ядра только драйверы внешних устройств — ввиду частых изменений в конфигурации под­ключенных к компьютеру внешних устройств подсистема ввода-вывода ядра до­пускает загрузку и выгрузку драйверов «на ходу», но для этого она разрабатыва­ется особым образом (например, среда STREAMS в UNIX или менеджер ввода-вывода в Windows NT). При микроядерном подходе конфигурируемость ОС не вызывает никаких проблем и не требует особых мер — достаточно изменить файл с настройками начальной конфигурации системы или же остановить не нужные больше серверы в ходе работы обычными для остановки приложений средствами.

Использование микроядерной модели повышает надежность ОС. Каждый сер­вер выполняется в виде отдельного процесса в своей собственной области памя­ти и таким образом защищен от других серверов операционной системы, что не наблюдается в традиционной ОС, где все модули ядра могут влиять друг на дру­га. И если отдельный сервер терпит крах, то он может быть перезапущен без останова или повреждения остальных серверов ОС. Более того, поскольку серве­ры выполняются в пользовательском режиме, они не имеют непосредственного доступа к аппаратуре и не могут модифицировать память, в которой хранится и работает микроядро. Другим потенциальным источником повышения надеж­ности ОС является уменьшенный объем кода микроядра по сравнению с тради­ционным ядром — это снижает вероятность появления ошибок программиро­вания.

Модель с микроядром хорошо подходит для поддержки распределенных вычисле­ний, так как использует механизмы, аналогичные сетевым: взаимодействие кли­ентов и серверов путем обмена сообщениями. Серверы микроядерной ОС могут работать как на одном, так и на разных компьютерах. В этом случае при получе­нии сообщения от приложения микроядро может обработать его самостоятельно и передать локальному серверу или же переслать по сети микроядру, работаю­щему на другом компьютере. Переход к распределенной обработке требует минимальных изменений в работе операционной системы — просто локальный транспорт заменяется на сетевой.

Производительность. При классической организации ОС (рис. 3.12, а) выполне­ние системного вызова сопровождается двумя переключениями режимов, а при микроядерной организации (рис. 3.12, 6) — четырьмя. Таким образом, операци­онная система на основе микроядра при прочих равных условиях всегда будет менее производительной, чем ОС с классическим ядром. Именно по этой причи­не микроядерный подход ие получил такого широкого распространения, которое ему предрекали.

 

           

Серьезность этого недостатка хорошо иллюстрирует история развития Windows NT. В версиях 3.1 и 3.5 диспетчер окон, графическая библиотека и высокоуров­невые драйверы графических устройств входили в состав сервера пользователь­ского режима, и вызов функций этих модулей осуществлялся в соответствии с микроядерной схемой. Однако очень скоро разработчики Windows NT поняли, что такой механизм обращений к часто используемым функциям графического интерфейса существенно замедляет работу приложений и делает данную опера­ционную систему уязвимой в условиях острой конкуренции. В результате в вер­сию Windows NT 4.0 были внесены существенные изменения — все перечислен­ные выше модули были перенесены в ядро, что отдалило эту ОС от идеальной микроядерной архитектуры, но зато резко повысило ее производительность.

Этот пример иллюстрирует главную проблему, с которой сталкиваются разра­ботчики операционной системы, решившие применить микроядерный подход, — что включать в микроядро, а что выносить в пользовательское пространство. В идеальном случае микроядро может состоять только из средств передачи сооб­щений, средств взаимодействия с аппаратурой, в том числе средств доступа к ме­ханизмам привилегированной защиты. Однако многие разработчики не всегда жестко придерживаются принципа минимизации функций ядра, часто жертвуя этим ради повышения производительности. В результате реализации ОС обра­зуют некоторый спектр, на одном краю которого находятся системы с минималь­но возможным микроядром, а на другом — системы, подобные Windows NT, в которых микроядро выполняет достаточно большой объем функций.

 

Совместимость и множественные прикладные среды

 

В то время как многие архитектурные особенности операционных систем непо­средственно касаются только системных программистов, концепция множест­венных прикладных сред непосредственно связана с нуждами конечных пользо­вателей — возможностью операционной системы выполнять приложения, написанные для других операционных систем. Такое свойство операционной системы называется совместимостью.

 

Двоичная совместимость и совместимость исходных текстов

 

Необходимо различать совместимость на двоичном уровне и совместимость на уровне исходных текстов. Приложения обычно хранятся в ОС в виде исполняе­мых файлов, содержащих двоичные образы кодов и данных. Двоичная совмести­мость достигается в том случае, когда можно взять исполняемую программу и запустить ее на выполнение в среде другой ОС.

Совместимость на уровне исходных текстов требует наличия соответствую­щего компилятора в составе программного обеспечения компьютера, на котором предполагается выполнять данное приложение, а также совместимости на уров­не библиотек и системных вызовов. При этом необходима перекомпиляция имеющихся исходных текстов в новый исполняемый модуль.

Совместимость на уровне исходных текстов важна в основном для разработчи­ков приложений, в распоряжении которых эти исходные тексты всегда имеются. Но для конечных пользователей практическое значение имеет только двоичная совместимость, так как только в этом случае они могут использовать один и тот же коммерческий продукт, поставляемый в виде двоичного исполняемого кода, в различных операционных средах и на различных машинах. Для пользователя, ку­пившего в свое время пакет (например, Lotus 1-2-3) для MS-DOS, важно, чтобы он мог запускать этот полюбившийся ему пакет без каких-либо изменений и на своей новой машине, работающей под управлением, например, Windows NT.

Обладает ли новая ОС двоичной совместимостью или совместимостью исход­ных текстов с существующими операционными системами, зависит от многих факторов. Самый главный из них — архитектура процессора, на котором работает новая ОС. Если процессор использует тот же набор команд (возможно, с некото­рыми добавлениями) и тот же диапазон адресов, тогда двоичная совместимость может быть достигнута довольно просто. Для этого достаточно соблюдения сле­дующих условий:

□ вызовы функций API, которые содержит приложение, должны поддерживать­ся данной ОС;

□ внутренняя структура исполняемого файла приложения должна соответство­вать структуре исполняемых файлов данной ОС.

Гораздо сложнее достичь двоичной совместимости операционным системам, предназначенным для выполнения на процессорах, имеющих разные архитек­туры. Помимо соблюдения приведенных выше условий необходимо организо­вать эмуляцию двоичного кода.

Пусть, например, требуется выполнить DOS-программу для IBM PC-совмести­мого компьютера на компьютере Macintosh. Компьютер Macintosh построен на основе процессора Motorola 680x0, а компьютер IBM PC — на основе процессора Intel 80x86. Процессор Motorola имеет архитектуру (систему команд, состав ре­гистров и т. п.), отличную от архитектуры процессора Intel, поэтому ему непо­нятен двоичный код DOS-программы, содержащей инструкции этого процес­сора. Для того чтобы компьютер Macintosh смог интерпретировать машинные инструкции, которые ему изначально непонятны, на нем должно быть установ­лено специальное программное обеспечение — эмулятор.

Эмулятор должен последовательно выбирать каждую двоичную инструкцию процессора Intel, программным способом дешифрировать ее, чтобы определить, какие действия она задает, а затем выполнять эквивалентную подпрограмму, на­писанную в инструкциях процессора Motorola. Так как к тому же у процессора Motorola нет в точности таких же регистров, флагов и внутреннего арифметико-логического устройства, как в Intel, он должен также имитировать (эмулиро­вать) все эти элементы с использованием своих регистров или памяти. Состоя­ние эмулируемых регистров и флагов после выполнения каждой команды должно быть абсолютно таким же, как и в реальном процессоре Intel.

Это простая, но очень медленная работа, так как одна команда процессора Intel исполняется значительно быстрее, чем эмулирующая его последовательность ко­манд процессора Motorola.

 

Трансляция библиотек

 

Выходом в таких случаях является использование так называемых прикладных программных сред. Одной из составляющих, формирующих прикладную про­граммную среду, является набор функций интерфейса прикладного программи­рования API, которые операционная система предоставляет своим приложени­ям. Для сокращения времени на выполнение чужих программ прикладные среды имитируют обращения к библиотечным функциям.

Эффективность этого подхода связана с тем, что большинство сегодняшних про­грамм работают под управлением GUI (графических интерфейсов пользовате­ля) типа Windows, Mac или UNIX Motif, при этом приложения тратят большую часть времени, производя некоторые хорошо предсказуемые действия. Они не­прерывно выполняют вызовы библиотек GUI для манипулирования окнами и для других связанных с GUI действий. Сегодня в типичных программах 60-80 % времени тратится на выполнение функций GUI и других библиотечных вызо­вов ОС. Именно это свойство приложений позволяет прикладным средам ком­пенсировать большие затраты времени, потраченные на покомандное эмулиро­вание программы. Тщательно спроектированная программная прикладная среда имеет в своем составе библиотеки, имитирующие внутренние библиотеки GUI, но написанные на «родном» коде. Таким образом достигается существенное

ускорение выполнения программ с API другой операционной системы. Иногда такой подход называют трансляцией для того, чтобы отличать его от более мед­ленного процесса эмулирования кода по одной команде за раз.

Например, для Windows-программы, работающей на Macintosh, при интерпрета­ции команд процессора Intel 80x86 производительность может быть очень низкой. Но когда производится вызов функции GUI открытия окна, модуль ОС, реали­зующий прикладную среду Windows, может перехватить этот вызов и перена­править его на перекомпилированную для процессора Motorola 680x0 подпро­грамму открытия окна. В результате на таких участках кода скорость работы программы может достичь (а возможно, и превзойти) скорость работы на своем «родном» процессоре.

Чтобы программа, написанная для одной ОС, могла быть выполнена в рамках    другой ОС, недостаточно лишь обеспечить совместимость API. Концепции, положенные в основу разных ОС, могут входить в противоречие друг с другом. На­пример, в одной операционной системе приложению может быть разрешено не­посредственно управлять устройствами ввода-вывода, в другой — эти действия    являются прерогативой ОС. Каждая операционная система имеет свои собствен­ные механизмы защиты ресурсов, свои алгоритмы обработки ошибок и исключи­тельных ситуаций, особую структуру процесса и схему управления памятью, свою семантику доступа к файлам и графический пользовательский интерфейс. Для обеспечения совместимости необходимо организовать бесконфликтное сосуществование в рамках одной ОС нескольких способов управления ресурсами ком­пьютера.

 

Способы реализации прикладных программных сред

 

Создание полноценной прикладной среды, полностью совместимой со средой [ другой операционной системы, является достаточно сложной задачей, тесно связанной со структурой операционной системы. Существуют различные варианты  построения множественных прикладных сред, отличающиеся как особенностями архитектурных решений, так и функциональными возможностями, обеспечивающими различную степень переносимости приложений.

Во многих версиях ОС UNIX транслятор прикладных сред реализуется в виде

обычного приложения. В операционных системах, построенных с использованием микроядерной концепции, таких как, например, Windows NT или Workplace  OS, прикладные среды выполняются в виде серверов пользовательского режима.

 А в OS/2 с ее более простой архитектурой средства организации прикладных

сред встроены глубоко в операционную систему.

Один из наиболее очевидных вариантов реализации множественных приклад­ных сред основывается на стандартной многоуровневой структуре ОС. На рис. 3.13[  операционная система OS1 поддерживает кроме своих «родных приложений    приложения операционных систем OS2 и OS3. Для этого в ее составе имеются специальные приложения — прикладные программные среды, — которые транслируют интерфейсы «чужих» операционных систем API OS2 и API OS3 в ин­терфейс своей «родной» операционной системы — API OS1. Так, например,

в случае, если бы в качестве 0S2 выступала операционная система UNIX, а в ка­честве OS1 — OS/2, для выполнения системного вызова создания процесса fork0 в UNIX-приложении программная среда должна обратиться к ядру операционной системы OS/2 с системным вызовом DosExecPgm().

 

 

К сожалению, поведение почти всех функций, составляющих API одной ОС, как правило, существенно отличается от поведения соответствующих функций дру­гой ОС. Например, чтобы функция создания процесса в OS/2 DosExecPgm() пол­ностью соответствовала функции создания процесса fork О в UNIX-подобных системах, ее нужно было бы изменить, чтобы она поддерживала возможность ко­пирования адресного пространства родительского процесса в пространство про­цесса-потомка. (При нормальном же поведении этой функции память процесса-потомка инициализируется на основе данных нового исполняемого файла.)

В другом варианте реализации множественных прикладных сред операционная система имеет несколько равноправных прикладных программных интерфейсов. В приведенном на рис. 3.14 примере операционная система поддерживает прило­жения, написанные для OS1, OS2 и OS3. Для этого непосредственно в простран­стве ядра системы размещены прикладные программные интерфейсы всех этих ОС: API OS1, API OS2 и API OS3.

В этом варианте функции уровня API обращаются к функциям нижележащего уровня ОС, которые должны поддерживать все три в общем случае несовмести­мые прикладные среды. В разных ОС по-разному осуществляется управление системным временем, используется разный формат времени дня, на основании собственных алгоритмов разделяется процессорное время и т. д. Функции каж­дого API реализуются ядром с учетом специфики соответствующей ОС, даже если они имеют аналогичное назначение. Например, как уже было сказано, функция создания процесса работает по-разному для приложения UNIX и при­ложения OS/2. Аналогично при завершении процесса ядру также необходимо оп­ределять, к какой ОС относится данный процесс. Если этот процесс был создан по запросу UNIX-приложения, то в ходе его завершения ядро должно послать родительскому процессу сигнал, как это делается в ОС UNIX. А по завершении процесса OS/2, созданного с параметром EXEC_SYNC, ядро должно отметить, что идентификатор процесса не может быть повторно использован другим процессом OS/2. Для того чтобы ядро могло выбрать нужный вариант реализации сис­темного вызова, каждый процесс должен передавать в ядро набор идентифици­рующих характеристик.

 

Еще один способ построения множественных прикладных сред основан на мик­роядерном подходе. При этом очень важно отделить базовые, общие для всех прикладных сред, механизмы операционной системы от специфических для каж­дой из прикладных сред высокоуровневых функций, решающих стратегические  задачи.

В соответствии с микроядерной архитектурой все функции ОС реализуются мик­роядром и серверами пользовательского режима. Важно, что каждая прикладная среда оформляется в виде отдельного сервера пользовательского режима и не включает базовых механизмов (рис. 3.15). Приложения, используя API, обра­щаются с системными вызовами к соответствующей прикладной среде через микроядро. Прикладная среда обрабатывает запрос, выполняет его (возможно, обращаясь для этого за помощью к базовым функциям микроядра) и отсылает приложению результат. В ходе выполнения запроса прикладной среде приходит­ся, в свою очередь, обращаться к базовым механизмам ОС, реализуемым микро­ядром и другими серверами ОС.

Такому подходу к конструированию множественных прикладных сред присущи

все достоинства и недостатки микроядерной архитектуры, в частности:

□  очень просто можно добавлять и исключать прикладные среды, что является следствием хорошей расширяемости микроядерных ОС;

□  надежность и стабильность выражаются в том, что при отказе одной из при­кладных сред все остальные сохраняют работоспособность;

□ низкая производительность микроядерных ОС сказывается на скорости рабо­ты прикладных сред, а значит, и на скорости выполнения приложений.

 

                                   

 

Создание в рамках одной операционной системы нескольких прикладных сред для выполнения приложений различных ОС представляет собой путь, который позволяет иметь единственную версию программы и переносить ее между опера­ционными системами. Множественные прикладные среды обеспечивают совмес­тимость на двоичном уровне данной ОС с приложениями, написанными для других ОС. В результате пользователи получают большую свободу выбора опе­рационных систем и более легкий доступ к качественному программному обес­печению.