Понедельник , 30 марта 2020
Новости
Главная / Студентам / ОСиС / Лекция № 6. АРХИТЕКТУРА ОПЕРАЦИОННЫХ СИСТЕМ

Лекция № 6. АРХИТЕКТУРА ОПЕРАЦИОННЫХ СИСТЕМ

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

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

  • Принцип модульности. Операционная система строится из множества программных модулей. Под модулем понимают функционально законченный элемент системы, выполненный в соответствии с принятыми межмодульными интерфейсами. По своему определению модуль предполагает легкий способ его замены другим при необходимости. Принцип модульности отражает технологические и эксплуатационные свойства системы. Наибольший эффект его использования достижим в случае, когда принцип распространен одновременно на операционную систему, прикладные программы и аппаратуру. Принцип модульности является одним из основных в UNIX-системах.
  • Принцип виртуализации. Любая операционная система, являясь средством распределения ресурсов и организуя по определенным правилам управление процессами, скрывает от пользователя и его приложений реальные аппаратные и иные ресурсы, заменяя их некоторой абстракцией. Операционная система существенно изменяет наши представления о компьютере. Она виртуализирует его, добавляя ему функциональности, удобства управления, предоставляя средства организации параллельных вычислений и т.д. Именно благодаря операционной системе мы воспринимаем компьютер совершенно иначе, чем без нее. Одним из аспектов принципа виртуализации является независимость программ от внешних устройств. Связь программы с этими устройствами производится не в процессе ее создания, а в период планирования исполнения. В результате перекомпиляция программы при работе с новым устройством не требуется.
  • Принцип мобильности. Мобильность означает возможность легкого переноса операционной системы на другую аппаратную платформу. Мобильная операционная система обычно разрабатывается с помощью специального языка высокого уровня, предназначенного для создания системного программного обеспечения. Одним из таких языков является язык C, который был специально создан для того, чтобы написать на нем очередную версию операционной системы UNIX. В последние годы язык C++ также стал использоваться для этих целей, поскольку идеи объектно-ориентированного программирования оказались плодотворными не только для прикладного, но и для системного программирования.
  • Принцип совместимости. Соблюдение этого принципа гарантирует способность операционной системы выполнять программы, написанные для других систем или для более ранних версий данной операционной системы, а также для другой аппаратной платформы.
  • Принцип открытости. Этот принцип иногда трактуют как принцип расширяемости системы. Открытая операционная система доступна для анализа как пользователям, так и системным специалистам. Прекрасные возможности для расширения ОС предоставляет подход к структурированию операционной системы по типу клиент-сервер с использованием микроядерной технологии. В соответствии с этим подходом операционная система строится как совокупность привилегированной управляющей программы и набора непривилегированных служб – «серверов». Основная часть операционной системы может оставаться неизменной, в то время как добавляются новые службы или изменяются старые. К открытым ОС прежде всего следует отнести UNIX-системы и Linux.
  • Принцип генерируемости. Согласно этому принципу исходное представление ядра системы должно обеспечивать возможность настройки, исходя из конкретной конфигурации вычислительного центра и круга решаемых задач. Под генерацией ОС понимается ее сборка из отдельных программных модулей. Процесс генерации осуществляется с помощью специальной программы-генератора. В наши дни при использовании персональных компьютеров с принципом генерируемости можно столкнуться разве что при работе с Linux. В этой системе имеется возможность не только использовать какое-либо готовое ядро, но и самому сгенерировать (скомпилировать) такое ядро, которое будет оптимальным для данного конкретного персонального компьютера и решаемых на нем задач. В остальных ОС конфигурирование системы под соответствующий состав оборудования осуществляется на этапе установки, причем в большинстве случаев не представляется возможным серьезно вмешаться в этот процесс.

6.2 Интерфейсы операционных систем

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

Интерфейсы системного и прикладного программирования (API) предназначены для выполнения следующих задач:

  1. Управление процессами, которое включает в себя следующий набор основных функций:
    1. запуск, приостанов и снятие задачи с выполнения;
    2. задание или изменение приоритета задачи;
    3. взаимодействие задач между собой;
    4. вызов удаленных процедур (Remote Procedure Call).
  2. Управление памятью:
    1. запрос на выделение блока памяти;
    2. освобождение памяти;
    3. изменение параметров блока памяти (например, память может быть заблокирована процессом либо предоставлена в общий доступ);
    4. отображение файлов на память (имеется не во всех системах).
  3. Управление вводом-выводом:
    1. запрос на управление виртуальными устройствами (напомним, что управление вводом-выводом является привилегированной функцией самой операционной системы, и никакая из пользовательских задач не должна иметь возможности непосредственно управлять устройствами);
    2. файловые операции (запросы к системе управления файлами на создание, изменение и удаление данных, организованных в файлы).

В последние годы большую популярность получили графические интерфейсы (Graphical User Interface, GUI), в которых задействованы манипуляторы типа «мышь». Указание курсором на объект и щелчок на кнопке мыши приводит к каким-либо действиям. Можно сказать, что такая интерфейсная подсистема транслирует «команды» пользователя в обращения к операционной системе.

Управление GUI является частным случаем задачи управления вводом-выводом и не относится к функциям ядра операционной системы, хотя в ряде случаев разработчики ОС относят функции GUI к основному системному интерфейсу API.

Общий термин API (Application Program Interface – интерфейс прикладного программирования) можно разделить на следующие направления:

  • API как интерфейс высокого уровня, принадлежащий к библиотекам RTL (Run Time Library);
  • API прикладных и системных программ, входящих в поставку операционной системы;
  • Прочие интерфейсы API.

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

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

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

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

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

Например, библиотеки, удовлетворяющие стандарту POSIX, доступны в большинстве систем программирования для языка С. И если прикладная программа использует только библиотеки этого стандарта, то ее исходный код будет переносимым. Еще одним примером является широко известная библиотека графического интерфейса XLib, поддерживающая стандарт графической среды X-Windows.

Стандарт POSIX (Portable Operating System Interface for Computer Environments – независимый от платформы системный интерфейс для компьютерного окружения) – это стандарт IEEE (Institute of Electrical and Electronics Engineers – институт инженеров по электротехнике и радиоэлектронике), описывающий системные интерфейсы для открытых операционных систем, в том числе оболочки, утилиты и инструментарии. Стандарт базируется на UNIX-системах, но допускает реализацию и в других операционных системах.