Скачиваний:
98
Добавлен:
03.06.2014
Размер:
5.64 Mб
Скачать

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

483

UNIX изначально должен был быть маленькой системой, чтобы достигнуть увеличения надежности и высокой производительности. Первые версии UNIX были полностью текстовыми и использовали терминалы, которые могли отображать 24 или 25 строк по 80 символов ASCII-кодов. Пользовательским интерфейсом управляла программа, так называемая оболочка, которая предоставляла интерфейс командной строки. Поскольку оболочка не являлась частью ядра, было легко добавлять новые оболочки в UNIX, и с течением времени было придумано несколько черезвычайно сложных оболочек.

Позднее, когда появились графические терминалы, в Массачусетском технологическом институте для UNIX была разработана система X Windows. Еще позже полностью доработанный графический интерфейс пользователя под названием Motif был установлен поверх X Windows. Поскольку требовалось сохранить маленькоеядро, практически весь код системы X Windows и Motifработаютв пользовательском режиме вне ядра.

WindowsNT

Первая машина IBM PC, выпущенная в 1981 году, была оснащена 16-битной операционной системой индивидуального пользования, работающей в реальном режиме, с командной строкой. Она называлась MS-DOS 1.0. Эта операционная система состояла из находящейся в памяти программы на 8 Кбайт. Через два года появилась более мощная система на 24 Кбайт — MS-DOS 2.O. Она содержала процессор командной строки (оболочку) с рядом особенностей, заимствованных из системы UNIX. В 1984 году компания IBM выпустила машину PC/AT с операционной системой MS-DOS 3.0, размер которой к тому моменту составлял 36 Кбайт. С годами у системы MS-DOS появлялись все новые и новые особенности, но она при этом оставалась системой с командной строкой.

Вдохновленная успехом Apple Macintosh, компания Microsoft решила создать графический пользовательский интерфейс, который она назвала Windows. Первые три версии Windows, включая систему Windows 3.x, были не настоящими операционными системами, а графическими пользовательскими интерфейсами набазе MS-DOS. Всепрограммыработаливодномитомжеадресном пространстве,и ошибка в любой из них могла привести к остановке всей системы.

В 1995 году появилась система Windows 95, но это не устранило MS-DOS, хотя MS-DOS уже представляла собой новую версию 7.0. Windows 95 и MS-DOS 7.0

всовокупности включали в себя особенности развитой операционной системы,

втом числе виртуальную память, управление процессами и мультипрограммирование. Однако операционная система Windows 95 не была полностью 32-битной программой. Она содержала большие куски старого 16-битного кода и все еще использовала файловую систему MS-DOS со всеми ограничениями. Единственным изменением в системе файлов было добавление длинных имен файлов (ранее

вMS-DOS длина имен файлов была не более 8+3 символов).

Даже при выпуске Windows 98 в 1998 году система MS-DOS все еще присутствовала (на этот раз версия 7.1) и включала 16-битный код. Система Windows 98 не очень отличалась от Windows 95, хотя часть функций перешлаот MS-DOS к Windows и формат дисков, подходящий для дисков большего размера, стал стандартным. Основным различием был пользовательский интерфейс, который объединил рабочий стол, Интернет, телевидение и сделал систему более закрытой. Именно

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 NT, начались в рамках совместного проекта по созданию новой 32-битной версии операционной системы OS/2, который одно время осуществляли компании IBM и Microsoft после ряда неудач с предыдущей 16-битной версией системы OS/2. Этот проект, ориентированный на возможности микропроцессора 5386, начался в 1989 году, однако уже в следующем году пути этих компаний разошлись, и Microsoft, продолжившая работу над системой OS/2 v.3.0, затем дала ей имя Windows NT, желая этим показать и использованиеединого графического интерфейсасосвоими популярными одноименными оболочками,идистанцированиеоткомпанииIBM. —Примеч.научн.ред.

2Необходимо заметить, что, в отличие от UNIX, WindowsNT не позволяет нескольким пользователям одновременно работать с компьютером, поскольку это однотерминальная система, тогда как UNIX — это мультитерминальная операционная система. Однако по сети с ней могут одновременно взаимодействовать несколько пользователей, работающих насвоих компьютерах. — Примеч. научн. ред.

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

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

 

 

 

 

 

 

 

Системы

Управление объектами

и интерфейс

 

графических

 

файлов

 

 

 

 

устройств

 

 

 

 

 

 

 

Драйверы устройств

 

Микроядро

S

 

 

Уровеньаппаратныхабстракций

 

а.

 

 

 

 

Аппаратное обеспечение

Рис. 6.25. Структура Windows NT

4 8 6 Глава 6. Уровень операционной системы

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

Микроядро поддерживает примитивные объекты ядра, обработку прерываний, ловушек, исключений, синхронизацию процессов, синхронизациюработы процессоров в многопроцессорных системах и управление временем. Основная задача этого уровня — сделать остальную часть операционной системы полностью независимой от аппаратного обеспечения и, следовательно, высокомобильной. Микроядро постоянно находится в основной памяти и никуда не передается, хотя оно временно может передать управление прерываниям ввода-вывода.

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

Над микроядром и драйверами устройств находится исполняющая система. Исполняющая система — независимая архитектура, поэтому ее можно переносить на другие машины. Она состоит из трех уровней.

Самый нижний уровень содержит файловые системы и диспетчер объектов. Файловые системы управляют использованием файлов идиректорий. Диспетчер объектов управляет объектами, известными ядру (процессами, потоками, директориями, семафорами, устройствами ввода-вывода, тактовыми генераторами и т. п.). Эта программа также управляет пространством имен, куда можно помещать новые объекты, чтобы обращаться к ним позже в случае необходимости.

Следующий уровень состоит из 6 основных частей, как показано на рис. 6.25. Диспетчер ввода-вывода обеспечивает структуру для управления устройствами ввода-вывода, а также общими службами ввода-вывода. Диспетчер ввода-вывода использует службы файловой системы, которая, в свою очередь, использует драйверы устройств, а также службы диспетчера объектов.

Диспетчер кэш-памяти хранит в памяти блоки с диска, которые недавно использовались, чтобы повысить скорость доступа к ним, если они понадобятся снова. Диспетчер кэш-памяти должен вычислять, какие блоки могут понадобиться снова, а какие — нет. Можно конфигурировать 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 своим пользовательским программам.

Бытует заблуждение, что Windows NT может выполнять различные программы, разработанные для OS/2. Однако на самом деле эта подсистема NT позволяет выполнять только те немногие 16-битные программы OS/2, которые работают исключительно в текстовом режиме. 32-битные программы OS/2 система Windows NT выполнять не может. — Примеч. научн. ред.

488 Глава 6. Уровень операционной системы

Функции подсистемы OS/2 тоже ограничены. Возможно, в будущих версиях ее уже не будет. Она также использует подсистему Win32. Существует и подсистема MS DOS (она не показана на рисунке).

Перейдем к обсуждению служб, которые предлагает операционная система NT. Ее интерфейс — это основное средство связи программиста с системой. К сожалению, компания Microsoft не опубликовала полный список системных вызовов NT, и кроме того, она меняет их от выпуска к выпуску. При таких обстоятельствах практически невозможно написание программ, которые непосредственно совершают системные вызовы.

Зато компания Microsoft определила набор вызовов Win32 API (Application

Programming Interface — прикладной программный интерфейс). Это библиотеч-

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

Однако, кроме этого, существуют вызовы NT API, которые могут менятся в новых версиях NT. Так как вызовы Win32 API задокументированы и более стабильны, мы сосредоточим наше внимание именно наних, а не насистемных вызовах NT.

В системахWin32 API и UNIX применяются совершенно разные подходы. В UNIX все системные вызовы общеизвестны и формируют минимальный интерфейс: удаление хотя бы одного из них изменит функционирование операционной системы. Подсистема Win32 обеспечивает очень полный интерфейс. Здесь часто одно и то же действие можно выполнить тремя или четырьмя разными способами. Кроме того, Win32 включает в себя много функций, которые не являются системными вызовами (например, копирование целого файла).

Многие вызовы Win32 API создают объекты ядра того или иного типа (файлы, процессы, потоки, каналы и т. п.). Каждый вызов, создающий объект ядра, возвращает вызывающей программе результат, который называется идентификатором (handle). Этот идентификатор впоследствии может использоваться для выполнения операций над объектом. Для каждого процесса существует свой идентификатор. Он не может передаваться другому процессу и использоваться там (дескрипторы файла в UNIX тоже нельзя передавать другому процессу). Однако при определенных обстоятельствах можно продублировать идентификатор, передать его другим процессам и разрешить им доступ к объектам, которые принадлежат другим процессам. Каждый объект имеет связанный с ним дескриптор защиты, который сообщает, кому разрешено или запрещено совершать те или иные операции над объектом.

Операционную систему NT иногда называют объектно-ориентированной, поскольку оперировать с объектами ядра можно только с помощью вызова процедур (функций API) по их идентификаторам. С другой стороны, она не обладает такими основными свойствами объектно-ориентированной системы, как наследование иполиморфизм.

Win32 API имеется и в системе Windows 95/98 (а также в операционной систме Windows СЕ), правда, с некоторыми исключениями. Например, Windows 95/98 не имеет защиты, поэтому те вызовы API, которые связаны с защитой, просто возвращают код ошибки. Кроме того, для имен файлов в NT используется набор

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

489

символов 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.

Более того, если машина содержит страничную память, то все адресное пространство может быть разбито на страницы, а пользовательские программы этого не знают. Единственное, что им будет известно, — то, что размер программы может превышать размер физической памяти машины. Системы UNIX, у которых нет страничной организации памяти, обычно перекачивают целые процессы между памятью и диском, чтобы сколь угодно большое число процессов работало в режиме разделения времени.

4 9 0 Глава 6. Уровень операционной системы

Адрес OxFFFFFFFF Стек

Данные

Код

Рис. 6.26. Адресное пространство одного процесса UNIX

Описание, данное выше (виртуальная память с подкачкой страниц по требованию), в целом подходит для Berkeley UNIX. Однако Sysytem V (и Solaris) имеет некоторые особенности, позволяющие пользователям управлять виртуальной памятью. Самой важной является способность процесса отображать файл или часть файла на часть его адресного пространства. Например, если файл в 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.

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

Виртуальная память Windows NT

В NT каждый пользовательский процесс имеет свое собственное виртуальное адресное пространство. Длина виртуального адреса составляет 32 бита, поэтому каждый процесс имеет 4 Гбайт виртуального адресного пространства. Нижние

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

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. Все они работают в области, состоящей либо из одной страницы, либо из двух или более страниц, последовательно расположенных в виртуальном адресном пространстве.

Таблица 6.8. Основ, ые функции API для управления виртуальной памятью в системе Windows NT

Функция API

Значение

VirtualAlloc

Резервация или выделение области

VirtualFree

Освобождение области или снятие выделения

VirtualProtect

Изменение типа защиты на чтение/запись/выполнение

VirtualQuery

Запрос о состоянии области

VirtualLock

Делает область памяти резидентной (то есть запрещает разбиение

 

на страницы в ней)

VirtualUnlock

Снимает запрет на разбиение на страницы

CreateFileMapping

Создает объект отображения файла и иногда приписывает ему имя

MapViewOfFile

Отображает файл или часть файла в адресное пространство

UnmapViewOfFile

Удаляет отображенный файл из адресного пространства

OpenFileMapping

Открывает ранее созданный объект отображения файла

Первые четыре функции очевидны. Следующие две функции позволяют процессу делать резидентной область памяти размером до 30 страниц и отменять это действие. Это качество может понадобиться программам, работающим в режиме реального времени. Операционная систма устанавливает определенный предел, чтобы процессы не становились слишком поглощающими. В системе NT также имеются функции API, которые позволяют процессу получать доступ к виртуальной памяти другого процесса (они не указаны в табл. 6.8).

Последние 4 функции API предназначены для управления отображаемыми в память файлами. Чтобы отобразить файл, сначала нужно создать объект отображения файла с помощью функции CreateFileMapping. Эта функция возвращает идентификатор (handle) объекту отображения файла и иногда еще и вводит в систему файлов имя для него, чтобы другой процесс мог использовать объект. Две функции отображают файлы и удаляют отображение соответственно. Следующая функция нужна для того, чтобы отобразить файл, который в данный момент отображен другим процессом. Таким образом, два и более процессов могут разделять области своих адресных пространств.

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