Рефераты

Сетевые ОС

масштаба кампуса или для сетей масштаба предприятия.

Сети отделов - используются небольшой группой сотрудников, решающих общие

задачи. Главной целью сети отдела является разделение локальных ресурсов,

таких как приложения, данные, лазерные принтеры и модемы. Сети отделов

обычно не разделяются на подсети.

Сети кампусов - соединяют несколько сетей отделов внутри отдельного здания

или внутри одной территории предприятия. Эти сети являются все еще

локальными сетями, хотя и могут покрывать территорию в несколько квадратных

километров. Сервисы такой сети включают взаимодействие между сетями

отделов, доступ к базам данных предприятия, доступ к факс-серверам,

высокоскоростным модемам и высокоскоростным принтерам.

Сети предприятия (корпоративные сети) - объединяют все компьютеры всех

территорий отдельного предприятия. Они могут покрывать город, регион или

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

информации и приложениям, находящимся в других рабочих группах, других

отделах, подразделениях и штаб-квартирах корпорации.

Главной задачей операционной системы, используемой в сети масштаба отдела,

является организация разделения ресурсов, таких как приложения, данные,

лазерные принтеры и, возможно, низкоскоростные модемы. Обычно сети отделов

имеют один или два файловых сервера и не более чем 30 пользователей. Задачи

управления на уровне отдела относительно просты. В задачи администратора

входит добавление новых пользователей, устранение простых отказов,

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

Операционные системы сетей отделов хорошо отработаны и разнообразны, также,

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

Такая сеть обычно использует одну или максимум две сетевые ОС. Чаще всего

это сеть с выделенным сервером NetWare 3.x или Windows NT, или же

одноранговая сеть, например сеть Windows for Workgroups.

Пользователи и администраторы сетей отделов вскоре осознают, что они могут

улучшить эффективность своей работы путем получения доступа к информации

других отделов своего предприятия. Если сотрудник, занимающийся продажами,

может получить доступ к характеристикам конкретного продукта и включить их

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

большее влияние на покупателей. Если отдел маркетинга может получить доступ

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

отделом, то он может быстро подготовить маркетинговые материалы сразу же

после окончания разработки.

Итак, следующим шагом в эволюции сетей является объединение локальных сетей

нескольких отделов в единую сеть здания или группы зданий. Такие сети

называют сетями кампусов. Сети кампусов могут простираться на несколько

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

Операционная система, работающая в сети кампуса, должна обеспечивать для

сотрудников одних отделов доступ к некоторым файлам и ресурсам сетей других

отделов. Услуги, предоставляемые ОС сетей кампусов, не ограничиваются

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

серверам других типов, например, к факс-серверам и к серверам

высокоскоростных модемов. Важным сервисом, предоставляемым операционными

системами данного класса, является доступ к корпоративным базам данных,

независимо от того, располагаются ли они на серверах баз данных или на

миникомпьютерах.

Именно на уровне сети кампуса начинаются проблемы интеграции. В общем

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

и сетевых операционных систем. Например, инженерный отдел может

использовать операционную систему UNIX и сетевое оборудование Ethernet,

отдел продаж может использовать операционные среды DOS/Novell и

оборудование Token Ring. Очень часто сеть кампуса соединяет разнородные

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

компьютеры.

Корпоративная сеть соединяет сети всех подразделений предприятия, в общем

случае находящихся на значительных расстояниях. Корпоративные сети

используют глобальные связи (WAN links) для соединения локальных сетей или

отдельных компьютеров.

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

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

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

миникомпьютеров и к глобальным связям. Когда ОС разрабатывается для

локальной сети или рабочей группы, то ее главной обязанностью является

разделение файлов и других сетевых ресурсов (обычно принтеров) между

локально подключенными пользователями. Такой подход не применим для уровня

предприятия. Наряду с базовыми сервисами, связанными с разделением файлов и

принтеров, сетевая ОС, которая разрабатывается для корпораций, должна

поддерживать более широкий набор сервисов, в который обычно входят почтовая

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

факс-сервис, обработка голосовых сообщений, организация видеоконференций и

др.

Кроме того, многие существующие методы и подходы к решению традиционных

задач сетей меньших масштабов для корпоративной сети оказались

непригодными. На первый план вышли такие задачи и проблемы, которые в сетях

рабочих групп, отделов и даже кампусов либо имели второстепенное значение,

либо вообще не проявлялись. Например, простейшая для небольшой сети задача

ведения учетной информации о пользователях выросла в сложную проблему для

сети масштаба предприятия. А использование глобальных связей требует от

корпоративных ОС поддержки протоколов, хорошо работающих на низкоскоростных

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

(например, тех, которые активно используют широковещательные сообщения).

Особое значение приобрели задачи преодоления гетерогенности - в сети

появились многочисленные шлюзы, обеспечивающие согласованную работу

различных ОС и сетевых системных приложений.

К признакам корпоративных ОС могут быть отнесены также следующие

особенности.

Поддержка приложений. В корпоративных сетях выполняются сложные приложения,

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

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

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

- запросов к файловому сервису, а на клиентских машинах - часть,

реализующая логику обработки данных приложения и организующая интерфейс с

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

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

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

сложные в вычислительном отношении части перенести на специально

предназначенный для этого мощный компьютер - сервер приложений.

Сервер приложений должен базироваться на мощной аппаратной платформе

(мультипроцессорные системы, часто на базе RISC-процессоров,

специализированные кластерные архитектуры). ОС сервера приложений должна

обеспечивать высокую производительность вычислений, а значит поддерживать

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

виртуальную память и наиболее популярные прикладные среды (UNIX, Windows,

MS-DOS, OS/2). В этом отношении сетевую ОС NetWare трудно отнести к

корпоративным продуктам, так как в ней отсутствуют почти все требования,

предъявляемые к серверу приложений. В то же время хорошая поддержка

универсальных приложений в Windows NT собственно и позволяет ей

претендовать на место в мире корпоративных продуктов.

Справочная служба. Корпоративная ОС должна обладать способностью хранить

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

обеспечивалось управление ею из одной центральной точки. Подобно большой

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

можно более полной справочной информации о самой себе (начиная с данных о

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

системе). Естественно организовать эту информацию в виде базы данных.

Данные из этой базы могут быть востребованы многими сетевыми системными

приложениями, в первую очередь системами управления и администрирования.

Кроме этого, такая база полезна при организации электронной почты, систем

коллективной работы, службы безопасности, службы инвентаризации

программного и аппаратного обеспечения сети, да и для практически любого

крупного бизнес-приложения.

База данных, хранящая справочную информацию, предоставляет все то же

многообразие возможностей и порождает все то же множество проблем, что и

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

операции поиска, сортировки, модификации и т.п., что очень сильно облегчает

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

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

синхронизации.

В идеале сетевая справочная информация должна быть реализована в виде

единой базы данных, а не представлять собой набор баз данных,

специализирующихся на хранении информации того или иного вида, как это

часто бывает в реальных операционных системах. Например, в Windows NT

имеется по крайней мере пять различных типов справочных баз данных. Главный

справочник домена (NT Domain Directory Service) хранит информацию о

пользователях, которая используется при организации их логического входа в

сеть. Данные о тех же пользователях могут содержаться и в другом

справочнике, используемом электронной почтой Microsoft Mail. Еще три базы

данных поддерживают разрешение низкоуровневых адресов: WINS - устанавливает

соответствие Netbios-имен IP-адресам, справочник DNS - сервер имен домена -

оказывается полезным при подключении NT-сети к Internet, и наконец,

справочник протокола DHCP используется для автоматического назначения IP-

адресов компьютерам сети. Ближе к идеалу находятся справочные службы,

поставляемые фирмой Banyan (продукт Streettalk III) и фирмой Novell

(NetWare Directory Services), предлагающие единый справочник для всех

сетевых приложений. Наличие единой справочной службы для сетевой

операционной системы - один из важнейших признаков ее корпоративности.

Безопасность. Особую важность для ОС корпоративной сети приобретают вопросы

безопасности данных. С одной стороны, в крупномасштабной сети объективно

существует больше возможностей для несанкционированного доступа - из-за

децентрализации данных и большой распределенности "законных" точек доступа,

из-за большого числа пользователей, благонадежность которых трудно

установить, а также из-за большого числа возможных точек

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

бизнес-приложения работают с данными, которые имеют жизненно важное

значение для успешной работы корпорации в целом. И для защиты таких данных

в корпоративных сетях наряду с различными аппаратными средствами

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

системой: избирательные или мандатные права доступа, сложные процедуры

аутентификации пользователей, программная шифрация.

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

1 Понятие "нить"

В традиционных ОС понятие нити тождественно понятию процесса. В

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

единое адресное пространство, но выполняющихся квазипараллельно.

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

операции с диском. Если сервер имеет несколько нитей управления, вторая

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

Это повышает пропускную способность и производительность. Эта цель не

достигается путем создания двух независимых серверных процессов, потому что

они должны разделять общий буфер кэша, который требуется им, чтобы быть в

одном адресном пространстве.

На рисунке 3.9,а показана машина с тремя процессами. Каждый процесс имеет

собственный программный счетчик, собственный стек, собственный набор

регистров и собственное адресное пространство. Каждый процесс не должен

ничего делать с остальными, за исключением того, что они могут

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

семафоры, мониторы, сообщения. На рисунке 3.9,б показана другая машина с

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

обычно называемых просто нитями или иногда облегченными процессами. Во

многих отношениях нити подобны мини-процессам. Каждая нить выполняется

строго последовательно и имеет свой собственный программный счетчик и стек.

Нити разделяют процессор так, как это делают процессы (разделение времени).

Только на многопроцессорной системе они действительно выполняются

параллельно. Нити могут, например, порождать нити-потомки, могут переходить

в состояние ожидания до завершения системного вызова, как обычные процессы,

пока одна нить заблокирована, другая нить того же процесса может

выполняться.

[pic]

Рис. 3.9. а) Три процесса с одной нитью каждый

б) Один процесс с тремя нитями

Нити делают возможным сохранение идеи последовательных процессов, которые

выполняют блокирующие системные вызовы (например, RPC для обращения к

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

Блокирующие системные вызовы делают проще программирование, а параллелизм

повышает производительность.

2 Различные способы организации вычислительного процесса с использованием

нитей

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

рисунке 3.10,а. Здесь нить-диспетчер читает приходящие запросы на работу из

почтового ящика системы. После проверки запроса диспетчер выбирает

простаивающую (то есть блокированную) рабочую нить, передает ей запрос и

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

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

запрос с данными разделяемого блока кэша, к которому имеют отношение все

нити. Если нет, она посылает сообщение к диску, чтобы получить нужный блок

(предположим, это READ), и переходит в состояние блокировки, ожидая

завершения дисковой операции. В этот момент происходит обращение к

планировщику, в результате работы которого активизируется другая нить,

возможно, нить-диспетчер или некоторая рабочая нить, готовая к выполнению.

Структура с диспетчером не единственный путь организации многонитевой

обработки. В модели "команда" все нити эквивалентны, каждая получает и

обрабатывает свои собственные запросы. Иногда работы приходят, а нужная

нить занята, особенно, если каждая нить специализируется на выполнении

особого вида работ. В этом случае может создаваться очередь незавершенных

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

работ, а затем почтовый ящик.

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

нить порождает некоторые данные и передает их для обработки следующей нити

и т.д. Хотя эта организация и не подходит для файл-сервера, для других

задач, например, задач типа "производитель-потребитель", это хорошее

решение.

Нити часто полезны и для клиентов. Например, если клиент хочет

растиражировать файл на много серверов, он может создать по одной нити для

копирования на каждом сервере. Другое использование нитей клиентами - это

управление сигналами, такими как прерывание с клавиатуры (del или break).

Вместо обработки сигнала прерывания одна нить назначается для постоянного

ожидания поступления сигналов. Таким образом, использование нитей может

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

[pic]

Рис. 3.10. Три способа организации нитей в процессе:

а - модель диспетчер/рабочие нити; б - модель "команда"; в - модель

конвейера

Другой аргумент в пользу нитей не имеет отношения ни к удаленным вызовам,

ни к коммуникациям. Некоторые прикладные задачи легче программировать,

используя параллелизм, например задачи типа "производитель-потребитель". Не

столь важно параллельное выполнение, сколь важна ясность программы. А

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

процессами.

Наконец, в многопроцессорных системах нити из одного адресного пространства

могут выполняться параллельно на разных процессорах. С другой стороны,

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

работать одинаково хорошо на однопроцессорной машине в режиме разделения

времени между нитями и на настоящем мультипроцессоре.

3 Вопросы реализации нитей

Существует два подхода к управлению нитями: статический и динамический. При

статическом подходе вопрос, сколько будет нитей, решается уже на стадии

написания программы или на стадии компиляции. Каждой нити назначается

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

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

по ходу выполнения. Системный вызов для создания нити обычно содержится в

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

стека, а также других параметров, например, диспетчерского приоритета.

Вызов обычно возвращает идентификатор нити, который можно использовать в

последующих вызовах, связанных с этой нитью. В этой модели процесс

начинается с одной нити, но может создавать их еще, когда необходимо.

Завершаться нити могут одним из двух способов: по своей инициативе, когда

завершается работа, и извне. Во многих случаях, например, при конвейерной

модели, нити создаются сразу же после старта процесса и никогда не

уничтожаются.

Поскольку нити разделяют общую память, они могут (и, как правило, делают

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

множеством нитей, таких, например, как буфер в системе "производитель-

потребитель". Доступ к разделяемым данным обычно программируется с

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

нитей обратиться к одним и тем же данным в одно и то же время. Критическая

секция наиболее легко реализуется с использованием семафоров, мониторов и

аналогичных конструкций.

Нити могут быть реализованы как в пользовательском пространстве, так и в

пространстве ядра. В первом случае нити работают на базе прикладной

системы, управляющей всеми операциями с нитями. Первым преимуществом такого

способа является то, что можно реализовать нити в операционной системе,

которая их не поддерживает. ОС прикладная среда, управляющая нитями,

кажется одним процессом. Все вызовы (ПРИОСТАНОВИТЬ, ПРОВЕРИТЬ СЕМАФОР и т.

д.) обрабатываются как вызовы функций этой прикладной среды. Она сохраняет

регистры и переключает указатели счетчика команд и стека. В этом случае

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

еще одно преимущество - для каждого процесса можно организовать свою схему

планирования. Однако этот подход связан с некоторыми проблемами, одна из

которых состоит в следующем. При выполнении блокирующих системных вызовов

приостанавливается весь набор нитей, принадлежащих этому процессу. Чтобы

избежать этого, можно сделать все системные вызовы неблокирующими, но это

требует изменений в ОС, что нежелательно, так как одной из целей реализации

нитей в пользовательском пространстве является их работа в существующих

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

Такой проблемы не существует при реализации нитей в пространстве ядра.

Преимущество заключается также и в том, что ядро может при диспетчеризации

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

аналогичен первому случаю, временные затраты на переключение нитей выше,

так как тратится время на переключение из режима пользователя в режим ядра.

4 Нити и RPC

Обычно в распределенных системах используются как RPC, так и нити. Так как

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

естественно, что исследователи обратили особое внимание в этом контексте на

RPC: нельзя ли их также сделать облегченными. Было замечено, что в

распределенных системах значительное количество RPC обрабатывается на той

же машине, на которой они были вызваны (локально), например, вызовы к

менеджеру окон. Поэтому была предложена новая схема, которая делает

возможным для нити одного процесса вызвать нить другого процесса на этой же

машине более эффективно, чем обычным способом.

Идея заключается в следующем. Когда стартует серверная нить S, то она

экспортирует свой интерфейс, сообщая о нем ядру. Интерфейс определяет,

какие процедуры могут быть вызваны, каковы их параметры и т.п. Когда

стартует клиентская нить C, то она импортирует интерфейс из ядра в том

случае, если собирается вызвать S, и ей дается специальный идентификатор

для выполнения определенного вызова. Ядро теперь знает, что C собирается

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

вызову.

Одна из этих структур данных является стеком аргументов, который

разделяется нитями C и S и отображается в оба адресных пространства для

чтения и записи. Для вызова сервера нить C помещает аргументы в разделяемый

стек, используя обычную процедуру передачи параметров, а затем прерывает

ядро, помещая данный ей идентификатор в регистр. По этому идентификатору

ядро видит, что вызов является локальным. (Если бы он был удаленным, то

ядро обработало бы его обычным способом для удаленных вызовов.) Затем ядро

выполняет переключение из адресного пространства клиента в адресное

пространство нити-сервера и запускает в рамках клиентской нити требуемую

процедуру сервера. При таком способе вызова аргументы уже загружены в

нужное место, так что копирование или перегруппировка аргументов не

требуется. Главный результат - локальный вызов RPC - будет выполнен этим

способом гораздо быстрее.

Другой прием широко используется для ускорения удаленных RPC. Идея основана

на следующем наблюдении: когда нить-сервер блокируется, ожидая нового

запроса, ее контекст почти всегда не содержит важной информации.

Следовательно, когда нить завершает обработку запроса, то ее просто

удаляют. При поступлении на сервер нового сообщения ядро создает новую нить

для обслуживания этого запроса. Кроме того ядро помещает сообщение в

адресное пространство сервера и устанавливает новый стек нити для доступа к

сообщению. Эту схему иногда называют неявным вызовом.

Этот метод имеет несколько преимуществ по сравнению с обычным RPC. Во-

первых, нити не должны блокироваться, ожидая новую работу, следовательно

контекст не нужно сохранять, во-вторых, создание новой нити проще, чем

активизация существующей приостановленной, так как не нужно восстанавливать

контекст.

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

1 Требования, предъявляемые к ОС 90-х годов

Операционная система является сердцевиной сетевого программного

обеспечения, она создает среду для выполнения приложений и во многом

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

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

удовлетворять современная ОС.

Очевидно, что главным требованием, предъявляемым к операционной системе,

является способность выполнения основных функций: эффективного управления

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

программ. Современная ОС, как правило, должна реализовывать

мультипрограммную обработку, виртуальную память, свопинг, поддерживать

многооконный интерфейс, а также выполнять многие другие, совершенно

необходимые функции. Кроме этих функциональных требований к операционным

системам предъявляются не менее важные рыночные требования. К этим

требованиям относятся:

Расширяемость. Код должен быть написан таким образом, чтобы можно было

легко внести дополнения и изменения, если это потребуется, и не нарушить

целостность системы.

Переносимость. Код должен легко переноситься с процессора одного типа на

процессор другого типа и с аппаратной платформы (которая включает наряду с

типом процессора и способ организации всей аппаратуры компьютера) одного

типа на аппаратную платформу другого типа.

Надежность и отказоустойчивость. Система должна быть защищена как от

внутренних, так и от внешних ошибок, сбоев и отказов. Ее действия должны

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

наносить вред ОС.

Совместимость. ОС должна иметь средства для выполнения прикладных программ,

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

интерфейс должен быть совместим с существующими системами и стандартами.

Безопасность. ОС должна обладать средствами защиты ресурсов одних

пользователей от других.

Производительность. Система должна обладать настолько хорошим

быстродействием и временем реакции, насколько это позволяет аппаратная

платформа.

Рассмотрим более подробно некоторые из этих требований.

1 Расширяемость

В то время, как аппаратная часть компьютера устаревает за несколько лет,

полезная жизнь операционных систем может измеряться десятилетиями. Примером

может служить ОС UNIX. Поэтому операционные системы всегда эволюционно

изменяются со временем, и эти изменения более значимы, чем изменения

аппаратных средств. Изменения ОС обычно представляют собой приобретение ею

новых свойств. Например, поддержка новых устройств, таких как CD-ROM,

возможность связи с сетями нового типа, поддержка многообещающих

технологий, таких как графический интерфейс пользователя или объектно-

ориентированное программное окружение, использование более чем одного

процессора. Сохранение целостности кода, какие бы изменения не вносились в

операционную систему, является главной целью разработки.

Расширяемость может достигаться за счет модульной структуры ОС, при которой

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

через функциональный интерфейс. Новые компоненты могут быть добавлены в

операционную систему модульным путем, они выполняют свою работу, используя

интерфейсы, поддерживаемые существующими компонентами.

Использование объектов для представления системных ресурсов также улучшает

расширяемость системы. Объекты - это абстрактные типы данных, над которыми

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

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

системными ресурсами. Добавление новых объектов не разрушает существующие

объекты и не требует изменений существующего кода.

Прекрасные возможности для расширения предоставляет подход к

структурированию ОС по типу клиент-сервер с использованием микроядерной

технологии. В соответствии с этим подходом ОС строится как совокупность

привилегированной управляющей программы и набора непривилегированных услуг-

серверов. Основная часть ОС может оставаться неизменной в то время, как

могут быть добавлены новые серверы или улучшены старые.

Средства вызова удаленных процедур (RPC) также дают возможность расширить

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

добавлены в любую машину сети и немедленно поступить в распоряжение

прикладных программ на других машинах сети.

Некоторые ОС для улучшения расширяемости поддерживают загружаемые драйверы,

которые могут быть добавлены в систему во время ее работы. Новые файловые

системы, устройства и сети могут поддерживаться путем написания драйвера

устройства, драйвера файловой системы или транспортного драйвера и загрузки

его в систему.

2 Переносимость

Требование переносимости кода тесно связано с расширяемостью. Расширяемость

позволяет улучшать операционную систему, в то время как переносимость дает

возможность перемещать всю систему на машину, базирующуюся на другом

процессоре или аппаратной платформе, делая при этом по возможности

небольшие изменения в коде. Хотя ОС часто описываются либо как переносимые,

либо как непереносимые, переносимость - это не бинарное состояние. Вопрос

не в том, может ли быть система перенесена, а в том, насколько легко можно

это сделать. Написание переносимой ОС аналогично написанию любого

переносимого кода - нужно следовать некоторым правилам.

Во-первых, большая часть кода должна быть написана на языке, который

имеется на всех машинах, куда вы хотите переносить систему. Обычно это

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

предпочтительно стандартизованном, например, на языке С. Программа,

написанная на ассемблере, не является переносимой, если только вы не

собираетесь переносить ее на машину, обладающую командной совместимостью с

вашей.

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

быть перенесена. Различная аппаратура требует различных решений при

создании ОС. Например, ОС, построенная на 32-битовых адресах, не может быть

перенесена на машину с 16-битовыми адресами (разве что с огромными

трудностями).

В-третьих, важно минимизировать или, если возможно, исключить те части

кода, которые непосредственно взаимодействуют с аппаратными средствами.

Зависимость от аппаратуры может иметь много форм. Некоторые очевидные формы

зависимости включают прямое манипулирование регистрами и другими

аппаратными средствами.

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

то он должен быть изолирован в нескольких хорошо локализуемых модулях.

Аппаратно-зависимый код не должен быть распределен по всей системе.

Например, можно спрятать аппаратно-зависимую структуру в программно-

задаваемые данные абстрактного типа. Другие модули системы будут работать с

этими данными, а не с аппаратурой, используя набор некоторых функций. Когда

ОС переносится, то изменяются только эти данные и функции, которые ими

манипулируют.

Для легкого переноса ОС при ее разработке должны быть соблюдены следующие

требования:

Переносимый язык высокого уровня. Большинство переносимых ОС написано на

языке С (стандарт ANSI X3.159-1989). Разработчики выбирают С потому, что он

стандартизован, и потому, что С-компиляторы широко доступны. Ассемблер

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

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

частей, которые требуют максимальной скорости (например, целочисленная

арифметика повышенной точности). Однако непереносимый код должен быть

тщательно изолирован внутри тех компонентов, где он используется.

Изоляция процессора. Некоторые низкоуровневые части ОС должны иметь доступ

к процессорно-зависимым структурам данных и регистрам. Однако код, который

делает это, должен содержаться в небольших модулях, которые могут быть

заменены аналогичными модулями для других процессоров.

Изоляция платформы. Зависимость от платформы заключается в различиях между

рабочими станциями разных производителей, построенными на одном и том же

процессоре (например, MIPS R4000). Должен быть введен программный уровень,

абстрагирующий аппаратуру (кэши, контроллеры прерываний ввода-вывода и т.

п.) вместе со слоем низкоуровневых программ таким образом, чтобы

высокоуровневый код не нуждался в изменении при переносе с одной платформы

на другую.

3 Совместимость

Одним из аспектов совместимости является способность ОС выполнять

программы, написанные для других ОС или для более ранних версий данной

операционной системы, а также для другой аппаратной платформы.

Необходимо разделять вопросы двоичной совместимости и совместимости на

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

том случае, когда можно взять исполняемую программу и запустить ее на

выполнение на другой ОС. Для этого необходимы: совместимость на уровне

команд процессора, совместимость на уровне системных вызовов и даже на

уровне библиотечных вызовов, если они являются динамически связываемыми.

Совместимость на уровне исходных текстов требует наличия соответствующего

компилятора в составе программного обеспечения, а также совместимости на

уровне библиотек и системных вызовов. При этом необходима перекомпиляция

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

Совместимость на уровне исходных текстов важна в основном для разработчиков

приложений, в распоряжении которых эти исходные тексты всегда имеются. Но

для конечных пользователей практическое значение имеет только двоичная

совместимость, так как только в этом случае они могут использовать один и

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

кода, в различных операционных средах и на различных машинах.

Обладает ли новая ОС двоичной совместимостью или совместимостью исходных

текстов с существующими системами, зависит от многих факторов. Самый

главный из них - архитектура процессора, на котором работает новая ОС. Если

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

(возможно с некоторыми добавлениями) и тот же диапазон адресов, тогда

двоичная совместимость может быть достигнута достаточно просто.

Гораздо сложнее достичь двоичной совместимости между процессорами,

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

программы другого (например, DOS-программу на Mac), этот компьютер должен

работать с машинными командами, которые ему изначально непонятны. Например,

процессор типа 680x0 на Mac должен исполнять двоичный код, предназначенный

для процессора 80x86 в PC. Процессор 80x86 имеет свои собственные

дешифратор команд, регистры и внутреннюю архитектуру. Процессор 680x0 не

понимает двоичный код 80x86, поэтому он должен выбрать каждую команду,

декодировать ее, чтобы определить, для чего она предназначена, а затем

выполнить эквивалентную подпрограмму, написанную для 680x0. Так как к тому

же у 680x0 нет в точности таких же регистров, флагов и внутреннего

арифметико-логического устройства, как в 80x86, он должен имитировать все

эти элементы с использованием своих регистров или памяти. И он должен

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

написанных подпрограмм для 680x0, гарантирующих, что состояние эмулируемых

регистров и флагов после выполнения каждой команды будет в точности таким

же, как и на реальном 80x86.

Это простая, но очень медленная работа, так как микрокод внутри процессора

80x86 исполняется на значительно более быстродействующем уровне, чем

эмулирующие его внешние команды 680x0. За время выполнения одной команды

80x86 на 680x0, реальный 80x86 может выполнить десятки команд.

Следовательно, если процессор, производящий эмуляцию, не настолько быстр,

чтобы компенсировать все потери при эмуляции, то программы, исполняющиеся

под эмуляцией, будут очень медленными.

Выходом в таких случаях является использование так называемых прикладных

сред. Учитывая, что основную часть программы, как правило, составляют

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

функции целиком, используя заранее написанную библиотеку функций

аналогичного назначения, а остальные команды эмулирует каждую по

отдельности.

Соответствие стандартам POSIX также является средством обеспечения

совместимости программных и пользовательских интерфейсов. Во второй

половине 80-х правительственные агентства США начали разрабатывать POSIX

как стандарты на поставляемое оборудование при заключении правительственных

контрактов в компьютерной области. POSIX - это "интерфейс переносимой ОС,

базирующейся на UNIX". POSIX - собрание международных стандартов

интерфейсов ОС в стиле UNIX. Использование стандарта POSIX (IEEE стандарт

1003.1 - 1988) позволяет создавать программы стиле UNIX, которые могут

легко переноситься из одной системы в другую.

4 Безопасность

В дополнение к стандарту POSIX правительство США также определило

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

правительством. Многие из этих требований являются желаемыми свойствами для

любой многопользовательской системы. Правила безопасности определяют такие

свойства, как защита ресурсов одного пользователя от других и установление

квот по ресурсам для предотвращения захвата одним пользователем всех

системных ресурсов ( таких как память).

Обеспечение защиты информации от несанкционированного доступа является

Страницы: 1, 2, 3, 4, 5


© 2010 БИБЛИОТЕКА РЕФЕРАТЫ