Подкачка страниц памяти
Windows 95, как и Windows NT, использует виртуальную память с подкачкой страниц по запросам. Эта система базируется на линейной модели адресного пространства с применением 32-разрядной адресации.
Каждому процессу выделяется свое виртуальное адресное пространство размером 4 Гб. Верхнее (2 Гб) - резервируются системой. Нижнее (2 Гб) - отдаются программе. При этом все виртуальное АП (ВАП) разбивается на равные блоки или страницы.
Подкачка страниц по запросу (demand paging) перемещает пространство из физической памяти в страничные файлы на диске. Если процессу необходима какая-либо информация, то она перекачивается обратно в физическую память.
Блок подкачки памяти проецирует виртуальные адреса с адресного пространства процесса на физические страницы памяти компьютера. При этом физическая организация памяти скрыта от потоков процесса. Поэтому виртуальная память процесса представляется потоку куда проще, чем реальная организация физической памяти.
Для поддержки 16-разрядных программ Win 3.1 и MS DOS в архитектуре процессора intell
используется механизм разбиения памяти на сегменты. Адрес ячейки памяти складывается из 16 - битного сегмента и 16-- битного смещения внутри сегмента. Поскольку размер сегмента всего 64 кб, и приложения, и ОС должны тратить слишком много времени на вычисление физического адреса информации.
IBM 386 поддерживает линейную модель памяти для 32 - разрядных ОС и Win - 32 приложений. Модель линейной адресации упрощает разработку программ и устраняет недостатки, присущие архитектуре сегментированной памяти.
Виртуальная память - термин, указывающий на то, что ОС способна выделить, куда большие объемы, чем на самом деле имеется у компьютера.
Рис. 7.1. Структура памяти Windows 95
Каждому процессу представляется уникальное адресное пространство - набор адресов, доступных потокам данных процесса. Его размер 4гб. Из них 2Гб - резерв для самой системы. Размещение системных компонент представлено на рис. 7.1.
ПОДСИСТЕМА УПРАВЛЕНИЯ ДАННЫМИ
Система управления данными играет центральную роль в ОС, поскольку она должна управлять и хранить информацию и программы, принадлежащие как пользователям, так и самой системе. Причем, с концептуальной точки зрения, целесообразно не различать хранимую информацию и периферийные устройства как источники или получатели информации во время выполнения программы, что тесно связывает систему управления данными (СУД) с системой управления вводом/выводом (СУВВ) в единое целое. Здесь имеется в виду обеспечение возможности взаимодействовать с устройствами ввода/вывода как с файлами.
Основными понятиями СУД являются файл, том и каталог. Причем существует логический и физический аспект этих понятий.
Логический файл - это организованная совокупность однородных элементов информации или однотипных записей для хранения информации в ИВС, которой присвоено имя.
Физический файл - это область внешней памяти, хранящей информацию, и дескриптор файла, используемый для доступа к файлу и хранящий данные о физическом размещении и характеристиках файла.
Файл состоит из записей или последовательности байт. Запись содержит информацию о свойствах одного объекта, значение которого определяется в виде полей (атрибутов). Одно или несколько полей записи, однозначно идентифицирующих запись файла, образуют ключ записи.
Сменяемое устройство внешней памяти, используемое для хранения информации, называется томом памяти. Чтобы получить доступ к информации, нужно установить том на соответствующее периферийное устройство, связать его с СУД, указать ОС метку - имя тома.
Сменные тома позволяют:
-
расширить объемы хранения информации в ВС;
- производить обмен файлами между разными ЭВМ (на уровне носителей).
Примерами томов являются: МЛ - тома с последовательным доступом и МД, дискеты - тома с прямым доступом.
Сменный том в целях безопасности и удобства должен:
- содержать всю информацию, позволяющую идентифицировать и физически локализовать файлы, содержащиеся в нем;
- удовлетворять требованиям установки на любом совместимом стандартном устройстве.
В соответствии с этим тома прямого доступа (ТПД) имеют:
- специальную запись - метку тома (не обязательно иметь);
- оглавление или каталог файлов тома, хранящий дескрипторы файлов, который сам является файлом;
- собственно файлы тома.
Логическим или виртуальным томом памяти (ВТП) называется область внешней памяти (раздел) на физическом томе, организованный аналогично тому прямого доступа, то есть имеющий свою метку и совокупность хранящихся файлов. Появление ВТП обусловлено появлением накопителей на магнитном диске (НМД) большой емкости, многопользовательских режимов и концепции виртуальных машин.
Большая емкость ТПД, размещение на них файлов многих пользователей создали в СУД следующие трудности:
- конфликты одноименных файлов разных пользователей;
- замедление работы ОС из-за поиска требуемого файла в оглавлении;
- доступность чужих файлов, то есть их незащищенность от других пользователей.
Это привело к появлению на ТПД иерархических, многоуровневых каталогов (справочников) файлов, где корневой, главный каталог - это оглавление тома, а подчиненные или каталоги нижнего уровня - это справочники группы файлов, объединенных по какому-либо признаку. Можно сказать, что каталог является виртуальным оглавлением раздела ТПД внешней памяти.
Итак, файл, том и каталоги - это логические объекты, обрабатываемые пользователем и программами ВС, и одновременно физические объекты, каждый из которых занимает некоторое пространство ТПД. В соответствии с этим СУД подразделяется на два уровня представления информации.
1. Система управления файлами (СУФ), которая обеспечивает удобное логическое представление и средства работы с файлами.
2. Система управления внешней памятью, которая обеспечивает эффективное размещение, физическое представление и надежное хранение данных на томах внешней памяти.
Понятие и эволюция операционных систем
Операционная система -
неотъемлемая часть каждой современной ЭВМ и предназначена для организации и управления работой ЭВМ, в том числе:
1.
Операционная система (ОС) предназначена для обеспечения удобства управления компьютером и сокрытия от пользователей и прикладных программ множества ненужных им деталей его функционирования. Например, для организации чтения блока данных с гибкого диска программист должен использовать 16 различных команд, каждая из которых требует 13 параметров, таких, как номер блока на диске, номер сектора на дорожке и т. п.
2. Операционная система -
это интерфейс между аппаратной частью и прикладными программами, с одной стороны, и пользователем ЭВМ - с другой. Это наиболее важная функция любого компьютера. (В настоящее время c помощью специальных компонентов ОС (драйверов) осуществляется управление и доступ к элементам аппаратного обеспечения компьютера). С помощью процедур ОС, обеспечивающих графический (или командный) интерфейс, выполняется взаимодействие с пользователем операционной системы и прикладных программ.
ОС предоставляет пользователю некоторую расширенную или виртуальную машину, которую легче программировать и с которой легче работать, чем непосредственно с аппаратурой, составляющей реальную машину.
Основные функции управления:
- управление ресурсами ЭВМ (администрирование ресурсов) такими как процессоры (если их больше 1), оперативная память (ОП), устройства ввода вывода;
- обеспечение вычислительных системных услуг прикладным программам (Application program interface - АРI);
- организация эффективного вычислительного процесса на ЭВМ в различных типах ОС (системы разделения времени, системы реального времени, системы пакетной обработки).
Понятие многонитевости
Многозадачность является важнейшим свойством ОС. Для поддержки этого свойства ОС определяет и оформляет для себя те внутренние единицы работы, между которыми и будет разделяться процессор и другие ресурсы компьютера. Эти внутренние единицы работы в разных ОС носят разные названия - задача, задание, процесс, нить. В некоторых случаях сущности, обозначаемые этими понятиями, принципиально отличаются друг от друга.
Говоря о процессах, мы отмечали, что операционная система поддерживает их обособленность: у каждого процесса имеется свое виртуальное адресное пространство, каждому процессу назначаются свои ресурсы - файлы, окна, семафоры и т.д. Такая обособленность нужна для того, чтобы защитить один процесс от другого, поскольку они, совместно используя все ресурсы машины, конкурируют с друг другом. В общем случае процессы принадлежат разным пользователям, разделяющим один компьютер, и ОС берет на себя роль арбитра в спорах процессов за ресурсы.
При мультипрограммировании повышается пропускная способность системы, но отдельный процесс никогда не может быть выполнен быстрее, чем если бы он выполнялся в однопрограммном режиме (всякое разделение ресурсов замедляет работу одного из участников за счет дополнительных затрат времени на ожидание освобождения ресурса). Однако задача, решаемая в рамках одного процесса, может обладать внутренним параллелизмом, который, в принципе, позволяет ускорить ее решение. Например, в ходе выполнения задачи происходит обращение к внешнему устройству, и на время этой операции можно не блокировать полностью выполнение процесса, а продолжить вычисления по другой "ветви" процесса.
Для этих целей современные ОС предлагают использовать сравнительно новый механизм многонитевой обработки (multithreading). При этом вводится новое понятие - "нить" (thread), а понятие "процесс" в значительной степени меняет смысл.
Мультипрограммирование теперь реализуется на уровне нитей, и задача, оформленная в виде нескольких нитей в рамках одного процесса, может быть выполнена быстрее за счет псевдопараллельного (или параллельного в мультипроцессорной системе) выполнения ее отдельных частей.
Например, если электронная таблица была разработана с учетом возможностей многонитевой обработки, то пользователь может запросить пересчет своего рабочего листа и одновременно продолжать заполнять таблицу. Особенно эффективно можно использовать многонитевость для выполнения распределенных приложений, например, многонитевый сервер может параллельно выполнять запросы сразу нескольких клиентов.
Нити, относящиеся к одному процессу, не настолько изолированы друг от друга, как процессы в традиционной многозадачной системе, между ними легко организовать тесное взаимодействие. Действительно, в отличие от процессов, которые принадлежат разным, вообще говоря, конкурирующим приложениям, все нити одного процесса всегда принадлежат одному приложению, поэтому программист, пишущий это приложение, может заранее продумать работу множества нитей процесса таким образом, чтобы они могли взаимодействовать, а не бороться за ресурсы.
В традиционных ОС понятие "нить" тождественно понятию "процесс". В действительности часто бывает желательно иметь несколько нитей, разделяющих единое адресное пространство, но выполняющихся квазипараллельно, благодаря чему нити становятся подобными процессам (за исключением разделяемого адресного пространства).
Нити иногда называют облегченными процессами или мини-процессами. Действительно, нити во многих отношениях подобны процессам. Каждая нить выполняется строго последовательно и имеет свой собственный программный счетчик и стек. Нити, как и процессы, могут, например, порождать нити-потомки, могут переходить из состояния в состояние. Подобно традиционным процессам (то есть процессам, состоящим из одной нити), нити могут находиться в одном из следующих состояний: ВЫПОЛНЕНИЯ, ОЖИДАНИЯ и ГОТОВНОСТИ. Пока одна нить заблокирована, другая нить того же процесса может выполняться. Нити разделяют процессор так, как это делают процессы, в соответствии с различными вариантами планирования.
Однако различные нити в рамках одного процесса не настолько независимы, как отдельные процессы.
Все такие нити имеют одно и то же адресное пространство. Это означает, что они разделяют одни и те же глобальные переменные. Поскольку каждая нить может иметь доступ к каждому виртуальному адресу, одна нить может использовать стек другой нити. Между нитями нет полной защиты, потому что, во-первых, это невозможно, а во-вторых, не нужно. Все нити одного процесса всегда решают общую задачу одного пользователя, и аппарат нитей используется здесь для более быстрого решения задачи путем ее распараллеливания. При этом программисту очень важно получить в свое распоряжение удобные средства организации взаимодействия частей одной задачи. Кроме разделения адресного пространства, все нити разделяют также набор открытых файлов, таймеров, сигналов и т.п.
Итак, нити имеют собственные:
-
программный счетчик;
- стек;
- регистры;
- нити - потомки;
- состояние.
Нити разделяют:
- адресное пространство;
- глобальные переменные;
- открытые файлы;
- таймеры;
- семафоры;
- статистическую информацию.
Многонитевая обработка повышает эффективность работы системы по сравнению с многозадачной обработкой. Например, в многозадачной среде Windows можно одновременно работать с электронной таблицей и текстовым редактором. Однако, если пользователь запрашивает пересчет своего рабочего листа, электронная таблица блокируется до тех пор, пока эта операция не завершится, что может потребовать значительного времени. В многонитевой среде в случае, если электронная таблица была разработана с учетом, предоставляемых программисту, возможностей многонитевой обработки, этой проблемы не возникает, и пользователь всегда имеет доступ к электронной таблице.
Некоторые прикладные задачи легче программировать, используя параллелизм, например задачи типа "писатель-читатель", в которых одна нить выполняет запись в буфер, а другая считывает записи из него. Поскольку они разделяют общий буфер, не стоит их делать отдельными процессами. Другой пример использования нитей - это управление сигналами, такими, как прерывание с клавиатуры (del или break). Вместо обработки сигнала прерывания одна нить назначается для постоянного ожидания поступления сигналов. Таким образом, использование нитей может сократить необходимость в прерываниях пользовательского уровня. В этих примерах не столь важно параллельное выполнение, сколь важна ясность программы.
Наконец, в мультипроцессорных системах для нитей из одного адресного пространства имеется возможность организовать выполнение параллельно на разных процессорах. Это действительно один из главных путей реализации разделения ресурсов в таких системах. С другой стороны, правильно сконструированные программы, которые используют нити, должны работать одинаково хорошо как на однопроцессорной машине в режиме разделения времени между нитями, так и в мультипроцессорных системах.
Принципы построения ОС
ОС различаются по назначению, выполняемым функциям, формам реализации. Тем не менее в основу их создания заложены общие принципы.
1.
Частотный принцип. Для действий, которые часто встречаются при работе с ОС, обеспечиваются условия их быстрого выполнения.
2. Принцип модульности. Модуль – функциональный элемент системы, имеющий оформление, законченное и выполненное в пределах требований системы, и средства сопряжения с другими модулями. Модули бывают однократными, многократными и реентерабельными.
3. Принцип функциональной избирательности. Используется при формировании ядра ОС. Модули "под рукой".
4. Принцип генерируемости. Настройка средств ОС, исходя из конкретной конфигурации ЭВМ и круга решаемых проблем (OS/2, Windows, UNIX).
5. Принцип функциональной избыточности. Проведение одной и той же работы различными средствами ОС -MFT, MVT, SVM.
6. Принцип умолчания. Он основан на хранении в системе некоторых данных, которые назначаются объектам ОС в случае их неуказания.
7. Принцип перемещаемости. Построение модулей, исполнение которых не зависит от места расположения в ОП.
8. Принцип защиты. Он предполагает необходимость разработки мер, ограждающих программы и данные пользователей от нежелательных влияний друг на друга. (Привилегированные команды. Границы области адресации).
9. Принцип независимости программ от внешних устройств. Связь программы с конкретным устройством устанавливается не на уровне трансляции, а в период ее исполнения.
Реализация многонитевой обработки в WINDOWS
В операционной ситстеме Windows 95 понятию «нить» соответствует “поток,” и многонитевая обработка представляет собой многопоточную обработку. Подробнее рассмотрим, как выполняется многопоточная обработка и управление памятью в Windows 95.
Планировщик процессов Windows 95 отвечает за выделение системных ресурсов приложениям и другим процессам и за распределение времени.
В Windows 95 применяются кооперативная многозадачность (cooperative multitasking) и вытесняющая (preemptive multitasking) .
В Windows 3.1 применяется только кооперативная многозадачность. ОС требовала, чтобы приложение периодически проверяло очередь сообщений и передавало управление другим приложениям. Этого обычно не происходило, и программы захватывали все процессорное время.
Кооперативный режим применяется в Windows 95 исключительно из соображений совместимости с Win - 16
- приложениями.
В Win-32 используется вытесняющая многозадачность. ОС сама решает, у какой программы отобрать управление и какой передать. В Win-32 приложение может использовать многопоточность, что упрощает реализацию одновременного исполнения нескольких программ. Приложение - процесс. Процесс состоит, как минимум, из одного потока. Поток - часть кода программы, которую можно использовать одновременно с другими частями кода. В Win-32
можно инициировать несколько процессов, что позволяет улучшить рабочие характеристики приложений.
В Windows 95 каждое открытое окно - поток. И если выполняется копирование между двумя окнами папок,то оно выполняется потоком окна - приемника. При этом можно выполнять операции с другими окнами.
В текстовом процессоре для увеличения скорости обработки реализуется несколько потоков. Первый поток обрабатывает ввод с клавиатуры, другой - проверку орфографии, третий - фоновую печать и т. д.
Решение фирмы Сompaq
Разделение шины ЦП - память (что позволило повысить ее разрядность до 32) и шины ISA – это является решением фирмы Compaq.
Повысилась пропускная способность канала (CPU-RAM за счет применения внешней кэш - памяти для каждого процесса. Выборка команд из внешней кэш - памяти выполняется одновременно с передачей данных между ОЗУ и ВНУ в режиме прямого доступа к памяти (ПДП) в результате распараллеливания работы системы. Это условно симметричная многопроцессорная система, которая позволяет одинаково разделять задачи между процессорами. Асимметрия состоит в том, что аппаратные прерывания от ВНУ может воспринимать только один (первичный) процессор.
Развитием стало внедрение архитектуры Tri Flex, которая легла в основу Systempro/x2. Еще больше параллелизма и оптимизации проходимости каналов передачи между основными подсистемами компьютера. Выделены уже три отдельные высокоскоростные шины. Основной выигрыш производительности - за счет используемой 64 разрядной шины CPU.
Высокоэффективное кэш - ОЗУ (64 - разрядное.) минимизирует частоту обращения к основной памяти. Когда процессору понадобиться доступ к ней, в его распоряжении 128-разрядная шина (267 Мб/сек). Специальная схема контроллера (управление потоком данных) содержит 256 - разрядные многоступенчатые буферы, способные накапливать и самостоятельно осуществлять до 16 операций ввода/ввывода по шине EISA (рис.9.4).
Сегментная организация виртуальной памяти
В системе с сегментной организацией памяти снимается ограничение на фиксированный размер блока и выполняется соответствующее произвольное разбиение АП процесса на сегменты.
Сегмент
- это единица логического разбиения программ (процедура, модуль, область данных), имеющая переменный размер и имя. Напомним, что страница - это физическая единица памяти.
Сегментная организация обеспечивает простое и естественное разделение общих сегментов между несколькими пользователями и защиту сегментов посредством связывания с ним прав доступа, подразделяющихся на:
-
выполнение E;
- чтение R;
- запись W;
- расширение A
и их различных комбинаций.
Для сегментной организации в таблице отображения сегментов с каждым сегментом связан дескриптор, который содержит адрес размещения сегмента в ОП, его длину
и права доступа (ERWA), признак обращения к сегменту за последний интервал времени, а также признак присутствия в РОП. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов этих процессов делаются ссылки на один и тот же участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре.
В сегментной организации все сегменты имеют различный размер и могут размещаться в несмежных участках РОП.
Достоинства сегментной организации:
1.Уменьшение временной фрагментации, так как естественно учитывается свойство локальности программ.
2.Легко совмещается с использованием общих процессов, поскольку данные и программа целиком находятся в одном блоке.
3.Возможность обеспечить четкое управление доступом к сегменту со стороны общих процессов и их полную защиту.
Недостатки:
1.Более сложное управление и защита ОП. Здесь уже не достаточно пары граничных регистров, а необходимы ключи защиты индивидуальных сегментов памяти.
2.Может возникнуть временная фрагментация для больших размеров процедур и данных.
Система управления файлами
Файловая система - это часть операционной системы, назначение которой состоит в том, чтобы обеспечить пользователю удобный интерфейс при работе с данными, хранящимися на диске, и обеспечить совместное использование файлов несколькими пользователями и процессами.
В широком смысле понятие "файловая система" включает:
- совокупность всех файлов на диске;
- наборы структур данных, используемых для управления файлами, такие, например, как каталоги файлов, дескрипторы файлов, таблицы распределения свободного и занятого пространства на диске;
- комплекс системных программных средств, реализующих управление файлами, в частности: создание, уничтожение, чтение, запись, именование, поиск и другие операции над файлами.
СУФ реализует выполнение следующих базовых функций.
1. Организацию логической системы в виде томов памяти и каталогов файлов.
2. Управление томами, в том числе:
- инициализацию (форматирование);
- подключение (перевод в оперативное состояние);
- отключение (перевод в автономное состояние).
3. Управление каталогами файлов:
- создание каталогов;
- переключение между каталогами;
- удаление каталогов.
4. Манипуляции с файлами:
- создание файла (определение имени, выделение места во внешней памяти);
- удаление файла (освобождение имени и занимаемого файлами пространства);
- открытие файла (объявление ОС о намерении использовать файл с определенными функциями доступа и правами);
- закрытие открытого файла (запрещение всякого доступа к файлу);
- копирование и переименование файла.
5. Связь файлов и потоков ввода/вывода, соединение и переадресацию потоков.
6. Организацию логической структуры файлов и доступа к записям файлов в требуемом порядке.
7. Модификацию записей файлов: читать, писать, изменять, вставлять, добавлять, удалять записи.
8. Защиту файлов от несанкционированного доступа и управление правами доступа.
Кроме того, может быть масса сервисных функций проверки и модификации различных характеристик файлов, каталогов, томов, зависящих от конкретной реализации СУФ.
Файлы бывают разных типов: обычные файлы, специальные файлы, файлы-каталоги.
Обычные файлы в свою очередь подразделяются на текстовые и двоичные. Текстовые файлы состоят из строк символов, представленных в ASCII-коде. Это могут быть документы, исходные тексты программ и т.п. Текстовые файлы можно прочитать на экране и распечатать на принтере. Двоичные файлы не используют ASCII-коды, они часто имеют сложную внутреннюю структуру, например, объектный код программы или архивный файл. Все операционные системы должны уметь распознавать хотя бы один тип файлов - их собственные исполняемые файлы.
В разных файловых системах могут использоваться в качестве атрибутов разные характеристики, например:
- информация о разрешенном доступе;
- пароль для доступа к файлу;
- владелец файла;
- создатель файла;
- признак "только для чтения";
- признак "скрытый файл";
- признак "системный файл";
- признак "архивный файл";
- признак "двоичный/символьный";
- признак "временный" (удалить после завершения процесса);
- признак блокировки;
- длина записи;
- указатель на ключевое поле в записи;
- длина ключа;
- время создания, последнего доступа и последнего изменения;
- текущий размер файла;
- максимальный размер файла.
Специальные файлы
- это файлы, ассоциированные с устройствами ввода-вывода, которые позволяют пользователю выполнять операции ввода-вывода, используя обычные команды записи в файл или чтения из файла. Эти команды обрабатываются вначале программами файловой системы, а затем на некотором этапе выполнения запроса преобразуются ОС в команды управления соответствующим устройством. Специальные файлы так же, как и устройства ввода-вывода, делятся на блок-ориентированные и на байт-ориентированные.
Для пользователей файл обозначается с помощью идентификаторов - внешних имен (могут быть и внутренние имена файлов). Пользователи дают файлам символьные имена, при этом учитываются ограничения ОС как на используемые символы, так и на длину имени. До недавнего времени эти границы были весьма узкими. Так, в популярной файловой системе FAT длина имен ограничивается известной схемой 8.3 (8 символов - собственно имя, 3 символа - расширение имени), а в ОС UNIX System V имя не может содержать более 14 символов. Однако пользователю гораздо удобнее работать с длинными именами, поскольку они позволяют дать файлу действительно мнемоническое название, по которому даже через достаточно большой промежуток времени можно будет вспомнить, что содержит этот файл. Поэтому современные файловые системы, как правило, поддерживают длинные символьные имена файлов. Например, Windows NT в своей новой файловой системе NTFS устанавливает, что имя файла может содержать до 255 символов, не считая завершающего нулевого символа.
При переходе к длинным именам возникает проблема совместимости с ранее созданными приложениями, использующими короткие имена. Чтобы приложения могли обращаться к файлам в соответствии с принятыми ранее соглашениями, файловая система должна уметь предоставлять короткие эквивалентные имена (псевдонимы) файлам, имеющим длинные имена.
Таким образом, одной из важных задач становится проблема генерации соответствующих коротких имен.
Длинные имена поддерживаются не только новыми файловыми системами, но и новыми версиями хорошо известных файловых систем. Например, в ОС Windows 95 используется файловая система VFAT, представляющая собой существенно измененный вариант FAT. Среди многих других усовершенствований одним из главных достоинств VFAT является поддержка длинных имен. Кроме проблемы генерации коротких эквивалентных имен, при реализации нового варианта FAT важной задачей была задача хранения длинных имен при условии, что принципиально метод хранения и структура данных на диске не должны были измениться.
Для решения проблем поиска и размещения файлов в СУФ используются иерархические, многоуровневые каталоги файлов, двухуровневые имена файлов и средства фильтрации.
Простой одноуровневый каталог представляет собой оглавление тома (используется в однопользовательских ОС - рис.11.1)
Рис.11.1. Простой одноуровневый каталог.
Иерархический, многоуровневый каталог (древовидный или сетевой) - это совокупность каталогов и дескрипторов файлов различной глубины (рис.11.2).
Рис.11.2. Иерархический многоуровневый каталог
Каталоги образуют дерево, если файлу разрешено входить только в один каталог, и сеть - если файл может входить сразу в несколько каталогов. В MS-DOS каталоги образуют древовидную структуру, а в UNIX'е - сетевую. Как и любой другой файл, каталог имеет символьное имя и однозначно идентифицируется составным именем, содержащим цепочку символьных имен всех каталогов, через которые проходит путь от корня до данного каталога.
Каждый каталог группирует по определенным принципам файлы пользователей, которые могут быть защищены паролем. Для упрощения работы имеется понятие текущего каталога, определяющего список доступных файлов и подкаталогов и позволяющего обращаться к файлам по собственным именам.
ОС обеспечивает определение нескольких текущих каталогов (путей доступа), которые в заданной последовательности просматривается при обращении к файлу по имени:
PATH C:\; C:\nc; D:\ альтернативные маршруты.
В процессе диалога ОС для группировки и удобства работы с файлами используются 2-х и 3-х компонентные идентификаторы:
[<префикс>:] <имя файла> [.суффикс/расщирение].
Например, в MS-DOS C:\sys\forrmat.com.
Такие средства классификации упрощают автоматическую обработку файлов. Обычно программы работают со своими типами файлов, поэтому зачастую суффикс или расширение можно не указывать.
Средства фильтрации позволяют определять операции над целым классом файлов, посредством указания вместо имени файла специальных символов (* или !). Например, имя *.exe представляет все файлы текущего подкаталога, имеющие расширение exe.
Важной характеристикой СУФ является обеспечение независимости программ от используемых ПУ и файлов. Для этого вводится понятие потока ввода/вывода как средства отсроченного установления связи программы с конкретными файлами и ПУ.
Поток ввода/вывода - это объект, который обладает всеми характеристиками устройства ввода/вывода, но не является реально существующим. Программа работает не с файлами, а потоками ввода/вывода.
В операционной системе MS-DOS, например, по умолчанию в качестве входного потока данных рассматривается клавиатура, а выходной поток направляется на дисплей. Для переопределения потоков ввода/вывода используются следующие символы:
< - для определения входного потока;
>- для определения выходного потока;
>> - для модификации (добавления) ранее определенного выходного потока.
Выполнение команды DIR>LPT приведет выводу содержимого текущего каталога на принтер.
Транспортировка потоков позволяет сцепить несколько программ по стандартному входу-выходу. По сути дела образуется буфер, позволяющий двум процессам связываться по схеме “производитель – потребитель”. Таким образом, выходные данные одной программы являются входными для другой программы, обеспечивая естественное взаимодействие.
Команда DIR|SORT выведет на дисплей отсортированный список файлов, полученный командой DIR.
Способы доступа и организации файлов
С точки зрения внутренней структуры (логической организации) файл - это совокупность однотипных записей, каждая из которых информирует о свойствах одного объекта. Записи могут быть фиксированной длины, переменной длины или неопределенной длины. Записи переменной длины в своем составе содержат длину записи, а неопределенной длины – специальный символ конца записи.
При этом каждая запись может иметь идентификатор, представляющий собой ключ, который может быть сложным и состоять из нескольких полей.
Существует три способа доступа к данным, расположенным во внешней памяти:
1.
Физически последовательный по порядку размещения записи в файле.
2. Логически последовательный
в соответствии с упорядочением по значению ключей. Для выполнения упорядочения создается специальный индексный файл, в соответствии с которым записи представляются для обработки.
3. Прямой - непосредственно по ключу или физическому адресу записи.
Для организации доступа записи должны быть определенным образом расположены и взаимосвязаны во внешней памяти. Есть несколько способов логической организации памяти.
Последовательный
Записи располагаются в физическом порядке и обеспечивают доступ в физической последовательности. Таким образом, для обработки записи с номером N+1 необходимо последовательно обратиться к записям с номером 1, 2,….,N. Это универсальный способ организации файла периферийного устройства. Используется так же для организации входного/выходного потока.
Индексно-последовательный.
Записи располагаются в логической последовательности в соответствии со значением ключей записи. Физически записи располагаются в различных местах файла. Логическая последовательность файла фиксируется в специальной таблице индексов, в которой значение ключей связывается с физическим адресом записи. При такой организации доступ к записям осуществляется логически последовательно в порядке возрастания или убывания значения ключа или по значению ключа.
Индексный
Место записи в файле, ее физический адрес, определяется алгоритмом преобразования для ключа. Доступ к записям возможен только прямой. Алгоритм преобразования ключа называется хешированием. Ключ, использующий алгоритм хеширования, преобразуется в номер записи.
Прямой.
Это организация, при которой осуществляется прямой доступ по порядковому номеру записи или по физическому адресу.
Библиотечный
Организация, в которой файл состоит из последовательных подфайлов (разделов), первый из которых является оглавлением и содержит имена и адреса остальных подфайлов. При такой организации осуществляется комбинированныйдоступ: индексный прямой к разделу и последовательный в разделах.
Определить права доступа к файлу - значит определить для каждого пользователя набор операций, которые он может применить к данному файлу. В разных файловых системах может быть определен свой список дифференцируемых операций доступа. Этот список может включать следующие операции:
- создание файла;
- уничтожение файла;
- открытие файла;
- закрытие файла;
- чтение файла;
- запись в файл;
- дополнение файла;
- поиск в файле;
- получение атрибутов файла;
- установление новых значений атрибутов;
- переименование;
- выполнение файла;
- чтение каталога;
- и другие операции с файлами и каталогами.
В самом общем случае права доступа могут быть описаны матрицей прав доступа, в которой столбцы соответствуют всем файлам системы, строки - всем пользователям, а на пересечении строк и столбцов указываются разрешенные операции.В некоторых системах пользователи могут быть разделены на отдельные категории. Для всех пользователей одной категории определяются единые права доступа. Например, в системе UNIX
все пользователи подразделяются на три категории: владельца файла, членов его группы и всех остальных. Различают два основных подхода к определению прав доступа:
- избирательный доступ, когда для каждого файла и каждого пользователя сам владелец может определить допустимые операции;
- мандатный подход, когда система наделяет пользователя определенными правами по отношению к каждому разделяемому ресурсу (в данном случае файлу) в зависимости от того, к какой группе пользователь отнесен.
Способы распределения памяти на диске
Выделение и освобождение места для файлов на томе аналогично стратегии размещения ОП.
1.
Непрерывное распределение памяти, когда файлу выделяется непрерывный участок памяти. Для задания адреса файла в этом случае достаточно указать только номер начального блока. Достоинство этого метода - простота. Очевидный недостаток - проблема расширения файла и фрагментация. Уплотнение или дефрагментация используется для восстановления памяти.
2. Секторное или блочное распределение, когда файлу выделяется логически связанные блоки, физически размещенные в любом месте. При таком способе в начале каждого блока содержится указатель на следующий блок. В этом случае адрес файла также может быть задан одним числом - номером первого блока. В отличие от предыдущего способа, каждый блок может быть присоединен в цепочку какого-либо файла и, следовательно, фрагментация отсутствует. Файл может изменяться во время своего существования, наращивая число блоков. Недостатком является сложность реализации доступа к произвольно заданному месту файла: для того чтобы прочитать пятый по порядку блок файла, необходимо последовательно прочитать четыре первых блока, прослеживая цепочку номеров блоков.
Популярным способом, используемым, например, в файловой системе FAT операционной системы MS-DOS, является использование связанного списка индексов. С каждым блоком (кластером) связывается некоторый элемент - индекс. Индексы располагаются в отдельной области диска (в MS-DOS это таблица FAT). Если некоторый блок распределен файлу, то индекс этого блока содержит номер следующего блока данного файла. При этом для каждого файла в каталоге имеется поле, в котором отмечается номер начального индекса для кластера, входящего в файл. Последний индекс содержит специальный маркер конца файла. Такая физическая организация сохраняет все достоинства предыдущего способа и снимает отмеченный недостаток: для доступа к произвольному месту файла достаточно прочитать только блок индексов, отсчитать нужное количество блоков файла по цепочке и определить номер нужного блока.
В заключение рассмотрим задание физического расположения файла путем простого перечисления номеров блоков, занимаемых этим файлом. ОС UNIX использует вариант данного способа, позволяющий обеспечить фиксированную длину адреса независимо от размера файла. Для хранения адреса файла выделено 13 полей. Если размер файла меньше или равен 10 блокам, то номера этих блоков непосредственно перечислены в первых десяти полях адреса. Если размер файла больше 10 блоков, то следующее, 11-е поле содержит адрес блока, в котором могут быть расположены еще 128 номеров следующих блоков файла. Если файл больше, чем 10+128 блоков, то используется 12-е поле, в котором находится номер блока, содержащего 128 номеров блоков, которые содержат по 128 номеров блоков данного файла. И, наконец, если файл больше 10+128+128(128, то используется последнее, 13-е поле для тройной косвенной адресации, что позволяет задать адрес файла, имеющего размер максимум: 10+ 128 + 128(128 + 128(128(128.
В некоторых файловых системах запросы к внешним устройствам, в которых адресация осуществляется блоками (диски, ленты), перехватываются промежуточным программным слоем-подсистемой буферизации. Подсистема буферизации представляет собой буферный пул, располагающийся в оперативной памяти, и комплекс программ, управляющих этим пулом и позволяющий выполнять опережающее считывание блоков файла при последовательном доступе. Каждый буфер пула имеет размер, равный одному блоку. При поступлении запроса на чтение некоторого блока подсистема буферизации просматривает свой буферный пул и, если находит требуемый блок, то копирует его в буфер запрашивающего процесса. Операция ввода-вывода считается выполненной, хотя физического обмена с устройством не происходило. Очевиден выигрыш во времени доступа к файлу. Если же нужный блок в буферном пуле отсутствует, то он считывается с устройства и одновременно с передачей запрашивающему процессу копируется в один из буферов подсистемы буферизации. При отсутствии свободного буфера на диск вытесняется наименее используемая информация.Таким образом, подсистема буферизации работает по принципу кэш-памяти. Кроме того, буферизация позволяет одновременно обрабатывать программой текущий блок и читать/писать в другие буфера следующий блок.
Тенденции в структурном построении ОС
Как уже отмечалось выше, для удовлетворения требований, предъявляемых к современной ОС, большое значение имеет ее структурное построение. Операционные системы прошли длительный путь развития от монолитных систем к хорошо структурированным модульным системам, способным к развитию, расширению и легкому переносу на новые платформы.
Монолитные системы
В общем случае "структура" монолитной системы представляет собой отсутствие структуры. ОС написана как набор процедур, каждая из которых может вызывать другие, когда ей это нужно. При использовании этой техники каждая процедура системы имеет хорошо определенный интерфейс в терминах параметров и результатов, и каждая вольна вызвать любую другую для выполнения некоторой нужной для нее полезной работы.
Для построения монолитной системы необходимо скомпилировать все отдельные процедуры, а затем связать их вместе в единый объектный файл с помощью компоновщика (примерами могут служить ранние версии ядра UNIX или Novell NetWare). Каждая процедура видит любую другую процедуру ( в отличие от структуры, содержащей модули, в которой большая часть информации является локальной для модуля, и процедуры модуля можно вызвать только через специально определенные точки входа). Однако даже такие монолитные системы могут быть немного структурированными. При обращении к системным вызовам, поддерживаемым ОС, параметры помещаются в строго определенные места, такие, как регистры или стек, а затем выполняется специальная команда прерывания, известная как вызов ядра или вызов супервизора. Эта команда переключает машину из режима пользователя в режим ядра, называемый также режимом супервизора, и передает управление ОС. Затем ОС проверяет параметры вызова для того, чтобы определить, какой системный вызов должен быть выполнен. После этого ОС индексирует таблицу, содержащую ссылки на процедуры, и вызывает соответствующую процедуру. Такая организация ОС предполагает следующую структуру:
1.
Главная программа, которая вызывает требуемые сервисные процедуры.
2. Набор сервисных процедур, реализующих системные вызовы.
3. Набор утилит, обслуживающих сервисные процедуры.
В этой модели для каждого системного вызова имеется одна сервисная процедура. Утилиты выполняют функции, которые нужны нескольким сервисным процедурам. Это деление процедур на три слоя показано на рис. 12.1.
Рис. 12.1. Простая структуризация монолитной ОС
Модель клиент - сервер и микроядра
Модель клиент-сервер - это подход к структурированию ОС. В широком смысле модель клиент-сервер предполагает наличие программного компонента - потребителя какого-либо сервиса - клиента, и программного компонента - поставщика этого сервиса - сервера. Взаимодействие между клиентом и сервером стандартизуется, так что сервер может обслуживать клиентов, реализованных различными способами и, может быть, разными производителями. При этом главным требованием является то, чтобы они запрашивали услуги сервера понятным ему способом. Инициатором обмена обычно является клиент, который посылает запрос на обслуживание серверу, находящемуся в состоянии ожидания запроса. Один и тот же программный компонент может быть клиентом по отношению к одному виду услуг и сервером для другого вида услуг. Модель клиент-сервер является, скорее, удобным концептуальным средством ясного представления функций того или иного программного элемента в той или иной ситуации, нежели технологией. Эта модель успешно применяется не только при построении ОС, но и на всех уровнях программного обеспечения и имеет в некоторых случаях более узкий, специфический смысл, сохраняя, естественно, при этом все свои общие черты.
Применительно к структурированию ОС идея состоит в разбиении ее на несколько процессов - серверов, каждый из которых выполняет отдельный набор сервисных функций, например, управление памятью, создание или планирование процессов. Каждый сервер выполняется в пользовательском режиме. Клиент, которым может быть либо другой компонент ОС, либо прикладная программа, запрашивает сервис, посылая сообщение на сервер.
Ядро ОС (называемое здесь микроядром), работая в привилегированном режиме, доставляет сообщение нужному серверу, сервер выполняет операцию, после чего ядро возвращает результаты клиенту с помощью другого сообщения (рис. 12.2).
Рис. 12.2.Структура ОС клиент - сервер
Подход с использованием микроядра заменил вертикальное распределение функций операционной системы на горизонтальное. Компоненты, лежащие выше микроядра, хотя и используют сообщения, пересылаемые через микроядро, взаимодействуют друг с другом непосредственно. Микроядро играет роль регулировщика. Оно проверяет сообщения, пересылает их между серверами и клиентами, и предоставляет доступ к аппаратуре.
Данная теоретическая модель является идеализированным описанием системы клиент-сервер, в которой ядро состоит только из средств передачи сообщений. В действительности различные варианты реализации модели клиент-сервер в структуре ОС могут существенно различаться по объему работ, выполняемых в режиме ядра.
Микроядро реализует жизненно важные функции, лежащие в основе операционной системы. Это базис для менее существенных системных служб и приложений. Именно вопрос о том, какие из системных функций считать несущественными, и, соответственно, не включать их в состав ядра, является предметом спора среди соперничающих сторонников идеи микроядра. В общем случае подсистемы, бывшие традиционно неотъемлемыми частями операционной системы - файловые системы, управление окнами и обеспечение безопасности, становятся периферийными модулями, взаимодействующими с ядром и друг с другом.
Главный принцип разделения работы между микроядром и окружающими его модулями - включать в микроядро только те функции, которым абсолютно необходимо исполняться в режиме супервизора и в привилегированном пространстве. Под этим обычно подразумеваются машиннозависимые программы (включая поддержку нескольких процессоров), некоторые функции управления процессами, обработка прерываний, поддержка пересылки сообщений, некоторые функции управления устройствами ввода-вывода, связанные с загрузкой команд в регистры устройств.
Эти функции операционной системы трудно, если не невозможно, выполнить программам, работающим в пространстве пользователя.
Есть два пути решения этой проблемы. Один путь - разместить несколько таких чувствительных к режиму работы процессора серверов в пространстве ядра, что обеспечит им полный доступ к аппаратуре и в то же время связь с другими процессами с помощью обычного механизма сообщений. Такой подход был использован, например, при разработке Windows NT: кроме микроядра, в привилегированном режиме работает часть Windows NT, называемая executive
управляющей программой. Она включает ряд компонентов, которые управляют виртуальной памятью, объектами, вводом-выводом и файловой системой (включая сетевые драйверы), взаимодействием процессов и, частично, системой безопасности.
Другой путь заключается в том, чтобы оставить в ядре только небольшую часть сервера, представляющую собой механизм реализации решения, а часть, отвечающую за принятие решения, переместить в пользовательскую область. В соответствии с этим подходом, например, в микроядре Mach, на базе которого разработана Workplace OS, размещается только часть системы управления процессами (и нитями), реализующая диспетчеризацию (то есть непосредственно переключение с процесса на процесс), а все функции, связанные с анализом приоритетов, выбором очередного процесса для активизации, принятием решения о переключении на новый процесс и другие аналогичные функции выполняются вне микроядра. Этот подход требует тесного взаимодействия между внешним планировщиком и резидентным диспетчером.
Здесь важно сделать различие: запуск процесса или нити требует доступа к аппаратуре, так что по логике - это функция ядра. Но ядру все равно, какую из нитей запускать, поэтому решения о приоритетах нитей и дисциплине постановки в очередь может принимать работающий вне ядра планировщик.
Кроме уже представленных соображений, перемещение планировщика на пользовательский уровень может понадобиться для чисто коммерческих целей. Некоторые производители ОС (например, IBM и OSF со своими вариантами микроядра Mach) планируют лицензировать свое микроядро другим поставщикам, которым может потребоваться заменить исходный планировщик на другой, поддерживающий, например, планирование в задачах реального времени или реализующий какой-то специальный алгоритм планирования.
А вот другая ОС - Windows NT, также использующая микроядерную концепцию, - воплотила понятие приоритетов реального времени в своем планировщике, резидентно расположенном в ядре, и это не дает возможности заменить ее планировщик на другой.
Как и управление процессами, управление памятью может распределяться между микроядром и сервером, работающим в пользовательском режиме. Например, в Workplace OS микроядро управляет аппаратурой страничной памяти. Пейджер (система управления страничной памятью), работающий вне ядра, определяет стратегию замещения страниц (т.е. решает, какие страницы следует удалить из памяти для размещения страниц, выбранных с диска в ответ на прерывание по отсутствию необходимой страницы), а микроядро выполняет перемещение выбранных пейджером страниц. Как и планировщик процессов, пейджер является заменяемой составной частью.
Драйверы устройств также могут располагаться как внутри ядра, так и вне его. При размещении драйверов устройств вне микроядра для обеспечения возможности разрешения и запрещения прерываний, часть программы драйвера должна исполняться в пространстве ядра. Отделение драйверов устройств от ядра делает возможной динамическую конфигурацию ОС. Кроме динамической конфигурации, есть и другие причины рассматривать драйверы устройств в качестве процессов пользовательского режима. СУБД, например, может иметь свой драйвер, оптимизированный под конкретный вид доступа к диску, но его нельзя будет подключить, если драйверы будут расположены в ядре. Этот подход также способствует переносимости системы, так как функции драйверов устройств могут быть во многих случаях абстрагированы от аппаратной части.
В настоящее время именно операционные системы, построенные с использованием модели клиент-сервер и концепции микроядра, в наибольшей степени удовлетворяют требованиям, предъявляемым к современным ОС.
Высокая степень переносимости обусловлена тем, что весь машинно-зависимый код изолирован в микроядре, поэтому для переноса системы на новый процессор требуется меньше изменений, и все они логически сгруппированы вместе.
Технология микроядер является основой построения множественных прикладных сред, которые обеспечивают совместимость программ, написанных для разных ОС. Абстрагируя интерфейсы прикладных программ от расположенных ниже операционных систем, микроядра позволяют гарантировать, что вложения в прикладные программы не пропадут в течение нескольких лет, даже если будут сменяться операционные системы и процессоры.
Расширяемость также является одним из важных требований к современным операционным системам. Является ли операционная система маленькой, как DOS, или большой, как UNIX,
для нее неизбежно настанет необходимость приобрести свойства, не заложенные в ее конструкцию. Увеличивающаяся сложность монолитных операционных систем делала трудным, если вообще возможным, внесение изменений в ОС с гарантией надежности ее последующей работы. Ограниченный набор четко определенных интерфейсов микроядра открывает путь к упорядоченному росту и эволюции ОС.
Обычно операционная система выполняется только в режиме ядра, а прикладные программы - только в режиме пользователя, за исключением тех случаев, когда они обращаются к ядру за выполнением системных функций. В отличие от обычных систем, система, построенная на микроядре, выполняет свои серверные подсистемы в режиме пользователя, как обычные прикладные программы. Такая структура позволяет изменять и добавлять серверы, не влияя на целостность микроядра.
Иногда имеется потребность и в сокращении возможностей ОС. На Windows NT или UNIX перешло бы большее число пользователей, если бы для этих операционных систем не требовалось 16 Мб оперативной памяти и 70 Мб и более пространства на жестком диске. Микроядро не обязательно подразумевает небольшую систему. Надстроенные службы, типа файловой системы и системы управления окнами, добавят к ней немало. Конечно же, не всем нужна безопасность класса C2 или распределенные вычисления. Если важные, но предназначенные для определенных потребителей свойства можно исключать из состава системы, то базовый продукт подойдет более широкому кругу пользователей.
Использование модели клиент- сервер повышает надежность. Каждый сервер выполняется в виде отдельного процесса в своей собственной области памяти и таким образом защищен от других процессов. Более того, поскольку серверы выполняются в пространстве пользователя, они не имеют непосредственного доступа к аппаратуре и не могут модифицировать память, в которой хранится управляющая программа. И если отдельный сервер может потерпеть крах, то он может быть перезапущен без останова или повреждения остальной части ОС.
Эта модель хорошо подходит для распределенных вычислений, так как отдельные серверы могут работать на разных процессорах мультипроцессорного компьютера или даже на разных компьютерах. При получении от процесса сообщения микроядро может обработать его самостоятельно или переслать другому процессу. Так как микроядру все равно, пришло ли сообщение от локального или удаленного процесса, подобная схема передачи сообщений является элегантным базисом для RPC. Однако такая гибкость не дается даром. Пересылка сообщений не так быстра, как обычные вызовы функций, и ее оптимизация является критическим фактором успеха операционной системы на основе микроядра. Windows NT, например, в некоторых случаях заменяет перенос сообщений на коммуникационные каналы с общей памятью, имеющие более высокую пропускную способность. Хотя это и стоит дороже в смысле потребления фиксированной памяти микроядра, данная альтернатива может помочь сделать модель пересылки сообщений более практичной.
Объектно-ориентированный подход
Хотя технология микроядер и заложила основы модульных систем, способных развиваться регулярным образом, она не смогла в полной мере обеспечить возможности расширения систем. В настоящее время этой цели в наибольшей степени соответствует объектно-ориентированный подход, при котором каждый программный компонент является функционально изолированным от других.
Основным понятием этого подхода является "объект". Объект - это единица программ и данных, взаимодействующая с другими объектам посредством приема и передачи сообщений.
Объект может быть представлением как некоторых конкретных вещей - прикладной программы или документа, так и некоторых абстракций - процесса, события.
Программы (функции) объекта определяют перечень действий, которые могут быть выполнены над данными этого объекта. Объект-клиент может обратиться к другому объекту, послав сообщение с запросом на выполнение какой-либо функции объекта-сервера.
Объекты могут описывать сущности, которые они представляют, с разной степенью детализации. Для обеспечения преемственности при переходе к более детальному описанию разработчикам предлагается механизм наследования свойств уже существующих объектов, то есть механизм, позволяющий порождать более конкретные объекты из более общих. Например, при наличии объекта "текстовый документ" разработчик может легко создать объект "текстовый документ в формате Word 6.0", добавив соответствующее свойство к базовому объекту. Механизм наследования позволяет создать иерархию объектов, в которой каждый объект более низкого уровня приобретает все свойства своего предка.
Внутренняя структура данных объекта скрыта от наблюдения. Нельзя произвольно изменять данные объекта. Для того, чтобы получить данные из объекта или поместить данные в объект, необходимо вызывать соответствующие объектные функции. Это изолирует объект от того кода, который использует его. Разработчик может обращаться к функциям других объектов, или строить новые объекты путем наследования свойств других объектов, ничего не зная о том, как они сконструированы. Это свойство называется инкапсуляцией.
Таким образом, объект предстает для внешнего мира в виде "черного ящика" с хорошо определенным интерфейсом. С точки зрения разработчика, использующего объект, пока внешняя реакция объекта остается без изменений, не имеют значения никакие изменения во внутренней реализации. Это дает возможность легко заменять одну реализацию объекта другой, например, в случае смены аппаратных средств; при этом сложное программное окружение, в котором находятся заменяемые объекты, не потребует никаких изменений.
С другой стороны, способность объектов представать в виде "черного ящика" позволяет упаковывать в них и представлять в виде объектов уже существующие приложения, ничего в них не изменяя.
Использование объектно-ориентированного подхода особенно эффективно при создании активно развивающегося программного обеспечения, например, при разработке приложений, предназначенных для выполнения на разных аппаратных платформах.
Полностью объектно-ориентированные операционные системы очень привлекательны для системных программистов, так как, используя объекты системного уровня, программисты смогут проникать вглубь операционных систем для приспособления их к своим нуждам, не нарушая целостность системы.
Но особенно большие перспективы имеет этот подход в реализации распределенных вычислительных сред. В настоящее время разные пакеты, работающие в данный момент в сети, представляют собой статически связанные наборы программ; в будущем, с использованием объектно-ориентированного подхода, они могут превратиться в единую совокупность динамически связываемых объектов, где каждый объект оперативно устанавливает и разрывает связи с другими объектами для выполнения актуальных в данный момент задач. Приложения, созданные для такой сетевой среды, основанной на объектах, могут выполняться, динамически обращаясь к множеству объектов, независимо от их местонахождения в сети и независимо от их операционной среды.
Поскольку любое объектно-ориентированное приложение представляет собой набор объектов, разработчику желательно иметь стандартные средства для управления объектами и организации их взаимодействия. При использовании и разработке объектно-ориентированных приложений в неоднородных распределенных средах нужны также средства, упрощающие доступ к объектам сети. При возникновении запроса к какому-либо объекту распределенной среды, независимо от того, находится требуемый объект на том же компьютере или на одном из удаленных, прозрачным образом должен быть выполнен поиск объекта, передача ему сообщения, и возврат ответа.
Для обеспечения прозрачного обнаружения объектов все они должны быть снабжены ссылками, хранящимися в каталогах. Отсюда вытекает очень сложная проблема организации службы каталогов, позволяющей программистам именовать и искать объекты в сети, которая, вообще говоря, может быть разбросана по всему миру.
Однако, несмотря на упомянутые сложности и проблемы, объектно-ориентированный подход является одной из самых перспективных тенденций в конструировании программного обеспечения.
Объектно-ориентированный подход к построению операционных систем, придающий порядок процессу добавления модульных расширений к небольшому ядру, был принят на вооружение многими известными фирмами, такими, как Microsoft, Apple, IBM, Novell/USL (UNIX Systems Laboratories) и Sun Microsystems, все они развернули свои операционные системы в этом направлении. Taligent, совместное предприятие IBM и Apple, надеется опередить всех со своей от начала до конца объектно-ориентированной операционной системой. Тем временем Next поставляет Motorola- и Intel-версии NextStep, наиболее продвинутой объектно-ориентированной операционной системы из имеющихся. Хотя NextStep и не имеет объектной ориентированности сверху донизу, как это планируется в разработках Taligent, но она доступна уже сегодня.
Одним из первых применений объектных систем для большинства пользователей станут основанные на объектах прикладные программы. К объектно-ориентированным технологиям этого уровня, уже имеющимся сейчас или доступным в ближайшем будущем относятся:
- Microsoft OLE (Object Linking and Embedding - связывание и внедрение объектов);
- стандарт OpenDoc
от фирм Apple, IBM, WordPerfect, Novell и Borland;
- DSOM (Distributed System Object Model - объектная модель распределенных систем) фирмы IBM;
- PDO (Portable Distributed Objects - переносимые распределенные объекты) фирмы Next;
- каркасы (frameworks) фирмы Taligent;
- архитектура CORBA объединения OMG.
Множественные прикладные среды
В то время как некоторые идеи (например, объектно-ориентированный подход) непосредственно касаются только разработчиков и лишь косвенно влияют на конечного пользователя, концепция множественных прикладных сред приносит пользователю долгожданную возможность выполнять на своей ОС программы, написанные для других операционных систем и других процессоров.
И сейчас дополнительное программное обеспечение позволяет пользователям некоторых ОС запускать чужие программы (например, Mac и UNIX
позволяют выполнять программы для DOS
и Windows). Но в зарождающемся поколении операционных систем средства для выполнения чужих программ становятся стандартной частью системы. Выбор операционной системы больше не будет сильно ограничивать выбор прикладных программ. Хотя столкновение пользовательских интерфейсов программ для Mac, Windows
и UNIX на одном и том же экране и заставит пользователя немного потрудиться, но все равно, множественные прикладные среды операционных систем скоро станут такими же стандартными, как мыши и меню.
Множественные прикладные среды обеспечивают совместимость данной ОС с приложениями, написанными для других ОС и процессоров, на двоичном уровне, а не на уровне исходных текстов. Для пользователя, купившего в свое время пакет для MS DOS (например, Lotus 1-2-3) важно, чтобы он мог запускать этот полюбившийся ему пакет без каких-либо изменений и на своей новой машине, построенной, например, на RISC-процессоре и работающей под управлением, например, Windows NT.
При реализации множественных прикладных сред разработчики сталкиваются с противоречивыми требованиями. С одной стороны, задачей каждой прикладной среды является выполнение программы по возможности так, как если бы она выполнялась на "родной" ОС. Но потребности этих программ могут входить в конфликт с конструкцией современной операционной системы.
Специализированные драйверы устройств могут противоречить требованиям безопасности. Могут конфликтовать схемы управления памятью и оконные системы. Чисто экономические вопросы (например, стоимость лицензирования программ и угроза судебного преследования) также могут повлиять на дизайн чужих прикладных сред. Но самой большой потенциальной проблемой является производительность - прикладная среда должна выполнять программы с приемлемой скоростью.
Этому требованию не могут удовлетворить широко используемые ранее эмулирующие системы. Для сокращения времени на выполнение чужих программ прикладные среды используют имитацию программ на уровне библиотек. Эффективность этого подхода связана с тем, что большинство сегодняшних программ работают под управлением GUI
(графических интерфейсов пользователя) типа Windows, Mac или UNIX Motif, при этом приложения тратят большую часть времени, производя некоторые хорошо предсказуемые вещи. Они непрерывно выполняют вызовы библиотек GUI
для манипулирования окнами и для других, связанных с GUI, действий. И это то, что позволяет прикладным средам возместить время, потраченное на эмулирование команды за командой. Тщательно сделанная прикладная среда имеет в своем составе библиотеки, имитирующие внутренние библиотеки GUI, но написанные на родном коде, то есть она совместима с программным интерфейсом другой ОС. Иногда такой подход называют трансляцией для того, чтобы отличать его от более медленного процесса эмулирования кода по одной команде за раз.
Например, для Windows-программы, работающей на Mac, при интерпретировании команд 80x86 производительность может быть очень низкой. Но когда производится вызов функции открытия окна, модуль прикладной среды может переключить его на перекомпилированную для 680x0 подпрограмму открытия окна. Так как библиотекам GUI не нужно дешифрировать и имитировать каждую команду, то в частях программы, относящихся к вызовам GUI ABI (Application Binary Interface - двоичный интерфейс прикладного программирования), производительность может резко вырасти.
В результате на таких участках кода скорость работы программы может достичь (а возможно, и превзойти) скорость работы на своем родном процессоре.
Сегодня в типичных программах значительная часть кода занята вызовом GUI ABI. Apple
утверждает, что программы для Mac
тратят до 90 процентов процессорного времени на выполнение подпрограмм из Mac toolbox, а не на уникальные для этих программ действия. Sun
Select говорит, что программы для Windows тратят от 60 до 80 процентов времени на работу в ядре Windows. В результате при эмуляции программы на основе GUI
потери производительности могут быть значительно меньше. SunSelect заявляет, что его новая прикладная среда Windows, WABI (Windows Application Binary Interface
- двоичный интерфейс прикладных программ Windows), благодаря сильно оптимизированным библиотекам, на некоторых платформах при исполнении одних и тех же тестов может обогнать настоящий Microsoft Windows.
С позиции использования прикладных сред более предпочтительным является способ написания программ, при котором программист для выполнения некоторой функции обращается с вызовом к операционной системе, а не пытается более эффективно реализовать эквивалентную функцию самостоятельно, работая напрямую с аппаратурой. Отбить у программистов охоту "обращаться к металлу" сможет наличие в библиотеках мощных и сложных программ, к которым гораздо проще обращаться, чем писать самому.
Модульность операционных систем нового поколения позволяет намного легче реализовать поддержку множественных прикладных сред. В отличие от старых операционных систем, состоящих из одного большого блока для всех практических применений, разбитого произвольным образом на части, новые системы являются модульными, с четко определенными интерфейсами между составляющими. Это делает создание дополнительных модулей, объединяющих эмуляцию процессора и трансляцию библиотек, значительно более простым.
К усовершенствованным операционным системам, явно содержащим средства множественных прикладных сред, относятся: IBM OS/2 2.x и Workplace OS, Microsoft Windows NT, PowerOpen
компании PowerOpen Association и версии UNIX от Sun Microsystems, IBM и Hewlett-Packard. Кроме того, некоторые компании переделывают свои интерфейсы пользователя в виде модулей прикладных сред, а другие поставщики предлагают продукты для эмуляции и трансляции прикладных сред, работающие в качестве прикладных программ.
Использование множественных прикладных сред обеспечит пользователям большую свободу выбора операционных систем и более легкий доступ к более качественному программному обеспечению.
Требования, предъявляемые к ОС -х годов
Операционная система является сердцевиной системного программного обеспечения, она создает среду для выполнения приложений и во многом определяет, какими полезными для пользователя свойствами эти приложения будут обладать. В связи с этим рассмотрим требования, которым должна удовлетворять современная ОС.
Очевидно, что главным требованием, предъявляемым к операционной системе, является способность выполнения основных функций: эффективного управления ресурсами и обеспечения удобного интерфейса для пользователя и прикладных программ. Современная ОС, как правило, должна реализовывать мультипрограммную обработку, виртуальную память, свопинг, поддерживать многооконный интерфейс, а также выполнять многие другие совершенно необходимые функции. Кроме этих функциональных требований, к операционным системам предъявляются не менее важные рыночные требования. К этим требованиям относятся:
Расширяемость. Код должен быть написан таким образом, чтобы можно было легко внести дополнения и изменения, если это потребуется, и не нарушить целостность системы.
Переносимость. Код должен легко переноситься с процессора одного типа на процессор другого типа и с аппаратной платформы (которая включает наряду с типом процессора и способ организации всей аппаратуры компьютера) одного типа на аппаратную плат форму другого типа.
Надежность и отказоустойчивость. Система должна быть защищена как от внутренних, так и от внешних ошибок, сбоев и отказов. Ее действия должны быть всегда предсказуемыми, а приложения не должны наносить вред ОС.
Совместимость. ОС должна иметь средства для выполнения прикладных программ, написанных для других операционных систем. Кроме того, пользовательский интерфейс должен быть совместим с существующими системами и стандартами.
Безопасность. ОС должна обладать средствами защиты ресурсов одних пользователей от других.
Производительность. Система должна обладать настолько хорошим быстродействием и временем реакции, насколько это позволяет аппаратная платформа.
Рассмотрим более подробно некоторые из этих требований.
Расширяемость
В то время как аппаратная часть компьютера устаревает за несколько лет, полезная жизнь операционных систем может измеряться десятилетиями. Примером может служить ОС UNIX. Поэтому операционные системы всегда эволюционно изменяются со временем, и эти изменения более значимы, чем изменения аппаратных средств. Изменения ОС обычно представляют собой приобретение ею новых свойств. Например, поддержка новых устройств, таких, как CD-ROM, возможность связи с сетями нового типа, поддержка многообещающих технологий, таких, как графический интерфейс пользователя или объектно-ориентированное программное окружение, использование более чем одного процессора. Сохранение целостности кода, какие бы изменения не вносились в операционную систему, является главной целью разработки.
Расширяемость может достигаться за счет модульной структуры ОС, при которой программы строятся из набора отдельных модулей, взаимодействующих только через функциональный интерфейс. Новые компоненты могут быть добавлены в операционную систему модульным путем, они выполняют свою работу, используя интерфейсы, поддерживаемые существующими компонентами.
Использование объектов для представления системных ресурсов также улучшает расширяемость системы. Объекты - это абстрактные типы данных, над которыми можно производить только те действия, которые предусмотрены специальным набором объектных функций. Объекты позволяют единообразно управлять системными ресурсами. Добавление новых объектов не разрушает существующие объекты и не требует изменений существующего кода.
Прекрасные возможности для расширения предоставляет подход к структурированию ОС по типу клиент-сервер с использованием микроядерной технологии. В соответствии с этим подходом ОС строится как совокупность привилегированной управляющей программы и набора непривилегированных услуг-серверов. Основная часть ОС может оставаться неизменной, в то время как могут быть добавлены новые серверы или улучшены старые.
Средства вызова удаленных процедур (RPC) также дают возможность расширить функциональные возможности ОС. Новые программные процедуры могут быть добавлены в любую машину сети и немедленно поступить в распоряжение прикладных программ на других машинах сети.
Некоторые ОС для улучшения расширяемости поддерживают загружаемые драйверы, которые могут быть добавлены в систему во время ее работы. Новые файловые системы, устройства и сети могут поддерживаться путем написания драйвера устройства, драйвера файловой системы или транспортного драйвера и загрузки его в систему.
Переносимость
Требование переносимости кода тесно связано с расширяемостью. Расширяемость позволяет улучшать операционную систему, в то время как переносимость дает возможность перемещать всю систему на машину, базирующуюся на другом процессоре или аппаратной платформе , делая при этом по возможности небольшие изменения в коде. Хотя ОС часто описываются либо как переносимые, либо как непереносимые, переносимость - это не бинарное состояние. Вопрос не в том, может ли быть система перенесена, а в том, насколько легко можно это сделать. Написание переносимой ОС аналогично написанию любого переносимого кода - нужно следовать некоторым правилам.
Во-первых, большая часть кода должна быть написана на языке, который имеется на всех машинах, куда вы хотите переносить систему. Обычно это означает, что код должен быть написан на языке высокого уровня, предпочтительно стандартизованном, например, на языке С. Программа, написанная на Ассемблере, не является переносимой, если только вы не собираетесь переносить ее на машину, обладающую командной совместимостью с вашей.
Во-вторых, следует учесть, в какое физическое окружение программа должна быть перенесена. Различная аппаратура требует различных решений при создании ОС. Например, ОС, построенная на 32-битовых адресах, не может быть перенесена на машину с 16-битовыми адресами (разве что с огромными трудностями).
В-третьих, важно минимизировать или, если возможно, исключить те части кода, которые непосредственно взаимодействуют с аппаратными средствами.
Зависимость от аппаратуры может иметь много форм. Некоторые очевидные формы зависимости включают прямое манипулирование регистрами и другими аппаратными средствами.
В-четвертых, если аппаратно - зависимый код не может быть полностью исключен, то он должен быть изолирован в нескольких хорошо локализуемых модулях. Аппаратно-зависимый код не должен быть распределен по всей системе. Например, можно спрятать аппаратно-зависимую структуру в программно-задаваемые данные абстрактного типа. Другие модули системы будут работать с этими данными, а не с аппаратурой, используя набор некоторых функций. Когда ОС переносится, то изменяются только эти данные и функции, которые ими манипулируют.
Для легкого переноса ОС при ее разработке должны быть соблюдены следующие требования:
1. Переносимый язык высокого уровня. Большинство переносимых ОС написано на языке С (стандарт ANSI X3.159-1989). Разработчики выбирают С, потом что он стандартизован и потому что С - компиляторы широко доступны. Ассемблер используется только для тех частей системы, которые должны непосредственно взаимодействовать с аппаратурой (например, обработчик прерываний), или для частей, которые требуют максимальной скорости (например, целочисленная арифметика повышенной точности). Однако непереносимый код должен быть тщательно изолирован внутри тех компонентов, где он используется.
2.Изоляция процессора. Некоторые низкоуровневые части ОС должны иметь доступ к процессорно-зависимым структурам данных и регистрам. Однако код, который делает это, должен содержаться в небольших модулях, которые могут быть заменены аналогичными модулями для других процессоров.
3.Изоляция платформы. Зависимость от платформы заключается в различиях между рабочими станциями разных производителей, построенными на одном и том же процессоре (например, MIPS R4000). Должен быть введен программный уровень, абстрагирующий аппаратуру (кэши, контроллеры прерываний ввода-вывода и т. п.) вместе со слоем низкоуровневых программ таким образом, чтобы высокоуровневый код не нуждался в изменении при переносе с одной платформы на другую.
Совместимость
Одним из аспектов совместимости является способность ОС выполнять программы, написанные для других ОС или для более ранних версий данной операционной системы, а также для другой аппаратной платформы.
Необходимо разделять вопросы двоичной совместимости и совместимости на уровне исходных текстов приложений. Двоичная совместимость достигается в том случае, когда можно взять исполняемую программу и запустить ее на выполнение на другой ОС. Для этого необходимы: совместимость на уровне команд процессора, совместимость на уровне системных вызовов и даже на уровне библиотечных вызовов, если они являются динамически связываемыми.
Совместимость на уровне исходных текстов требует наличия соответствующего компилятора в составе программного обеспечения, а также совместимости на уровне библиотек и системных вызовов. При этом необходима перекомпиляция имеющихся исходных текстов в новый выполняемый модуль.
Совместимость на уровне исходных текстов важна в основном для разработчиков приложений, в распоряжении которых эти исходные тексты всегда имеются. Но для конечных пользователей практическое значение имеет только двоичная совместимость, так как только в этом случае они могут использовать один и тот же коммерческий продукт, поставляемый в виде двоичного исполняемого кода, в различных операционных средах и на различных машинах.
Обладает ли новая ОС двоичной совместимостью или совместимостью исходных текстов с существующими системами - зависит от многих факторов. Самый главный из них - архитектура процессора, на котором работает новая ОС. Если процессор, на который переносится ОС, использует тот же набор команд (возможно с некоторыми добавлениями) и тот же диапазон адресов, тогда двоичная совместимость может быть достигнута достаточно просто.
Гораздо сложнее достичь двоичной совместимости между процессорами, основанными на разных архитектурах. Для того чтобы один компьютер выполнял программы другого (например, DOS-программу на Mac), этот компьютер должен работать с машинными командами, которые ему изначально непонятны.
Например, процессор типа 680x0 на Mac должен исполнять двоичный код, предназначенный для процессора 80x86 в PC. Процессор 80x86 имеет свои собственные дешифратор команд, регистры и внутреннюю архитектуру. Процессор 680x0 не понимает двоичный код 80x86, поэтому он должен выбрать каждую команду, декодировать ее, чтобы определить, для чего она предназначена, а затем выполнить эквивалентную подпрограмму, написанную для 680x0. Так как, к тому же, у 680x0 нет в точности таких же регистров, флагов и внутреннего арифметико-логического устройства, как в 80x86, он должен имитировать все эти элементы с использованием своих регистров или памяти. И он должен тщательно воспроизводить результаты каждой команды, что требует специально написанных подпрограмм для 680x0, гарантирующих, что состояние эмулируемых регистров и флагов после выполнения каждой команды будет в точности таким же, как и на реальном 80x86.
Это простая, но очень медленная работа, так как микрокод внутри процессора 80x86 исполняется на значительно более быстродействующем уровне, чем эмулирующие его внешние команды 680x0. За время выполнения одной команды 80x86 на 680x0 реальный 80x86 может выполнить десятки команд. Следовательно, если процессор, производящий эмуляцию, не настолько быстр, чтобы компенсировать все потери при эмуляции, то программы, исполняющиеся под эмуляцией, будут очень медленными.
Выходом в таких случаях является использование так называемых прикладных сред. Учитывая, что основную часть программы, как правило, составляют вызовы библиотечных функций, прикладная среда имитирует библиотечные функции целиком, используя заранее написанную библиотеку функций аналогичного назначения, а остальные команды эмулирует каждую по отдельности.
Соответствие стандартам POSIX также является средством обеспечения совместимости программных и пользовательских интерфейсов. Во второй половине 80-х гг.правительственные агентства США начали разрабатывать POSIX как стандарты на поставляемое оборудование при заключении правительственных контрактов в компьютерной области.
POSIX - это " интерфейс переносимой ОС, базирующейся на UNIX". POSIX - собрание международных стандартов интерфейсов ОС в стиле UNIX. Использование стандарта POSIX (IEEE стандарт 100 3.1 - 1988) позволяет создавать программы стиле UNIX, которые могут легко переноситься из одной системы в другую.
Безопасность
В дополнение к стандарту POSIX также определены требования компьютерной безопасности для приложений. Многие из этих требований являются желаемыми свойствами для любой многопользовательской системы. Правила безопасности определяют такие свойства, как защита ресурсов одного пользователя от других и установление квот по ресурсам для предотвращения захвата одним пользователем всех системных ресурсов (таких, как память).
Обеспечение защиты информации от несанкционированного доступа является обязательной функцией сетевых операционных систем. В большинстве популярных систем гарантируется степень безопасности данных, соответствующая уровню С2 в системе стандартов США. Основы стандартов в области безопасности были заложены "Критериями оценки надежных компьютерных систем". Этот документ, изданный в США в 1983 году Национальным центром компьютерной безопасности (NCSC - National Computer Security Center), часто называют Оранжевой Книгой.
В соответствии с требованиями Оранжевой Книги, безопасной считается такая система, которая "посредством специальных механизмов защиты контролирует доступ к информации таким образом, что только имеющие соответствующие полномочия лица или процессы, выполняющиеся от их имени, могут получить доступ на чтение, запись, создание или удаление информации".
Иерархия уровней безопасности, приведенная в Оранжевой Книге, помечает низший уровень безопасности как D, а высший - как А.
В класс D попадают системы, оценка которых выявила их несоответствие требованиям всех других классов.
Основными свойствами, характерными для С - систем, являются: наличие подсистемы учета событий, связанных с безопасностью, и избирательный контроль доступа.
Уровень С делится на 2 подуровня: уровень С1, обеспечивающий защиту данных от ошибок пользователей, но не от действий злоумышленников, и более строгий уровень С2. На уровне С2 должны присутствовать средства секретного входа, обеспечивающие идентификацию пользователей путем ввода уникального имени и пароля перед тем, как им будет разрешен доступ к системе. Избирательный контроль доступа, требуемый на этом уровне, позволяет владельцу ресурса определить, кто имеет доступ к ресурсу, и что он может с ним делать. Владелец делает это путем предоставляемых прав доступа пользователю или группе пользователей. Средства учета и наблюдения (auditing) обеспечивают возможность обнаружить и зафиксировать важные события, связанные с безопасностью, или любые попытки создать, получить доступ или удалить системные ресурсы. Защита памяти заключается в том, что память инициализируется перед тем как повторно используется. На этом уровне система не защищена от ошибок пользователя, но поведение его может быть проконтролировано по записям в журнале, оставленным средствами наблюдения и аудитинга.
Системы уровня В основаны на помеченных данных и распределении пользователей по категориям, то есть реализуют мандатный контроль доступа. Каждому пользователю присваивается рейтинг защиты, и он может получать доступ к данным только в соответствии с этим рейтингом. Этот уровень, в отличие от уровня С, защищает систему от ошибочного поведения пользователя.
Уровень А является самым высоким уровнем безопасности, он требует, в дополнение ко всем требованиям уровня В, выполнения формального, математически обоснованного доказательства соответствия системы требованиям безопасности.
Различные коммерческие структуры (например, банки) особо выделяют необходимость учетной службы, аналогичной той, что предлагают государственные рекомендации С2. Любая деятельность, связанная с безопасностью, может быть отслежена и тем самым учтена. Это как раз то, что требует С2, и то, что обычно нужно банкам. Однако коммерческие пользователи, как правило, не хотят расплачиваться производительностью за повышенный уровень безопасности.А - уровень безопасности занимает своими управляющими механизмами до 90% процессорного времени. Более безопасные системы не только снижают эффективность, но и существенно ограничивают число доступных прикладных пакетов, которые соответствующим образом могут выполняться в подобной системе. Например, для ОС Solaris (версия UNIX) есть несколько тысяч приложений, а для ее аналога В - уровня - только сотня.
УПРАВЛЕНИЕ АСИНХРОННЫМИ ПАРАЛЛЕЛЬНЫМИ
ПРОЦЕССАМИ
Процессам часто нужно взаимодействовать друг с другом, например, один процесс может передавать данные другому процессу, или несколько процессов могут обрабатывать данные из общего файла. Во всех этих случаях возникает проблема синхронизации процессов, которая может решаться приостановкой и активизацией процессов, организацией очередей, блокированием и освобождением ресурсов.
Одной из важных характеристик ОС является возможность одновременного выполнения взаимосвязанных процессов. Надо сказать, что в распараллеливании процессов состоит один из основных резервов повышения быстродействия и производительности ЭВМ.
Процессы называются параллельными, если они существуют одновременно. Одновременно выполняющиеся и не взаимосвязанные процессы называются параллельными процессами. Одновременно выполняющиеся, взаимодействующие и совместно использующие общие ресурсы, называются асинхронными параллельными процессами.
При управлении асинхронными параллельными процессами возникает две проблемы:
1. Проблема синхронизации параллельных процессов;
2.Проблема взаимной блокировки – тупика («смертельное объятие»-deadlock)
Пример 1. Писатели – читатели.
Пренебрежение вопросами синхронизации процессов, выполняющихся в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы. Рассмотрим, например, программу печати сообщений (принт-сервер) (рис.4.1). Эта программа печатает по очереди все сообщения, которые последовательно в порядке поступления записывают в специальный общедоступный файл другие программы. Особая переменная N, также доступная всем процессам-клиентам, содержит номер первого свободного для записи сообщения. Процессы-клиенты читают эту переменную, записывают в соответствующую позицию сообщение и наращивают значение N на единицу.
Предположим, что в некоторый момент процесс R решил распечатать сообщение, для этого он прочитал значение переменной N (для определенности сделаем его равным 4). Процесс запомнил это значение, но поместить сообщение не успел, так как его выполнение было прервано (например, вследствие исчерпания кванта).
Очередной процесс S, желающий распечатать сообщение, прочитал то же самое значение переменной N, поместил в четвертую позицию свое сообщение и нарастил значение переменной на единицу. Когда в очередной раз управление будет передано процессу R, то он, продолжая свое выполнение, в полном соответствии со значением текущей свободной позиции, полученным во время предыдущей итерации, запишет сообщение также в позицию 4, поверх сообщения процесса S.
Таким образом, процесс S никогда не увидит свое сообщение распечатанным.
Особенности взаимодействия:
1.
Процессы автономны, но должны кооперироваться во время выполнения работы (писать - читать). Проблема: очередь пустая / буфер заполнен.
2. Для правильной работы процессы должны быть синхронизированы друг с другом. На участке работ с общим ресурсом онидолжны взаимоисключать друг друга (блокировать друг друга), иначе результат может быть неверным и непредсказуемым.
Рис. 4.1. Кооперация программ при работе с общим ресурсом.
В связи с рассмотренной ситуацией важным понятием процессов является понятие "критическая секция" программы. Критическая секция - это часть программы, в которой осуществляется доступ к разделяемым данным синхронизации. Чтобы исключить ситуацию, когда два или более процессов обрабатывают разделяемые данные, необходимо сделать так, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением.
Пример 2. Распределение ресурсов между параллельными процессами
Простая тупиковая ситуация возникает для группы общих ресурсов (тупик - "смертельное объятие"). Программа 1, захватив ресурс 1, для продолжения работы нуждается в ресурсе 2, который захватила и удерживает программа 2, для завершения работы которой, в свою очередь, требуется ресурс 1, удерживаемый программой 1 (рис.4.2).
Рис.4.2. Тупиковая ситуация
Таким образом, подсистема УП асинхронными параллельными процессами должна обеспечить решение двух следующих задач:
1.Синхронизацию и кооперирование процессов.
2. Предотвращение взаимной блокировки процессов по ресурсам.
Задача синхронизации АПП в ОС решается методом взаимоисключения процессов при выполнении их на критических участках. Для взаимоисключения процессов на критических участках используется три средства:
1.Примитивы взаимоисключения.
2.Семафоры.
3.Мониторы.
Примитивы взаимоисключения используются для обработки критических участков программы и определяются совокупностью логической переменной I, представляющей общий ресурс и принимающей два значения: 0 - свободен, 1 - занят, и командой TS, TS,I,B01
(проверить и установить).
а) читает логическую переменную I;
б) проверяет ее значение;
в) устанавливает новое значение I.
Следует заметить, что операция проверки и установки блокирующей переменной должна быть неделимой. Поясним это. Пусть в результате проверки переменной процесс определил, что ресурс свободен, но сразу после этого, не успев установить переменную в 0, был прерван. За время его приостановки другой процесс занял ресурс, вошел в свою критическую секцию, но также был прерван, не завершив работы с разделяемым ресурсом. Когда управление было возвращено первому процессу, он, считая ресурс свободным, установил признак занятости и начал выполнять свою критическую секцию. Таким образом, был нарушен принцип взаимного исключения, что потенциально может привести к нежелаемым последствиям.
Ниже в примере 3 перед входом в критическую секцию процесс проверяет, свободен ли ресурс. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной I устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом D, значение переменной I снова устанавливается равным 0.
Пример 3.
A. B.
Do while (TS I,B’1’) Do while (TS I,B’1’)
END END
<критический участок> <критический участок>
TS I,B’0’ TS I,B’0’
Обеспечивается исключительное право доступа к разделяемым ресурсам. При этом другим процессам приходится ожидать освобождения ресурса. Естественно, что процессы должны быстрее проходить критические участки и не должны блокироваться системой. Примитив взаимоисключения - самое простое решение.
Недостатки:
1. Циклический опрос переменной I и бессмысленное расходование времени ЦП.
2. Не исключено бесконечное ожидание ресурса, хотя вероятность невелика.
3. Работает с одним ресурсом.
Для устранения расходования времени ЦП может быть использован так называемый аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по - своему, но в любом случае используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где x - идентификатор некоторого события. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(I), здесь I обозначает событие, заключающееся в освобождении ресурса I. Функция WAIT(I) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события I. Процесс, который в это время использует ресурс I, после выхода из критической секции выполняет системную функцию POST(I), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события I, в состояние ГОТОВНОСТЬ
Семафор развивает механизм примитивов и обобщает его. Автор –
Е. Дейкстра. Семафор - это целочисленная неотрицательная переменная S – счетчик ресурса, которую можно менять и опрашивать при помощи операций P
и V, и очередь процессов к ресурсу Q(S).
Над переменной определено три операции:
- инициализация ресурса I(S) - задает число доступных ресурсов;
- P(S) - захват ресурса;
- V(S)
- освобождение ресурса.
Операция P(S) выполняется следующим образом:
IF S>0 есть ресурс?
THEN S:=S-1 выдать ресурс
ELSE Q(S) ожидать очереди);
Операция V(S):
IF Q(S)¹0 очередь не пуста?
THEN вывести процесс из очереди выдать ресурс
ELSE S:=S+1 освободить ресурс;
Если семафор управляет одним ресурсом, то это двоичный семафор, и S принимает значение {0,1}. Если он управляет группой ресурсов, то в переменной S устанавливается число ресурсов. Для работы семафора необходимо один раз инициировать процесс и обрабатывать критические участки операциями P(S) и V(S).
Рассмотрим использование семафоров на классическом примере взаимодействия двух процессов, выполняющихся в режиме мультипрограммирования, один из процессов пишет данные в буферный пул, а другой считывает их из буферного пула. Пусть буферный пул состоит из N
буферов, каждый из которых может содержать одну запись. Процесс "писатель" должен приостанавливаться, когда все буфера оказываются занятыми, и активизироваться при освобождении хотя бы одного буфера. Напротив, процесс "читатель" приостанавливается, когда все буферы пусты, и активизируется при появлении хотя бы одной записи.
Введем два семафора: e
- число пустых буферов и f - число заполненных буферов. Предположим, что запись в буфер и считывание из буфера являются критическими секциями (как в примере с принт-сервером в начале данного раздела). Введем также двоичный семафор b, используемый для обеспечения взаимного исключения. Тогда процессы могут быть описаны следующим образом:
// Глобальные переменные
#define N 256
int e = N, f = 0, b = 1;
void Writer ()
{
while(1)
{
PrepareNextRecord(); /* подготовка новой записи */
P(e); /* Уменьшить число свободных буферов, если они есть */
/* в противном случае ждать, пока они освободятся */
P(b); /* Вход в критическую секцию */
AddToBuffer(); /* Добавить новую запись в буфер */
V(b); /* Выход из критической секции */
V(f); /* Увеличить число занятых буферов */
}
}
void Reader ()
{
while(1)
{
P(f); /* Уменьшить число занятых буферов, если они есть */
/* в противном случае ждать, пока они появятся */
P(b); /* Вход в критическую секцию */
GetFromBuffer(); /* Взять запись из буфера */
V(b); /* Выход из критической секции */
V(e); /* Увеличить число свободных буферов */
ProcessRecord(); /* Обработать запись */
}
}
Общая схема использования семафоров на критических участках для двух процессов приведена на рис.4.3.
Достоинства использования операций на семафоре:
1.Пассивное ожидание (постановка в очередь и автоматическая выдача ресурсов)
2.Возможность управления группой однородных ресурсов.
Рис.4.3. Критические участки с использованием операций на семафоре
Недостатки:
Неправильное либо умышленное использование операций на семафоре приводит к нарушению работоспособности параллельных систем.
Действительно, если в рассмотренном примере переставить местами операции P(e) и P(b) в программе "писатель", то при некотором стечении обстоятельств эти два процесса могут взаимно заблокировать друг друга. Так, пусть "писатель" первым войдет в критическую секцию и обнаружит отсутствие свободных буферов; он начнет ждать, когда "читатель" возьмет очередную запись из буфера, но "читатель" не сможет этого сделать, так как для этого необходимо войти в критическую секцию, вход в которую заблокирован процессом "писатель".
Монитор - это механизм организации параллелизма высокого уровня, который содержит множество переменных состояний, очередей и множество процедур, необходимых для реализации динамического распределения и доступа к общим ресурсам.
Монитор представляет собой централизованный семафор или совокупность семафоров, спрятанных от пользователей процессов в одном системном процессе, и потому, недоступным пользовательским программам, которые не могут их нарушить. Процессы, которые использует монитор для синхронизации, не имеют прямого доступа к переменным состояния, и могут воспользоваться ресурсами только путем вызова процедур монитора (или макрокоманд).
Монитор при создании автоматически инициирует число ресурсов и включает процедуры, позволяющие блокировать и активизировать процессы. Вход в монитор находится под жестким контролем системы и только через монитор осуществляется взаимоисключение процессов. Если процесс обращается к монитору и требуемый ресурс занят, то процесс переводится в состояние ожидания. Со временем некоторый процесс обращается к монитору для возвращения ресурса и монитор оповещает процесс о том, что может выделить ресурс и покинуть очередь. Режимом ожидания управляет сам монитор, который для гарантии получения ресурса
процессом повышает приоритеты процессов критических областей. На рис.4.4 критический участок программируется в мониторе
Рис. 4.4. Схема использования монитора.
Достоинства монитора:
1. Логические возможности не меньше, чем у семафоров.
2. Упрощение написания параллельных программ. Достаточно знать процедуры организации параллельных вычислений.
3. Повышение надежности параллельных систем, так как полностью защищает управление ресурсом.
4. Обеспечение гарантированного получения ресурса.
Первая рассмотренная нами проблема, возникающая для асинхронных параллельных процессов, работающих с общим ресурсом - это проблема синхронизации процессов.
Вторая проблема - это проблема тупика, возникающая при выполнении асинхронных параллельных процессов, работающих с монопольными ресурсами (взаимоблокировка). Тупиком
называется ситуация, когда процесс ждет наступления события (выделения ресурса), которое никогда не произойдет или может бесконечно откладываться.
Для возникновения тупика необходимо наличие 4-х условий:
1.Взаимоисключение, когда процессы требуют монопольного предоставления ресурса.
2.Ожидание дополнительного ресурса, когда процессы удерживают ресурсы и требуют дополнительных ресурсов.
3.Неперераспределяемости ресурсов, когда ресурсы нельзя отобрать у процессов до завершения их работы.
4.Кругового ожидания, когда существует кольцо процессов, удерживающих ресурсы друг друга.
Для решения проблемы тупиков должны выполняться определенные задачи:
1.Предотвращение тупиков.
Путем исключения одного из необходимых условий возникновения тупиков, кроме условий взаимоисключения (это объективное условие).
– условие ожидания дополнительных ресурсов можно нарушить, если потребовать, чтобы процессы запрашивали сразу все ресурсы. (Недостаток - снижение уровня мультипрограммирования и нерациональное использование ресурсов);
- условие неперераспределяемости можно нарушить, если потребовать, чтобы процесс, который не получил дополнительных ресурсов, сам освобождал удерживаемые;
- условие кругового ожидания можно предотвратить, если процессы запрашивают ресурсы в заранее определенном порядке, то есть ресурсы имеют уникальные упорядоченные номера, которые распределяются в соответствии с некоторым планом (планирование распределения ресурсов).
Путем обхода
тупиков. Это решение основывается на том, что все процессы заранее указывают максимальное число требуемых ресурсов, и ОС контролирует возможность их совместного удовлетворения.
2.Обнаружение тупиков, когда возникающие тупики анализируются и прогнозируются с выдачей соответствующей информации операторам.
Возможные тупики анализируются по графам распределения ресурсов. Существуют формальные, программно-реализованные методы распознавания тупиков, основанные на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки.
3.Восстановление после тупиков осуществляется путем вывода из системы одного или N процессов, вовлеченных в тупик и почти всегда с потерей полученных результатов работы. Не обязательно снимать с выполнения все заблокированные процессы. Можно снять только часть из них, при этом освобождаются ресурсы, ожидаемые остальными процессами, можно вернуть некоторые процессы в область свопинга, можно совершить "откат" некоторых процессов до так называемой контрольной точки, в которой запоминается вся информация, необходимая для восстановления выполнения программы с данного места. Контрольные точки расставляются в программе в местах, после которых возможно возникновение тупика.
В настоящее время проблема тупика является критическим фактором по следующим причинам:
- широкое распространение получают мультипроцессорные и параллельные вычисления;
- в системах выполняется преимущественно динамическое распределение ресурсов;
- тенденция рассмотрения данных как ресурса приводит к возрастанию числа управляемых ресурсов.
УПРАВЛЕНИЕ ОСНОВНОЙ ПАМЯТЬЮ
Основная память (ОП), в которой размещаются процессы и которая имеет ограниченный объем, представляет собой самый ограниченный и дорогостоящий ресурс. Поэтому организация и управление ОП ЭВМ является одним из самых важных факторов, определяющих построение и развитие ОС.
Именно организация и управление ОП во многом определяют фактический уровень мультипрограммирования ОС, то есть возможность выполнения нескольких параллельных процессов. Функциями ОС по управлению памятью являются: отслеживание свободной и занятой памяти, выделение памяти процессам и освобождение памяти при завершении процессов, вытеснение процессов из оперативной памяти на диск, когда размеры основной памяти не достаточны для размещения в ней всех процессов, и возвращение их в оперативную память, когда в ней освобождается место, а также настройка адресов программы на конкретную область физической памяти.
Основными задачами подсистемы управления памятью (УП) являются:
1.Эффективное размещение процессов в ОП.
2.Защита памяти процессов.
Основная цель УП - обеспечить максимальный уровень мультипрограммирования и, тем самым, максимальную загрузку ЦП.
Современные ЭВМ имеют 3-х уровневую иерархическую организацию запоминающих устройств (внутренние регистры процессора, различные типы сверхоперативной и оперативной памяти, диски, ленты), отличающихся средним временем доступа и стоимостью хранения данных в расчете на один бит (рис.5.1). Пользователю хотелось бы иметь и недорогую, и быструю память. Кэш-память представляет некоторое компромиссное решение этой проблемы.
Рис.5.1. Иерархическая организация памяти ЭВМ.
Кэш-память - это способ организации совместного функционирования двух типов запоминающих устройств, отличающихся временем доступа и стоимостью хранения данных, который позволяет уменьшить среднее время доступа к данным за счет динамического копирования в "быстрое" ЗУ наиболее часто используемой информации из "медленного" ЗУ.
Кэш-памятью часто называют не только способ организации работы двух типов запоминающих устройств, но и одно из устройств - "быстрое" ЗУ.
Оно стоит дороже и, как правило, имеет сравнительно небольшой объем. Важно, что механизм кэш-памяти является прозрачным для пользователя, который не должен сообщать никакой информации об интенсивности использования данных и не должен никак участвовать в перемещении данных из ЗУ одного типа в ЗУ другого типа, все это делается автоматически системными средствами.
Рассмотрим частный случай использования кэш-памяти для уменьшения среднего времени доступа к данным, хранящимся в оперативной памяти. Для этого между процессором и оперативной памятью помещается быстрое ЗУ, называемое просто кэш-памятью. В качестве такового может быть использована, например, ассоциативная память. Содержимое кэш-памяти представляет собой совокупность записей обо всех загруженных в нее элементах данных. Каждая запись об элементе данных включает в себя адрес, который этот элемент данных имеет в оперативной памяти, и управляющую информацию: признак модификации и признак обращения к данным за некоторый последний период времени.
В системах, оснащенных кэш-памятью, каждый запрос к оперативной памяти выполняется в соответствии со следующим алгоритмом:
Просматривается содержимое кэш-памяти с целью определения, не находятся ли нужные данные в кэш-памяти; кэш-память не является адресуемой, поэтому поиск нужных данных осуществляется по содержимому - значению поля "адрес в оперативной памяти", взятому из запроса.
Если данные обнаруживаются в кэш - памяти, то они считываются из нее, и результат передается в процессор. Если нужных данных нет, то они вместе со своим адресом копируются из оперативной памяти в кэш-память, и результат выполнения запроса передается в процессор. При копировании данных может оказаться, что в кэш-памяти нет свободного места, тогда выбираются данные, к которым в последний период было меньше всего обращений, для вытеснения из кэш-памяти. Если вытесняемые данные были модифицированы за время нахождения в кэш-памяти, то они переписываются в оперативную память. Если же эти данные не были модифицированы, то их место в кэш-памяти объявляется свободным.
На практике в кэш- память считывается не один элемент данных, к которому произошло обращение, а целый блок данных, это увеличивает вероятность так называемого "попадания в кэш", то есть нахождения нужных данных в кэш-памяти.
В реальных системах вероятность попадания в кэш составляет примерно 0,9. Высокое значение вероятности нахождения данных в кэш-памяти связано с наличием у данных объективных свойств: пространственной и временной локальности.
Пространственная локальность. Если произошло обращение по некоторому адресу, то с высокой степенью вероятности в ближайшее время произойдет обращение к соседним адресам.
Временная локальность. Если произошло обращение по некоторому адресу, то следующее обращение по этому же адресу с большой вероятностью произойдет в ближайшее время.
Все предыдущие рассуждения справедливы и для других пар запоминающих устройств, например, для оперативной памяти и внешней памяти. В этом случае уменьшается среднее время доступа к данным, расположенным на диске, и роль кэш-памяти выполняет буфер в оперативной памяти.
Физически ОП имеет линейную организацию и представляет собой последовательность адресуемых ячеек (байт, 1 байт = 8 бит) от 0 до N, которая делится на слова, блоки, сегменты. Номер является адресом ячейки памяти. Размер ОП определяется в килобайтах (1Кб=1024б), мегабайтах (1Мб=1024Кб), гигабайтах (1Гб=1024Мб), терабайтах (1Тб=1024 Гб) и т.д.
Слово- это единица обмена ОП с ЦП, определяемое разрядностью с ЦП.
Блок - это непрерывная область памяти с общим ключом защиты. В EC ЭВМ - размер блока 2К, поэтому процессом выдается память, кратная 2К.
Сегмент - это некоторый участок памяти (для IBM PC от 16б до 64Кб). Сегмент может содержать несколько блоков.
Для эффективного использования ОП необходимо определить стратегию управления памятью. ОС постоянно приходится решать задачу: когда, куда и за счет кого ввести в ОП процесс и данные. Существует три стратегии управления ОП:
1. Стратегия выборки - определяет, когда разместить в ОП очередной блок программы или данных.
а) выборка по запросу (требованию), когда очередной блок загружается по требованию процесса. При такой реализации невозможно в общем случае определить передачу управления в программе (настройка адресов должна быть выполнена после загрузки);
б) упреждающая выборка основана на свойствах последовательного выполнения программы и локальности циклов. В настоящее время это наиболее употребляемая стратегия.
2. Стратегия размещения, определяющая, куда помещать поступающую программу.
а) "первый подходящий" участок (эффективность по времени размещения);
б) "наиболее подходящий" участок (эффективность по объему);
в) "наименее подходящий" - странная стратегия со следующей аргументацией: после размещения процесса в больший свободный участок, оставшееся место также велико и может быть достаточно для размещения еще одной программы. Псевдоэффективность по мультипрограммированию.
3. Стратегия замещения
определяет какой блок/сегмент программы или данных следует вытолкнуть из ОП для освобождения места для более приоритетных программ (в системах со свопингом). Естественно, что организация памяти тесно связана с мощностью ЦП, объемом ОП и режимом мультипрограммирования.
Существуют 4 вида организации реальной памяти:
1.
Однопрограммная организация памяти с выделением непрерывной области одному пользователю. Это самая простая организация, которая использовалась на первых ЭВМ и на микро-ЭВМ, а также и на первых персональных компьютерах (PC) (рис. 5.2).
Рис. 5.2. Примеры организации памяти с выделением непрерывной области одному пользователю
Достоинства: простота защиты оперативной памяти. Для защиты требуется пара регистров, определяющих границы доступа ОП.
Недостатки: простаивает ЦП, а следовательно, и ОП, и устройства ввода/вывода. Неэффективное использование ЭВМ даже при наличии потока заданий, когда задания формируются в пакеты (режим PCP для ЕС ЭВМ).
2. Мультипрограммная организация с фиксированными разделами представлена на рис.5.3.
ОП при загрузке ОС статически разбивается на ряд разделов фиксированного размера, в каждом из которых может выполняться одно задание (режим MFT OC в ЕС ЭВМ, MP?? фирмы Digital Research для 8 и 16 – разрядных процессоров Intel 8080, 8086).
Задание (программа) может помещаться в любой свободный раздел, размер которого это допускает. Защита памяти осуществляется парой регистров для каждого раздела ОП.
Рис. 5.3. Мультипрограммная организация с фиксированными разделами
Достоинства: большая загрузка ЦП и повышение пропускной способности ВС.
Недостатки:
1. Внешняя фрагментация, которая выражается в недостаточности разделов для больших программ, что требует перезагрузки ОС для назначения больших разделов.
2.Внутренняя фрагментация, при которой совокупная неиспользованная память может быть достаточной для выполнения программы, но разделена на несвязные участки и не может быть задействована для размещения процессов и данных.
3.Мультипрограммированная организация с переменными разделами, при которой ОП разделяется динамически между процессами по запросам заданий (программ) пользователей (рис.5.4).
Рис. 5.4. Мультипрограммная организация с переменными разделами
Области памяти выделяются непрерывные из участков свободной памяти в соответствии с реализованными стратегиями размещения. При окончании заданий соседние свободные участки ОП объединяются. Защита памяти аналогичная режиму с фиксированными разделами.
Достоинства: повышается уровень мультипрограммирования, исчезает внутренняя фрагментация (выделяется памяти столько, сколько требуется).
Недостатки: внешняя фрагментация памяти - образование неиспользованных участков в целом может давать большие потери объема и мультипрограммирования.
Проблема - совокупность свободных участков достаточна для выполнения программы, а поскольку они не смежные, то не могут быть использованы для размещения процессов или данных.
Эта проблема в частности решается методом уплотнения памяти (“сборки мусора”). Такая процедура может выполняться либо при каждом завершении задачи, либо только тогда, когда для вновь поступившей задачи нет свободного раздела достаточного размера.
В первом случае требуется меньше вычислительной работы при корректировке таблиц, а во втором - реже выполняется процедура сжатия. Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то преобразование адресов из виртуальной формы представления в физическую должно выполняться динамически.
Недостатки
этого метода:
а) используется время ЦП на уплотнение;
б) во время уплотнения ОС прекращает выполнение процессов пользователей (неприемлемо для СРВ).
Страничная организация памяти
реализует концепцию несвязного распределения памяти ЭВМ и означает
а) разделение ОП ЭВМ на блоки фиксированной длины размером от 1 до 4 Кб;
б) разделение адресного пространства программы загрузчиком на страницы фиксированного размера, равного длине блока;
в) динамически поблочно выделяется память программам в любом месте ЭВМ;
г) аппаратная поддержка соответствия номеров блоков ОП ЭВМ и страниц процесса по соответствующей таблице отображения страниц, пример которой приведен на рис.5.5.
Рис.5.5. Таблица отображения страниц (ТОС):
Достоинства:
1.Отсутствие внешней фрагментации (достаточно разделов для больших программ).
2.Внутренняя фрагментация ограничена размером блока ОП ЭВМ < 1 -4 Кб.
Общий итог развития форм организации реальной ОП - практически полная ликвидация фрагментации.
Общие недостатки реальной ОП:
(Физический)
ограниченный объем реальной памяти и, соответственно, максимального объема выполняемой программы. Адресное пространство ЭВМ определяется разрядностью адресов, допустимых в архитектуре ЭВМ, а программа не может быть размером больше чем реальный объем ОП.
ЕC ЭВМ – 24 - разрядные адресные регистры определяют допустимое адресное пространство размером 16 Мб, реально же устанавливается объем памяти 512 Кб - 8 Мб.
Pentium может адресовать своими 32-разрядными регистрами 4 Гб ОП, реально на компьютере устанавливается значительно меньший объем памяти (32-192 Мб). Нетрудно представить, какой огромный размер виртуальной ОП будет доступен с использованием анонсированного фирмой Intel 64 - разрядного процессора Merced.
(Логический) неэффективное использование РОП ввиду необходимости загрузки в ОП задания пользователя целиком, в то время как 85% времени выполнения программ реализуется обычно 5-10% команд программ.
Все упомянутые проблемы привели к появлению концепции виртуальной памяти как воплощения идеи виртуализации ресурсов.
УПРАВЛЕНИЕ ПЕРИФЕРИЙНЫМИ УСТРОЙСТВАМИ
Одной из главных функций ОС является управление всеми устройствами ввода-вывода компьютера. ОС должна передавать устройствам команды, перехватывать прерывания и обрабатывать ошибки; она также должна обеспечивать интерфейс между устройствами и остальной частью системы. В целях развития интерфейс должен быть одинаковым для всех типов устройств (независимость от устройств).
Подсистема управления периферийными устройствами (УПУ) предназначена для выполнения следующих функций:
-
передачи информации между ПУ и ОП, то есть ввод-вывод информации;
- слежения за состоянием периферийных устройств;
- обеспечения интерфейса между устройствами, а также подключения и отключения периферийных устройств и поддержки схемы распределения устройств;
- модификации конфигурации;
- обработки ошибок.
УПРАВЛЕНИЕ ПРОЦЕССАМИ
Подсистема управления процессами (УП) является наиболее интенсивно используемым компонентом ОС, входящим в состав ядра ОС, то есть резидентно размещенным в ОП и выполняющим следующие важнейшие функции:
1.
Представление процессов в ОС посредством блоков управления процессами.
2. Создание и уничтожение процессов.
3. Обработка прерываний и переключение процессов из состояния в состояние.
4. Синхронизация и организация взаимодействия между асинхронными и параллельными процессами.
Процессом
называется программа в стадии или во время выполнения. В большинстве ОС процесс соответствует заданию пользователя. В системе существует одновременно много процессов. Даже в однопрограммной ОС существует системный и пользовательский процессы и можно выделить два типа состояний: пассивное и активное (пассивное, когда запуск не производится или работа завершена). В период своего существования процесс проходит через ряд дискретных состояний, подразделяющихся на основные и дополнительные состояния.
Основные состояния процесса:
1. Состояние активности, когда процесс обладает всеми необходимыми ресурсами и непосредственно выполняется процессором.
2. Состояние готовности, когда процесс имеет все требуемые для него ресурсы, он готов выполняться, однако процессор занят выполнением другого процесса.
3. Состояние блокировки или ожидания, когда процесс не может выполняться по своим внутренним причинам, он ждет осуществления некоторого события, например, завершения операции ввода-вывода, получения сообщения от другого процесса, освобождения какого-либо необходимого ему ресурса.
Дополнительные состояния процесса:
1. Приостановка готовности, когда процесс готов, но задержан и не конкурирует за ЦП.
2. Приостановка блокировки, когда процесс блокирован и задержан. То есть также не будет конкурировать за ЦП.
Дополнительные состояния процессов кратковременны и обычно используются в ОС РВ (реального времени при перегрузках ЦП).
В однопроцессорных ЭВМ в каждый момент времени может выполняться только один процесс, и поэтому, когда один процесс активен, несколько процессов могут находиться в других состояниях, т.е. располагаться в соответствующих очередях (готовности, блокировки и др.). Очередью называется упорядоченный по приоритетам список процессов, ожидающих доступ к некоторому вычислительному ресурсу.
В ходе жизненного цикла каждый процесс переходит из одного состояния в другое в соответствии с алгоритмом планирования процессов, реализуемым в данной операционной системе. Диаграмма переходов процесса представлена на рис. 3.1.
Рис. 3.1. Диаграмма переходов процесса
1. Когда в ОС поступает задание на обслуживание, создается процесс, который устанавливается в очередь готовых процессов.
2. Процесс постепенно продвигается в очереди, и когда очередь подходит при освобождении ЦП, процесс переходит в состояние активности. Предоставление ЦП процесса называется запуском или выбором процесса для выполнения. Эту функцию выполняет системная программа, называющаяся диспетчером.
3. Процесс, получивший ЦП, выполняется. Для предотвращения случайного либо умышленного монопольного захвата ресурсов ЭВМ каким-либо процессом устанавливается временной интервал, называющийся квантом времени, в течение которого процессу разрешено занимать ЦП. Этот интервал устанавливается аппаратным таймером прерываний. По истечении кванта времени диспетчер возвращает процесс в состояние готовности и выбирает следующий готовый процесс.
4. Если выполняемый процесс до истечения кванта запрашивает какое-либо внешнее событие (обычно ввод-вывод), то добровольно освобождает ЦП, переводится в очередь блокировки до наступления события, безвозвратно теряет остаток кванта.
5. При наступлении события (завершении операции ввода/вывода) процесс переводится в состояние готовности.
Операции приостановки и возобновления играют важную роль в ОС РВ и используются в следующих случаях:
- при пиковой нагрузке ВС, когда она не может обеспечить требуемое быстродействие, когда расходы времени на смену состояний превышают полезную работу;
- при ненадежной работе системы и возможном ее отказе;
- когда промежуточные результаты работы процесса вызывают сомнение в правильности работы программы.
При приостановке процесс обязательно освобождает ОП, его копия сбрасывается на диск в специальный свопинг файл (swapping). Также могут быть освобождены и другие ресурсы.
6. В активном состоянии инициатором приостановки в однопроцессорной системе может быть сам процесс, а в мультипроцессорной системе другие процессы. В остальных состояниях – другие процессы (внешние события).
7. Возобновление (или активизация) процесса это операция подготовки процесса к повторному запуску с точки приостановки.
8. По завершении выполнения задания процесс уничтожается.
Все смены состояний происходят по прерываниям.
Прерывание – это событие/сигнал, привлекающий внимание ЦП и заставляющий его изменить текущий порядок исполнения команд процесса. Существуют аппаратные и программные прерывания.
Аппаратные прерывания инициируются аппаратурой (например, сигнал микросхемы таймера в IBM PC вырабатывается 18.2 раза в секунду), сигналом принтера, нажатием клавиш клавиатуры и многими другими причинами.
Программные прерывания инициируются процессом и на самом деле ничего не прерывают. Это обычные процедуры, которые используются программами для выполнения стандартной рутиной работы. Однако эти программы содержатся в ОС, и механизм прерываний дает возможность обратиться к ним из программ пользователей. Программные прерывания могут выдаваться внутри друг друга (быть вложенными).Например, аппаратные прерывания могут возникнуть при выполнении программных прерываний. Когда разрешенное прерывание вызывается, ЦП оставляет свою работу, выполняет прерывание, а затем возвращается в место прерывания. Управляет прерываниями обработчик прерываний (Interrupt Handler).
УПРАВЛЕНИЕ ПРОЦЕССОРАМИ И ЗАДАНИЯМИ В ОДНОПРОЦЕССОРНОМ ВЫЧИСЛИТЕЛЬНОМ КОМПЛЕКСЕ
Подсистемы управления процессорами и заданиями в ОС выполняют сходные функции: планирование загрузки процессоров и планирование загрузки вычислительных комплексов, имеют сходные механизмы планирования, работающие на разных уровнях - процессов и заданий пользователя соответственно.
В однопроцессорной ЭВМ подсистема управления процессорами выполняет единственную функцию - диспетчирования процессов, то есть планирует загрузку ЦП.
Подсистема управления заданиями управляет прохождением заданий в ВС и выполняет следующие функции:
1.Предоставление языковых средств управления работами в вычислительной системе (Job Control Language (JCL) в ОС ЕС ЭВМ, Shell в UNIX).
2.Ввод и интерпретация заданий/команд.
3.Выделение и освобождение необходимых ресурсов.
4.Планирование заданий на выполнение.
5.Сбор и предоставление информации о состоянии заданий.
В однопроцессорном вычислительном комплексе существует три основных уровня планирования:
1.Планирование на верхнем уровне или планирование заданий.
На этом уровне осуществляется выбор заданий пользователем для выполнения и их запуск. Выбранные задания становятся готовыми процессами. Эту работу выполняет системный компонент - планировщик заданий.
2.Планирование на нижнем уровне или диспетчирование процессов.
Здесь осуществляется выбор готового процесса для выполнения, то есть предоставление ему ЦП. Выбранный процесс становится активным. Эту работу выполняет системный компонент - диспетчер.
3.Планирование на промежуточном уровне.
На данном уровне определяется, каким процессам будет разрешено состязаться за захват ЦП, то есть быть готовыми, и какие процессы будут кратковременно приостановлены (задержаны) для оптимизации загрузки системы. Промежуточное планирование управляет текущей производительностью вычислительной системы.
В соответствии с тремя уровнями планирования, из которых два обязательны, существует двух и трехуровневые системы планирования.
Типичная двухуровневая система планирования представлена на рис.8.1.
Современной тенденцией развития вычислительной техники является построение вычислительных комплексов, содержащих несколько ЦП, называемых мультипроцессорными вычислительными системами. Мультипроцессорная обработка – это способ организации вычислений в системах с несколькими процессорами, при котором несколько задач (процессов, нитей) могут одновременно выполняться на разных процессорах системы.
Целью построения мультипроцессорных вычислительных систем является:
-
повышение производительности вычислительных систем;
- повышение надежности и коэффициента готовности вычислительной системы.
Существует два вида мультипроцессорных вычислительных систем:
1. Мультипроцессорные вычислительные системы со слабо связанными процессорами, называемые многомашинными комплексами, которые предусматривают соединение двух или более вычислительных машин при помощи канала связи и/или внешней памяти (рис.9.1).
Рис. 9.1. Системы со слабо связанными процессорами
2. Мультипроцессорные системы с сильно связанными процессорами, называющиеся многопроцессорными вычислительными комплексами, которые имеют единую ОП, коллективно используемую несколькими ЦП (рис.9.2).
Рис.9.2. Мультипроцессорная система
Мультипроцессорная организация системы приводит к усложнению всех алгоритмов управления ресурсами.
Например, необходимо планировать процессы не для одного, а для нескольких процессоров, что гораздо сложнее. Сложности возрастают при возрастании количества конфликтов по обращению к устройствам ввода/вывода, данным общей памяти и совместно используемым программам. Все эти проблемы должны решать ОС путем синхронизации, ведения очередей, планирования процессов.
Итак, в отличие от однопроцессорных ОС, подсистемы управления процессами и заданиями должны выполнять следующие основные функции:
- организацию взаимодействия центральных процессоров (синхронизация);
- управление загрузкой процессоров (диспетчирование).
Рис.8.1. Двухуровневая процедура планирования
Двухуровневая процедура вводится в системах с ограниченным мультипрограммированием, что определяется ограниченными ресурсами и производительностью вычислительной системы. Это основная схема для ВС с реальной ОП без поддержки систем реального времени (СРВ).
В вычислительных системах с ВП, допускающих неограниченный уровень мультипрограммирования и СРВ, требующих высокой реактивности системы, используется трехуровневая система планирования, представленная на рис.8.2.
Рис. 8.2. Трехуровневая система планирования
Эффективное планирование заданий и процессов является сложной проблемой, поскольку должно учитываться много противоречивых требований, таких, как:
-
cправедливость;
- максимальная пропускная способность;
- приемлемое время ответа для максимального числа интерактивных пользователей;
- предсказуемость (задание должно выполняться примерно за одно время независимо от загрузки вычислительной системы);
- минимум накладных расходов на выполнение планирования;
- сбалансированность использования ресурсов;
- исключение бесконечного откладывания;
- учет приоритетов;
- отдавать предпочтение процессам, занимающим ключевые ресурсы;
- плавная деградация при увеличении нагрузок.
Для того чтобы реализовать перечисленные требования, механизм планирования должен знать и учитывать следующие факторы:
- является ли процесс обменным (активно использующим операции ввода/вывода) или вычислительным (активно использующим процессор);
- является ли процесс пакетным или диалоговым;
- уровень реактивности интерактивного процесса;
- приоритетность процесса;
- частоту прерываний по отсутствию нужной страницы;
- частоту прерывания с низкого приоритета на высокий;
- длительность периода ожиданий ЦП процесса;
- суммарное использование времени ЦП и оценочное время, необходимое для завершения.
Существует множество различных алгоритмов планирования процессов, преследующих различные цели и обеспечивающих различное качество мультипрограммирования. Среди этого множества алгоритмов рассмотрим подробнее две группы наиболее часто встречающихся алгоритмов: алгоритмы, основанные на приоритетах, и алгоритмы, основанные на квантовании.
В соответствии с алгоритмами, основанными на квантовании, смена активного процесса происходит, если::
1)процесс завершился и покинул систему;
2)произошла ошибка;
3)процесс перешел в состояние ОЖИДАНИЕ4
4)исчерпан квант процессорного времени, отведенный данному процессу.
Процесс, который исчерпал свой квант, переводится в состояние ГОТОВНОСТЬ и ожидает, когда ему будет предоставлен новый квант процессорного времени, а на выполнение, в соответствии с определенным правилом, выбирается новый процесс из очереди готовых. Таким образом, ни один процесс не занимает процессор надолго, поэтому квантование широко используется в системах разделения времени.
Кванты, выделяемые процессам, могут быть одинаковыми для всех процессов или различными. Кванты, выделяемые одному процессу, могут быть фиксированной величины или изменяться в разные периоды жизни процесса. Процессы, которые не полностью использовали выделенный им квант (например, из-за ухода на выполнение операций ввода-вывода), могут получить или не получить компенсацию в виде привилегий при последующем обслуживании.
По - разному может быть организована очередь готовых процессов: циклически, по правилу "первый пришел - первый обслужился" (FIFO) или по правилу "последний пришел - первый обслужился" (LIFO).
Многие современные системы планирования основываются на системе приоритетов, которая воплощается в соответствующих дисциплинах планирования. Приоритет - это число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной машины, в частности, процессорного времени: чем выше приоритет, тем выше привилегии.
Приоритеты подразделяются на статические, назначаемые извне системы администрацией ВЦ, и динамические, присваиваемые системой автоматически в соответствии с поведением, потребностями в ресурсах и прочими характеристиками процессов.
Начальные значения динамических приоритетов обычно устанавливаются на основе статического, но действуют в течение короткого времени. Существует две разновидности приоритетных алгоритмов: алгоритмы, использующие относительные приоритеты, и алгоритмы, использующие абсолютные приоритеты.
В обоих случаях выбор процесса на выполнение из очереди готовых осуществляется одинаково: выбирается процесс, имеющий наивысший приоритет. По-разному решается проблема определения момента смены активного процесса. В системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор, перейдя в состояние ОЖИДАНИЕ (или же произойдет ошибка, или процесс завершится). В системах с абсолютными приоритетами выполнение активного процесса прерывается еще при одном условии: если в очереди готовых процессов появился процесс, приоритет которого выше приоритета активного процесса. В этом случае прерванный процесс переходит в состояние готовности.
Во многих операционных системах алгоритмы планирования построены с использованием как квантования, так и приоритетов. Например, в основе планирования лежит квантование, но величина кванта и/или порядок выбора процесса из очереди готовых определяется приоритетами процессов.
Для установления значений приоритетов заданий и процессов используются следующие дисциплины планирования и их различные комбинации:
1. Планирование по сроку завершения, гарантирующее выполнение задания в назначенное время. Это сложная проблема в мультипрограммных системах, поскольку пользователь должен точно указать все требуемые ресурсы. Необходимо активное управление ресурсами, что связано с высокими накладными расходами. Недостаток: несправедливо к другим пользователям (протекционизм).
2. Планирование по принципу FIFO, где ЦП предоставляется процессам в порядке готовности, и они выполняются до завершения или блокировки. Это самая простая дисциплина планирования - фактически без переключения ЦП. Формально - справедливый принцип, но фактически не справедлив, так как длинные задания заставляют ждать короткие. Менее важные - заставляют ждать более важные. Характеризуется небольшим колебанием времени выполнения и большей предсказуемостью, нежели другие дисциплины. Используется только в пакетных системах, обычно в комбинации с другими дисциплинами и не гарантирует реактивности системы.
3. Циклическое, или круговое планирование, где каждому готовому процессу в цикле представляется квант времени. По истечении кванта времени процесс переходит в конец очереди готовых процессов. При блокировке квант теряется. Эффективно для СРВ, так как гарантирует приемлемое время ответа для всех интерактивных пользователей. Основная проблема выбора - оптимальный размер кванта. Стараются выбрать такой размер, чтобы большинство рядовых запросов обслуживалось за один квант.
4. Планирование по принципу - "кратчайшее задание - первым" или "по наименьшему оставшемуся времени выполнения". Максимальный приоритет назначается процессу либо заданию с минимальным оценочным временем до завершения. Недостаток: время ожидания на большие задания растет; большие издержки на регистрацию истекшего времени обслуживания.
Достоинство: сокращение очередей заданий и ожидающих процессов; стремится к минимальному времени ожиданий для заданий.
5. Планирование по времени нахождения в системе, в которой приоритет есть функция времени обслуживания и времени ожидания.
Приоритет =
Приоритет отдает меньшее предпочтение коротким заданиям и без предубеждения относится к длинным. Чем реже процесс получает ЦП, тем выше его приоритет. Задания с вводом/выводом повышают приоритет.
6. Сеть многоуровневых очередей с обратными связями (рис.8.3), которая имеет следующие достоинства:
- определяет характер процессов и разделяет на соответствующие категории;
- отдает предпочтение коротким процессам;
- отдает предпочтение обменным процессам с хорошим коэффициентом использования устройств ввода/вывода. Это наиболее совершенный и сложный механизм планирования.
Рис. 8.3. Сеть многоуровневых очередей
Сеть представляет собой упорядоченную структуру очередей готовых процессов, работающих с различными дисциплинами обслуживания. Каждый процесс входит в сеть очередей с конца верхней очереди и перемещается по FIFO пока не получит ЦП. Процесс выполняется. Если в течение кванта процесс запросил выполнение операции ввода/вывода, то он после завершения операции будет установлен в очередь готовых процессов текущего уровня. Если в течение выделенного кванта времени процесс не завершился, то он устанавливется в очередь готовых процессов следующего уровня, у которого понижен приоритет и увеличен квант времени. Таким образом, чем больше время работы процесса, тем больший квант времени выделяется, но меньше приоритет, что приводит к получению ЦП реже, но на более длительный период.
Таким образом, сеть многоуровневых очередей - это адаптивный механизм планирования, который реагирует на изменение поведения системы.
В ОС OS/2, UNIX приоритеты устанавливаются с помощью класса приоритета и уровня приоритета в классе.Есть три класса приоритета и 32 различных уровня приоритета для класса.
Существует три класса приоритета:
критический или высокий - для программ управления процессом или связью с другими компьютерами;
обыкновенный - для большинства программ пользователя;
запасной или низкий - задачи и процессы из этого класса выполняются, если в очереди нет критических или обыкновенных задач.
Существует несколько способов взаимодействия ЦП:
1. Вычислительный комплекс и ОС с подчиненными процессорами
- асимметричное мультипроцессирование (один главный процессор и несколько подчиненных).
2. Вычислительный комплекс и ОС с равноправными процессорами.
3. Вычислительный комплекс и ОС с симметричной организацией - симметричное мультипроцессирование.
В мультипроцессорных системах с подчиненными процессорами один ЦП является главным, остальные - подчиненными (ведущий - ведомые). Это самая простая организация не намного сложнее однопроцессорной системы. Операционная система выполняется только на главном процессоре. Этот ЦП осуществляет ввод-вывод и управляет загрузкой подчиненных процессоров. Подчиненные процессоры выполняют только программы пользователя. Узкое место - главный процессор. Он должен иметь большую мощность (производительность), чем подчиненные процессоры, чтобы последние не простаивали.
В мультипроцессорной системе с равноправными процессорами каждый ЦП имеет собственную ОС и управляет собственными ресурсами и устройствами ввода/вывода по типу многомашинных комплексов. В такой организации для управления всей системы существуют таблицы с глобальной системной информацией, доступ к которой строго контролируется методом взаимного исключения. Каждый ЦП берет из общей операции задание и выполняет его до завершения. Во время исполнения взаимодействие между ЦП не предусматривается. Данную систему характеризует высокая надежность, но не достаточно высокий уровень распараллеливания.
Симметричная организация мультипроцессорной системы наиболее сложна и эффективна. Здесь все ЦП - идентичны. Каждый из них может управлять работой любого периферийного устройства и обращаться к любому устройству памяти. В таких системах в общей области памяти существует две очереди: очередь готовых процессов и очередь готовых процессоров.
В любой момент времени любой готовый процесс может выполняться на любом готовом процессоре.
Процессы во время своего исполнения мигрируют между ЦП. ОС также перемещается по процессорам, но в каждый момент времени может находиться только на одном процессоре.
Симметричное мультипроцессирование реализуется общей для всех процессоров ОС. Все процессы равноправно участвуют в управлении вычислительным процессом и в выполнении прикладных задач. Например, сигнал прерывания от устройства, на которое выводит данные прикладной процесс, выполняемый на некотором процессоре, может быть обработан совсем другим процессором.
Разные процессоры могут в какой-то момент времени выполнять как разные, так и одинаковые модули общей ОС. Для этого программные модули ОС должны обладать свойством повторной входимости – реентерабельности. ОС полностью децентрализована. Освободившийся процессор сам запускает планировщик задач, который выбирает из общей системной очереди задачу для выполнения. Все ресурсы выделяются для задачи по мере потребности и не закрепляются за процессором. При таком подходе все процессоры работают с одной и той же динамически выравниваемой загрузкой. В решении одной задачи могут участвовать сразу несколько процессоров, если она допускает распараллеливание, например, путем предоставления нескольких нитей (потоков для WINDOWS NT фирмы Microsoft, UNIX - SOLARIS компании Sun, базирующийся на UNIX System V Release 4).
Достоинства этой организации:
- высокая надежность (отказ одного из ЦП исключает его из очереди готовых процессоров);
- сбалансированная загрузка ЦП;
- лучшее использование ресурсов.
Недостаток - возрастает число конфликтов по системному обслуживанию, так как ОС имеется только в одном экземпляре.
Фирма COMPAQ, сотрудничая с NOVELL, выпустила OS-NETWARE from COMPAQ.
SCO UNIX оптимизирована под серверы COMPAQ и поддерживает многопроцессорность с помощью утилиты SCO MPX, которая эффективно использует симметричную многопроцессорную архитектуру.
Рассмотрим архитектуру двухпроцессорной вычислительной системы фирмы COMPAQ. В основу решения положены два принципа:
- пропускная способность шины должна превышать сумму пропускных способностей всех подключенных к ней компонент;
- как следствие, компонента, готовая передать данные, не должна ждать.
Первое - за счет наращивания разрядности шин. Второе - за счет кэширования. Первоначально IBM PC/XT/AT имели один 8/16 - разрядный канал передачи данных, к которому посредством шины подключались все основные компоненты системы: процессор, память, устройство ввода/вывода (рис. 9.3)
Рис.9.3 Архитектура однопроцессорной системы
По сути, канал представляет собой расширение шины процессора, и повышение производительности канала за счет применения новых, более быстродействующих процессоров оказалось невозможным из-за сохранения совместимости с существующими устройствами, рассчитанными на работу с 8 МГц шиной ISA. Шина стала «узким местом» и ограничивала скорость доступа ЦП к памяти.
УПРАВЛЕНИЕ ВИРТУАЛЬНОЙ ПАМЯТЬЮ
Уже достаточно давно пользователи столкнулись с проблемой размещения в памяти программ, размер которых превышал имеющуюся в наличии свободную память. Решением было разбиение программы на части, называемые оверлеями. Первым начинал выполняться 0-ой оверлей. Когда он заканчивал свое выполнение, он вызывал другой оверлей. Все оверлеи хранились на диске и перемещались между памятью и диском средствами операционной системы. Однако разбиение программы на части и планирование их загрузки в оперативную память должен был осуществлять программист.
Развитие методов организации вычислительного процесса в этом направлении привело к появлению метода, известного под названием виртуальная память. Виртуальным называется ресурс, который пользователю или пользовательской программе представляется обладающим свойствами, которыми он в действительности не обладает. Так, например, пользователю может быть предоставлена виртуальная оперативная память, размер которой превосходит всю имеющуюся в системе реальную оперативную память. Пользователь пишет программы так, как будто в его распоряжении имеется однородная оперативная память большого объема, но в действительности все данные, используемые программой, хранятся на одном или нескольких разнородных запоминающих устройствах, обычно на дисках, и при необходимости частями отображаются в реальную память
Итак, виртуальной
памятью называется основная память процесса, адресное пространство которого соответствует диапазону непосредственной адресации системы команд ЭВМ и которая обычно не совпадает с объемом реальной памяти ЭВМ.
EC ЭВМ имеет 24 разрядную адресную шину, что позволяет адресовать 16 Мб оперативной памяти. Операционная система обеспечивает одновременную работу N процессам, выделяя каждому из них 16 Мб.
Начиная с процессоров Intel 386 (32 разрядный), для каждого процесса выделяется адресное пространство размером 4 Гб. При этом одновременно могут работать N
процессов.
Управление виртуальной памятью имеет своей целью:
1.Обеспечить возможность создания и выполнения на ЭВМ программ максимально допустимого размера.
2.Облегчить жизнь программиста, сняв с него проблемы, связанные с ограниченным объемом реальной ОП (РОП).
3.Устранить временную фрагментацию, максимально эффективно используя ОП ЭВМ, которая образуется при отсутствии необходимого участка программы/данных в РОП и определяется временем, необходимым для размещения необходимых данных в РОП.
Суть концепции виртуальной памяти (ВП) заключается в том, что адресное пространство (АП) процесса отделяется от адресов реальной оперативной памяти и по необходимости динамически и по частям отображается в реальную память.
В ОС с реальной ОП привязка адресного пространства к реальным адресам осуществляется статически до выполнения программы на все время выполнения.
Управление внешней памятью
Физически том дисковой памяти - это отдельный носитель внешней памяти, представляющий собой совокупность блоков данных. Блок - это единица физической передачи данных (единица обмена данных с устройством). Запись - это единица ввода/вывода программы. Блок может содержать несколько логических записей, что минимизирует число операций ввода/вывода (рис.11.3).
Рис. 11.3. Коэффициент блокирования 7
Физически файл - это совокупность выделенных блоков памяти (область внешней памяти). Существует два вида организации накопителей на магнитном диске:
1.Трековый, в котором весь диск подразделяется на треки (дорожки) фиксированной длины, на которых размещаются блоки переменного размера. Адресом блока является тройка:
- номер цилиндра;
- номер трека;
- номер блока.
Единицей выделения памяти является трек или цилиндр. Цилиндр представляет собой область памяти, образованную всеми дорожками, доступными на магнитных поверхностях без перемещения магнитных головок.
2.Секторный, в котором диск разбивается на блоки фиксированного размера, обычно кратного 256 байтам. Адресом блока является его порядковый номер на носителе.
Работа с дисковой памятью включает в себя 4 основные процедуры:
1. Инициализация тома (форматирование).
2. Выделение и освобождение памяти файлу.
3. Уплотнение внешней памяти (дефрагментация).
4. Копирование, восстановление томов для обеспечения целостности.
Инициализация тома состоит из:
- форматирования диска на дорожки (сектора);
- определения сбойных участков диска;
- присвоения метки тому;
- создания оглавления тома;
- записи ОС, если это необходимо.
Версии Windows NT
Windows NT 3.1
Операционная система Windows NT с самого начала проектировалась с учетом всех требований, предъявляемых к современным ОС: расширяемости, переносимости, надежности, совместимости, производительности. Эти свойства были достигнуты за счет применения передовых технологий структурного проектирования, таких, как клиент-сервер, микроядра, объекты.
В отличие от Windows, в которой реализована многозадачность без вытеснения (non-preemptive multitasking), в Windows NT используется механизм многозадачности с вытеснением (preemptive multitasking).
Windows NT поддерживает симметричную многопроцессорную организацию вычислительного процесса, в соответствии с которой ОС может выполняться на любом свободном процессоре или на всех процессорах одновременно, разделяя память между ними. Учитывая, что многозадачность реализуется на уровне нитей, разные части одного и того же процесса могут действительно выполняться параллельно. Следовательно, многонитевые серверы могут обслуживать более одного клиента.
Для управления нитями Windows NT Server использует механизм приоритетов. В определенные моменты производится оценка приоритетов и перераспределение нитей по процессорам, в результате чего последовательные стадии одного потока программы могут выполняться разными процессорами или откладываться до высвобождения очередного процессора.
Windows NT Server поддерживает до 16 параллельных процессоров, что актуально для таких серверов, как Symmetry 750 фирмы Sequent с 16 процессорами Intel 486/50 МГц. Следует, однако, иметь в виду, что реализация СМП в Windows NT Server нацелена на оптимизацию производительности и не обеспечивает резервирования в целях повышения отказоустойчивости. В случае выхода из строя одного из процессоров система останавливается.
В Windows NT Server в полной мере реализован потенциал масштабируемости архитектуры СМП. Однопроцессорную систему можно легко развивать, наращивая число процессоров, без замены версии ОС или приложений.
При управлении устройствами ввода/вывода Windows NT Server использует асинхронный подход.
Для завершения процесса и начала выполнения новой задачи не нужно ждать поступления сигнала об окончании таких операций, как чтение или запись. Каждый процесс создается с использованием одной нити, которая служит специфическим отображением выполнения программы процессором. Впоследствии программа может создавать новые нити, и Windows NT Server будет распределять их и управлять ими, не привлекая к этому приложения высокого уровня.
Для того чтобы прикладная программа могла использовать несколько потоков, не нужно предусматривать этого в ее алгоритме. Отдельный поток создается для каждой операции. Например, в одном потоке программа может воспроизводить сложную графическую форму, а другой использовать для редактирования объемного чертежа. Каждый из этих потоков (или, с точки зрения пользователя, операций) работает на отдельном процессоре, не требуя никаких управляющих вмешательств со стороны приложения. Потоки внутри процесса используют общую область памяти и, следовательно, не должны специально обмениваться данными.
В соответствии с требованием совместимости, Windows NT обеспечивает среду выполнения не только для приложений с исходным программным интерфейсом Win32 API. При выполнении на процессорах фирмы Intel защищенные подсистемы Windows NT обеспечивают двоичную совместимость существующих приложений фирмы Microsoft, включая MS-DOS, Win16, OS/2. На MIPS RISC процессорах двоичная совместимость достигается для приложений MS-DOS и 16-битных Windows-приложений (с использованием эмуляции). Windows NT обеспечивает также совместимость на уровне исходных текстов для POSIX-приложений, которые твердо придерживаются интерфейса, определенного в стандарте IEEE 1003.1.
Помимо совместимости программных интерфейсов, Windows NT поддерживает существующие файловые системы, включая файловую систему MS-DOS (FAT), файловую систему CD-ROM, файловую систему OS/2 (HPFS) и собственную новую файловую систему (NTFS).
В отличие от большинства других операционных систем, Windows NT изначально разрабатывался с учетом возможности работы в сети.
В результате этого функции совместного использования файлов, устройств и объектов встроены в интерфейс с пользователем. Администраторы могут централизованно управлять и контролировать работу сетей в масштабах крупных предприятий. Особенно важно отметить возможность распространения работы приложений типа клиент-сервер на многокомпьютерные системы.
Windows NT 3.5
Версия Windows NT 3.5, как и предыдущая, Windows NT 3.1, разработана в двух конфигурациях: для рабочей станции Windows NT Workstation 3.5 и для сервера - Windows NT Server 3.5. Windows NT 3.5 имеет многочисленные усовершенствования и нововведения по сравнению с Windows NT 3.1: улучшенное автораспознавание аппаратуры, возможность ручного выбора и конфигурирования сетевых адаптеров, если автоматическое распознавание не дает положительного результата.
Встроенная совместимость с NetWare. Возможность выполнения роли шлюза к сетям NetWare, так что Windows NT-компьютеры могут получать доступ к файлам, принтерам и серверам приложений NetWare. В Windows NT, начиная с версии 3.5, входит Microsoft Compatible Workstation Service for NetWare, который позволяет осуществлять доступ к файлам, каталогам и принтерам на сервере Novell NetWare. Транспортный протокол Microsoft NWLink IPX/SPX обеспечивает связь между компьютером с Windows NT и NetWare файл-сервером и сервером печати. Он поддерживает работу с файлами и с очередями печати на NetWare сервере.
Встроенная поддержка TCP/IP. Новая высокопроизводительная Microsoft-реализация протоколов TCP/IP, которая обеспечивает простое, мощное решение для межсетевого взаимодействия. Microsoft поддерживает протокол TCP/IP, начиная с 1991 года, когда был выпущен первый стек для Microsoft LAN Manager 2.1. В Windows NT также имеется поддержка этого протокола, начиная с самой первой версии этой операционной системы. Помимо этого имеются базовые утилиты, такие, как ftp, tftp, telnet, команды r*, arp, route и finger. С выходом версии 3.5 появились новые ключевые свойства, которые, с одной стороны, упростили конфигурирование и обслуживание, а с другой - улучшили свойства TCP/IP.
Значительные улучшения средств удаленного доступа RAS, включающие поддержку IPX/SPX и TCP/IP, использование стандартов Point to Point Protocol (PPP) и Serial Line IP (SLIP). Сервер RAS может теперь поддерживать до 256 соединений (вместо 64 в версии 3.1).
Поддержка длинных имен файлов в файловой системе FAT. Windows NT поддерживает работу с тремя файловыми системами: NTFS, FAT и HPFS. Таким образом, если до установки Windows NT на компьютере были установлены MS-DOS или OS/2, то нет никакой необходимости переформатировать диск. Система преобразует FAT или HPFS в NTFS, сохранив всю информацию на диске. Обратное преобразование невозможно. Здесь уместно заметить, что если вы хотите установить NTFS только затем, чтобы использовать длинные (до 255 символов) имена файлов, то для этих целей прекрасно подойдут и FAT и HPFS. Если для последней это естественное свойство, то возможность использования длинных имен файлов на FAT была введена только в версии Windows NT начиная с 3.5. Вы можете спокойно называть файлы и каталоги именами, выходящими за пределы традиционного для MS-DOS правила "8.3", нисколько не опасаясь, что эти файлы не будут доступны при работе в MS-DOS. Для таких файлов и каталогов будут назначены вторые, "короткие" имена.
Полная поддержка хранения встроенных объектов OLE 2.x и поиска составных документов. Эти возможности включают связывание, встраивание, связывание со встроенными объектами, технологии "drag-and-drop" и OLE-Automation.
В операционную систему Windows NT 3.5 встроены графические возможности трехмерной графики OpenGL API. OpenGL - это независимая от операционной системы промышленно-стандартная библиотека графических функций, разработанная фирмой Silicon Graphics для своих рабочих станций. В настоящее время OpenGL признана Architecture Review Board, включающей такие фирмы, как DEC, IBM, Intel, Microsoft и Silicon Graphics. Технология OpenGL была лицензирована Microsoft для предоставления этого мощного 32-разрядного API пользователям Windows NT.
Развитые функции этой библиотеки требуются в том случае, когда необходима визуализация крупных проектов и данных. Типичные задачи, требующие ее использования - это САПР, системы механического и промышленного дизайна, программы статистического и научного анализа.
Приложения, разработанные для MS Windows 3.x и MS-DOS, выполняются более надежно, так как каждое приложение теперь работает в своем адресном пространстве.
Доменная организация. В сетях на основе Windows NT Server рабочие станции подключаются к выделенным серверам. Именованные собрания серверов могут быть сгруппированы в домены. Такой метод организации сети упрощает централизованное управление сетью и позволяет использовать Windows NT Server в качестве сетевой операционной системы масштаба предприятия. Если администратор однажды завел учетную информацию о пользователе домена, то последний имеет возможность зарегистрироваться с любой рабочей станции в этом домене. Для этого достаточно ввести имя, имя домена и пароль при регистрации, и Windows NT Workstation опознает пользователя и воссоздаст его рабочую среду. В серверных сетях, как правило, все совместно используемые каталоги располагаются на выделенных серверах, а совместно используемые принтеры подключены к специализированным серверам печати. Однако это ни в коей мере не ограничивает возможностей пользователя по предоставлению ресурсов его рабочей станции в совместное использование так, как это обычно делается в одноранговых сетях. Windows NT Server предоставляет возможность пользователям различных доменов совместно использовать ресурсы путем установления доверительных отношений между доменами. Если домен А и домен Б полностью доверяют друг другу, то пользователь домена А может зарегистрироваться в домене Б и осуществлять доступ к ресурсам его сервера. Аналогично пользователь домена Б может использовать ресурсы любого из серверов домена А.
Клиентами в сети с Windows NT Server могут являться компьютеры с различными операционными системами. Стандартно поддерживаются: MS-DOS, OS/2, Windows for Workgroups, клоны UNIX, Macintosh, Windows NT Workstation.
Программное обеспечение возможных клиентов включается в стандартную поставку Windows NT Server.
Microsoft является одним из лидеров в установлении общественных стандартов на socket-интерфейсы для Windows. Windows Sockets является открытой спецификацией, определяющей программный интерфейс Windows к сетевым протоколам. Этот интерфейс также является частью Microsoft Windows Open Services Architecture (WOSA). Он уже знаком сетевым программистам, работающим под UNIX с расширениями на базе Windows, и стал стандартным методом разработчиков, пишущих Windows-приложения для обеспечения удаленного вызова процедур (RPC) не только через TCP/IP, но и через IPX и NetBEUI. В 1993 году Microsoft создал свой Internet FTP сервер, работающий на базе Windows NT Advanced Server. Этот сервер можно найти в Internet как ftp.microsoft.com. В настоящее время в среднем 25 000 пользователей подключаются к этому серверу еженедельно и загружают с него общим числом около 75 000 файлов в неделю.
Взаимодействие с UNIX в Windows NT обеспечивается посредством поддержки общих стандартных сетевых протоколов (включая TCP/IP), стандартных способов распределенной обработки, стандартных файловых систем и совместного использования данных, а также благодаря простоте переноса приложений. Несмотря на то, что система Windows NT была разработана для поддержки работы по схеме клиент-сервер, для совместимости с UNIX-хостами встроена эмуляция терминалов.
SNMP. В Windows NT имеется ряд средств для интеграции в системы, использующие протокол SNMP (Simple Network Management Protocol), что позволяет выполнять удаленное администрирование Windows NT с помощью, например, SUN Net Manager и HP OpenView. Поддержка графических и текстовых терминалов.
В Windows NT входят мощные API гибкой поддержки сред распределенных вычислений:
-
RPC (Remote Procedure Call) - критическая составная часть, необходимая при построении распределенных приложений;
- Windows Sockets - API, совместимый с сокетами типа Berkeley, популярным в UNIX механизмом распределенных вычислений;
- WOSA (Windows Open Services Architecture) - этот набор API позволяет объединять системы Windows с широким рядом приложений-поставщиков данных, выпускаемых самыми разными производителями.
Для работы с Windows NT Workstation (Server) 3.5 требуется:
- компьютер с процессорами i386, i486 или Pentium с тактовой частотой от 33 Мгц и оперативной памятью от 12 (16) Мб; либо с процессором DEC Alpha и оперативной памятью от 16 (24) Мб; либо с MIPS-процессором; либо компьютер с несколькими процессорами;
- не менее 70 (90) Мб свободного пространства на жестком диске;
- желательно иметь устройство чтения компакт дисков с интерфейсом SCSI (CD-ROM) и мышь;
- при работе в сети, требуется наличие 16- или 32-разрядной сетевой карты Ethernet или Token Ring;
Дополнительно могут быть установлены звуковая карта, накопители на магнитных лентах, принтеры, графопостроители, модемы и другие периферийные устройства.
Полный список техники, прошедшей тестирование на совместимость с Windows NT, прилагается к системе.
Windows NT 4.0
При разработке Windows NT 4.0 Microsoft решила пожертвовать стабильностью ради производительности. С этой целью были внесены изменения в архитектуру: библиотеки менеджера окон и GDI, а также драйверы графических адаптеров были перенесены из пользовательского режима в режим ядра. Это изменение означает некоторый отход от принятой в предыдущих версиях Windows NT 3.х концепции микроядра.
Перенос графической библиотеки и драйверов в область ядра повышает скорость выполнения графического ввода-вывода. Эти изменения особенно сказались на скорости выполнения приложений Win32, в то время как приложения Windows-16 и графические приложения MS DOS работают примерно так же, как и в версии 3.5.
В то же время описанные изменения делают операционную систему в принципе менее надежной. Действительно, поскольку программное обеспечение графических адаптеров, как правило, разрабатывается фирмами-производителями этого оборудования и это программное обеспечение часто меняется (вместе с оборудованием), то от него трудно ожидать той надежности, которая требуется для модулей операционной системы.
Кроме архитектурных, в Windows NT 4.0 имеются и другие, не менее кардинальные изменения:
- средства взаимодействия с NetWare модифицированы - Gateway и клиент NCP поддерживают теперь NDS;
- в стандартную поставку включен Internet Information Server и сервер DNS (Domain Name Server). DNS взаимодействует с WINS и DHCP-серверами. Эта комбинация реализует Dynamic DNS, который разрешает верхние уровни доменного имени и передает имя для окончательного разрешения службе WINS;
- поддержка многопротокольной маршрутизации;
- сервер может работать как транслирующий агент протокола BOOTP/DHCP , что позволяет компьютеру передавать сообщения BOOTP/DHCP по IP-сети;
- новые административные средства Windows NT могут работать удаленно на клиентах Windows 95. Кроме того, Windows NT Server обеспечивает сервис удаленной загрузки для клиентов Windows 95. (Это полезно для бездисковых рабочих станций);
- интерфейс в стиле Windows 95;
- подсистема обработки сообщений Microsoft Windows Messaging Subsystem позволяет получать и отправлять почту из приложений;
- в Windows NT 4.0 появился эмулятор процессоров Intel для RISC-платформ.
Microsoft добавила в Windows NT 4.0 много технических средств, чтобы сделать эту операционную систему пригодной для использования в качестве платформы для Web-сервера.
Одно из усовершенствований связано с тем, что повышающаяся роль Internet и клиент-серверных систем ведет к росту числа мобильных пользователей. Microsoft в связи с этим улучшила RAS (улучшила поддержку ISDN) и предоставила средства безопасной работы с RAS через Internet. В RAS реализованы протоколы PPTP (создает зашифрованный трафик через Internet) и Multilink PPP (позволяет объединять несколько каналов в один).
Клиентами могут быть Windows NT 4.0 Workstation или Windows 95. Важным аргументом в борьбе за Internet является включение в стандартную поставку Windows NT 4.0 Web-сервера производства Microsoft - Internet Information Server, возможности которого сравнимы, а по ряду тестов и превосходят аналогичный популярный продукт Server Netscape для NT.
14.2. Структура: NT executive и защищенные подсистемы
При разработке структуры Windows NT была в значительной степени использована концепция микроядра. В соответствии с этой идеей ОС разделена на несколько подсистем, каждая из которых выполняет отдельный набор сервисных функций. Каждый сервер выполняется в пользовательском режиме, выполняя цикл проверки запроса от клиента на одну из его сервисных функций. Клиент, которым может быть либо другой компонент ОС, либо прикладная программа, запрашивает сервис, посылая сообщение на сервер. Ядро ОС (или микроядро), работая в привилегированном режиме, доставляет сообщение нужному серверу, затем сервер выполняет операцию, после этого ядро возвращает результаты клиенту с помощью другого сообщения.
Структурно Windows NT может быть представлена в виде двух частей: часть операционной системы, работающая в режиме пользователя, и часть операционной системы, работающая в режиме ядра (рис.14.1).
Рис. 14.1.. Структура Windows NT
Часть Windows NT, работающая в режиме ядра, называется executive - исполнительной частью. Она включает ряд компонент, которые управляют виртуальной памятью, объектами (ресурсами), вводом-выводом и файловой системой (включая сетевые драйверы), взаимодействием процессов и частично системой безопасности. Эти компоненты взаимодействуют между собой с помощью межмодульной связи. Каждая компонента вызывает другие с помощью набора тщательно специфицированных внутренних процедур.
Вторую часть Windows NT, работающую в режиме пользователя, составляют серверы. Серверы Windows NT называются защищенными подсистемами, так как каждый из них выполняется в отдельном процессе, память которого отделена от других процессов системой управления виртуальной памятью NT executive.
Так как подсистемы автоматически не могут совместно использовать память, они общаются друг с другом посредством посылки сообщений. Сообщения могут передаваться как между клиентом и сервером, так и между двумя серверами. Все сообщения проходят через исполнительную часть Windows NT. Ядро Windows NT планирует нити защищенных подсистем точно так же, как и нити обычных прикладных процессов.
Поддержку защищенных подсистем обеспечивает исполнительная часть Windows NT - executive, которая работает в пространстве ядра и никогда не сбрасывается на диск. Ее составными частями являются:
1. Менеджер объектов. Он создает, удаляет и управляет объектами NT executive - абстрактными типами данных, используемых для представления ресурсов системы.
2. Монитор безопасности, который. устанавливает правила защиты на локальном компьютере, охраняет ресурсы операционной системы, выполняет защиту и регистрацию исполняемых объектов.
3. Менеджер процессов. Создает и завершает, приостанавливает и возобновляет процессы и нити, а также хранит о них информацию.
4. Менеджер виртуальной памяти.
5. Подсистема ввода-вывода. Включает в себя следующие компоненты: менеджер ввода-вывода, предоставляющий средства ввода-вывода, независимые от устройств; файловые системы - NT-драйверы, выполняющие файл-ориентированные запросы ввода-вывода и транслирующие их в вызовы обычных устройств; сетевой редиректор и сетевой сервер - драйверы файловых систем, передающие удаленные запросы на ввод-вывод на машины сети и получающие запросы от них; драйверы устройств NT executive - низкоуровневые драйверы, которые непосредственно управляют устройством; менеджер кэша, осуществляющего кэширование диска.
Исполнительная часть, в свою очередь, основывается на службах нижнего уровня, предоставляемых ядром (его можно назвать и микроядром) NT. В функции ядра входит:
· планирование процессов;
· обработка прерываний и исключительных ситуаций;
· синхронизация процессоров для многопроцессорных систем;
· восстановление системы после сбоев.
Ядро работает в привилегированном режиме и никогда не удаляется из памяти. Обратиться к ядру можно только посредством прерывания. Ядро расположено над уровнем аппаратных абстракций (Hardware Abstraction Level - HAL), который концентрирует в одном месте большую часть машинно-зависимых процедур. HAL располагается между NT executive и аппаратным обеспечением и скрывает от системы такие детали, как контроллеры прерываний, интерфейсы ввода/вывода и механизмы взаимодействия между процессорами. Такое решение позволяет легко переносить Windows NT с одной платформы на другую путем замены только слоя HAL.
При создании NT разработчики руководствовались задачами улучшения производительности и сетевых возможностей, а также требованием поддержки определенного набора прикладных сред. Эта цель была достигнута продуманным разделением функций между модулями ядра и остальными модулями. Например, передача данных в файловую систему и по сети производится быстрее в пространстве ядра, поэтому внутри ядра NT выделены буфера для небольших по объему (от 16 до 32 Кб) операций чтения и записи, являющихся типичными для приложений клиент-сервер и распределенных приложений. Размещение этих функций ввода-вывода внутри ядра, может, и нарушает академическую чистоту микроядра NT, но соответствует цели создания NT.
Защищенные подсистемы Windows NT работают в пользовательском режиме и создаются Windows NT во время загрузки операционной системы. Сразу после создания они начинают бесконечный цикл своего выполнения, отвечая на сообщения, поступающие к ним от прикладных процессов и других подсистем. Среди защищенных подсистем можно выделить подкласс, называемый подсистемами окружения. Подсистемы окружения реализуют интерфейсы приложений операционной системы (API).
Другие типы подсистем, называемые интегральными подсистемами, исполняют необходимые операционной системе задачи. Например, большая часть системы безопасности Windows NT реализована в виде интегральной подсистемы, сетевые серверы также выполнены как интегральные подсистемы.
Наиболее важной подсистемой окружения является Win32 - подсистема, которая обеспечивает доступ для приложений к 32-bit Windows API. Дополнительно эта система обеспечивает графический интерфейс с пользователем и управляет вводом/выводом данных пользователя. Также поддерживаются подсистемы POSIX, OS/2,16-разрядная Windows и MS-DOS.
Каждая защищенная подсистема работает в режиме пользователя, вызывая системный сервис NT executive для выполнения привилегированных действий в режиме ядра. Сетевые серверы могут выполняться как в режиме пользователя, так и в режиме ядра, в зависимости от того, как они разработаны.
Подсистемы связываются между собой путем передачи сообщений. Когда, например, пользовательское приложение вызывает какую-нибудь API-процедуру, подсистема окружения, обеспечивающая эту процедуру, получает сообщение и выполняет ее либо обращаясь к ядру, либо посылая сообщение другой подсистеме. После завершения процедуры подсистема окружения посылает приложению сообщение, содержащее возвращаемое значение. Посылка сообщений и другая деятельность защищенных подсистем невидимы для пользователя.
Основным средством, скрепляющим все подсистемы Windows NT в единое целое, является механизм вызова локальных процедур (Local Procedure Call - LPC). LPC представляет собой оптимизированный вариант более общего средства - удаленного вызова процедур (RPC), которое используется для связи клиентов и серверов, расположенных на разных машинах сети.
Средства LPC поддерживают несколько способов передачи данных между клиентами и серверами: Один обычно используется для передачи коротких сообщений, другой - для длинных сообщений, а третий оптимизирован специально для использования подсистемой Win32. Каждая подсистема устанавливает порт - канал связи, посредством которого с ней могут связываться другие процессы.
Порты реализуются как объекты.
Windows NT использует защищенные подсистемы для того, чтобы:
· обеспечить несколько программных интерфейсов (API), по возможности не усложняя при этом базовый программный код (NT executive);
· изолировать базовую операционную систему от изменений или расширений в поддерживаемых API;
· объединить часть глобальных данных, требующихся всем API, и в то же время отделить данные, использующиеся каждым отдельным API от данных, использующихся другими API;
· защитить окружение каждого API от приложений, а также от окружений других API, и защитить базовую операционную систему от различных окружений;
· позволить операционной системе расширяться в будущем за счет новых API.
Таким образом, реализация частей ОС в виде серверов, выполняющихся в режиме пользователя, является важнейшей частью проекта Windows NT и оказывает глубокое воздействие на все функционирование системы.
Концентрация машинно-зависимых программ внутри микроядра делает перенос NT на разнообразные процессоры относительно легким. Но в то время, как некоторые микроядра (Mach и Chorus) предполагается поставлять в качестве самостоятельного программного продукта, из операционной системы Windows NT ядро вряд ли может быть вычленено для отдельного использования. Это является одной из причин того, что некоторые специалисты не считают Windows NT истинно микроядерной ОС в том смысле, в котором таковыми являются Mach и Chorus. Те же критики отмечают также, что NT не исключает, как это положено, все надстроенные службы из пространства ядра и что драйверы устройств в NT по минимуму взаимодействуют с ядром, предпочитая работать непосредственно с лежащим ниже слоем аппаратной абстракции HAL.
Множественные прикладные среды
При разработке NT важнейшим рыночным требованием являлось обеспечение поддержки по крайней мере двух уже существующих программных интерфейсов OS/2 и POSIX, а также возможности добавления других API в будущем.
Заметим, что для того, чтобы программа, написанная для одной ОС, могла быть выполнена в рамках другой ОС, недостаточно лишь обеспечить совместимость API. Кроме этого необходимо обеспечить ей "родное" окружение: структуру процесса, средства управления памятью, средства обработки ошибок и исключительных ситуаций, механизмы защиты ресурсов и семантику файлового доступа. Отсюда ясно, что поддержка нескольких прикладных программных сред является очень сложной задачей, тесно связанной со структурой операционной системы. Эта задача была успешно решена в Windows NT, при этом в полной мере был использован опыт разработчиков ОС Mach из университета Карнеги-Меллона, которые смогли в своей клиент-серверной реализации UNIX'а отделить базовые механизмы операционной системы от серверов API различных ОС.
Windows NT поддерживает пять прикладных сред операционных систем: MS-DOS, 16-разрядный Windows, OS/2 1.x, POSIX и 32-разрядный Windows (Win32). Все пять прикладных сред реализованы как подсистемы окружения. Каждая работает в собственном защищенном пользовательском пространстве. Подсистема Win32 обеспечивает поддержку дисплея, клавиатуры и мыши для четырех оставшихся подсистем.
16-битовые приложения DOS и Windows работают на VDM (Virtual DOS Machines - виртуальные машины DOS), каждая из которых эмулирует полный 80x86 процессор с MS-DOS. В NT VDM является приложением Win32, значит, как и обычные модули прикладных сред для UNIX, приложения DOS и 16-битовой Windows расположены в слое непосредственно над подсистемой Win32.
Подсистемы OS/2 и POSIX построены по-другому. В качестве полноценных подсистем NT они могут взаимодействовать с подсистемой Win32 для получения доступа к вводу и выводу, но также могут обращаться непосредственно к исполнительной системе NT за другими средствами операционной системы. Подсистема OS/2 может выполнять многие имеющиеся приложения OS/2 символьного режима, включая OS/2 SQL Server, и поддерживает именованные каналы и NetBIOS.
Однако возможности подсистемы POSIX весьма ограничены, несмотря на непосредственный доступ ее к службам ядра.
Приложения POSIX должны быть откомпилированы специально для Windows NT. Windows NT не поддерживает двоичный код, предназначенный для других POSIX-совместимых систем, таких, как UNIX. К тому же подсистема POSIX NT не поддерживает непосредственно печать, не поддерживает сетевой доступ, за исключением доступа к удаленным файловым системам, и не поддерживает многие средства Win32, например, отображение на память файлов и графику. На рис.14.2 показана структура, обеспечивающая в Windows NT поддержку множественных прикладных сред.
Рис. 14.2. Реализация множественных прикладных сред в Windows NT
NT executive выполняет базовые функции операционной системы и является той основой, на которой подсистемы окружения реализуют поддержку своих приложений. Все подсистемы равноправны и могут вызвать "родные" функции NT для создания соответствующей среды для своих приложений.
Каждая подсистема окружения имеет свое представление о том, что такое, например, процесс или описатель файла, поэтому структуры данных, используемые в каждом окружении, могут не совпадать. Следовательно, как только подсистема Win32 передала прикладной процесс другой подсистеме окружения, данное приложение становится клиентом этой подсистемы вплоть до завершения процесса. При этом подсистема Win32 перенаправляет входные сообщения от пользователя этому приложению, а также отображает вывод приложения на экране.
Объектно-ориентированный подход
Хотя NT и не является полностью объектно-ориентированной, в ее основе лежат объекты. Единообразная форма именования, совместного использования и учета системных ресурсов, простой и дешевый способ обеспечения безопасности системы и ее модификации - все эти преимущества могут быть достигнуты при использовании объектной модели.
В Windows NT любой ресурс системы, который одновременно может быть использован более чем одним процессом, включая файлы, совместно используемую память и физические устройства, реализован в виде объекта и управляется рядом функций. Такой подход сокращает число изменений, которые необходимо внести в операционную систему в процессе ее эксплуатации.
Если, скажем, изменилось что-то в аппаратуре, то все, что необходимо сделать - заменить соответствующий объект. Аналогично, если требуется поддержка новых ресурсов, то надо добавить только новый объект, не изменяя при этом остального кода операционной системы.
Наиболее фундаментальное отличие между объектом и обыкновенной структурой данных заключается в том, что внутренняя структура данных объекта скрыта от наблюдения. Вы должны вызвать объектную функцию для того, чтобы получить данные из объекта или поместить данные в объект. Вы не можете непосредственно изменять данные, находящиеся внутри объекта. Это отделяет средства реализации объекта от кода, который только использует его, такая техника позволяет легко изменять в последствии реализацию объектов.
Группа разработчиков NT executive решила использовать объекты для представления системных ресурсов, потому что объекты обеспечивают централизованные средства для выполнения трех важных (и часто утомительных) задач ОС:
· поддержки пользовательских имен системных ресурсов;
· разделения ресурсов и данных между процессами;
· защиты ресурсов от несанкционированного доступа.
Не все структуры данных в NT executive являются объектами. Объектами являются только такие данные, которые нужно разделять, защищать, именовать или делать видимыми для программ пользовательского режима (с помощью системных функций). Структуры, которые используются только одним компонентом executive для выполнения внутренних функций, не являются объектами.
Несмотря на всестороннее использование объектов для представления разделяемых ресурсов, Windows NT не является объектно-ориентированной системой в строгом смысле. Большая часть кода операционной системы написана на С с целью обеспечения переносимости. Несмотря на то, что С не поддерживает непосредственно объектно-ориентированные конструкции, такие, как динамическое связывание типов данных, полиморфные функции или наследование классов, эти инструментальные средства были использованы из-за их широкой распространенности.
Менеджер объектов - это компонент NT executive, который отвечает за создание, удаление, защиту и слежение за NT-объектами. Менеджер объектов централизует операции управления ресурсами, которые в противном случае будут разбросаны по всей ОС.
Менеджер объектов NT выполняет следующие функции:
· выделяет память для объекта;
· присоединяет к объекту так называемый дескриптор безопасности, который определяет, кому разрешено использовать объект, и что они могут с ним делать;
· создает и манипулирует структурой каталога объектов, в котором хранятся имена объектов;
· создает описатель объекта и возвращает его вызывающему процессу.
Процессы пользовательского режима, включая подсистемы окружения, должны иметь описатель объекта перед тем, как их нити смогут использовать этот объект. Использование описателей для работы с системными ресурсами не является новой идеей. Например, библиотек и С и Паскаля (а также других языков) возвращают описатели для открытых файлов. Аналогично приложениям Win32 используют различные типы описателей для управления окнами, курсором мыши, иконками. В обоих случаях описатели служат косвенными указателями на системные ресурсы; эта косвенность предохраняет прикладные программы от рутинной работы непосредственно с системными структурами данных.
Каждый NT-объект является объектом определенного типа. Тип определяет данные, которые хранит объект, и "родные" системные функции, которые могут к нему применяться. Для того чтобы управлять различными объектами единообразно, менеджер объектов требует, чтобы каждый объект содержал несколько полей стандартной информации в определенном месте объекта. До тех пор, пока эти данные имеются, менеджер объектов не заботится о том, что еще хранится в объекте. Каждый объект состоит из двух частей - заголовка объекта и тела объекта, которые содержат стандартные и переменные данные объекта соответственно.
Менеджер объектов работает с заголовком объекта, а другие компоненты executive работают с телами объектов тех типов, которые они сами создают. Заголовок объекта используется менеджером без учета типа объекта. В заголовке объекта любого типа содержится имя, каталог, дескриптор безопасности, квоты на использование ресурсов, счетчик открытых описателей, база данных открытых описателей, признак постоянный/временный, режим пользователя/ядра, указатель на тип объекта.
Кроме заголовка объекта, каждый объект имеет тело объекта, формат и содержание которого уникально определяется типом этого объекта; у всех объектов одного и того же типа одинаковый формат тела. При создании объекта исполнительная часть может оперировать данными в телах всех объектов этого типа.
Процессы и нити
В разных ОС процессы реализуются по-разному. Эти различия заключаются в том, какими структурами данных представлены процессы, как они именуются, какими способами защищены друг от друга и какие отношения существуют между ними. Процессы Windows NT имеют следующие характерные свойства:
· процессы Windows NT реализованы в форме объектов, и доступ к ним осуществляется посредством службы объектов;
· процесс Windows NT имеет многонитевую организацию;
· как объекты-процессы, так и объекты-нити имеют встроенные средства синхронизации;
· менеджер процессов Windows NT не поддерживает между процессами отношений типа "родитель-потомок".
В любой системе понятие "процесс" включает следующее:
· исполняемый код;
· собственное адресное пространство, которое представляет собой совокупность виртуальных адресов, которые может использовать процесс;
· ресурсы системы, такие как файлы, семафоры и т.п., которые назначены процессу операционной системой;
· хотя бы одну выполняемую нить.
Адресное пространство каждого процесса защищено от вмешательства в него любого другого процесса. Это обеспечивается механизмами виртуальной памяти. Операционная система, конечно, тоже защищена от прикладных процессов. Чтобы выполнить какую-либо процедуру ОС или прочитать что-либо из ее области памяти, нить должна выполняться в режиме ядра. Пользовательские процессы получают доступ к функциям ядра посредством системных вызовов. В пользовательском режиме выполняются не только прикладные программы, но и защищенные подсистемы Windows NT.
В Windows NT процесс - это просто объект, создаваемый и уничтожаемый менеджером объектов. Объект-процесс, как и другие объекты, содержит заголовок, который создает и инициализирует менеджер объектов. Менеджер процессов определяет атрибуты, хранимые в теле объекта-процесса, а также обеспечивает системный сервис, который восстанавливает и изменяет эти атрибуты.
В число атрибутов тела объекта-процесса входят:
· идентификатор процесса - уникальное значение, которое идентифицирует процесс в рамках операционной системы;
· маркер доступа - исполняемый объект, содержащий информацию о безопасности;
· базовый приоритет - основа для исполнительного приоритета нитей процесса;
· процессорная совместимость - набор процессоров, на которых могут выполняться нити процесса;
· предельные значения квот - максимальное количество страничной и нестраничной системной памяти, дискового пространства, предназначенного для выгрузки страниц, процессорного времени - которые могут быть использованы процессами пользователя;
· время исполнения - общее количество времени, в течение которого выполняются все нити процесса.
Напомним, что нить является выполняемой единицей, которая располагается в адресном пространстве процесса и использует ресурсы, выделенные процессу.
Подобно процессу нить в Windows NT реализована в форме объекта и управляется менеджером объектов.
Объект-нить имеет следующие атрибуты:
· идентификатор клиента - уникальное значение, которое идентифицирует нить при ее обращении к серверу;
· контекст нити - информация, которая необходима ОС для того, чтобы продолжить выполнение прерванной нити. Контекст нити содержит текущее состояние регистров, стеков и индивидуальной области памяти, которая используется подсистемами и библиотеками;
· динамический приоритет - значение приоритета нити в данный момент;
· базовый приоритет - нижний предел динамического приоритета нити;
· процессорная совместимость нитей - перечень типов процессоров, на которых может выполняться нить;
· время выполнения нити - суммарное время выполнения нити в пользовательском режиме и в режиме ядра, накопленное за период существования нити;
· cостояние предупреждения - флаг, который показывает, что нить должна выполнять вызов асинхронной процедуры;
· счетчик приостановок - текущее количество приостановок выполнения нити.
Кроме перечисленных, имеются и некоторые другие атрибуты.
Как видно из перечня, многие атрибуты объекта-нити аналогичны атрибутам объекта-процесса. Весьма сходны и сервисные функции, которые могут быть выполнены над объектами-процессами и объектами-нитями: создание, открытие, завершение, приостановка, запрос и установка информации, запрос и установка контекста и другие функции.
Алгоритм планирования процессов и нитей
В Windows NT реализована вытесняющая многозадачность, при которой операционная система не ждет, когда нить сама захочет освободить процессор, а принудительно снимает ее с выполнения после того, как та израсходовала отведенное ей время (квант), или если в очереди готовых появилась нить с более высоким приоритетом.
При такой организации разделения процессора ни одна нить не займет процессор на очень долгое время. В ОС Windows NT нить в ходе своего существования может иметь одно из шести состояний (рис.14.3). Жизненный цикл нити начинается в тот момент, когда программа создает новую нить. Запрос передается NT executive, менеджер процессов выделяет память для объекта-нити и обращается к ядру, чтобы инициализировать объект-нить ядра. После инициализации нить проходит через следующие состояния:
Рис. 14.3. Граф состояний нити
· готовности.
При поиске нити на выполнение диспетчер просматривает только нити, находящиеся в состоянии готовности, у которых есть все для выполнения, но не хватает только процессора;
· первоочередной готовности (standby). Для каждого процессора системы выбирается одна нить, которая будет выполняться следующей (самая первая нить в очереди). Когда условия позволяют, происходит переключение на контекст этой нити;
· выполнения. Как только происходит переключение контекстов, нить переходит в состояние выполнения и находится в нем до тех пор, пока либо ядро не вытеснит ее из-за того, что появилась более приоритетная нить или закончился квант времени, выделенный этой нити, либо нить завершится вообще, либо она по собственной инициативе перейдет в состояние ожидания.
· ожидания. Нить может входить в состояние ожидания несколькими способами: нить по своей инициативе ожидает некоторый объект для того, чтобы синхронизировать свое выполнение; операционная система (например, подсистема ввода-вывода) может ожидать в интересах нити; подсистема окружения может непосредственно заставить нить приостановить себя. Когда ожидание нити подойдет к концу, она возвращается в состояние готовности.
· переходного состояния. Нить входит в переходное состояние, если она готова к выполнению, но ресурсы, которые ей нужны, заняты.
Например, страница, содержащая стек нити, может быть выгружена из оперативной памяти на диск. При освобождении ресурсов нить переходит в состояние готовности.
· завершения. Когда выполнение нити закончилось, она входит в состояние завершения. Находясь в этом состоянии, нить может быть либо удалена, либо не удалена. Это зависит от алгоритма работы менеджера объектов, в соответствии с которым он и решает , когда удалять объект. Если executive имеет указатель на объект-нить, то она может быть инициализирована и использована снова.
Диспетчер ядра использует для определения порядка выполнения нитей алгоритм, основанный на приоритетах, в соответствии с которым каждой нити присваивается число - приоритет, и нити с более высоким приоритетом выполняются раньше нитей с меньшим приоритетом. В самом начале нить получает приоритет от процесса, который создает ее. В свою очередь, процесс получает приоритет в тот момент, когда его создает подсистема той или иной прикладной среды. Значение базового приоритета присваивается процессу системой по умолчанию или системным администратором. Нить наследует этот базовый приоритет и может изменить его, немного увеличив или уменьшив. На основании приоритета, называемого приоритетом планирования, начинается выполнение нити. В ходе выполнения приоритет планирования может меняться.
Windows NT поддерживает 32 уровня приоритетов, разделенных на два класса - класс реального времени и класс переменных приоритетов. Нити реального времени, приоритеты которых находятся в диапазоне от 16 до 31, являются более приоритетными процессами и используются для выполнения задач, критичных ко времени.
Каждый раз, когда необходимо выбрать нить для выполнения, диспетчер прежде всего просматривает очередь готовых нитей реального времени и обращается к другим нитям, только когда очередь нитей реального времени пуста. Большинство нитей в системе попадают в класс нитей с переменными приоритетами, диапазон приоритетов которых от 0 до 15.
Этот класс имеет название " переменные приоритеты" потому, что диспетчер настраивает систему, выбирая (понижая или повышая) приоритеты нитей этого класса.
Алгоритм планирования нитей в Windows NT объединяет в себе обе базовых концепции - квантование и приоритеты. Как и во всех других алгоритмах, основанных на квантовании, каждой нити назначается квант, в течение которого она может выполняться. Нить освобождает процессор, если:
· блокируется, уходя в состояние ожидания;
· завершается;
· исчерпан квант;
· в очереди готовых появляется более приоритетная нить.
Использование динамических приоритетов, изменяющихся во времени, позволяет реализовать адаптивное планирование, при котором не дискриминируются интерактивные задачи, часто выполняющие операции ввода-вывода и недоиспользующие выделенные им кванты. Если нить полностью исчерпала свой квант, то ее приоритет понижается на некоторую величину. В то же время приоритет нитей, которые перешли в состояние ожидания, не использовав полностью выделенный им квант, повышается. Приоритет не изменяется, если нить вытеснена более приоритетной нитью.
Для того, чтобы обеспечить хорошее время реакции системы, алгоритм планирования использует наряду с квантованием концепцию абсолютных приоритетов. В соответствии с этой концепцией при появлении в очереди готовых нитей такой, у которой приоритет выше, чем у выполняющейся в данный момент, происходит смена активной нити на нить с самым высоким приоритетом.
В многопроцессорных системах при диспетчеризации и планировании нитей играет роль их процессорная совместимость: после того, как ядро выбрало нить с наивысшим приоритетом, оно проверяет, какой процессор может выполнить данную нить и, если атрибут нити “процессорная совместимость" не позволяет нити выполняться ни на одном из свободных процессоров, то выбирается следующая в порядке приоритетов нить.
Нарастающие темпы компьютеризации уже приблизили
Нарастающие темпы компьютеризации уже приблизили время, когда в контакте с компьютерами оказываются не только относительно немногочисленные профессионалы по обработке информации, а практически все члены общества. Контакт с компьютером - это контакт с его программным обеспечением и, прежде всего, с операционной системой (ОС). Именно она формирует интерфейс между аппаратурой компьютера и человеком, причем задача создателей ОС состоит в том, чтобы сделать этот интерфейс, как теперь принято говорить, как можно более дружественным.
Свойства ОС зачастую оказываются не менее важными, чем свойства аппаратуры. Известны случаи, когда переход с одной ОС на другую на одной и той же машине приводил к пятикратному ускорению разработки программ.
На «голой» машине в современном мире не работает практически никто, и именно это определяет интерес к операционным системам.
В главе 1 вводится понятие «операционная система», приводятся факты из истории развития операционных систем и обсуждаются основные характеристики операционных систем. Глава 2 рассматривает архитектуру вычислительной системы и выделяет обобщенный состав и функции операционной системы. В главе 3 даются понятия процесса, перехода процесса из состояния в состояние, прерывания, переключения контекста, вводятся различные концепции, связанные с управлением процессами, и рассматривается организация прерываний в различных архитектурах ЭВМ. В главе 4 введено понятие асинхронности. Здесь обсуждаются проблемы, возникающие в случае совместного доступа к разделяемым ресурсам, а также описаны различные способы взаимоисключения, как аппаратные, так и программные, обеспечивающие решение этих проблем. Рассматриваются примитивы взаимоисключения, семафоры и мониторы, и то, каким образом их можно использовать для решения классических проблем параллелизма; приведено описание задачи «читатели и писатели», реализуемое при помощи рассмотренных средств. Здесь же объясняется, что такое тупик (дедлок), при котором выполнение различных процессов не может продолжаться, поскольку они ожидают событий, которые никогда не произойдут; представлены различные средства решения этой проблемы.
В главе 5 обсуждаются различные проблемы управления памятью в системах физической (реальной) памяти, в главе 6 - виртуальной памяти. Прослеживается развитие систем реальной памяти - от систем, где вся память предоставлялась в распоряжение одного пользователя, до мультипрограммных систем с различными видами распределения памяти, описываются организация и управление виртуальной памятью. В главе 6 объясняется концепция виртуальной памяти и показано, каким образом благодаря применению методов поблочного отображения, страничной организации и сегментации памяти можно уменьшить объем информации отображения. Приводится подробное описание реализации виртуальной памяти и преобразования адресов в системах со страничной организацией и сегментацией памяти и обсуждаются различные стратегии управления системами виртуальной памяти. Рассматриваются стратегии вталкивания, размещения и выталкивания данных, причем обсуждаются стратегии вталкивания по требованию и упреждающего вталкивания. Основное внимание в этой главе уделяется стратегиям выталкивания (подкачки) страниц; рассматриваются принцип оптимальности и стратегии выталкивания страниц. В главе 7 обсуждаются понятия многозадачность и многонитевость и различия между ними, а также реализация многонитевой обработки и подкачка страниц памяти в операционной системе Windows 95/NT. В главе 8 речь идет об управлении процессорами, в частности, о проблемах планирования загрузки процессоров и о мультипроцессорном режиме. Основное внимание сосредоточено на стратегиях планирования; здесь обсуждается планирование на верхнем уровне, промежуточном и нижнем уровне, цели и критерии планирования, приоритетное планирование, статические и динамические приоритеты, «заслуженные» или «купленные» приоритеты, а также планирование по предельному сроку. Представлены различные алгоритмы планирования. Эта глава заканчивается анализом механизмов многоуровневых очередей с обратными связями. В главе 9 обсуждаются мультипроцессорные системы, разработанные как средство повышения производительности и надежности машин.
Рассматривается использование достоинств параллелизма. Анализируются различные мультипроцессорные аппаратные архитектуры и варианты организации операционных систем, и архитектурные решения мультипроцессорных Flex/MP и TryFlex фирмы COMPAQ. В главе 10 рассматривается управление периферийными устройствами в различных архитектурах ЭВМ и организация программного обеспечения ввода-вывода. Глава 11 посвящена подсистеме управления данными. Рассматриваются логический и физический аспекты управления файлами, способы организации и управления внешней памятью. В главе 12 рассматриваются современные концепции и технологии проектирования операционных систем. Формулируются требования, предъявляемые к современным ОС, такие, как расширяемость, переносимость, совместимость, безопасность. Большое внимание уделяется описанию различных тенденций структурного построения ОС. Главы 13 и 14 описывают характеристики и области применения операционных систем UNIX и Windows NT, соответственно.
|