Лекции по операционным системам (1114738), страница 15
Текст из файла (страница 15)
Уровень прикладных программ. На этом уровне находятся протоколы, часть которых опираются на протокол TCP, а часть — на UDP.
Протоколы, которые основываются на принципах работы протокола TCP, обеспечивают доступ и работу с заведомо корректной информацией, причем именно в среде межсетевого взаимодействия (internet), и эти протоколы требуют корректной доставки. В частности, это протокол TELNET (Network Terminal Protocol) — прикладной протокол, эмулирующий терминальное устройство; протокол перемещения файлов FTP (File Transfer Protocol); протокол передачи почтовых сообщений SMTP (Simple Mail Transfer Protocol).
Есть ряд прикладных протоколов, основанных на использовании протокола UDP. Эти протоколы оказываются относительно быстрыми, поскольку максимально снижены накладные расходы на передачу, но они допускают наличие ошибок.
Часть подобных протоколов действуют в рамках локальной сети. В частности, в большинстве случаев протокол NFS (Network File System) сетевой файловой системы функционирует именно в рамках локальной сети, и очень редко его запускают в межсетевом режиме.
Другая часть протоколов должны контролироваться, с одной стороны, на прикладном уровне, а с другой стороны, они предполагают обмен очень небольшими порциями данных. К таким протоколам относится DNS (Domain Name Service), который позволяет мнемоническим способом именовать сетевые устройства. В частности, этот протокол осуществляет преобразования IP-адресов в доменные имена и обратно.
1.3Основы архитектуры операционных систем
Этот раздел мы начнем с определения базовых понятий, среди которых очень важным для нас станет понятие операционной системы. Этот термин имеет различные толкования в разных изданиях, мы остановимся на следующем.
Операционная система — это комплекс программ, в функции которого входит обеспечение контроля за существованием, использованием и распределением ресурсов вычислительной системы. Напомним, что вычислительная система может включать в свой состав как физические, так и виртуальные ресурсы. Чтобы дать более ясную картину того, что же мы будем считать операционной системой, разберем ее определение детально.
Начнем с того, что операционная система обеспечивает контроль за существованием ресурсов. Для любого ресурса степень его доступности зависит от операционной системы. Существуют ресурсы, которые полностью зависят от того, имеется ли их реализация в операционной системе или нет, если есть, то какая именно это реализация. Примером подобного ресурса служит файловая система: этого ресурса может и не быть в операционной системе, может существовать одна модель, или другая модель, или сразу несколько моделей.
Следующий пункт — использование ресурсов. Здесь имеется в виду, что операционная система предоставляет все средства, обеспечивающие доступность ресурсов ВС пользователю (точнее программам).
И, наконец, распределение: под этим будем понимать обеспечение всевозможных моделей регламентации доступа.
Любая операционная система опирается на набор базовых сущностей, на основе характеристик которых выстраиваются почти все эксплуатационные свойства конкретной операционной системы. При этом, для различных операционных систем наборы базовых сущностей зачастую различаются: одни основаны на понятии устройства, другие — на понятии файла, третьи — на понятии набора данных. Но в большинстве случаев в состав базовых включается сущность, обозначающая исполняемую программу, задачу, задание или процесс. Эта сущность определяет некоторый процесс исполнения последовательности команд, причем здесь может участвовать единственная ветвь вычислений, а может сразу и несколько параллельных ветвей. Из множества трактовок этой сущности мы выберем понимание ее именно как процесса.
Процесс — это совокупность машинных команд и данных, обрабатывающаяся в рамках вычислительной системы и обладающая правами на владение некоторым набором ресурсов.
Разберемся в этом определении. Понятие совокупности машинных команд и данных обозначает то, что принято называть исполняемой программой, т.е. это код и операнды, используемые в этом коде. Далее, под термином обработки в рамках ВС будем понимать, что эта программа сформирована и находится в системе в режиме обработки (это может быть и ожидание, и исполнение на процессоре, и т.п.). И, третье, понятие обладания правами на владение некоторым набором ресурсов обозначает, по сути, возможность доступа. Отметим, что здесь речь не идет об эксклюзивных правах, поскольку в общем случае это было бы некорректно. Итак, иными словами процесс можно определить как исполняемую программу, которая введена в систему для ее обработки, и с которой ассоциированы некоторые ресурсы вычислительной системы.
Ресурсы, выделяемые процессам, могут быть двух типов. Первая категория ресурсов состоит из тех ресурсов, которые выделяются процессу на эксклюзивных правах. Это означает, что этот ресурс, пока процесс им владеет, принадлежит ему и только ему, и никакой иной процесс не имеет право работать с данным ресурсом. Вторая категория — это те ресурсы, которые в один и тот же момент времени могут принадлежать двум и более процессам, и их принято называть разделяемыми ресурсами. Здесь сделаем небольшое пояснение: то, что разделяемый ресурс может одновременно принадлежать нескольким процессам, не означает, что к нему возможен одновременный доступ. Обозначенная проблема решается на другом уровне посредством использования разных схем синхронизации доступа к разделяемому ресурсу, и об этом речь пойдет несколько позже.
С точки зрения выделения ресурса процессу используются две модели организации этого выделения. Первый способ — это предварительная декларация ресурсов. В этом случае до ввода программы в систему и формирования для нее процесса описывается перечень тех ресурсов, которыми процесс будет обладать. Например, это может быть перечень областей оперативной памяти, которые будут доступны данному процессу (если система поддерживает механизм виртуальной памяти, то это будет перечень областей виртуальной памяти, доступных процессу). Или же это может быть предельное время центрального процессора, которое может быть потрачено на исполнение данного процесса. Так или иначе, при вводе программы и формировании процесса операционная система постарается выделить все необходимые ресурсы, которые были предварительны декларированы. Если в системе нет заказанного ресурса, то она, скорее всего, не станет запускать процесс, который запросил этот ресурс.
Вторая модель — это динамическое дополнение списка ресурсов. Данная модель предполагает выделение процессу ресурса уже во время выполнения этого процесса. Это означает, что в системе происходит запуск процесса с выделением ему минимально необходимой области виртуальной памяти, а затем, когда процесс обращается к системе за выделением дополнительной области, то ОС обрабатывает эти запросы соответствующим образом. Отметим также, что на практике также применяются и смешанные подходы, но во многих системах, с которыми мы сталкиваемся в нашей повседневной жизни, ориентация сделана на динамическую модель выделения ресурсов.
Многие операционные системы разрабатывались и разрабатываются таким образом, чтобы обладать следующими важными свойствами: надежность, защита, эффективность и предсказуемость.
Надежность означает, что система должна быть надежной как программный комплекс, т.е. число программных ошибок в системе должно быть сведено к минимуму и должно быть соизмеримо с количеством возможных аппаратных сбоев.
Защита информации на сегодняшний день является одним из основных требований, предъявляемых к системе. ОС должна обеспечивать защиту информации и ресурсов от несанкционированного доступа.
Свойство эффективности означает, что функционирование системы должно удовлетворять некоторым требованиям, критериям эффективности, которые, по сути, являются оценкой соответствия.
И, наконец, это предсказуемость системы, являющееся также одним из важных свойств ОС, поскольку большинство систем, которые, так или иначе, являются массово распространенными, при возникновении разного рода форс-мажорных обстоятельств должны вести себя строго определенным способом. Это свойство должно очерчивать круг всевозможных проблем, которые могут возникнуть в той или иной ситуации, а также подразумевать устойчивость системы к возникновению подобных обстоятельств.
1.3.1Структура ОС
Существует множество взглядов, касающихся структуры операционной системы, и в этом разделе речь пойдет о некоторых из них.
Простейшая структурная организация основана на представлении операционной системы в виде композиции следующих компонентов (Рис. 64.).
-
Структурная организация ОС.
Ядро (kernel) ОС — это часть ОС, в которой реализована функциональность ОС; ядро работает в режиме супервизора, т.е. в привилегированном режиме, и резидентно (постоянно) размещается в оперативной памяти. Итак, по определению ядро обеспечивает реализацию некоторого набора функций операционной системы. Это может быть очень большой набор функций, а может маленький — все зависит от конкретной реализации системы. Ядро может включать в свой состав драйверы основных физических или виртуальных устройств.
Над уровнем ядра может надстраиваться следующий уровень — это уровень динамически подгружаемых драйверов физических и виртуальных устройств. Под динамически подгружаемыми понимается то, что в зависимости от ситуации состав этих драйверов при инсталляции и загрузке системы может меняться. Соответственно, эти драйверы можно поделить на две категории: резидентные драйверы и нерезидентные. Резидентные драйверы подгружаются в систему в процессе ее загрузки и находятся в ней до завершения ее работы. Примером резидентного драйвера может быть драйвер физического диска.
Отметим, что большинство современных операционных систем имеют в своем составе набор драйверов широкого спектра конкретных физических устройств и, в частности, физических дисков. Поэтому зачастую при смене устройства драйвер менять не надо: он уже есть в системе. Но при этом системе незачем держать драйвера всех устройств в оперативной памяти. Соответственно, следуя той или иной стратегии, будут загружаться драйверы тех физических устройств, которые реально будут обслуживаться системой. Стратегии могут быть различными, одной из них: может быть явное указание системе списка драйверов, которые необходимо подгрузить (в этом случае, если в списке что-то будет указано неправильно, то соответствующее устройство, возможно, просто не будет работать). Вторая стратегия предполагает, что система при загрузке самостоятельно сканирует подключенное к ней оборудование и выбирает те драйверы, которые должны быть подгружены для обслуживания найденного оборудования.
Итак, примером резидентного драйвера может служить драйвер физического диска. Это объясняется тем, что диск является устройством оперативного доступа, поэтому к моменту полной загрузки системы все должно быть готово для работы. А, например, в системах, где пользователи редко используют сканер, держать соответствующий драйвер резидентно не имеет смысла, поскольку скорость работы самого устройства много медленнее, чем скорость загрузки драйвера из внешней памяти в оперативную. Соответственно, драйвер сканера в этом случае служит одним из примеров нерезидентных драйверов, т.е. тех драйверов, которые могут находиться в ОЗУ, а могут быть и отключенными, но они также динамически подгружаемые.
В общем случае драйверы могут работать как в привилегированном режиме, так и в пользовательском.
И, наконец, некоторой логической вершиной рассматриваемой структуры ОС будут являться интерфейсы системных вызовов (API — Application Program Interface). Под системным вызовом будем понимать средство обращения процесса к ядру операционной системы за выполнением той или иной функции (возможности, услуги, сервиса). Примерами системных вызовов являются открытие файла, чтение/запись в него, порождение процесса и т.д. Отличие обращения к системному вызову от обращения к библиотеке программ заключается в том, что библиотечная программа присоединяется к исполняемому коду процесса, поэтому вычисление библиотечных функций будет происходить в рамках процесса. Обращение к системному вызову — это вызов тех команд, которые инициируют обращение к системе. Как уже отмечалось выше, инициацией обращения к операционной системе может служить либо прерывание, либо исполнение специальной команды. Следует понимать различие между системным вызовом и библиотечной функцией. Например, осуществляя работу с файлом, имеется возможность работы с ним посредством обращения к системным вызовам либо посредством использования библиотеки ввода-вывода. В последнем случае в тело процесса включаются дополнительные функции из данной библиотеки, а уже внутри данных функций происходит обращение к необходимым системным вызовам.
Итак, существует несколько подходов к структурной организации операционных систем. Один из них можно назвать классическим: он использовался в первых операционных системах и используется до сих пор — это подход, основанный на использовании монолитного ядра. В этом случае ядро ОС представляет собою единую монолитную программу, в которой отсутствует явная структуризация, хотя, конечно, в ней есть логическая структуризация. Это означает, что монолитное ядро содержит фиксированное число реализованных в нем функций, поэтому модификация функционального набора достаточно затруднительна. Устройство монолитного ядра напоминает физическую организацию первых компьютеров: в них также нельзя было выделить отдельные физические функциональные блоки — все было единым, монолитным и интегрированным друг с другом. Аналогичными свойствами обладают одноплатные компьютеры, у которых все необходимые компоненты (ЦПУ, ОЗУ и пр.) расположены на одной плате, и чтобы что-то изменить в этой конфигурации, требуются соответствующие инженерные знания.
На Рис. 65. проиллюстрирована структурная организация классической системы Unix. В данном случае ядро имеет фиксированный интерфейс системных вызовов. В нем реализовано управление процессами, а также драйвер файловой системы, реализована вся логика системы по организации работы с устройствами, которые можно разделить на байт-ориентированные и блок-ориентированные, и пр.