Эмуляция Windows на Unix-системах
Эмуляция Unix на Windows-системах
Мобильные библиотеки
Решение OpenNT
Стандарты открытых систем
Множественный доступ
Полное решение для Unix
Производительность и функциональность
Портирование из Unix в NT
Реализация OpenNT
Литература

Компания Softway Systems предложила прямолинейный, но эффектный способ переноса приложений из Unix в Windows NT - она просто реализовала Unix для NT в виде собственной подсистемы, получившей название OpenNT [1]. В данной статье сравнивается подход OpenNT с другими известными способами портирования приложений и, в более широком плане, методами организации доступа к приложениям в гетерогенной компьютерной сети. Более подробно последний аспект обсуждается в статье [2].

Хотя вопрос переноса приложений касается в первую очередь разработчиков, он имеет непосредственное отношение и к пользователям. Сейчас типична ситуация, когда довольно просто найти в Internet программное обеспечение, которое решает интересующую вас задачу. Если это ПО представлено в бинарном виде для вашей платформы и вашей версии операционной системы, то все хорошо и можно работать. В противном случае останется либо кусать локти, либо перед вами встанет задача компиляции исходных текстов.

В принципе возможность работать с приложением на нескольких разных платформах можно обеспечить двумя способами. Первый - реализация в архитектуре клиент-сервер, что позволяет выполнять приложение на одной платформе, а управлять им и получать результаты - на другой. Подход, который предполагает получение доступа к Unix приложениям как с различных платформ Windows, так и из других операционных сред с помощью серверов дисплеев X Window и эмуляции терминалов, стал очень распространенным. Обратная ситуация - выполнение приложений Windows распределенным образом на Unix-платформах является относительно новым способом, но он становится все более популярным в связи с наращиванием вычислительных возможностей компьютеров на базе микропроцессоров Intel Pentium, что дает возможность применять их в качестве серверов приложений. Основы почти всех продуктов в этой области - новые технологии Citrix WinFrame и Tektronix WinDD. Благодаря использованию этих решений, приложения, выполняющиеся на сервере NT, доступны почти для всех других платформ (Unix, DOS, Windows, X-терминалов, мэйнфреймов).

Удаленный доступ - это хороший общий подход, позволяющий во многих случаях быстро провести интеграцию, однако всех проблем он не решает. Если не считать потери производительности приложений из-за издержек при передаче данных по сети, то практически единственный недостаток этого подхода состоит в том, что для работы с приложениями Windows и Unix требуется иметь и поддерживать обе эти платформы одновременно. Сейчас большинство крупных предприятий не имеют иного выбора и должны просто "проглотить пилюлю", установив и Unix-, и Windows-системы, каждую со своим набором приложений. И пользователям, и администраторам вычислительных систем жилось бы куда проще, если бы в корпоративной сети использовалась только одна платформа, но тогда требуется решить вопрос с переносом приложений - это второй общий подход.

Проблема портирования приложений Unix и Windows NT решается сегодня по крайней мере тремя различными способами:

  • эмуляция среды Windows на Unix-системах;
  • эмуляция среды Unix на Windows-системах;
  • использование мобильной библиотеки.

Эмуляция Windows на Unix-системах

Эмуляторы, отображая среду одной ОС на другую платформу, представляют собой самый экономный способ переноса приложений - никаких изменений не требуется. К средствам эмуляции Windows на Unix-системах относятся: VP/ix компании Interactive Systems, DOS Merge (Locus), WABI (SunSoft) и SoftWindows (Insignia Solutions). Существенный недостаток чистых эмуляторов - большие потери производительности приложений, и с этим невозможно справиться, поскольку бинарный код выполняется на чужой аппаратуре. В некоторых случаях замедление может быть незаметным, однако иногда производительность падает на порядок.

Кроме чистых эмуляторов существует класс продуктов, эмулирующих API разработчика, в случае NT - это API Win32. Первый способ портирования в таком случае - трансляция исходного текста приложения, в результате которой генерируется код для целевой платформы. Один из примеров такого транслятора - TeleUse/Win16 и Win32 (Thomson Software). Получая на входе исходный код на языке Си для ОС Unix, написанный в расчете на Motif, транслятор преобразует его в текст C++, используя для этого Microsoft Foundation Classes (MFC). Результирующий код может быть откомпилирован в среде Visual C++ на платформе Windows. Главный недостаток такого подхода в том, что после трансляции Motif-кода получается два экземпляра исходного текста, в которых используются разные API, и оба экземпляра необходимо поддерживать. Кроме того, способ преобразования в TeleUse/Win16 далеко не идеален: полученное для Windows приложение будет больше напоминать приложение для Motif.

Второй способ предлагается в продуктах, которые дают возможность использовать при разработке приложения эмуляцию целевого API, например Windows API. Так, Willows Software предлагает Twin XPDK, инструментальное средство кросс-платформенной разработки, в которое входят библиотеки, файлы интерфейсов процедур для поддержки Windows API для Unix. Все разработчики должны писать для Windows, неважно на какой платформе они сидят.

Аналогичного подхода придерживается и компания Bristol Technology. Последняя версия ее инструментария Wind/U для портирования приложений Windows на среду Unix включает поддержку MFC 4.0, объектов OLE 2.0 и Windows 95. Программное обеспечение MainWin компании Mainsoft позволяет компилировать Windows-приложения на платформе Unix, причем результирующее Unix-приложение может быть оформлено либо в стиле Windows, либо в стиле Motif, а выбрать режим пользователь может во время выполнения.

Несмотря на такое изобилие продуктов эмуляции Windows, они никогда не решали до конца проблему действительной совместимости с Windows из-за ставшего традиционным недостатка функциональных возможностей, которые могли бы сделать эти технологии жизнеспособными и полезными. Продукты, предлагающие API Windows для Unix, нередко грешат отсутствием совместимости и надежности. Их разработчики все время вынуждены играть в догонялки, поскольку API Windows развивается быстрее, чем эти компании могут создавать свои продукты. В результате получается почти перманентное состояние: "мы надеемся, что эта новая функция в скором времени будет реализована".

Эмуляция Unix на Windows-системах

В течение многих лет существовали продукты, с помощью которых разработчики пытались перенести все изобилие средств Unix в DOS и Windows. Самые известные в этой области - MKS Toolkit, а среди продуктов, ориентированных на эмуляцию API разработчика, - NuTCRACKER (DataFocus) и Portage (Consensys). Хотя эти продукты, имитирующие Unix, хорошо принимались пользователями, они все же всегда оставались не совсем Unix, поскольку были построены не на родном для Unix ядре и далеко не все требуемые функции могли быть реализованы. Множество пользователей разочаровывалось, заявляя, что "это средство было бы прекрасно, если бы оно умело делать..." и далее длинный перечень принципиальных замечаний. Другие продукты в этой сфере (Hamilton C Shell, Hippix, Cygnus GNU Win32 project) не оказали значительного влияния на коммерческий рынок.

Продукты, которые предоставляли API Unix для Windows, очень интересовали потребителей, желающих продвинуть приложения Unix в мир Windows, но технологии, примененные в этих продуктах, не решали полностью задачу портирования. По-видимому, в основе этих неудач лежит фундаментальная причина: все продукты такого рода были построены над Win32 и требовали существенной эмуляции кодов, чтобы обеспечить функции Unix, далеко не все из которых можно преобразовать без потери функциональности и производительности. Имеются глубокие расхождения как между самими ОС, так и между Windows API и Unix/X, Unix/Motif. Исследованию различий между интерфейсами посвящены работы [3,4], выполненные компанией Bristol Technology.

Мобильные библиотеки

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

Решение OpenNT

Компания Softway Systems, выпустив OpenNT, предложила радикальное решение - реализовала Unix в виде собственной подсистемы над ядром NT на платформе Intel (рис. 1). Задача не ограничилась созданием реальной как для пользователей, так и для разработчиков среды Unix на Windows NT. В составе OpenNT выпущено семейство продуктов, которые делают саму NT многопользовательской системой и обеспечивают параллельный удаленный доступ пользователей к приложениям. Чтобы реализовать это, потребовалось решение, которое не сводится к оболочке Unix, рассчитанной на одного пользователя, набору утилит и библиотеке для портирования. Полномасштабная реализация Unix в OpenNT, выполненная по стандартам открытых систем, открыла следующие возможности:

  • позволяет разработчикам переносить свои Unix-приложения в Windows NT;
  • дает пользователям и разработчикам метафору взаимодействия с операционной системой, опирающуюся на Unix;
  • пользователи и разработчики получают полную среду Unix, причем OpenNT реализована так, что не приносится в жертву производительность и функциональность.
  • Picture 1(1x1)

    Рисунок 1.
    Архитектура OpenNT.

    Стандарты открытых систем

    Согласованность со стандартами Unix - краеугольный камень OpenNT. Чтобы оценить важность этого вопроса, нужно понять, зачем вообще были разработаны стандарты операционных систем. Все они были созданы теми, кто понимал, что, хотя многие из разработчиков заявляли, что у них есть совместимые ОС, пользователи редко имели возможность безболезненного перехода от одной платформы к другой с гарантией получения совместимого интерфейса. Стандарты IEEE POSIX и X/Open были разработаны для того, чтобы сориентировать производителей операционных систем на вопросы межплатформенной совместимости. Следуя этим четко определенным, установленным на основе консенсуса стандартам, и пользователи, и разработчики выиграли. Пользователи могут быть уверены, что системный интерфейс, оболочка и множество инструментов будут доступны на любой сертифицированной системе, а разработчики получают совместимый, предсказуемый, хорошо определенный интерфейс с операционной системой. Сертифицированность программного обеспечения стала важным критерием при выборе платформы. Softway Systems стремилась привнести стандарты в Windows NT так, чтобы все перечисленные достоинства стали бы достоянием пользователей. Возможно, Softway Systems стала первой компанией в мире, которая строит среду операционной системы с нуля, используя спецификацию, определенную в стандартах POSIX и X/Open.

    Существует множество систем, часть их упомянута выше, которые "почти" соответствуют стандартам. Такое "почти" соответствие вносит некоторую непредсказуемость и в конкретной ситуации может стать непреодолимым препятствием для использования того или иного приложения. Одной из причин применения архитектуры собственных подсистем Windows NT при реализации OpenNT была потребность в построении такой инфраструктуры операционной системы, которая могла бы обеспечить поддержку всех продуктов, основанных на стандартах. Это решение обусловлено тем, что не существует способа согласовать Win32 и все Unix-подобные продукты, использующие API Win32, с каждым из стандартов POSIX и X/Open. В Win32 отсутствуют некоторые ключевые компоненты, необходимые для того, чтобы пройти через тесты соответствия.

    Множественный доступ

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

    В отличие от Unix, операционная система Windows NT в том виде, в каком она выпускается Microsoft, на самом деле является однопользовательской ОС. Хотя на NT можно установить клиент-серверные сетевые приложения, не существует способа одновременного подключения нескольких пользователей к одной системе Windows NT. Исправляя такое положение и обеспечивая многопользовательский доступ в стиле Unix-систем, в состав OpenNT были включены Telnet Server для многопользовательского текстового доступа, а также X11 Server и X11 Windowing System для многопользовательского графического доступа.

    Полное решение для Unix

    OpenNT претендует на полномасштабную реализацию Unix. Вопрос, что такое полное решение для Unix, трудный, потому что Unix развивалась долгие годы, и в ее состав входят разные по направленности и качеству средства. Первой коммерческой версией Unix была многопользовательская текстовая система с разделением времени. По мере возникновения сетевых стандартов добавлялись сокеты и интерфейсы TCP/IP. В конце концов был предложен стандарт X Window System, и Unix-системы получили возможность работать с графикой. Сегодня практически все ключевые Unix-технологии попадают в одну из этих трех областей - текстовое многопользовательское обслуживание, сетевое обслуживание (например NFS и DCE) и графика X Window (Motif, CDE, OpenGL, OpenLook). Хотя было бы хорошо полностью охватить все базовые технологии во всех разновидностях Unix, это программное обеспечение требует тщательной разработки шаг за шагом. Система OpenNT - это не что иное, как перенос Unix в новую архитектуру. Предполагается, что к середине 1997 года будет разработано семейство продуктов, поддерживающих все промышленные и утвержденные стандарты для пользователей и разработчиков. Компания Softway Systems хотя и не собирается поддерживать CDE, будет поставлять API, с помощью которого третьи разработчики смогут перенести CDE в OpenNT.

    Производительность и функциональность

    OpenNT строится как собственная подсистема над ядром NT, что позволяет обеспечить высокую производительность и полноту функциональных возможностей. Архитектура подсистем среды ОС является особенностью NT, которая дает возможность одновременно выполнять над единственным ядром несколько разных операционных сред, разделяя между ними ресурсы, файлы и функции ядра. В частности, родная для Unix операционная среда может быть реализована без потерь производительности или функциональных возможностей, и в то же время она не оказывает влияния на среду Windows. Реализация подхода OpenNT стала возможной в результате заключения соглашения между Microsoft и Software Systems, которая получила лицензию на исходный текст NT.

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

    Пределы функциональных возможностей Win32 переносятся в ограниченную функциональность любых продуктов Unix, построенных на Win32. Из этого не следует, что Win32 - плохая среда. Она дает богатый набор инструментов, которые сфокусированы на поддержке традиционной среды Windows, однако не может поддержать тот же набор API, что Unix. Реализация OpenNT в виде подсистемы дает платформу, которая совместима с Unix-системами. Это открывает возможность для адекватной реализации тех функций, которые Win32 просто не может выполнять, например ссылки на файлы, управление задачами, чувствительность к регистру в именах файлов, полная реализация функций fork() и exec().

    Среда OpenNT полностью интегрирована с Windows NT. Это означает, что используется та же файловая система, системное администрирование выполняется стандартным для NT способом и полностью сохранен аппарат обеспечения безопасности NT. Например, пользовательские профили и привилегии администрируются посредством NT User Manager и отображаются в мир OpenNT. Файлы, созданные в OpenNT, доступны из Windows, и наоборот. Можно также отметить поддержку выполнения приложений из разных подсистем. Из оболочки OpenNT, с использованием скриптов, пользователь может запустить и программу для OpenNT, и приложение Win32. Это мощное средство, так как появляется возможность строить скрипты не только из обычных команд Unix, но и из команд NT.

    Портирование из Unix в NT

    OpenNT решает задачу обеспечения переносимости единственного варианта исходного текста на разные платформы - Unix и NT. Для этого в OpenNT включены современные средства разработки программного обеспечения Unix, которые содержат как сервисные программы, так и инструментальные библиотеки. Портирование приложения осуществляется путем его перекомпиляции с помощью инструментария OpenNT Software Development Kit. В качестве компилятора используется MS Visual C/C++, а Software Development Kit служит интерфейсом с ним. Такая организация процесса портирования сохраняет привычную для Unix среду разработки, но при этом еще и приносит выгоду от использования родного для NT компилятора.

    Полезно сравнить подход OpenNT с другими средствами, например с NuTCracker, среда которого провоцирует одностороннее движение - при настройке исходного текста для Unix на API Win32 происходит слияние обоих интерфейсов (для Unix и для Windows), так что в дальнейшем становится очень трудно отделить одно от другого и использовать полученный в результате преобразования исходный текст снова в Unix. Получается, что это и не код для Unix, и не чистый код для Windows, а их комбинация, которая годится только для среды NuTCracker. Это, конечно, не то, что подразумевается в концепции открытых систем.

    Важна также полнота переносимости программного кода - считается, что NuTCracker способен справиться примерно с 60% программы стандартного приложения Unix. Это хорошо, но оставшиеся 40% придется переносить вручную. Как уже говорилось, OpenNT реализует плохо согласующиеся с Windows функции Unix. Например, поддерживаются ссылки на файлы - стандартная возможность в Unix. Созданные в среде OpenNT ссылки полностью видимы для того, кто работает в среде Win32, и могут использоваться обычным образом. Для разработчиков важна реальная реализация функций fork() и exec(), которая бы сохраняла их семантику. Эти функции являются наиболее важными инструментами при разработке многих приложений Unix, поскольку дают возможность порождать новые процессы и обеспечивать эффективное распараллеливание. Win32 не имеет поддержки для fork() и exec() - OpenNT не только реализует такую поддержку, но и делает это, как в Unix. В этом еще одно отличие OpenNT от Unix-подобных библиотек для Windows NT, при составлении которых была сделана попытка отобразить важнейшие функции Unix в API Win32. Поскольку, однако, Win32 не поддерживает некоторые базовые примитивы Unix, библиотеки их эмулируют по мере возможности, причем их семантику не всегда получается адекватно реализовать, примером чему служат fork() и exec(). Поэтому NuTCracker не был сертифицирован на соответствие даже с POSIX.1. Подход OpenNT основан на спецификации The Open Group (старое название X/Open) Single Unix (известной так же, как Unix 95). Планируется достигнуть уровня Unix 95 к середине 1997 года. Параллельно Softway Systems работает над достижением полной согласованности с POSIX.1, Posix.2 и XPG4 Base95.

    Реализация OpenNT

    Компания Softway Systems сейчас поставляет OpenNT Release 2.0 и можно получить свободно распространяемую бета-версию [5]. В состав этой версии входят несколько продуктов: оболочка и утилиты Unix; инструментарий разработки Unix; дисплейный сервер, среда времени выполнения и средства разработки X11; администратор окон и средства разработки OSF/Motif; сервер Telnet. Выбирая различные комбинации этих продуктов, можно сконфигурировать несколько вариантов среды OpenNT, например рабочую станцию/сервер только для запуска Unix/X-приложений или сервер с инструментальными средствами для портирования или разработки Unix-приложений под Windows NT. Весь комплект продуктов стоит приблизительно 1000 долл. (цены близкие к Windows).

    OpenNT можно установить на системы с процессорами Intel x86, Pentium, Pentium Pro и на платформы Digital Alpha. Требуется Windows NT 3.51 или выше (Workstation или Server), Visual C/C++ начиная с 4.0 (для средств разработки). Одно из достижений OpenNT - упрощение процедуры инсталляции, которая занимает всего несколько минут. Для этого не нужно запускать сложные скрипты или редактировать файлы. Оценивая современное состояние OpenNT Release 2.0, можно отметить, что поддерживаются следующие основные функции:

  • интерфейсы POSIX.1, POSIX.2 и ANSI C;
  • сокеты BSD и их отображение на Winsock;
  • средства управления процессами (очереди сообщений, семафоры) Unix System V (SVID);
  • разделяемая память, отображение файлов в память;
  • возможность выполнять приложения Win32 из OpenNT;
  • полная семантика алфавитно-цифрового терминала, отображаемого в консольное окно;
  • клиенты и библиотеки оконной системы X11R5, дисплейный сервер, шрифты и управление ими X11R6;
  • управление окнами, библиотеки, средства разработки OSF/Motif 1.2.4 (OpenNTiF);
  • демон telnet, обслуживающий многопользовательский вход;
  • свыше 200 команд и утилит Unix и X11R5;
  • оболочки Unix - Korne shell, Bourne shell, C shell;
  • языки сценариев: awk, perl, sed, Tcl/Tk;
  • полное управление заданиями из командной оболочки;
  • полная интеграция с файловой системой и моделью безопасности Windows NT;
  • демоны;
  • клиенты для Internet: ftp, telnet, ping, rsh;
  • ленточные устройства;
  • инструментарий для разработки Unix - make, rcs, yacc, lex, cc, nm, ar, strip.
  • Задачи, поставленные создателями OpenNT, не ограничиваются вопросами портирования приложений Unix. OpenNT представляет собой полноценную операционную Unix-среду на платформе Windows. Команды и утилиты OpenNT образуют полный набор, соответствующий стандарту IEEE POSIX.2 Execution Environment Utilities, определенный в FIPS 189. Два компонента OpenNT, OpenNT Telnet Server и OpenNT X11 Server, превращают базовую операционную среду NT в действительно многопользовательскую систему с удаленным доступом.

    Сервер OpenNT Telnet является демоном Telnet для Windows NT, через который пользователи получают доступ к оболочке Common Command Shell Windows NT и к оболочке OpenNT POSIX/Unix. Несколько пользователей могут одновременно обращаться к серверу NT и выполнять параллельно несколько приложений DOS, Win32, OS/2 и POSIX. Сервер OpenNT Telnet экспортирует приглашение login по сети, обеспечивая удаленный доступ из любой системы, подключенной по протоколу TCP/IP и имеющей клиентскую часть Telnet. Клиентами могут быть системы Unix, Macintosh, Windows, DOS или сетевые терминалы. Сервер OpenNT Telnet полностью сохраняет все функции безопасности NT уровня С2, создавая для каждого пользователя собственный контекст безопасности.

    Сервер OpenNT Telnet имеет полный набор опций конфигурирования, с помощью которых системный администратор Windows NT может определять права доступа для отдельных пользователей и групп. Графический интерфейс для установки и администрирования сервера Telnet позволяет определить: права входа и доступа пользователей; ведение журнала событий и действий пользователей; способы эмуляции терминала и управление цветом; опции оболочки пользователей и каталоги по умолчанию; кванты времени и приоритеты; регистрацию приложений.

    Сервер Telnet - это средство для многопользовательской работы с алфавитно-цифровыми (в том числе полноэкранными) приложениями. Аналогичные функции, но для графических приложений выполняет X-сервер. Сервер OpenNT X11 имеет следующие особенности:

  • он полностью соответствует спецификации X11R6;
  • имеет 32-разрядную архитектуру;
  • поддерживает различные администраторы окон Unix: Motif, OpenLook, VUE, CDE;
  • поддерживает виртуальный экран с размерами 32,767х32,767 пикселей;
  • позволяет копировать и вставлять тексты и графику между буфером обмена Windows NT и X Window;
  • содержит полный набор шрифтов X11R6 и обеспечивает их автоматическую подстановку;
  • полностью интегрирован с Windows - пользователь получает обычный для NT интерфейс и способ управления окнами.
  • Если суммировать все сказанное, то получается, что на одном настольном компьютере NT + Unix = OpenNT пользователь может работать со следующими типами приложений:

  • Win16 (Windows 3.1);
  • Win32 (Windows 95 и Windows NT);
  • текстовыми приложениями POSIX и Unix через оболочку OpenNT;
  • приложениями X11 и Motif, которые выполняются на NT, через OpenNT X11 и OpenNT Motif;
  • с теми же приложениями, но выполняющимися удаленно.
  • Литература

    [1] D. Miller. The OpenNT Solution. Softway Systems.

    [2] В. Черный. Интеграция платформ Windows NT и Unix. Открытые системы, # 3, 1997.

    [3] S. Wingo. Implementing the Windows API on Unix/Motif: a Technical Analysis. Bristol Techonolgy Inc.

    [4] C. Cullens. Cross-Planform Portability between Windows and X. Bristol Techonolgy Inc.

    [5] OpenNT 2.0 Server Data Sheet. http://www.softway.com/OpenNT.