- •Что такое процесс?
- •Адресное пространство
- •Набор ресурсов
- •Объект-процесс
- •Что такое поток?
- •Многозадачность и мультипроцессорная обработка
- •Многопоточность
- •Объект-поток
- •История
- •Опорная модель osi
- •Встроенная сетевая поддержка
- •Сетевые api
- •Разрешение имен
- •Встроенные сетевые компоненты
- •Открытая архитектура
- •Доступ пользовательского режима к удаленным файловым системам
- •Транспортные протоколы
- •Среда ndis для сетевых драйверов
- •Среда распределенных приложений
- •Удаленный вызов процедур
- •Именованные каналы
- •Корпоративные сети и распределенная защита
Встроенные сетевые компоненты
Хотя за поддержку сети отвечают многие компоненты Windows NT, наиболее важны из них те, которые имеют в Microsoft самую долгую историю: редиректор и сетевой сервер. Как и в оригинальной MS-NET, редиректор посылает локально выдаваемые запросы удаленному серверу, а сервер принимает и обрабатывает их.
Конечно, кроме названий, мало что в сервере или редиректоре напоминает прежнее программное обеспечение. Первые варианты были написаны на языке ассемблера и выполняли роль надстройки над MS-DOS. Несмотря на то, что новые сервер и редиректор встроены в Windows NT, они не зависят от аппаратной архитектуры, на которой выполняется ОС. Они написаны на языке С и реализованы в виде загружаемых драйверов файловых систем, которые могут загружаться и выгружаться динамически. Кроме того, они могут сосуществовать с серверами и редиректорами других фирм.
Реализация редиректора и сервера в виде драйверов файловой системы делает их частью исполнительной системы NT. В связи с этим они имеют доступ к специализированным интерфейсам, которые предоставляет драйверам диспетчер ввода-вывода. В свою очередь, данные интерфейсы разрабатывались с учетом потребностей сетевых компонентов. Эта возможность доступа к интерфейсам драйвера плюс способность прямого вызова функций диспетчера кэша вносят существенный вклад в повышение производительности сервера и редиректора.
Послойная модель драйвера диспетчера ввода-вывода напоминает естественное расположение сетевых протоколов один над другим. Поскольку редиректор и сервер являются драйверами, под ними может быть расположено столько слоев драйверов протоколов, сколько необходимо. Такая структура обеспечивает модульность сетевых компонентов и создает эффективные переходы от уровня редиректора или сервера вниз к транспортным и физическим уровням сети.
Редиректор
Сетевой редиректор предоставляет средства, необходимые машине с Windows NT для доступа к ресурсам на другой машине в сети. Редиректор Windows NT может осуществлять доступ к удаленным файлам, именованным каналам и принтерам. Благодаря тому, что в нем реализован протокол SMB, редиректор может работать с существующими серверами MS-NET и LAN Manager, обеспечивая Windows NT доступ к системам MS-DOS, Windows и OS/2. Механизмы защиты гарантируют, что данные Windows NT, совместно используемые через сетевое соединение, будут защищены от несанкционированного доступа.
Будучи драйвером файловой системы, редиректор работает, как и любой другой драйвер. Когда он загружается в систему, его процедура инициализации создает объект-устройство (под названием \Device\Redirector) для представления редиректора в системе. Кроме того, процедура инициализации определяет коды функций, поддерживаемых редиректором, и записывает точки входа драйвера (процедуры распределения) для этих операций. Когда диспетчер ввода-вывода получает сетевой запрос ввода-вывода, он создает IRP и вызывает одну из процедур распределения редиректора, передавая ей этот пакет. После того как редиректор обработает запрос (посредством обращения к сети), IRP завершается, и результаты возвращаются вызывающей программе.
В промежутке между посылкой запроса и получением ответа у редиректора есть одна основная задача: предоставить "файловую систему", которая ведет себя как локальная файловая система, хотя и работает с ненадежным по своей природе носителем (сетью). Физическое соединение между двумя компьютерами нарушается значительно чаще, чем связь между компьютером и его жестким диском или приводом гибких дисков. При нарушении связи редиректор отвечает за ее восстановление, если это возможно, или за корректную обработку сбоя, позволяющую приложениям повторно выполнить текущую операцию. Для этой цели редиректор применяет различные методы. Например, при потере связи с сервером он просто восстанавливает ее. Кроме того, он запоминает, какие файлы были открыты и при определенных обстоятельствах открывает их снова. (Драйверы транспортов, лежащие ниже редиректора, обеспечивают надежность передачи данных на уровне битов.)
Как и другие драйверы файловых систем, редиректор должен соответствовать асинхронной модели ввода-вывода, поддерживая выполнение асинхронных запросов ввода-вывода. Когда запрос пользовательского режима выдается асинхронно, редиректор должен вернуть управление немедленно, независимо от того, завершена ли удаленная операция ввода-вывода. В большинстве случаев удаленный запрос ввода-вывода не завершается сразу же, поэтому, вернув управление вызывающей программе, редиректор должен ждать его завершения. Парадоксально, но код драйвера всегда активизируется вызывающим потоком, в контексте этого потока. У него нет адресного пространства своих потоков или каких-либо еще. Каким же образом драйвер может вызвать процедуру ожидания?
Данная проблема не уникальна для редиректоров; большинство драйверов файловых систем сталкиваются с той же дилеммой. В первоначальном варианте системы ввода-вывода драйверы файловых систем, которым нужно было выполнять обработку в своем собственном контексте, просто создавали процесс режима ядра, связанный с драйвером, и использовали его потоки для асинхронной обработки. Однако такой подход оказался слишком дорогим с точки зрения использования системной памяти. Поэтому было придумано новое решение.
У Windows NT имеется специальный системный процесс для инициализации системы во время ее загрузки. В этом процессе есть несколько рабочих потоков, ожидающих в цикле поступления запросов от драйверов и других компонентов исполнительной системы, которые и выполняют асинхронную работу, Если для выполнения асинхронной работы драйверу нужен поток, он помещает задание в очередь этого специального процесса, прежде чем вернуть управление вызывающей программе. Поток системного процесса пробуждается и выполняет операции, необходимые для обработки запроса ввода-вывода и завершения IRP исходной вызывающей программы.
Для выполнения своих задач редиректор отправляет и принимает SMB. Протокол SMB является протоколом прикладного уровня, как показано на рис. 9-6.
Интерфейс, через который редиректор посылает свои SMB, называется интерфейсам драйвера транспорта (transport driver interface, TDI). Редиректор вызывает TDI для передачи SMB различным драйверам транспорта, загруженным в систему. Для того, чтобы вызвать функции TDI, редиректор должен открыть для связи с удаленной машиной канал, называемый виртуальным контуром (virtual circuit), и затем посылать SMB через этот контур. Редиректор поддерживает по одному виртуальному контуру для каждого сервера, с которым связана Windows NT, и мультиплексирует все запросы к данному серверу в один контур. Транспортный уровень, располагающийся под редиректором, определяет способы реализации виртуального контура и посылает данные через сетевое соединение.
Помимо повышения надежности, от переписанного редиректора также требовалось обеспечить стопроцентную совместимость с существующим протоколом SMB. Для выполнения этих требований он использовал все тот же протокол для передачи сообщений серверам старых моделей (MS-NET и LAN Manager). Сохранение этого базового протокола позволяет Windows NT взаимодействовать с серверами Windows, OS/2 или MS-DOS, работающими под LAN Manager. Для обмена данными между системами Windows NT был расширен базовый протокол SMB для поддержки распространенных операций системы ввода-вывода NT. Например, расширенный протокол способен поддерживать такие специфичные для NT операции, как открытие файла с доступом для удаления, открытие каталога, присоединение к файлам списков управления доступом (ACL) в целях их защиты и выполнение операций опроса для получения информации о файлах. В дополнение к этому новый протокол SMB передает строки в символах UNICODE, чтобы гарантировать правильную передачу символов иностранных языков.
Сервер
Как и редиректор, сервер Windows NT создавался так, чтобы обеспечить стопроцентную совместимость с существующими протоколами SMB MS-NET и LAN Manager. Полная совместимость позволяет серверу обрабатывать запросы, приходящие не только от систем Windows NT, но также и от других систем, на которых работает программное обеспечение LAN Manager. Подобно редиректору, сервер реализован в виде драйвера файловой системы.
Может показаться странным, что нечто, называемое "сервером", не реализовано в виде серверного процесса. Резонно было бы предположить, что сетевой сервер должен работать как защищенная подсистема — процесс, чьи потоки ожидают поступления запросов из сети, выполняют их и возвращают результаты обратно в сеть. Но решено было реализовать сервер как драйвер файловой системы. Хотя сервер не является драйвером в обычном смысле и не управляет какой-либо файловой системой, использование модели драйвера имеет свои преимущества по сравнению с реализацией сервера в виде процесса.
Основным преимуществом является то, что сервер находится в исполнительной системе NT и может непосредственно вызывать диспетчер кэша для оптимизации передачи данных. Например, если сервер получает запрос на чтение большого объема данных, он вызывает диспетчер кэша, чтобы найти в кэше нужные данные (или загрузить с диска, если их нет в кэше) и зафиксировать их в памяти.
Рис. 9-6. Использование протокола SMB.
Затем сервер передает данные в сеть непосредственно из кэша, избегая лишних обращений к диску или копирования. Аналогично, при поступлении запроса на запись данных сервер вызывает диспетчер, чтобы выделить для поступающих данных место в кэше и получить адрес этого места. Затем сервер записывает данные непосредственно в кэш. Благодаря записи данных в кэш, а не на диск сервер может быстрее вернуть управление вызывающей программе; диспетчер кэша затем пересылает данные на диск в фоновом режиме (используя средства подкачки страниц диспетчера виртуальной памяти).
Вызывая диспетчер кэша, сервер фактически берет на себя некоторые обязанности диспетчера ввода-вывода для упрощения обработки. Кроме того, сервер играет роль диспетчера ввода-вывода, создавая собственные IRP и посылая их непосредственно драйверам NTFS, FAT и HPFS, Он может принять решение непосредственно пересылать данные в кэш и из кэша, не создавая IRP. Если бы сервер был подсистемой пользовательского режима (или даже режима ядра), ему пришлось бы для обработки поступающих запросов вызывать сервисы ввода-вывода NT, что связано с несколько большими накладными расходами.
Будучи драйвером файловой системы, сервер также более гибок, по сравнению с процессом. Например, он может зарегистрировать процедуру завершения ввода-вывода, что дает ему возможность быть вызванным сразу же, как только драйверы нижнего уровня завершат обработку, и выполнить необходимые завершающие действия. Несмотря на то, что сервер Windows NT реализован в виде драйвера файловой системы, другие серверы могут быть как драйверами, так и серверными процессами.
Подобно редиректору, сервер использует начальный системный процесс для обработки асинхронных операций ввода-вывода и тех периодически встречающихся "дорогих" операций, выполнение которых не требует максимальной скорости — например, открытия файла. Операции, требующие высочайшей скорости выполнения, такие как чтение или запись, исполняются, если возможно, непосредственно в драйвере, чтобы избежать накладных расходов, связанных с переключением контекста. Несмотря на необходимость переключения контекста, использование начального системного процесса для выполнения сетевых операций позволяет серверу при необходимости ждать у описателей объектов или генерировать страничные ошибки, чего он не может сделать, выполняясь в контексте другого потока на повышенном IRQL. Возможность генерации страничных ошибок означает, что меньшая часть кода сервера должна оставаться резидентной в памяти.
При запуске Windows NT диспетчер ввода-вывода загружает те драйверы, которые требуются на ранних стадиях загрузки системы (драйверы файловой системы и диска, видеодрайвер, драйверы мыши и клавиатуры). После того, как процесс загрузки системы продвинется достаточно далеко, чтобы переключиться из режима ядра в пользовательский режим, для загрузки остальных драйверов, включая редиректор, сервер и драйверы транспортов, вызывается контроллер сервисов. Он загружает эти драйверы, вызывая сервисы системы ввода-вывода, которые копируют драйверы в память и выполняют процедуры их инициализации. Процедура инициализации каждого драйвера создает объект-устройство и помещает его в пространство имен диспетчера объектов. Контроллер сервисов можно также вызвать в любой момент работы системы для загрузки и выгрузки сетевых серверов или для запуска и останова сетевых сервисов.
Открытая архитектура. Доступ пользовательского режима:
маршрутизатор для API Wnet, многосетевой UNC для файлового I\O Win32.
