Модель клиент—сервер и модель ОС на базе микроядра.
11.11.2020 21:31
Модель клиент—сервер — это еще один подход к структурированию ОС. В широком смысле модель клиент—сервер предполагает наличие программного компонента — потребителя какого-либо сервиса — клиента и программного компонента — поставщика этого сервиса — сервера.
Взаимодействие между клиентом и сервером стандартизуется, так что сервер может обслуживать клиентов, реализованных различными способами и, может быть, разными производителями. При этом главным требованием является то, чтобы они запрашивали услуги сервера понятным ему способом. Инициатором обмена обычно является клиент, который посылает запрос на обслуживание серверу, находящемуся в состоянии ожидания запроса (рис. 59). Один и тот же программный компонент может быть клиентом по отношению к одному виду услуг и сервером для другого вида услуг. Модель клиент—сервер является скорее удобным средством ясного представления функций того или иного программного элемента в той или иной ситуации, нежели технологией. Эта модель успешно применяется не только при построении ОС, но и на всех уровнях программного обеспечения, и имеет в некоторых случаях более узкий, специфический смысл, сохраняя, естествено, при этом все свои общие черты.
Рис. 59. Структура ОС клиент-сервер.
В целях обеспечения эффективности и целостности работы ОС реализуется двумя режимами работы: режим пользователя (user mode) и режим ядра (kernel mode).
Применительно к структурированию ОС идея состоит в разбиении ее на несколько процессов — подсистем, каждая из которых выполняет отдельный набор сервисных функций — например, управление памятью, создание или планирование процессов. Каждая подсистема выполняется в пользовательском режиме. Клиент, которым может быть либо другой компонент ОС, либо прикладная программа, запрашивает сервис, посылая сообщение на сервер. Ядро ОС (называемое здесь микроядром), работая в привилегированном режиме, доставляет сообщение нужному серверу, сервер выполняет операцию, после чего ядро возвращает результаты клиенту с помощью другого сообщения (см. рис. 59).
Режим пользователя — менее привилегированный по сравнению с режимом ядра режим работы процессора. Он не имеет прямого доступа к аппаратуре. Выполняющийся в этом режиме код непосредственно имеет дело лишь с объектами своего адресного пространства (рис. 60).
Рис. 60. Представление режима пользователя.
Системные службы он вызывает через интерфейсы прикладных программ (Application Program Interface — API). Поддерживающие их приложения и подсистемы работают в режиме пользователя. При запуске приложения создается процесс (process), реализованный в виде объекта (object). Объект состоит из исполняемой программы, пространства адресов виртуальной памяти и одного или нескольких потоков.
Особенности процесса пользовательского режима таковы:
• не имеет прямого доступа к оборудованию. Это сделано в целях зашиты от неверно работающих приложений или от несанкционированного доступа. Запросы на использование аппаратных ресурсов должны быть разрешены компонентом режима ядра;
• ограничен размерами выделенного адресного пространства. Ограничение размера памяти, используемой процессом, позволяет обеспечить дополнительную защиту ОС. Это ограничение устанавливается путем выделения процессу диапазона фиксированных адресов;
• может быть выгружен из физической памяти в виртуальную память на жестком диске. Виртуальная память (virtual memory, VRAM) использует пространство жесткого диска как дополнительную оперативную память. В результате процесс режима пользователя получает доступ к памяти, размер которой превышает объем ОЗУ;
• приоритет процесса данного типа ниже, чем у процессов режима ядра. Поэтому в сравнении с последними ему, как правило, предоставляется меньше процессорного времени. Это предохраняет ОС от снижения производительности или возникновения задержек, связанных с ожиданием за¬вершения работы приложений.
Подход с использованием ядра заменил вертикальное распределение функций операционной системы на горизонтальное. Компоненты, лежащие выше микроядра, хотя и используют сообщения, пересылаемые через микроядро, взаимодействуют друг с другом непосредственно. Микроядро играет роль регулировщика. Оно проверяет сообщения, пересылает их между сервера¬ми и клиентами и предоставляет доступ к аппаратуре.
Режим ядра — это привилегированный режим работы, в котором код имеет прямой доступ ко всем аппаратным ресурсам и всей памяти, включая адресные пространства всех процессов режима пользователя (рис. 61).
Рис. 61. Представление режима ядра.
Кроме того, компоненты не выгружаются на жесткий диск в файл подкачки виртуальной памяти. Функционирование режима ядра обеспечивается исполнительной системой, включающей в себя системные службы, микроядро и слой абстрагирования от оборудования (HAL).
Исполнительная система представляет собой обобщенное наименование ряда подсистем и компонентов ОС, работающих в режиме ядра. Поскольку системные (исполнительные) службы обеспечивают работу всех основных функций ОС, очень важно защитить их от влияния приложений и подсистем пользовательского режима. Такую защиту обеспечивают системные службы, работающие в режиме ядра:
• диспетчеры — различные модули, осуществляющие управление вводом-выводом, объектами, безопасностью, процессами, взаимодействием между процессами, виртуальной памятью, окнами и графикой;
• драйверы устройств — программные компоненты, управляющие доступом к оборудованию;
Микроядро предоставляет наиболее общие службы ОС, такие как диспетчеризация потоков, обработка прерываний перво¬го уровня и отложенный вызов процедур. Микроядро расположено между слоем системных служб и HAL.
Слой абстрагирования от оборудования (HAL) представляет собой библиотеку режима ядра, включающую процедуры управления оборудованием. Этот программный слой позволяет скрыть особенности аппаратных платформ, предоставив ОС стандартные точки входа в процедуры, благодаря чему для нее исчезают различия между платформами и архитектурами. Поэтому ОС может функционировать на разных платформах с разными процессорами. Сетевая операционная система способна работать на одно- и многопроцессорных компьютерах и позволяет высокоуровневым драйверам графических адаптеров форматировать данные для мониторов разных типов.
Сетевые ОС обеспечивают работу с приложениями с помощью подсистем среды. Подсистема среды предоставляет API приложениям, разработанным под конкретную среду или ОС. Примером является широко распространенная подсистема Win32.
Микроядро реализует функции, лежащие в основе операционной системы. Это основа для менее существенных системных служб и приложений. В общем случае, подсистемы, бывшие традиционно неотъемлемыми частями операционной системы — файловые системы, управление окнами и обеспечение безопасности — становятся периферийными модулями, взаимодействующими с ядром и друг с другом.
Главный принцип разделения работы между микроядром и окружающими его модулями — включать в микроядро только те функции, которым абсолютно необходимо исполняться в режиме супервизора и в привилегированном пространстве. Под этим обычно подразумеваются машинозависимые, программы (включая поддержку нескольких процессоров), некоторые функции управления процессами, обработка прерываний, поддержка пересылки сообщений, некоторые функции управления устройствами ввода-вывода, связанные с загрузкой команд в регистры устройств.
Есть два пути построения подсистем.
Один путь — разместить несколько таких чувствительных к режиму работы процессора серверов в пространстве ядра, что обеспечит им полный доступ к аппаратуре и в то же время связь с другими процессами с помощью обычного механизма сообщений. Такой подход был использован, например, при разработке Windows NT: кроме микроядра, в привилегированном режиме работает часть Windows NT, называемая executive — управляющей программой. Она включает ряд компонентов, которые управляют виртуальной памятью, объектами, вводом-выводом и файловой системой (включая сетевые драйверы), взаимодействием процессов и частично системой безопасности.
Другой путь заключается в том, чтобы оставить в ядре только небольшую часть сервера, представляющую собой механизм реализации решения, а часть, отвечающую за принятие решения, переместить в пользовательскую область.