ГЛАВА 8 X WINDOW И P E X

8.1. ВВЕДЕНИЕ

Разработанный MIT в 1985 году, X Window (сокращенно X), все чаще и чаще заявляет о себе, как о стандарте для реализации графических интерфейсов. Речь идет о продукте freeware, который, таким образом, можно получить бесплатно. Нашей целью будет дать не полное и исчерпывающее описание X Window, а лишь описать те стороны этого продукта, которые имеют отношение к функциональным возможностям и механизмам реали- зации распределенных прикладных программ. Мы ограничимся опи- санием версии X11R4,и лишь упомянем о некоторых изменениях, внесенных в версию X11R5.

PHIGS (Programmer Hierarchical Interactive Graphic System) - был принят в качестве стандарта для трехмерной графики. PEX (PHIGS Extension to X Window) - должен позволять распределять прикладные программы, обрабатывающую трехмерную графику.

8.2. ФУНКЦИОНАЛЬНЫЕ ВОЗМОЖНОСТИ

8.2.1. Концепции и предлагаемые возможности

Можно определить X Window как графический многооконный расп- ределенный интерфейс. X Window определяет несколько концепций и предлагает определенный набор возможностей, который мы и рассмотрим далее.

Многооконность

Многооконность - это возможность открыть несколько окон и выполнять в каждом окне свою задачу. Окна организованы иерархически : существует окно, являющееся предком для всех окон ("root window") и всякое окно создается своим окном-родителем. В каждый конкретный момент активно только одно окно - то, на котором сосредоточен "фокус" (т.е. то окно, в которое можно ввести информацию с клавиатуры или с помощью мышки).

Понятие дисплея

X Window выводит информацию на дисплей - это понятие объединяет в себе :
- устройство отображения (монитор)
- один или несколько экранов
- клавиатуру и мышку.
Процесс визуализации можно адресовать с помощью имени дисплея - это понятие включает в себя следующие элементы :
- имя машины
- номер устройства отображения
- номер экрана устройства отображения.
Например, имя_сервера:0.0 обозначает дисплей, связанный с первым экраном первого устройства отображения машины имя_сер- вера.

Распределение

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

Важно обратить внимание на то, что роли клиента и сервера поменялись местами по сравнению с другими системами распределенной обработки (сокеты, TLI, NFS ...) : в X Window именно сервер отвечает за взаимодействие с пользователем (в то время, как в других системах за это отвечает клиент).

Прикладная программа-клиент является либо локальной (т.е., расположенной на той же машине, что и сервер), либо удаленной. Для того, чтобы запустить удаленную программу, достаточно добавить, при запуске прикладной программы, опцию -display (display имя_сервера:0.0).

X Window позволяет, таким образом, выполнять удаленные программы с локальным выводом информации, причем делает это в гетерогенных средах.

Графика

X Window включает в себя 2х-мерные графические функции. Эти функции являются функциями довольно низкого уровня ; именно по этой причине можно реализовать GKS и PHIGS в качестве надстройки над X Window. Графические примитивы GKS и PHIGS преобразуются в графические примитивы X. Таким образом, прикладные программы порождают графические изображения более производительно в окнах X.

Пользовательский интерфейс

Пользователь манипулирует окнами и активирует прикладные программы с помощью меню,пиктограмм ... Специальный клиент - Window Manager - управляет окнами (создание,перемещение,изменение размера ...).

Управление ресурсами

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

Символьные шрифты

Шрифт описывает размер и форму группы символов. Описание шрифта хранится в файле и загружается, по мере необходимости, сервером. В X11R5 было разработано сервисное средство "X Font Service", которое позволяет снять с сервера X обязанность управлять шрифтами и переложить ее на сервер шрифтов.

Внешний вид и внутреннее состояние

X Window обеспечивает только основные механизмы, позволяющие разрабатывать прикладные программы. Эта система гарантирует, что внутреннее состояние ("feel") прикладной программы будет одним и тем же,независимо от того, какая именно система используется. Наоборот, внешний вид ("look") зависит от реализации прикладных программ,использующих X Window. Например, если окно будет закрыто, X гарантирует, что связанная с этим окном прикладная программа, получит одно и то же сообщение об этом событии (и будет иметь одно и то же внутренне состояние), не- зависимо от того, как именно закрытие окна будет выглядеть на экране. Внешний вид экрана относится к компетенции Window Manager'а, который является клиентом X и который может быть своим для каждого разработчика.

8.2.2. Механизмы реализации

Запросы и события

Механизмы реализации являются существенно асинхронными: клиент посылает запросы, которые помещаются в очередь на ожидание обработки сервера. Клиент ожидает событий от сервера ; события тоже помещаются в очередь (рисунок 8.1.). Кроме того, сервер может переслать сообщение об ошибке - в случае, если запрос невозможно выполнить. Запросы, получаемые сервером, сохраняются в буферах. Содер- жимое буфера передается серверу, если буфер полон, или если клиент ожидает событий. Клиент ожидает событий во всех окнах, в которых он явно запросил получение специфицированных им типов событий.

Если сервер заметил, что в некотором окне произошло определенное событие, он посылает об этом сообщение всем клиентам, которые ждут данного сообщения в данном окне. Если таких клиентов нет, сервер поднимается по иерархии окон и выполняет ту же процедуру.

Рис. 8.1. - Принципиальная схема механизмов X Window.
1 - Сервер Х
- Управление ресурсами
- Обработка запросов
- Отправлений собщений о событиях
2 - Прикладная программа Клиент Х
- Посылка запросов
- Обработка сообщений
3 - Очередь ожидания запросов
4 - События
5 - Очередь ожидания сообщений
6 - Запросы
7 - Сокет
-Интерфейс
8 - Сетевой или локальный обмен данными

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

Обмен данными между прикладными программами

Два клиента могут обменяться псевдособытиями (с помощью сервера) внутри одного окна ; этот тип события нельзя отфильтровать. С помощью этого механизма можно создавать прикладные программы, которые обмениваются сообщениями (размером до 20 байт), не выводя никакой информации на экран. X Window позволяет двум прикладным программам обмениваться данными в режиме Cut-Paste с помощью механизмов, описанных в руководстве ICCCM (Inter Client Communications Conventions Manual). Преобразование формата информации может быть выполнено посылающим клиентом по запросу принимающего. Обмен осуществляется через сервер.

Протокол коммуникации

X Window не зависит от используемых протоколов : существуют реализации X над TCP/IP и DECnet. Взаимодействие между сервером и клиентами использует socket интерфейс : sockets UNIX внутри одной машины, sockets TCP между двумя машинами, связанными сетью. В некоторых системах вместо sockets используется разделяемая память, что позволяет увеличить производительность в локальном случае. Кроме того, протокол Х можно заменить механизмом прямого доступа к памяти графической платы (DGA : Direct Graphic Access).

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

Окна и ресурсы

Если активируется окно, закрытое другим окном, содержимое первого надо восстановить.При этом существует две возможности: либо клиент перерисовывает изображение, либо его восстанавливает сервер. Сервер восстанавливает окно лишь в том случае,если он управляет атрибутом "backing store" и если клиент явно приказал управлять этим атрибутом (не все серверы X позволяют это делать).

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

Сервер и прикладные программы

Сервер X - это процесс, независимый от ядра UNIX, реализованный в виде фоновой задачи (в отличие от некоторых других многооконных систем, встроенных в ядро - например, Sunview в системе SunOS). Нет необходимости выполнять специальную установку на машинах-клиентах. Прикладные программы используют библиотеку Xlib, которая управляет интерфейсом с сетью (Рис. 8.2.)

Рис. 8.2. - Сервер Х и прикладные программы Х.
1 - сервер Х
2 - прикладная программа-клиент Х
3 - Сетевой или локальный обмен данными

8.3. ПРОГРАММИРОВАНИЕ, ИСПОЛЬЗОВАНИЕ И УПРАВЛЕНИЕ

8.3.1. Программирование прикладных программ

Xlib

Xlib - это библиотека, которая позволяет разрабатывать прикладные программы (клиенты) X Window. Речь идет о API (Application Program Interface) довольно низкого уровня, управляющем основными механизмами : созданием окон, графическими примитивами, позиционированием атрибутов ... Xlib - это продукт freeware, являющийся фактическим стандартом (стандартизован ANSI) и обеспечивающий таким образом переносимость программ.

Прикладная программа Х, использующая Xlib выглядит следующим образом :

ПРОГРАММА 45

        ourverture du display :
        /*откpытие дисплея
        в зависимости от имени дисплея, создает локальную или
        удаленную связь с сеpвеpом */

        creation de fenetres dans le display :
        /*создание окон в дисплее
        pечь идет о под-окнах (окнах, содеpжащихся в дpугих
        окнах - по умолчанию, всегда существует хотя бы одно окно
        "root Window", покpывающее весь экpан), наследующих атpи-
        буты pодительских окон, если только явно не указано пpо-
        тивное */

        reguete specifiant les evenements a attendre sur les
        fenetres ;
        /* запpос, специфициpующий ожидаемые в окнах события */

        affichage des fenetres a l'ecran ;
        /*вывод окон на экpан */

        attente d'evenements sur les fenetres ;
        /* ожидание событий в окнах */

        traitements de l'evenement regu ; envoi eventuel de
        requetes au serveur ;
        /* обpаботка полученных событий : пpи необходимости,
        посылка запpосов сеpвеpу */

        retour a l'attente d'evenements sur les fenetres.
        /* возвpат к состоянию ожидания в окнах */


Прикладная программа Х представляет собой, таким образом, бесконечный цикл ожидания событий, передаваемых сервером. 

Инструментальные средства

Инструментальные средства ("toolkits"), реализованные с помощью библиотеки Xlib, предназначены для облегчения задачи разработчиков прикладных программ. Некоторые из этих инструментальных средств распространяются свободно по X11 : Athena toolkit, Andrew toolkit ... Базовое инструментальное средство - надстройка над Xlib, используемое в большинстве других инструментальных средств, называется Xt (X Intrinsic).

Инструментальные средства используют объектно-ориентированные понятия : widgets - это классы объектов, с которыми ассоциированы методы, и которые используют механизмы наследования. В наиболее развитых инструментальных средствах существуют,например widget'ы label,command button или даже menu. Программирование осуществляется путем использования процедур, манипулирующих объектами. Intrinsic определяют механизм создания и использования widget'ов.

Инструментальные средства используются в соответствии со следующими принципами :

- создание widget'ов - отображение widget'ов - обработка событий, связанных с widget'ами, путем запуска действий, являющихся атрибутами, связанными с widget'ами. Инструментальные средства облегчают труд программиста. Однако, прикладная программа, написанная с помощью инструментального средства перестает быть мобильной при изменении инструментального средства. Кроме того, widget'ы имеют отношение, как правило, лишь к пользовательскому интерфейсу ; когда же речь идет о графическом содержимом окон, следует использовать библиотеку Xlib (или библиотеки GKS или PHIGS, являющиеся надстройками Xlib).

Motif и Open Look

В настоящее время существуют две развитых среды, позволяющих строить пользовательский интерфейс в X Window :
- Motif - фирмы OSF ;
- Open Look - фирмы UNIX International.

Каждая из этих двух сред предлагает похожую идеологию и сравнимые инструментальные средства :
- руководство по стилю, цель которого обеспечить одинаковый стиль интерфейса для всех прикладных программ (как на Макинтош) ;
- развитые инструментальные средства : XView для Open Look и Xm для Motif.
Кажется, Motif выдвигается в качестве стандарта, обгоняя Open Look.

Интерактивные средства порождения интерфейсов

Для того, чтобы еще более упростить задачу разработчиков, появились интерактивные редакторы интерфейсов. Эти редакторы автоматически порождают программный код Motif и Open Look. Программист рисует свой интерфейс с помощью пиктограмм и меню.

Вообще говоря, эти программные средства не заменяют знакомства программиста с Motif или Open Look, но дают ему возможность избежать кодирования примитивов, содержащих многочислен- ные и довольно сложные параметры.

8.3.2. Использование прикладных программ

Запустите сервер Х на машине, управляющей тем экраном, с которым Вы хотите работать.

Если прикладная программа - клиент находится на той же машине,что и сервер, ее следует запустить без дополнительных параметров.

Если прикладная программа находится на удаленной машине, то для успешной работы необходимо, чтобы этой машине было разре- шено использовать сервер (см. параграф 8.3.3., рассказывающий об управлении). Существует две возможности :
- подсоединиться к удаленной машине и - либо изменить значение переменной окружения DISPLAY, присвоив ей значение имя_сервера:0.0, а затем запустить программу ;
- либо активировать программу с параметром -display имя_сервера:0.0 ;
- выполнить команду удаленного запуска (что позволяет избежать подсоединения к машине), при условии, что это позволяет делать файл .rhosts на удаленной машине. При этом прикладная программа выполняется с параметром -display. Например, предположим, что пользователь, работающий под именем gab с экраном машины ordinan, хочет выполнить следующие операции :
- запустить Window Manager системы ordinbb, на которой gab имеет счет и запись в файле .rhosts (файл содержит строку ordinan gab): #rsh ordinbb /usr/bin/X11/hpwm -display ordinan:0.0 &
- запустить прикладную программу xman на станции ordinzz ; пользователь gab имеет на станции ordinzz счет titi (файл .rhosts содержит запись ordinan gab) : #rsh ordinzz -l titi /usr/bin/X11/man -display ordinan:0.0 &

8.3.3. Управление

Запуск сервера и клиентов

Сервер запускается с помощью командного файла, активирующего в то же самое время несколько клиентов (обычно Window Manager и несколько окон : xclock,xterm ...). Остальные клиенты запускаются с помощью меню или непосредственно в окне, эмулирующем терминал (с помощью прикладной программы xterm).

Атрибуты выполнения клиентов (цвет,символы ...) можно настроить одним из следующих способов :
- указав в качестве значения параметра при запуске клиента (только при вызове) ;
- изменив (что повлияет на всех пользователей) файл /usr/lib /X11/ app_defaults/имя_прикладной_программы
- изменив (что повлияет только на данного конкретного пользователя) файл $HOME/.Xdefaults.

Все эти механизмы управления атрибутами автоматически обрабатываются в прикладных программах при использовании функций XGetDefault() или XInitialise() библиотеки Xlib.

Производительность

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

Загрузка сети

Загрузка в сети разумеется зависит от типа прикладных программ. Вообще говоря, X Window почти не загружает сеть (интерактивные прикладные программы), за исключением отдельных моментов - при пересылке образов, например. То, что сервер сохраняет ресурсы, которые, таким образом, пересылаются только один раз, сильно уменьшает трафик сети. Для примера мы измерили загрузку в сети, порожденную прог- раммой, выполняющейся на компьютере Cray и непрерывно, при этом, отображающей векторные графические изображения на экране станции Sun 3/260. Программа на ЭВМ Cray рисует графику с помощью средств графической библиотеки PHIGS, являющейся надс- тройкой X Window. Трафик, при этом, составляет примерно 10 К/сек, причем длина пакета в сети Ethernet равна в среднем 400 байт.

Безопасность

Сервер Х доступен только для тех удаленных машин, которые зарегистрированны в файле /etc/X0.hosts (постоянная авторизация) или с помощью команды xhost (временная авторизация). Таким образом, защита реализована от доступа машин, а не от доступа пользователей.

В версии X11R5 этот недостаток ликвидирован - введена команда xauth.

8.4. PEX И ДРУГИЕ

8.4.1. Функциональные возможности и механизмы реализации PEX

PEX - это протокол, являющийся расширением X Window, и предназначенный для управления трехмерными графическими изображе- ниями.
PHIGS - это стандарт ISO/IEC 9295.1 интерфейсов прикладных программ, описывающий функции управления трехмерными графическими изображениями. PHIGS+ - расширяет возможности PHIGS по созданию реалистичных изображений - тени,полутона,глубина ... PHIGS+ - проект стандарта ISO (Черновое Предложение 9592.4).

PHIGS опирается на концепцию иерархически упорядоченной структуры данных ; фундаментальным понятием этой концепции является понятие элемента структуры. Вся совокупность структур хранится в CSS : Central Structure Store (Центральное Хранилище Структур). Элементы структуры - это либо графические данные, либо собственные данные прикладной программы. Графические данные - это либо графические примитивы - прямоугольники,тексты,многоугольники, либо атрибуты этих примитивов (цвет,толщина линии, индекс угла зрения наблюдателя ...). Сеть структур можно сохранить на диске (архив PHIGS) и восстановить с диска. PHIGS использует понятие виртуальной графической рабочей станции, что позволяет обеспечить независимость программ от периферийных устройств. Адаптация программного обеспечения к реальному устройству выполняется драйверами. Вывод графического изображения на экран выполняется путем "пересылки" ("постирования") корневой структуры сети структур. Модификация графического элемента требует полного изменения изображения ; нельзя "постировать" подструктуру,"постировать" можно только всю сеть - при этом образ полностью перерисовывается.

Как и Х, РЕХ разбит на библиотеку клиента и сервера (Рис. 8.3.) PHIGS - это API (Application Program Interface - Интерфейс прикладных программ) PEX. PEX использует концепции X Window : дисплей, управление ресурсами ...

Благодаря РЕХ, прикладную программу, разработанную с учетом стандарта PHIGS, можно переслать на другую машину, не изменяя ее программного кода, и она будет работать.

Рис. 8.3. - Отношения между PHIGS, X и PEX
1 - Прикладная программа
2 - обмен данных между процессами
3 - Протокол Х и PEX
4 - Общий сервер
5 - Сервер Х
6 - Сервер РЕХ

PEX можно инсталлировать в одном из трех возможных режимов :
- в режиме IMMEDIATE RENDERING - в этом режиме управление структурами PHIGS выполняет клиент PEX ;
- в режиме PHIGS WORKSTATION - в этом режиме управление структурами осуществляется сервером ;
- в смешанном режиме -в этом режиме структуры сохраняются и клиентом и сервером.

Каждый из трех режимов имеет свои преимущества и недостатки :
- структурами управляет клиент (рис. 8.4) :
- скорость выдачи изображения на экран зависит от скорости сети.Графический вывод выполняется путем передачи структур: таким образом, вся совокупность структур пересылается через сеть ;
- редактирование структур не зависит от сети, так как выполняется клиентом - локально
- структурами управляет сервер (рис. 8.5) :
- скорость выдачи изображения не зависит от скорости сети ;
- редактирование структур (создание, удаление, вставка) зависит от скорости передачи в сети, так как осуществля- ется клиентом через сеть ;
- смешанный режим (рис. 8.6) : этот режим является, по-видимому оптимальным, но зато и самым сложным при инсталляции.

Локальное редактирование структур

Рис. 8.4. Структурами управляет клиент.

Рис. 8.5. Структурами управляет сервер.

Рис. 8.6. Смешанный режим : структурами управляют клиент и сервер.

8.4.2. Альтернативы PEX

Альтернативами РЕХ являются распределенные версии нестандартизованных графических библиотек. Ниже описываются три продукта, использующих этот подход.

DGL (Distributed Graphic Library)

DGL - это распределенная версия библиотеки GL (Graphic Library), использующейся на рабочих станциях IBM RS6000 и Silicon Graphics. Основной принцип работы - пересылка вызовов библиотеке с помощью механизма, аналогичного RPC (Remote Procedure Call).

Распределенный PHIGIX

PHIGIX - это коммерческая версия графического стандарта PHIGS, реализованная фирмой CELTIS. В рамках проекте EDF от фирмы CELTIS требовалось реализовать распределенную версию PHIGIX, обеспечивающую, в частности, связь между ЭВМ Cray и рабочей станцией HP 9000. На рисунке 8.7. приведена схема архитектуры PHIGIX. Структу- рами PHIGS управляет клиент. Обмен информацией между клиентом и сервером использует механизм сокетов и XDR (eXternal Data Representation). При этом используется собственный протокол обмена PHIGIX.

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

DGPHIGS

DGPHIGS - это распределенная версия библиотеки PHIGS, разра- ботанной французской фирмой G5G. DGPHIGS делится на программ- ное обеспечение клиента, управляющее структурами PHIGS, и программное обеспечение сервера, управляющее графическими устройствами (Рис. 8.8). Сервер получает сообщения о событиях, вызванных действиями клиента и отправляет такие же сообщения клиенту. Клиент пересылает на сервер структуры PHIGS - для вывода на экран. Сервер сохраняет структуры PHIGS до тех пор, пока их не вытеснят другие структуры. Обмен структурами PHIGS между клиентом и сервером выполняется с помощью библиотеки sockets. Такая архитектура позволяет значительно уменьшить объем пересылки в сети : например, операции по изменению точки зрения выполняются прямо на сервере, без взаимодействия с клиентом.

Рис. 8.7. - Архитектура PHIGIX.
1 - Ядро PHIGIX
2 - Структуры PHIGIX
3 - Коммуникационный интерфейс
4 - Архивы PHIGS
5 - Драйвер
6 - Ускоритель 3х-мерная графика


Рис. 8.8. - Архитектура DGPHIGS.
1 - Сервер вычислений
2 - клиент
3 - Структры PHIGS
4 - Архивы PHIGS
5 - События
6 - сервер
7 - Сохраненные структуры PHIGS
8 - Рабочая станция

8.5. ИТОГИ

X Window - это распределенный, многооконный, графический интерфейс пользователя, очень распространенный в среде пользователей UNIX. Механизмы реализации используют модель клиент-сервер и асинхронные коммуникации. Клиент - это прикладная программа. Сервер - это программа, которая контролирует и управляет интерфейсом изображения (дисплеем). Она, таким образом, отвечает за вывод на экран, управление мышкой и клавиатурой и за отслеживанием действий пользователя.

X Window - это мощное инструментальное средство, позволяющее разрабатывать прикладные программы. Прикладные программы могут, к примеру, выполняться на обрабатывающем сервере (сервере вычислений) и управлять выводом изображений на экран и взаимодействием с пользователем на графической рабочей станции.

X Window - используется для управления двумерной графикой. Использовать третье измерение позволяет РЕХ. РЕХ предлагает те же возможности, что и X Window, а кроме того дополнительные возможности PHIGS 3D. В настоящее время начинают появляться реализации PEX. Так, например, X11R5 содержит PEX SI (Simple Implementation - Простая реализация), который управляет структурами PHIGS на сервере. Однако существуют и альтернативные возможности, позволяющие распределить трехмерные графические библиотеки.