NetWare - это специализированная операционная система, а не ОС общего назначения. ОС общего назначения обеспечивают сервис, который удовлетворяет потребностям многих различных приложений, к тому же такая ОС обычно очень устойчива к поведению своих приложений за счет специальных ограничительных мер. Приложения могут разрабатываться почти без заботы о их взаимодействии с другими программами. Они также могут быть написаны без учета фактора разделения ресурсов компьютера, таких как память или CPU.
В ОС общего назначения проблемы взаимодействия, разделения ресурсов и т.д. решаются операционной системой. Приложениям, которые пытаются решать их самостоятельно, ОС может запретить это делать. Это обеспечивает некоторый уровень защиты приложений и ОС.
NetWare - это специализированная ОС, которая с самого начала проектировалась для оптимизации сетевого сервиса и, в первую очередь, доступа к удаленным файлам. Такие приложения, как электронные таблицы и текстовые процессоры, будут лучше работать под управлением ОС общего назначения, а приложения типа сервера печати, сервера баз данных и коммуникационного сервера, которые обеспечивают управление разделяемыми ресурсами, будут лучше работать под NetWare. Но, чтобы добиться такого эффекта, приложения для NetWare нужно писать тщательно, осознавая последствия их совместной работы на сервере, чтобы одно приложение не подавляло другие из-за слишком интенсивного захвата процессорного времени.
Кроме повышения производительности - основной цели разработки семейства ОС NetWare 3.x и 4.x, разработчики ставили перед собой цели создания открытой, расширяемой и высоконадежной операционной системы, обеспечивающей высокий уровень защиты информации.
Плоская модель памяти
NetWare работает в защищенном режиме CPU (protected mode), используя все преимущества 386, 486 процессоров и Pentium, связанные с 32-разрядной адресацией памяти.
В защищенном режиме память адресуется непрерывным диапазоном адресов. Эта так называемая "плоская" (flat) модель памяти делает управление памятью более удобным и гибким. В этом случае нет необходимости переключать сегменты памяти, так как вся память состоит из одного сегмента. При работе в "реальном" режиме CPU отдельная операция по выделению памяти ограничена размером 64 К, так как 64 К - это максимальный размер сегмента. Работа в 32-разрядном режиме значительно повышает скорость выполнения всех компонентов и модулей ОС.
Нити и невытесняющая многозадачность
Другим преимуществом защищенного режима является возможность выполнять несколько программ одновременно. Часто это называют многозадачностью (multitasking). В NetWare реализован механизм "нитей" (thread), который позволяет использовать все преимущества расщепления одного процесса на несколько параллельно выполняемых нитей. Этот механизм описан в разделе 1.2.4 главы 1. NetWare обеспечивает удобные средства для реализации многонитевых процессов.
Существует несколько вариантов реализации алгоритма диспетчирования нитей. NetWare использует метод невытесняющей многозадачности (nonpreemptive multitasking). Это означает, что обычно невозможно прерывание приложений и их нитей другими приложениями и нитями. Иногда этот метод называют "окружением хороших парней", так как ожидается, что приложения будут вести себя вежливо по отношению к системным ресурсам. Фактически, если приложение не отдает периодически управление CPU, чтобы дать возможность другим приложениям выполняться, то будет работать только это приложение. Следовательно, при работе в таком режиме очень важно понимать последствия захвата CPU и быть "хорошим парнем" среди равных. Главным же преимуществом невытесняющей многозадачности является более быстрое переключение с нити на нить по сравнению с вытесняющей многозадачностью (preemptive multitasking), когда нить процесса прерывается в неожиданный и часто неудобный для нее момент времени, и ОС приходится сохранять гораздо больше информации о прерванном состоянии нити, чем в случае, когда нить сама отдает управление ОС.
Из-за того, что NetWare использует режим невытесняющей многозадачности, она не очень заботится о управлении поведением нитей, которые выполняются. NetWare хранит информацию о том, какая нить выполняется, с каким приоритетом и как долго это происходит, но навязывает нитям свои ограничения только в экстремальных ситуациях. Обычно NetWare считает, что все нити справедливо разделяют процессор, достаточно часто отдавая ему управление. Это позволяет NetWare самой работать более эффективно.
Кэширование диска
Вся оперативная память, оставшаяся после загрузки ОС и дополнительных модулей, используется для кэширования диска, что, файлам при соответствующих размерах оперативной памяти, естественно, существенно повышает скорость обращения к дисковым.
Элеваторный поиск
В ОС NetWare предусмотрен отдельный процесс чтения с диска, который считывает данные с жестких дисков сервера и размещает их в кэш-буферах. Этот процесс сортирует поступающие запросы на чтение и располагает их в порядке приоритетов, в зависимости от текущего положения головок дисковода. Такой метод обслуживания запросов, называемый элеваторным поиском (elevator seeking), оптимизирует перемещение головок и в результате позволяет значительно увеличить пропускную способность дисковой подсистемы при большой интенсивности запросов.
Параллельный поиск
Если на сервере имеется несколько дисковых каналов, то NetWare может параллельно осуществлять поиск данных на нескольких дисках (по одному диску на канал). Это существенно повышает производительность.
Все сетевые сервисы, утилиты сервера или работающие на сервере приложения выполнены в NetWare в виде загружаемых модулей - NetWare Loadable Modules, NLMs, которые могут динамически загружаться и выгружаться в любое время без остановки сервера. Структура ОС NetWare приведена на рисунке 7.1.
Рис. 7.1. Структура ОС NetWare
Ядро системы, называемое System Executive, выполняет базовые задачи ОС по управлению памятью, планированию и диспетчированию нитей, управлению файловой системой, также поддерживает программную шину для интерфейса NLM'ов. Каждый NLM выполняет либо функции операционной системы (драйвер диска или сетевого адаптера, утилита пространства имен, файловый сервер или модуль почтового сервиса), либо является пользовательским модулем, реализующим дополнительный сетевой сервис - например, сервис SQL-сервера или сервера печати. Для ядра системы все модули NLM равноправны, поэтому расширение или сужение функций системы осуществляется путем добавления или выгрузки соответствующего NLM'а.
Novell обеспечивает расширяемость системы NetWare за счет предоставления программистам набора инструментальных средств и строго описанных интерфейсов API для разработки собственных NLM-приложений, использующих все возможности 32-разрядного окружения. В настоящее время существует большое количество программных систем третьих фирм, реализованных в виде NLM-приложений, для серверов NetWare - серверы баз данных, коммуникационные серверы и т.п.
Открытость ОС NetWare обеспечивается поддержкой ею наиболее популярных стеков протоколов в строгом соответствии с существующими стандартами. NetWare поддерживает такие популярные сетевые протоколы, как IPX/SPX, TCP/IP, Apple Talk, и средства их мультиплексирования, такие как STREAMS и TLI. Стандарт ODI позволяет независимым разработчикам сетевых адаптеров легко включать свои NLM-драйверы в состав серверной ОС NetWare. Кроме того, фирма Novell разработала для NetWare большое количество программных средств - шлюзов к другим широко распространенным сетям, таким, как сети Internet и SNA.
В системах NetWare предусмотрен ряд функций, обеспечивающих надежность системы и целостность данных. Ниже перечислены функции, которые обеспечивают защиту всех частей сервера: от устройств хранения данных до критичных файлов прикладных программ. Наличие таких функций позволяет NetWare обеспечить очень высокий уровень надежности сети.
Средства обеспечения надежности SFT I:
Средства обеспечения надежности SFT II:
Средства обеспечения надежности SFT III заключаются в полном динамическом зеркальном отображении двух серверов, которые могут находится на значительном удалении друг от друга (при использовании оптоволоконного кабеля для межсерверной связи - до 4 км).
Средства обеспечения надежности уровней SFT I и SFT II реализованы в NetWare v3.11, NetWare v3.12 и NetWare v4.x. Уровень надежности SFT III реализован пока только в NetWare SFT III v3.11.
Средства защиты информации встроены в NetWare на базовых уровнях операционной системы, а не являются надстройкой в виде какого-либо приложения. Поскольку NetWare использует на файл-сервере особую структуру файлов, то пользователи не могут получить доступ к сетевым файлам, даже если они получат физический доступ к файл-серверу.
Операционные системы NetWare содержат механизмы защиты следующих уровней:
В 1983 году фирма Novell ввела в систему концепций локальной сети понятия имени пользователя, пароля и характеристики пользователя (user profile). Характеристика пользователя содержит перечень ресурсов, к которым пользователь имеет доступ, и права, которыми он обладает при работе с этими ресурсами. Администратор сети может ограничить права пользователя по входу в сеть датой, временем и конкретными рабочими станциями. Средства обнаружения нарушений защиты и блокировки действий нарушителя извещают администратора сети о попытках несанкционированного доступа.
В версии NetWare 3.12 пароли хранятся на сервере в зашифрованном виде. Пароль, задаваемый пользователем, передается по кабелю также в зашифрованном виде, что обеспечивает защиту от попыток узнать пароль путем "прослушивания" сети.
В версии NetWare 4.x использована более надежная схема идентификации пользователя при логическом входе в сеть, основанная на использовании технологии защиты RSA public key/private key. При использовании этой технологии пароль и личный ключ пользователя никогда не передаются по кабелям, что полностью исключает возможность узнать чужой пароль. В службу каталогов NDS также введен новый уровень управления доступом, который может быть введен в действие администратором в любой части сети.
С точки зрения защиты ОС NetWare не делает различия между операционными системами рабочих станций. Станции, работающие под управлением DOS, Windows, OS/2, Macintosh и UnixWare, обслуживаются совершенно одинаково, и все функции защиты применяются ко всем операционным системам, которые могут использоваться в сети NetWare.
Каждый NLM стартует в ОС NetWare как по крайней мере одна нить (ее можно считать процессом в традиционном понимании этого термина), которая создается неявным образом при запуске функции main( ) программы, но однонитевые процессы в NetWare являются редким исключением. Функциональные особенности файл-сервера предопределяют большие выгоды при расщеплении процесса обслуживания параллельных запросов к файлам, поступающих одновременно от нескольких пользователей, на несколько нитей. Концепция нитей упрощает программирование этого параллелизма, так как подпроцесс обслуживания одного запроса внутри одной нити программируется как последовательный процесс, то есть процесс, в котором все стадии выполнения протекают в естественной последовательности. Параллелизм же выполнения нескольких запросов реализуется на уровне планировщика операционной системы. NetWare сама запускает много внутренних процессов, таких как процесс обновления кэша или процесс обработки командной строки консоли, которые являются многонитевыми. Все нити одного NLM разделяют общее адресное пространство.
При переключении нитей операционная система использует контекст нити, который является мгновенным снимком рабочей среды нити. В общем случае в контекст нити входят различные переменные, содержание экранов, указатели, счетчики, ссылки, управляющая информация и другие параметры. При переключении с одной нити на другую контекст снимаемой с выполнения нити запоминается ОС, а контекст запускаемой нити восстанавливается. Время переключения во многом зависит от размера контекста, и алгоритм невытесняющей многозадачности работает быстрее вытесняющего алгоритма и из-за того, что в первом случае контекст нити или процесса (в ОС, поддерживающих только концепцию процесса) имеет меньшие размеры.
Рис. 7.2. Соотношение между глобальным, групповым и индивидуальным
контекстами нитей в NetWare
В среде NetWare различается три вида контекстов нитей: глобальный контекст, контекст группы нитей и контекст отдельной нити. Эти контексты вложены друг в друга, как это показано на рисунке 7.2. Соотношение между данными этих контекстов напоминает соотношение глобальных и локальных переменных в программе, написанной на языке C. Глобальный контекст является общим для всех нитей данного NLM'а, и все его переменные видны для всех его нитей. В NetWare можно создавать несколько групп нитей внутри одного NLM-процесса, и эти группы имеют свой групповой контекст. Все нити группы видят переменные контекста своей группы, но не видят переменных контекста другой группы. И, наконец, каждая отдельная нить имеет свой собственный контекст. Содержимое этого контекста доступно только для данной нити.
Очевидно, что такая иерархическая организация контекстов ускоряет переключение нитей, так как при переключении с нити на нить в пределах одной группы нет необходимости заменять контексты групп или глобальные контексты, достаточно лишь заменить контексты нитей, которые меньше по объему, чем контексты других видов. Аналогично, при переключении с нити одной группы на нить другой группы в пределах одного NLM глобальный контекст не изменяется, а заменяется только контекст группы. Переключение же глобальных контекстов происходит только при переходе с нити одного NLM на нить другого NLM.
Программный код в NetWare для работы с нитями может пользоваться различными библиотечными функциями, такими как:
Кроме этих функций NetWare предоставляет средства синхронизации нитей с помощью семафоров и сигналов.
Планировщик NetWare использует несколько очередей для организации невытесняющей дисциплины обслуживания нитей (рисунок 7.3).
При создании нити с помощью функций BeginThread или BeginThreadGroup нить попадает в конец очереди RunList, которая содержит готовые к выполнению нити. После того, как выполнявшаяся на CPU нить завершает свою очередную итерацию с помощью одного из вызовов передачи управления (или вызова ожидания на семафоре), планировщик выбирает для выполнения стоящую первой в очереди RunList нить и запускает ее на выполнение. Нить, завершившая свою очередную итерацию, помещается в конец одной из очередей в зависимости от того, какой вызов передачи управления она использовала: в конец очереди RunList при вызове ThreadSwitch, в конец очереди DelayedWorkToDoList при вызовах ThreadSwitchWithDelay или Delay или же в конец очереди LowPriorityRunList при вызове ThreadSwitchLowPriority. Если же нить вообще завершила свою работу, выполнив функцию return() в главной функции нити (при создании нити в качестве параметра указывается функция, которая является главной функцией нити), то данная нить уничтожается.
Нити, находящиеся в очереди DelayedWorkToDoList, после завершения условия ожидания перемещаются в конец очереди RunList.
Нити, находящиеся в очереди LowPriorityRunList, запускаются на выполнения только в том случае, когда очередь RunList пуста. Обычно в эту очередь назначаются нити, выполняющую несрочную фоновую работу.
Рис. 7.3. Система очередей планирования NetWare
Очередь WorkToDoList является в системе самой приоритетной. Рабочие нити ОС выбирают работы из этой очереди, и эти нити обладают наивысшим приоритетом, то есть попадают на выполнение перед нитями из очереди RunList. Рабочие нити должны использоваться для выполнения очень срочных работ. Планировщик разрешает выполниться подряд только определенному количеству нитей из очереди WorkToDoList, а затем запускает нить из очереди RunList. Очередь WorkToDoList и связанные с ней функции, появившиеся в версии NetWare 4.0, значительно повышают производительность NLM-приложений.
Описанный механизм организации многонитевой работы в ОС NetWare v3.x и NetWare 4.x в сочетании со средствами синхронизации нитей (семафоры и сигналы) представляет собой современный подход к организации параллелизма и многопоточной обработки. Этот подход потенциально очень производителен, так как отличается небольшими накладными расходами ОС на диспетчирование нитей за счет простых алгоритмов планирования и иерархии контекстов Но для достижения высокой производительности к разработчикам NLM-приложений предъявляются высокие требования, так как распределение процессорного времени между различными NLM будет зависеть в конечном счете от реализации приложения и способа использования описанных в этом разделе средств. Кроме того, общая производительность сервера будет определяться всем набором выполняемых на нем NLM'ов и их взаимной способностью к сосуществованию.
Файловая система NetWare значительно отличается от файловых систем ОС общего назначения следующими ключевыми свойствами:
Файловая система NetWare 4.x обратно совместима с файловой системой NetWare 3.x, но имеет несколько новых свойств, включая интерфейс монитора файловой системы.
Тома и жесткие диски
Том - это первичная структура данных файловой системы NetWare. Том включает физическое хранилище данных, логическую информацию о файлах (файлы и каталоги), информацию пространства имен (Name Space) для поддержки не-DOS'овских форматов файлов и системы отказоустойчивости - систему оперативного исправления (Hot Fix) и систему отслеживания транзакций (TTS).
Сервер NetWare 3.12 или 4.x может иметь до 64 томов, монтируемых одновременно. Каждый том может обеспечивать хранение до 32 TБ (терабайт), если сервер имеет достаточный кэш для хранения структур данных тома, включая FAT (File Allocation Table) тома.
Том NetWare - это аналог понятия "файловая система" в UNIX. То есть том можно монтировать и демонтировать, как и файловую систему UNIX. Однако внутренняя структура тома NetWare существенно отличается от структуры файловой системы UNIX.
Физическая структура тома
Физический носитель, который доступен для приложений с помощью средств тома NetWare, состоит из блоков. Блок тома соответствует последовательности секторов физического носителя. Стандартный размер блока тома - 4K (8 секторов), но возможны блоки и больших размеров. Том NetWare - это массив блоков, а каждый блок - это массив секторов.
Блоки тома должны быть связаны с реальным физическим носителем. Этот носитель состоит из сегментов областей физического носителя, которые являются разделами (partitions), подготовленными для использования как части тома NetWare.
Таким образом, базовая структура тома NetWare включает:
Том NetWare может быть многосегментным. Поэтому физический носитель тома может состоять из нескольких дисководов.
Многосегментные тома имеют следующую структуру:
Размещение сегментов одного тома на разных дисках позволяет осуществлять операции чтения и записи различных частей этого тома одновременно, что повышает скорость доступа к данным. Однако при размещении сегментов тома на нескольких дисках требуется зеркальное отображение дисков для защиты информации при отказе какого-либо диска, иначе такой отказ приведет к потере одного или нескольких томов.
Таблица, которая описывает сегмент, называется таблицей определения тома Volume Definition Table (VDT). В этой таблице содержится имя тома, размер тома и информация о расположении сегментов тома на различных дисках. Каждый том NetWare содержит четыре копии (для обеспечения отказоустойчивости) таблицы VDT в каждом разделе NetWare диска. Кроме таблиц VDT раздел NetWare содержит область переназначения дефектных блоков Hot Fix, остальная часть раздела NetWare отводится под сегменты, которые могут принадлежать различным томам.
На сервере NetWare должен быть один диск, содержащий раздел DOS. Этот раздел является активным и с него после выполнения стартового командного файла DOS autoexec.bat автоматически стартует ОС NetWare.
Логическая структура тома
Каждый том имеет таблицу распределения блоков файлов FAT и таблицу входов в каталог DET (Directory Entry Table). Таблица FAT по назначению аналогична таблице FAT MS-DOS, а таблица DET - корневому каталогу диска MS-DOS. Отличие DET от корневого каталога DOS состоит в том, что для каждого файла в нем может находиться несколько записей - входов, если файл имеет не DOS'овский формат.
Таблицы FAT и DET кэшируются в оперативной памяти сервера. FAT кэшируется всегда, а DET - динамически, кэшируются только те входы, которые используются. Входы DET могут выгружаться из памяти, если они долгое время не используются.
NetWare всегда оперирует с избыточным числом копий FAT и DET для надежности.
Кэширование файлов
В NetWare для достижения высокой производительности файловой системы реализован обширный динамический кэш файлов в оперативной памяти. Этот кэш построен на блочной основе. Когда приложение читает или пишет в файл, NetWare копирует нужные блоки данных файла в кэш (если они не находятся уже там). Когда файловая кэш-память полностью заполняется, NetWare выполняет процедуру выгрузки в соответствии с алгоритмом "наименее используемый в последнее время" (Least Recently Used, LRU).
NetWare конфигурирует файловую кэш-память во время инсталляции ОС. После распределения памяти для структур данных операционной системы и инициализации динамических таблиц для стартовой конфигурации, NetWare превращает всю оставшуюся память в файловый кэш. Если NLM'ы динамически запрашивают память, то она берется из памяти файлового кэша. В версиях NetWare 4.x NLM может вернуть эту память файловому кэшу, когда она ему больше не нужна (в предыдущих версиях такой возможности нет).
NetWare кэширует данные файлов поблочно. Это позволяет NetWare достигать высокой степени синхронизации между буферами файлового кэша и блоками тома. Фактически, система кэширования файлов представляет собой часть логической файловой системы NetWare. Такая тесная интеграция между файловым кэшем и физическими носителями помогают сохранить целостность данных в файлах при значительном выигрыше в производительности.
В NetWare в буферах кэш-системы хранятся не только блоки данных файлов, но и такие элементы файловой системы, как FAT, Turbo FAT, кэш-таблица и входы каталогов. Turbo FAT представляет собой таблицу, в которой непосредственно перечислены все блоки файла, если их количество превышает 64. Это обеспечивает быстрый доступ к большим файлам.
При разработке серверных приложений при использовании стандартных функций API работы с файлами программисту нет необходимости задумываться об особенностях реализации системы кэширования файлов. Однако NetWare предоставляет разработчику специальные функции чтения данных непосредственно из буферов кэша (API асинхронного чтения AsyncRead API). Этот API позволяет увеличить производительность NLM-приложений.