2011 г.
Становление Windows NT
Artem Baranov
Когда Microsoft выпустила первую версию Windows NT в апреле 1993, маркетинг компании и кампания связей с общественностью особенно акцентировали внимание на имени - NT (то есть, Новая Технология) новой ОС. Microsoft продвигала NT как современную ОС, которая включает в себя все возможности, ожидаемые пользователями как от ОС для рабочих станций, так и для средних серверов. Хотя NT была новой ОС, в 1993, с новым API (то есть, Win32) и новыми пользовательскими и системными программами, корни системной архитектуры NT и ее реализация уходят к середине 1970-х.
Время до NT
История NT близко привязана к Дэвиду Н. Катлеру (David N. Cutler), ее главному архитектору. После окончания Michigan's Olivet College в 1965, Катлер работал в DuPont. Хотя компьютеры в начале его не интересовали, он управлял моделированием машин Digital и это была часть его работы в DuPont. Вскоре, Катлер получил хорошие знания о программном обеспечении и решил, что он хочет разрабатывать операционные системы. Он поступил на работу в DEC в 1971 и занялся разработкой операционных систем для семейства машин PDP-11. RSX-11M стала первой ОС, в которую Катлер включил основные понятия и принципы разработки, позже появившиеся в NT. RSX-11M – это ОС для PDP-11 фирмы Digital, разработанная для использования в управлении производственным процессом.
Рис. 1. Дэвид Катлер.
Сам Катлер в предисловии к первому изданию «Inside Windows NT» пишет:
Моим первым проектом в области ОС была система реального времени RSX-11M, которая работала на 16-разрядных миникомпьютерах PDP-11 фирмы DEC. В то время наши цели казались очень амбициозными. Нужно было создать многозадачную ОС, которая работала бы на 32 Кбайт памяти, поддерживала иерархическую файловую систему, подкачку приложений, планировку задач в реальном времени и имела набор утилит для разработчиков.
В 1975, в DEC поняли, что их конкуренты разрабатывают 32-битный процессор и что эта технология переманит клиентов от 16-битной архитектуры PDP. Гордон Белл, легендарная фигура в компьютерной истории и затем вице-президент Digital по компьютерным разработкам вел развитие 32-битового процессора, который в компании, в конечном счете, окрестили VAX. К этому времени Катлер был частью первоначальной команды разработчиков VAX. Digital назначила Катлера, наряду с Диком Хустведтом (Dick Hustvedt) и Питером Липмэном (Peter Lipman), разработчиками OС для VAX, которая называлась VMS. Первичные цели проекта Digital для VAX включали обратную совместимость с процессорами PDP-11 и достаточную гибкость, которая делала бы VAX основой как для рабочих станций, так и для серверов. DEC также сделала VMS совместимой с RSX-11M и спроектировала VMS так, чтобы та запускалась на машинах разного размера. Из этого периода развития Digital, ее состояние как компании называлось «ставит бизнес» (betting the business) на VAX и VMS. Позднее Билл Гейтс будет утверждать, что Microsoft «ставит бизнес» на NT 5.0.
Компьютеры PDP-11 обеспечивали лучшее соотношение цена/производительность по сравнению с большими ЭВМ и могли использоваться на уровне отделов предприятий. Вместе с другими популярными миникомпьютерами тех лет они породили первую волну уменьшения размеров (downsizing) в компьютерной индустрии. Уменьшение размеров было попыткой перенести приложения больших ЭВМ на миникомпьютеры. Многие такие приложения были слишком велики для PDP-11, и почти сразу же Digital начала борьбу с тем, что Гордон Белл считал единственной самой важной причиной устаревания компьютерных архитектур – недостаточным количеством адресных разрядов. Так родилась архитектура VAX, которая стала одной из наиболее популярных архитектур конца семидесятых и сохраняла свои позиции все восьмидесятые годы.Дэйв Катлер.
В 1977, Digital анонсировала VAX-11/780 и VMS 1.0, осуществляя первые поставки продукта в 1978. Как лидер проекта и один из главных архитекторов VMS, Катлер продолжал работу над последующими выпусками VMS, но уже начинал нервничать, работая в Digital. В 1981 Катлер пригрозил покинуть Digital. Чтобы сохранить такую звезду в области разработки, компания дает Катлеру приблизительно 200 аппаратных и программных инженеров. Дэвид переместил свою группу в Сиэтл и открыл центр разработки. Цель этой элитной группы состояла в проектировании новой архитектуры процессора и ОС для него. Digital назвала аппаратную платформу Prism, а ОС для нее – Mica. Собственно, Prism явила собой разработку новой 32-разрядной процессорной архитектуры RISC, а Mica – ОС, основанную на микроядре.
В 1988, руководство Digital отменила проект Катлера и уволила многих из членов его группы. Катлер решил оставить Digital, но прежде, чем он это сделал, руководители Microsoft поняли, что у них есть идеальная возможность нанять Катлера. В то время, когда Катлер покинул Digital, релизной версией была VMS 5.0.
Рис. 2. Катлер (в центре) с Соломоном и Руссиновичем, фото к предисловию 4-го издания Windows Internals.
Разработка NT
В августе 1988, Билл Гейтс нанял Катлера. Одним из условий Дэвида при переходе в MS было то, что с собой он возьмет 20 инженеров из Digital, работавших с ним, включая нескольких инженеров проекта Prism. Microsoft с готовностью встретила это требование, компания знала, что наем архитектора ОС такого уровня как Катлер станет удачным ходом, к тому же у немногих инженеров был такой послужной список. Гейтс чувствовал, что долгосрочное будущее Microsoft зависело от развития новой ОС, которая будет конкурировать с UNIX.
Летом 1988 года мне позвонил Билл Гейтс из корпорации Microsoft с интересным предложением. Он спрашивал, не соберусь ли я приехать и поговорить о создании новой ОС Microsoft для персональных компьютеров. В то время меня не очень интересовала работа с персональными компьютерами, но я подумал, что это очень хорошая возможность встретиться с Биллом и обсудить его идеи. То, что предлагал Билл, сводилось к созданию новой ОС – переносимой и отвечающей требованиям, которые предъявляются к ПК при выполнении критически важных задач. Для меня это был шанс создать еще одну операционную систему! В конце концов Билл убедил меня, что такую возможность нельзя упускать, так что в октябре 1988 года я перешел в Microsoft и начал подбирать группу для создания новой ОС. В то время я еще не понимал, что это будет самый амбициозный проект ОС, в котором я когда-либо принимал участвовал.
В Microsoft внутреннее название проекта для новой ОС было OS/2 NT, потому что ее намерением для новой ОС было сохранение OS/2 API как первичного интерфейса. Хотя самым первичным именем NT было все-таки N-Ten и разрабатывалась она для RISC процессора Intel i860. По поводу этого Марк Люковски (Mark Lucovsky), говорил (в статье Windows Server 2003: The Road To Gold Part One: The Early Years):
Первоначально мы нацеливали NT на Intel i860 (кодовое имя N-Ten), RISC-процессор, который был одним из последних в списке. Поскольку у нас не было машин с i860 для тестирования, мы использовали его эмулятор. Именно поэтому мы назвали ее (ОС) NT, потому что она работала на N-Ten.Марк Люковски, знаменитый архитектор Windows Server (пришел в MS вместе с остальной командой Катлера из DEC, известен как разработчик диспетчера процессов NT).
Мы начали проект с пятью парнями из DEC и одним из MS, этого парня звали Стив Вуд. И мы оставались крошечной группой долгое время, в течении лета. Мы думали ‘Как это трудно, создать ОС?’ и запланировали 18 месяцев на разработку. Но мы забыли о части важного материала – пользовательском режиме, сети и прочем.Марк Люковски.
К концу 1989 группа NT начала расти. Руководство добавило команду разработчиков сети и расширила команду безопасности, в которую входил только один человек. В этом же году появились первые образцы i860, которые команда стала использовать вместо эмуляторов. К сожалению, выяснилось, что он не в состоянии эффективно исполнять написанный код и группе пришлось переориентироваться на MIPS архитектуру, в итоге решено было остановиться на чипе MIPS R3000.
Немного позже началось портирование NT на Intel i386 процессор, который был наиболее распространен в то время. Люковски объяснил, почему изначально было важно не нацеливать на него NT. «Некоторое время, мы избегали 386, чтобы избежать заточки на архитектуру. Мы не хотели использовать допущение о немобильности.»
Успех Windows 3.0, в апреле 1990, изменил отношения Microsoft с IBM. Спустя шесть недель после того, как Microsoft выпустила Windows 3.0, она переименовала OS/2 NT в Windows NT, и определила Win32 API, как официальный API для NT (а это было ударом для IBM). Сам Люковски говорил на этот счет:
Мы посмотрели на Windows 3.0 и сказали ‘Что если, вместо OS/2 мы сделаем 32-битную версию Windows?’. Четверо парней – Стив Вуд, Скотт Людвиг, парень из группы графики и я посмотрели на 16-битный Windows API и рассчитали. что его можно расширить до 32-битного. Мы провели полтора месяца, подготавливая набор API и затем представили его группе предварительного просмотра из 100 человек.
Новая 32-битная реализация старого API открыла для разработчиков простой путь для переноса их приложений в новую 32-битную среду, используя при этом новые возможности NT.
Мы сделали возможным перенос 16-битных приложений в NT очень простым и эти приложения могли использовать преимущества уникальных возможностей NT, как, например, большое адресное пространство. Мы также добавили новые API, которых не было в 16-битной версии.
Гейтс решил, что совместимость с 16-битовым Windows API и умение запускать приложения Windows 3.x без модификации было первостепенной целью для NT, в дополнение к неполной поддержке DOS, OS/2 и POSIX API.
Рис. 3. Новый логотип HP VMS (aka OpenVMS).
NT – переработанная VMS
Большинство основных проектировщиков NT продолжило работать и над VMS в Digital. Многие пользователи верят, что разработчики NT перенесли концепции VMS в NT, но большинство не знает, как похожи NT и VMS на уровне ядра (совпадение или нет, если вы увеличите каждую букву в названии VMS вы получите WNT).
Первая версия Windows NT, Windows NT 3.1, была выпущена в июле 1993 и была названа так, чтобы соответствовать номеру версии текущего на тот момент 16-битного продукта Windows. С этих пор команда разработчиков NT работала над совершенствованием выпусков и все разработки велись на одной и той же кодовой базе. Следующей версией NT стала 3.5, которая носила кодовое имя Daytona и была выпущена в сентябре 1994. Первоначальными возможностями для Daytona были размер, производительность и совместимость с Netware.
Рис. 4. Загрузочный экран NT 3.1.
Как в UNIX, и в большинстве коммерческих ОС, у NT есть два режима исполнения кода. В пользовательском режиме выполняются приложения, подситемы OS/2, DOS, и POSIX. Эти компоненты являются непривилегированными, потому что NT управляет ими, а также аппаратными средствами, на которых они работают. Без разрешения NT эти компоненты не могут непосредственно получить доступ к аппаратным средствам. Кроме того, компоненты и оборудование не могут получить доступ ни к другим адресным пространствам, ни к адресному пространству ядра. Компоненты в пользовательском режиме должны обратиться к ядру, если они хотят получить доступ к аппаратным средствам или выделить физические или логические ресурсы.
Ядро исполняется в привилегированном режиме: оно может непосредственно получить доступ к памяти и апаратуре. Ядро состоит из нескольких исполнительных подсистем, которые отвечают за обслуживание ресурсов, включая диспетчер процессов, диспетчер воода/вывода, диспетчер виртуальной памяти, справочный монитор безопасности, и микроядро, которое обслуживает планирование и прерывания. Система динамически загружает драйверы устройств, которые являются компонентами ядра и служат интерфейсом между NT и различными периферийными устройствами. Уровень абстрагирования от оборудования (HAL) скрывает специфичные особенности процессора и материнской платы от NT. Родной (native) API NT – это API, который приложения пользовательского режима используют для вызова ядра. Этот родной API главным образом недокументирован, потому что приложения, как предполагается, вызывают подсистему Win32, DOS, OS/2, POSIX, или Win16, и соответствующая подсистема взаимодействует с ядром от имени приложения.
Разработчики Digital написали ядро VMS почти полностью на ассемблере VAX. Чтобы код был портируемым на различные архитектуры процессоров, разработчики Microsoft написали ядро NT почти полностью на C. При разработке NT, разработчики переписали VMS на C, избавили ее от недостатков, настроили, и добавили некоторый новый функционал и совместимость. Они создали новый API (то есть, Win32), новую файловую систему (то есть, NTFS), и новую графическую подсистему интерфейса, исполнительную среду, поддерживая т. о. обратную совместимость с DOS, OS/2, POSIX, и Win16. Однако, перемещение внутренностей VMS в NT было настолько полным, что в течение нескольких недель после выпуска NT, инженеры Digital заметили поразительные общие черты.
Рис. 5. Обобщенная архитектура ядра VMS.
Рис. 6. Обобщенная архитектура ядра NT.
Из этих общих черт можно составить книгу. Фактически, можно прочитать разделы книги «VAX/VMS Internals and Data Structures» (Digital Press) как точное описание внутренностей NT, просто переводя термины VMS к терминам NT. Рассмотрим некоторые из главных общих черт и различий между Windows NT 3.1 и VMS 5.0, последней версией VMS, на которую Дейв Катлер и его команда, оказали большое влияние.
Процессы в NT фактически идентичны процессам VMS. В NT, как в VMS, планировщик процессов реализует 32 уровня приоритетов. Процесс с самым высоким приоритетом всегда активен, а процессы с тем же самым приоритетом планируются по принципу карусели. Система выделяет 16 уровней высокого приоритета - реального времени или уровней с фиксированным приоритетом. В таких процессах планировщик не манипулирует приоритетами. 16 низкоприоритетных уровней (исключая нулевой, который система резервирует для потока простоя idle, он выполняется в том случае, когда нет готовых к выполнению потоков) являются динамическими, потому что планировщик, часто, совместно с драйверами устройств, увеличивает приоритеты, при отклике на различные события. Например, когда процесс получает данные от устройства, приоритет соответственно увеличивается. Особенность диспетчеров процессов NT и VMS в том, что они никогда не понижают приоритет процесса ниже приоритета, на котором изначально работает приложение. Планировщики и VMS 5.0 и NT 3.1 поддерживают симметрическую мультипроцессорную обработку (SMP), которая позволяет им выполнять процессы одновременно на различных центральных процессорах, для увеличения производительности приложения.
Главное различие между NT и VMS в управлении процессами в том, что процессы NT содержат один или более потоков, и планировщик NT предоставляет процессорное время не процессам, а потокам. Digital не вводила потоки режима ядра в VMS до версии 7.0 в 1995. Это дополнение - одно из нескольких улучшений, сделанных Digital для VMS, начиная с выхода NT, которые появились в ответ на возможности NT. В свою очередь, Microsoft добавила легкие потоки пользовательского режима к NT 4.0 в 1996, которые она скопировала с реализации потоков VMS.
Рис. 7. Загрузочный экран NT 4.0.
Диспетчеры памяти в NT и VMS также похожи. Обе ОС осуществляют трансляцию виртуальных адресов, которые система разделяет между выполняемым приложением и ядром. И NT и VMS полагаются, в большой степени, на проецируемые в память файлы, особенно для проецирования кода, выполняемого приложением и реализацию функционала копирование при записи (copy-on-write). Физическое управление памятью в NT и VMS осуществляется через подкачку виртуальной памяти по требованию (demand-paged virtual memory). Диспетчер памяти VMS назначает каждому процессу верхние и нижние пределы количества физической памяти (такой алгоритм называется рабочий набор, working set). Эта возможность регулирует распределение физической памяти между приложениями, чтобы процесс, требующий много памяти не смог воздействовать, таким образом, на другие приложения.
Как и с диспетчером процессов, примечательные отличия существуют между диспетчером памяти NT и VMS. Диспетчер настройки баланса VMS (VMS's Balance Set Manager) перемещает всю память процессов из памяти в файлы подкачки и обратно в память, в ответ на требования системы. Microsoft не перенесла этот механизм, известный как свопинг (swapping, устаревший механизм подкачки, согласно которому процесс выгружался из памяти не постранично, а целиком) в диспетчер настройки баланса NT, хотя некоторые из вторичных обязанностей диспетчера настройки баланса NT сходны с обязанностями диспетчера VMS.
Диспетчер ввода/вывода NT непосредственно основан на диспетчере ввода/вывода VMS. У обеих ОС он поддерживает многоуровневую модель драйверов через стек драйверов устройств, а также реализует асинхронные команды ввода/вывода, основанные на пакетах (специальных структурах данных), и способен динамически загружать и выгружать драйверы устройств. Стековые и загружаемые драйверы делают NT и VMS очень расширяемымыми ОС. Любая из них может делить функциональность между несколькими драйверами устройств, при этом каждый из них будет реализовывать свой уровень абстракции. Например, система может вставить отказоустойчивый драйвер диска (fault-tolerant disk driver) между драйвером файловой системы и дисковым драйвером. Эта конфигурация позволяет отказоустойчивому драйверу диска получать запрос, который система посылает на один логический диск (например, C), и далее отправить запрос на несколько физических дисков, чтобы осуществить зеркалирование или чередование. Асинхронный ввод/вывод позволяет приложениям и подсистемам ядра инициировать запросы на устройства и продолжать работу, и это предпочтительнее, чем просто ждать завершения запроса (синхронный ввод/вывод). Архитектура драйвера устройства NT и схема приоритетов запросов перерываний основаны на аналогичных в VMS.
NT и VMS представляют ресурсы как объекты, которыми система управляет через диспетчер объектов, он реализует унифицированный механизм подсчета ссылок и учета объектов. Диспетчер объектов регулирует выделение ресурса и вызывает функции исполнительной подсистемы, которые запросили уведомление об определенных операциях на объекте. Управление объектами в VMS не формализовано как в NT, и диспетчер объектов VMS - только свободная связь функций. Microsoft расширила диспетчер объектов в NT так, чтобы он предоставлял единую схему именования для всех ресурсов ядра.
Подсистема безопасности NT основана на объектах со списком избирательного управления доступом (discretionary access control lists). Эти списки определяют, какие пользователи и какие операции они могут выполнить на этих объектах. Digital добавила улучшенный DACL к модели безопасности VMS в версии 4.0 в 1984. Поэтому, реализация безопасности VMS - предшественник NT. Microsoft даже включала системные утилиты из VMS в NT, включая, Монитор Производительности (Performance Monitor), который основан на программе MONITOR, расширяемом мониторе производительности VMS (extensible VMS performance monitor). VMS включала утилиту под названием BACKUP задолго до того, как Microsoft разработала подобную ей для NT.
Статья "Почему Самый быстрый Чип не Победил", "Why the Fastest Chip Didn't Win" (Business Week, April 28, 1997) заявляет, что, когда инженеры Digital заметили общие черты между VMS и NT, они донесли свои наблюдения до высшего руководства. Вместо предъявления иска, Digital просто разорвала связи с Microsoft. Летом 1995, Digital анонсировала Affinity для OpenVMS, программу, которая требовала от MS помощи в обучении работе с NT технического персонала Digital, а также помощи в продвижении NT и OpenVMS как части сетевого решения клиент-сервер, и обещания встроить в NT поддежку Alpha процессора. Microsoft также заплатила Digital сумму между 65 миллионами и 100 миллионов долларов.
Заключение
Хотя Microsoft представляет NT как свою ОС, она фактически намного старше своей даты рождения в 1993 и содержит архитектурное влияние от ОС другого флагмана. Интересно, что большая часть бизнеса Microsoft, это ее линейка современных ОС для PC, каждая из которых, по сути, основана на ОС от другого вендора. DEC не смогла бы сделать OpenVMS такой популярной, т. к. та изначально была ориентирована на серверы и свою архитектуру VAX. MS же напротив, соединила клиентскую и серверную модели (впервые в Windows 2000). В итоге они получили ядро ОС, которое может работать как с клиентскими, так и с серверными PC, достаточно лишь его настроить соответствующим образом.