
Танненбаум Е. Архітектура компютера [pdf]
.pdf

4 8 4 Глава 6. Уровень операционной системы
это и привлекло внимание судебного департамента США, который тогда компанию Microsoft в суд, обвинив ее в незаконном монополизме.
Во время всех этих преобразований компания Microsoft разрабатыва шенноновую 32-битнуюоперационнуюсистему,котораябыланаписаназано Эта новая система называлась Windows New Technology (новая техноло Windows NT1. Изначально предполагалось, что она заменит все другие онные системы компьютеров на базе процессоров Intel, но она очень медл пространялась и позднее была переориентирована наболее дорогостоящие теры. Постепенно она стала пользоваться популярностью и в других кру
NT продается в двух вариантах: для серверов и для рабочих станций версии практически идентичны и выработаны из одного исходного код версия предназначена для локальных файловых серверов и серверов для имеет более сложные особенности управления, чем версия для рабочих которая предназначенадля настольных вычислений одного пользователя. С ет особый вариант версии для серверов, предназначенный для больших сай личные версии настраиваются по-разному, и каждая из них оптимизир ожидаемого окружения. Во всем остальном эти версии сходны. Практи выполняемые файлы идентичны для всех версий. Система NT сама оп свою версию по специальной переменной во внутренней структуре дан темный реестр). Пользователям запрещено изменять эту переменную и т разом превращать дешевую версию для рабочей станции в более дорого версию для сервера или в версию для предприятия. В дальнейшем мы заострять внимание на различиях.
MS-DOS и все предыдущие версии Windows были рассчитаны на одног вателя. NT поддерживает мультипрограммирование, поэтому на одной машине в одно и то же время могут работать несколько пользователей2. Н сетевой сервер позволяет нескольким пользователям входить в систему п новременно, причем каждый из них получает доступ к своим собственным
NT представляет собой реальную 32-битную операционную систему программированием. Она поддерживает несколько пользовательских п каждый из которых имеет в своем распоряжении полное 32-битное вир адресное пространство с подкачкой страниц по требованию. Кроме того, тема написана как 32-битный код.
NT, в отличие от Windows 95, имеет модульную структуру. Она со небольшого ядра, которое работает в привилегированном режиме, и не обслуживающих процессов, работающих в пользовательском режиме.
1Работы над операционной системой, получившей впоследствии название Windows N в рамках совместного проекта по созданию новой 32-битной версии операционной сис который одно время осуществляли компании IBM и Microsoft после ряда неудач с п 16-битной версией системы OS/2. Этот проект, ориентированный на возможности микро 5386, начался в 1989 году, однако уже в следующем году пути этих компаний разошлись, продолжившая работу над системой OS/2 v.3.0, затем дала ей имя Windows NT, желая эт
и использованиеединого графического интерфейсасосвоими популярными одноименны

Примеры операционных систем |
4 8 5 |
вательские процессы взаимодействуют с обслуживающими процессами с применением модели клиент—сервер: клиент посылает запрос серверу, а сервер выполняет работу и отправляет результат клиенту. Модульная структура позволяет переносить систему NT на некоторые компьютеры не из семейства Intel (DEC Alpha, IBM Power PC и SGI MIPS). Однако из соображений повышения производительности начиная с NT 4.0 большая часть системы была перенесена обратно в ядро.
Можно до бесконечности долго рассказывать, какова структура NT и каков ее интерфейс. Поскольку нас в первую очередь интересует виртуальная машина, представленная различными операционными системами, мы кратко расскажем о структуре системы, а затем перейдем к интерфейсу.
Структура NT показана на рис. 6.25. Она состоит из ряда модулей, которые расположены по уровням. Их совместная работа реализует операционную систему. Каждый модуль выполняет определенную функцию и имеет определенный интерфейс с другими модулями. Практически все модули написаны на языке С, хотя часть графического интерфейсанаписана на C++, а кое-что из самых нижнихуровней — на ассемблере.
В самом низу расположен уровень аппаратных абстракций. Он должен снабжать операционную систему абстрактными аппаратными устройствами, лишенными всех недостатков, которых у реального аппаратного обеспечения в избытке. К моделируемым устройствам относятся кэш-память вне кристалла, тактовые генераторы, шины ввода-вывода, контроллеры прерываний и контроллеры прямого доступа к памяти. Если эти устройства представить перед операционной системой в идеализированном виде, то это упростит перенос NT на другие аппаратные платформы, поскольку большая часть необходимых изменений концентрируется в одном месте.
Программа POSIX |
ПрограммаWin32 |
Программа OS/2 |
||||
Подсистема POSIX |
ПодсистемаWin32 |
Подсисте>ма OS/2 |
||||
|
|
Системный интерфейс |
|
|||
|
|
|
Системные службы |
|
||
Ввод- |
Кэш |
Виртуальная Процессы |
Защита |
|
||
вывод |
файлов |
память |
и потоки |
|
||
|
Win32 |
|||||
|
|
|
|
|
||
Системы |
Управление объектами |
и интерфейс |
||||
графических |
||||||
файлов |
||||||
|
|
|
устройств |
|||
|
|
|
|
|
||
Драйверы устройств |
|
Микроядро |

4 8 6 Глава 6. Уровень операционной системы
Над уровнем аппаратных абстракций расположен уровень, содержа роядро и драйверы устройств. Микроядро и все драйверы устройств и мой доступ к аппаратному обеспечению, поскольку они содержат зави аппаратного обеспечения код.
Микроядро поддерживает примитивные объекты ядра, обработку пр ловушек, исключений, синхронизацию процессов, синхронизациюработ соров в многопроцессорных системах и управление временем. Основ этого уровня — сделать остальную часть операционной системы полно висимой от аппаратного обеспечения и, следовательно, высокомобиль роядро постоянно находится в основной памяти и никуда не передается временно может передать управление прерываниям ввода-вывода.
Каждый драйвер устройств может управлять одним или нескольким ствами ввода-вывода. Кроме того, драйвер устройств может выполнят функции, не связанные с конкретным устройством, например шифров данных или даже обеспечение доступа к структурам данных ядра. Так к ватели имеют возможность устанавливать новые драйверы устройств, повлиять на ядро и испортить всю систему. По этой причине драйверы сать с особой осторожностью.
Над микроядром и драйверами устройств находится исполняюща Исполняющая система — независимая архитектура, поэтому ее можно п на другие машины. Она состоит из трех уровней.
Самый нижний уровень содержит файловые системы и диспетчер Файловые системы управляют использованием файлов идиректорий. объектов управляет объектами, известными ядру (процессами, потоками риями, семафорами, устройствами ввода-вывода, тактовыми генератора Эта программа также управляет пространством имен, куда можно помещ объекты, чтобы обращаться к ним позже в случае необходимости.
Следующий уровень состоит из 6 основных частей, как показано на Диспетчер ввода-вывода обеспечивает структуру для управления устр ввода-вывода, а также общими службами ввода-вывода. Диспетчер вво использует службы файловой системы, которая, в свою очередь, исполь веры устройств, а также службы диспетчера объектов.
Диспетчер кэш-памяти хранит в памяти блоки с диска, которые не пользовались, чтобы повысить скорость доступа к ним, если они понадо ва. Диспетчер кэш-памяти должен вычислять, какие блоки могут пон снова, а какие — нет. Можно конфигурировать NT с несколькими систе лов. В этом случае диспетчер кэш-памяти работает на все системы файло отдельный диспетчер для каждой из них не нужен. Если требуется какойдиска, диспетчеру кэш-памяти посылается сигнал выдать этот блок. Есл блока нет, диспетчер вызывает соответствующую систему файлов, чтобы этот блок. Поскольку файлы могут быть отображены на адресные про

Примеры операционных систем |
487 |
правила защиты, которые ограничивают доступ каждого процесса только к тем страницам, которые принадлежат его адресному пространству. Он также обрабатывает некоторые системные вызовы, которые связаны с виртуальной памятью.
Диспетчер процессов и потоков управляет процессами и потоками, в том числе их созданием и удалением.
Диспетчер безопасности предоставляет механизмы безопасности NT, которые удовлетворяют требованиям Оранжевой книги департамента защиты США. В Оранжевой книге определяется огромное количество правил, которым должна удовлетворять система, начиная с пароля и заканчивая тем, что виртуальные страницы должны обнуляться перед повторным использованием.
Интерфейс графических устройств управляет изображением на мониторе и принтерами. Он обеспечивает системные вызовы, которые позволяют пользовательским программам записывать информацию на монитор или принтеры независимо от устройств. Он также содержит диспетчер окон и драйверы аппаратных устройств. В версиях NT до NT 4.0 он находился в пользовательском пространстве, но производительность при этом оставляла желать лучшего, поэтому компания Microsoft перенесла его в ядро. Модуль Win32 также управляет многими системными вызовами. Изначально он тоже располагался в пользовательском пространстве, но позднее был перемещен в ядро с целью повышения производительности.
Самый верхний уровень исполняющей системы — системные службы. Этот уровень обеспечивает интерфейс с исполняющей системой. Он принимает системные вызовы NT и вызывает другие части исполняющей системы для выполнения.
Вне ядра находятся пользовательские программы и подсистемы окружения. Необходимость подсистем окружения объясняется тем, что пользовательские программы не способны непосредственно осуществлять системные вызовы. Поэтому каждая такая подсистема экспортирует определенный набор вызовов функций, которые могут использовать пользовательские программы. На рисунке 6.25 показаны 3 подсистемы окружения: Win32 (для программ NT и Windows 95/98), POSIX (для программ UNIX) и OS/2 для программ OS/21.
Приложения Windows используют функции подсистемы Win32 и взаимодействуют с подсистемой Win32, чтобы совершать системные вызовы. Подсистема Win32 принимает вызовы функций Win32 и использует модуль системного интерфейса, чтобы системные вызовы NT могли выполнять их.
Подсистема POSIX обеспечивает поддержку для приложений UNIX. Она поддерживает только стандарт Р1003.1. Это закрытая подсистема. Ее приложения не могут использовать приспособления подсистемы Win32, что сильно ограничивает ее возможности. На практике перенос любой программы UNIX на NT с использованием этой подсистемы почти невозможен. Ее включили в NT только потому, что правительство США потребовало, чтобы операционные системы на компьютерах в правительстве соответствовали стандарту Р1003.1. Эта подсистема не является самодостаточной, поэтомудля своей работы она использует подсистему Win32, но при
этом не передает полный интерфейс Win32 своим пользовательским программам.

488 Глава 6. Уровень операционной системы
Функции подсистемы OS/2 тоже ограничены. Возможно, в будущих ее уже не будет. Она также использует подсистему Win32. Существует и п ма MS DOS (она не показана на рисунке).
Перейдем к обсуждению служб, которые предлагает операционная сис Ее интерфейс — это основное средство связи программиста с системой. К нию, компания Microsoft не опубликовала полный список системных выз и кроме того, она меняет их от выпуска к выпуску. При таких обстоят практически невозможно написание программ, которые непосредствен шают системные вызовы.
Зато компания Microsoft определила набор вызовов Win32 API (A
Programming Interface — прикладной программный интерфейс). Это биб
ные процедуры, которые либо совершают системные вызовы, чтобы вы определенные действия, либо в некоторых случаях выполняют некоторые прямо в библиотечной процедуре пользовательского пространства или п ме Win32. Вызовы Win32 API не меняются при создании новых версий.
Однако, кроме этого, существуют вызовы NT API, которые могут меня вых версиях NT. Так как вызовы Win32 API задокументированы и более ны, мы сосредоточим наше внимание именно наних, а не насистемных вы В системахWin32 API и UNIX применяются совершенно разные подходы все системные вызовы общеизвестны и формируют минимальный ин удаление хотя бы одного из них изменит функционирование операционн мы. Подсистема Win32 обеспечивает очень полный интерфейс. Здесь ча и то же действие можно выполнить тремя или четырьмя разными способа ме того, Win32 включает в себя много функций, которые не являются сис
вызовами (например, копирование целого файла).
Многие вызовы Win32 API создают объекты ядра того или иного типа процессы, потоки, каналы и т. п.). Каждый вызов, создающий объект ядр щает вызывающей программе результат, который называется идентиф (handle). Этот идентификатор впоследствии может использоваться дл нения операций над объектом. Для каждого процесса существует свой и катор. Он не может передаваться другому процессу и использоваться скрипторы файла в UNIX тоже нельзя передавать другому процессу). Од определенных обстоятельствах можно продублировать идентификатор, его другим процессам и разрешить им доступ к объектам, которые при другим процессам. Каждый объект имеет связанный с ним дескриптор который сообщает, кому разрешено или запрещено совершать те или ин ции над объектом.
Операционную систему NT иногда называют объектно-ориентирован скольку оперировать с объектами ядра можно только с помощью вызова (функций API) по их идентификаторам. С другой стороны, она не облад ми основными свойствами объектно-ориентированной системы, как насл

Примеры операционных систем |
48 |
символов Unicode, которого нет в Windows 95/98. Существуют различия в пара метрах для некоторых вызовов API. В системе NT, например, все координаты эк рана являются 32-битными числами, а в системе Windows 95/98 используютс только младшие 16 битов (для совместимости с Windows 3.1). Существование на бора вызовов Win32 API на нескольких разных операционных системах упрощае перенос программ между ними, но при этом кое-что удаляется из основной систе мы вызовов. Различия между Windows 95/98 и NT изложены в табл. 6.7.
Таблица6.7. Некоторые различия междуверсиямиWindows
Характеристика |
Windows 95/98 |
NT 5.0 |
Win32 API |
Да |
Да |
Полностью 32-битная система |
Нет |
Да |
Защита |
Нет |
Да |
Отображение защищенных файлов |
Нет |
Да |
Отдельное адресное пространство для каждой |
Нет |
Да |
программы MS-DOS |
|
|
Plug and Play |
Да |
Да |
Unicode |
Нет |
Да |
Процессор |
Intel 80x86 |
80x86, Alpha |
Многопроцессорная поддержка |
Нет |
Да |
Реентерабельная программа (допускающая повторное |
Нет |
Да |
вхождение) внутри операционной системы |
|
|
Пользователь может сам написать некоторые важные |
Да |
Нет |
части операционной системы |
|
|
Примеры виртуальной памяти
В этом разделе мы поговорим о виртуальной памяти в системах UNIX иNT. С точк зрения программиста они во многом сходны.
Виртуальная память UNIX
Модель памяти в системе UNIX довольно проста. Каждый процесс имеет три сег мента: код, данные и стек, как показано на рис. 6.26. В машине с линейным адрес ным пространством код обычно располагается в нижней части памяти, а за ни следуют данные. Стек помещается в верхней части памяти. Размер кода фиксиро ван, а данные и стек могут увеличиваться или уменьшаться. Такую модель легк реализовать практически на любой машине. Она используется в операционно системе Solaris.
Более того, если машина содержит страничную память, то все адресное про странство может быть разбито на страницы, а пользовательские программы этог

4 9 0 Глава 6. Уровень операционной системы
Адрес OxFFFFFFFF Стек
Данные
Код
Рис. 6.26. Адресное пространство одного процесса UNIX
Описание, данное выше (виртуальная память с подкачкой страниц по нию), в целом подходит для Berkeley UNIX. Однако Sysytem V (и Solar некоторые особенности, позволяющие пользователям управлять виртуал мятью. Самой важной является способность процесса отображать файл файла на часть его адресного пространства. Например, если файл в 12 К бражается на виртуальный адрес 144 К, то в ячейке с адресом 144 К бу диться первое слово этого файла. Таким образом, можно осуществлять вв файла без применения системных вызовов. Поскольку размер некото лов может превышать размер виртуального адресного пространства, мо бражать не весь файл, а только его часть. Чтобы осуществить отображение нужно открыть файл и получить дескриптор файлаfd (file descriptor). Де используется для идентификации файла, который нужно отобразить. За цесс совершает вызов
paddr=nmap(virtual_address.1ength.protection,f1 ags.fd,fI1e_offset)
который отображает length, начиная с file_offset в файле, в виртуальное пространство, начиная с virtualjxddress. Параметр flags требует, чтобы выбрала виртуальный адрес, который затем возвращается в paddr. Отоб область должна содержать целое число страниц и должна быть выровне ницах страницы. Параметр protection определяет разрешение на чтени и выполнение (в любой комбинации). Отображение можно в дальнейше
спомощью команды unmap.
Водин и тот же файл можно одновременно отображать несколько п Есть два варианта разделения общих страниц. В первом случае разделя страницы, поэтому записи, призводимые одним процессом, видны все процессам. Эта возможность обеспечивает между процессами тракт с высо пускной способностью. Во втором случае страницы разделяются всеми пр до тех пор, пока какой-нибудь процесс не изменит их. Как только один из п пытается произвести запись в страницу, он получает ошибку защиты, в р чего операционная система выдает ему копию этой страницы, в котору производить запись. Такая схема используется в том случае, когда для ка
нескольких процессов нужно создать иллюзию, что только он отображаетс

Примеры операционных систем |
491 |
2 Гбайт предназначены для кода и данных процесса; верхние 2 Гбайт разрешают ограниченный доступ к памяти ядра. Исключение составляют версии NT для предприятий, в которых разделение памяти может быть другим: 3 Гбайт — для пользователя и 1 Гбайт — для ядра. Виртуальное адресное пространство с подкачкой страниц по требованию содержит страницы фиксированного размера (4 Кбайт на машине Pentium II).
Каждая виртуальная страница может находиться в одном из трех состояний: она может быть свободной (free), зарезервированной (reserved) и выделенной
(committed). Свободная страница в текущий момент не используется, а обращение к ней вызывает ошибку из-за отсутствия страницы. Когда процесс начинается, все его страницы находятся в свободном состоянии до тех пор, пока программа и начальные данные не будут отображены в свое адресное пространство. Если код или данные отображены в страницу, то такая страницаявляется выделенной. Обращение к выделенной странице будет успешным, если страница находится в основной памяти. Если страница отсутствует в основной памяти, то произойдет ошибка и операционной системе придется вызывать нужную страницу с диска. Виртуальная страница может находиться и в зарезервированном состоянии. Это значит, что эта страница недоступна для отображения до тех пор, пока резервирование не будет отменено. Помимо атрибутов состояния страницы имеют и другие атрибуты (например, указывающие на возможностьчтения, записи и выполнения). Верхние 64 Кбайт и нижние 64 Кбайт памяти всегда свободны, чтобы можно было отыскивать ошибки указателей (неинициализированные указатели часто равны 0 или -1).
Каждая выделенная страница имеет теневую страницу на диске, где она хранится при отсутствии ее в основной памяти. Свободные и зарезервированные страницы не имеют теневых страниц, поэтому обращения к ним вызывают ошибки изза отсутствия страницы (система не может вызвать страницу с диска, если этой страницы нет на диске). Теневые страницы на диске сгруппированы в один или несколько страничных файлов. Операционная система следит, в какую часть какого страничного файла отображается каждая виртуальная страница. Файлы с текстами программ имеют теневые страницы; для страниц данных используются специальные страничные файлы.
NT, как и System V, позволяет отображать файлы прямо в области виртуального адресного пространства. Если файл был отображен в адресное пространство, его можно считывать или записывать путем обычных обращений к памяти.
Отображаемые в память файлы реализуются так же, как другие выделенные страницы, только теневые страницы могут находиться в файле надиске, а не в страничном файле. В результате, когда файл отображается, версия в памяти может не совпадать с версией на диске (из-за последних записей в виртуальное адресное пространство). Однако когда отображение файла удаляется, версия на диске обновляется.
NT позволяет отображать два и более процессов в одном файле одновременно,

4 9 2 Глава 6. Уровень операционной системы
одни и те же страницы, поэтому изменения, произведенные одним из п видны всем остальным процессам, даже если файл на диске еще не был о Win32 API содержит ряд функций, которые позволяют процессу откры лять виртуальной памятью. Самые важные из этих функций приведены в Все они работают в области, состоящей либо из одной страницы, либо из более страниц, последовательно расположенных в виртуальном адресном п
стве.
Таблица 6.8. Основ, ые функции API для управления виртуальной памятью в системе Windows NT
Функция API |
Значение |
VirtualAlloc |
Резервация или выделение области |
VirtualFree |
Освобождение области или снятие выделения |
VirtualProtect |
Изменение типа защиты на чтение/запись/выполнение |
VirtualQuery |
Запрос о состоянии области |
VirtualLock |
Делает область памяти резидентной (то есть запрещает разбиен |
|
на страницы в ней) |
VirtualUnlock |
Снимает запрет на разбиение на страницы |
CreateFileMapping |
Создает объект отображения файла и иногда приписывает ему и |
MapViewOfFile |
Отображает файл или часть файла в адресное пространство |
UnmapViewOfFile |
Удаляет отображенный файл из адресного пространства |
OpenFileMapping |
Открывает ранее созданный объект отображения файла |
Первые четыре функции очевидны. Следующие две функции позвол цессу делать резидентной область памяти размером до 30 страниц и отм действие. Это качество может понадобиться программам, работающим реального времени. Операционная систма устанавливает определенны чтобы процессы не становились слишком поглощающими. В системе имеются функции API, которые позволяют процессу получать доступ к в ной памяти другого процесса (они не указаны в табл. 6.8).
Последние 4 функции API предназначены для управления отобра в память файлами. Чтобы отобразить файл, сначала нужно создать объек жения файла с помощью функции CreateFileMapping. Эта функция во идентификатор (handle) объекту отображения файла и иногда еще и ввод тему файлов имя для него, чтобы другой процесс мог использовать об функции отображают файлы и удаляют отображение соответственно. Сл функция нужна для того, чтобы отобразить файл, который в данный мо бражен другим процессом. Таким образом, два и более процессов могут р области своих адресных пространств.
Эти функции API являются основными. На них строится вся остальн