在本章和下一章我们将描述X的基本架构,并介绍许多基础的观念,其目的在於对你稍後使用系统时能有一个了解,你将会洞悉系统程式做些什麽和如何做,如此你将更快和更有效率的使用系统,我们也会指出系统外在的利益,以及使用系统对你的影响。
本章描述系统的基本元素,以及它们彼此之间如何交谈(interact),下一章描述系统其它的面貌,特别是使用者介面。此章包含了许多新观念,你不妨先很快的浏览这两章後,开始实际地使用它,当你对系统比较有感觉之後,再回头来复习,这样比较容易了解。
2.1 X的基本元素
X不像早期的视窗系统,把一堆同类软体集中在一起,而是由三个相关的部份组合起来。
1. 一个"server"(供应者):是控制实际显示器和输入装置的程式。
2. "Client" (顾客) 程式:需藉著server在指定的视窗中完成特定的操作。
3. 一个 "通讯通道(communication channel)":client和server用来作为彼此交谈之用。
基本的"server","client"和 "通讯通道" 的关系图如图2-1 。
┌—————————————┐
│ p16 fig 2.1 │
│ │
│ 图 2-1 X的基础成员 │
└—————————————┘
底下我们描述一下这三个部份。
2.1.1 Server
Server是控制实际显示器和它的输入装置 (键盘和滑鼠或其它指示装置)的软体,server可以建立视窗、在视窗中画图形影像和文字、回应client程式的 "需求" (requests),它不会自己动作,只有在client程式提出需求後才完成动作。
每一个显示器只有一个唯一的server。server一般由系统的供应厂商提供,通常无法被使用者修改。针对作业系统而言,server只是一个普通的使用者程式而已,因此很容易换一个新的版本,或许甚至是由第三集团提供的原始程式 (注1) 。
注1:这是Unix系统上的情况,有些供应厂商会选择将server的部份或全部放在作业系统核心(kernel)。
2.1.2 Client
Client是使用系统视窗功能的一些应用程式。把X下的应用程式称作"client",原因是因为它是server的 "顾客" :它要求server应它的需求完成特定的动作。
Client无法直接影响视窗或显示,它们只能送一个 "需求" (request) 给server,让server来完成它们的需求。典型的 "需求" 通常是: "在 XYZ视窗中写一列 'Hello, world' 的字串" ,或 "在 CDE视窗中用这种颜色从 A点到 B点画一条直线" 。
当然,对视窗操作提 "需求" 只是client程式的一部份,其它的部份是那些让使用者执行的程式部份。例如:编辑文字、画一个系统的工程图、执行计
算表的计算等等。一般来说,client程式的这个部份和视窗是独立的,对於视
窗几乎不需要知道什麽,通常 (特别是指大型的标准绘图套装软体,统计套装
软体等) 应用程式对许多的输出装置具有输出的能力。在X视窗上的显示只是
client程式许多输出格式中的一种,所以,client程式中和X相关的部份在整
个程式中,只占了非常小的一部份。
使用者可由不同的来源来使用client程式:一些是由系统提供的 (例如时
钟) ,一些来自於第三集团,一些是使用者为了特殊应用而撰写他自己的client
程式。
2.1.3 通讯通道
X的第三个元素为通讯通道,client藉著它送 "需求" 给server,而server
藉著它回送状态 (status) 及一些其它的资讯 (information)。
只要 client 和 server 都知道如何使用通道,通道的本身并不是很重要
,在系统或网路上支援通讯型态的需求是内建於系统基本的X视窗函数馆(library)
,所有和通讯型态有关的事都从函数馆独立出来,client和server之间的通讯
只要藉著使用这函数馆(在标准X版为xlib)即可,如图2-2 。
┌—————————————┐
│ p17 fig 2.2 │
│ │
│ 图 2-2 xlib函数馆的功能│
└—————————————┘
总结来说,只要client程式利用函数馆,自然有能力用到所有可用的通讯
方法。
Client和Server通讯大略分为两类,相对应於二种基本X系统的操作模式:
1. server和client在同一部电脑执行,则它们彼此均可使用机器上任何
可用的方法做交互处理通讯(inter-process communication
(简称IPC)), 见图2-3
,在这种模式下,X可以像许多传统的视窗系统一样有效率
的操作。
┌—————————————┐
│ p18 fig 2.3 │
│ │
│ 图 2-3 在相同机器上的 │
│ client和server │
└—————————————┘
2. client在一部机器上执行,显示器和server则在另一部机器上,则
client和server的通讯必需透过网路利用彼此同意的协定(protocol)
方可。目前,最常见的协定为TCP/IP和DECnet,但其它任何被提供的
可信赖地协定亦可使用。图2-4 显示一个典型的Ethernet网路的通讯。
┌—————————————┐
│ p18 fig 2.4 │
│ │
│ 图 2-4 在不同机器上的 │
│ client和server │
└—————————————┘
这种透过网路,使得应用程式的操作,如同在本地机器一样的能力称
为网路透通性(network transparence),几乎是X独一无二的特性
(注1)。这种特性使得它非常适合建立在有弹性地多目标混合机器
网路上。
注1:有几种例如Sun Microsystems 的NEWS的视窗系统有使用到网路结构,
但没有一种被广泛地使用,而有超过一家以上的制造厂商使用它们。
因为client和server完全独立,一种名之为X-terminal 的新型态显示器
被发展出来。简单的说,X-terminal 是一种除了能直接在上面执行X server
程式外,什麽也没有的工作站,它有键盘,滑鼠和萤幕,以及一些和网路互相
通讯的方法(所以在其它主机上的client可在它上面显示),但并没有档案系
统,也不提供一般目的 (general purpose)的程式,一般目的的程式需要在网
路上执行。
2.2 Server和Client如何交谈
本节描述client和server互相通讯时,双方各传输些什麽。基本上,一个
client要求server去执行输出,输入则藉著 "事件" (event) 的通知由server
来掌握( "事件" :如按下键盘的键或滑鼠的按钮等等)。
2.2.1 Client送达server的东西;Output Handing (输出交予)
当一个client要求server做一个动作,例如在一个指定的萤幕上建立一个特
殊特徵的视窗,或者在一个视窗中写一列文字串。这时client是藉著送 "需求"
(requests)到server上来达成。一个 "需求" 是一个被封装(package) 的简单
区块(block) ,区块包含一个 "操作码"(opcode) 来指示要执行何种操作,伴
随著一些引数(arguments) 提供更多的需求细节。例如:清除一个视窗内的一
个长方形区域,client会送一个16位元组(byte)的需求区块,来指定是哪一个
视窗,欲清除区域的左上角座标及区域的高和宽。
这个格式有几个重要的特徵:
. 需求区块的内容,和client与server在何种型态上的机器上执行完全无
关。一个client可以输出需求给在任何型式显示器上的任何X视窗server。需
求和语言、机器及作业系统均无关。
. 每一个需求包含了视窗的细节和其它被使用的资源,对一个client送至
特定server的需求超过一种以上的连接方法,所以在网路架构上提供的视窗数
目没有限制。
. 需求区块通常大小为20位元组左右,算是相当的小,因为需求是设定为
相当高阶的,(例如画一条线是指定两个端点而非记录一串萤幕上的点)通常
萤幕上被影响到的像素的数目往往是区块本身大小的十到一百倍,如此不会使
网路的负荷太重,网路的使用效率会非常的好(一般认为X的server和client
之间的传输是位元影像 (bitmaps)的观念是错误的)。
2.2.2 Server送达Client的东西;Input Handling (输入交予)
Server也会利用通讯通道送资讯回client,这些资讯包括回应client需求
是否成功和告诉client有兴趣的特殊 "事件" ,这些 "事件" 包含的讯息类似
”视窗XYZ 的滑鼠左按钮被碰触”或”视窗ABC 已被重定大小等”。
就像从client来的需求一般,server的回应也是一些和语言、机器、作业
系统无关的简单区块。
"事件" 是X的基本功能,所有的键盘输入,滑鼠按钮输入和滑鼠移动都
是由 "事件" 来控制,尤有进者,client完全依赖 "事件" 才能获得那些一定
在系统发生的而它必需知道的资讯。我们将从一些普通的输入和移动功能著手
,实际了解 "事件" 是如何工作的:
键盘输入
当你从键盘按下一个键,这个动作会被server查觉到,Server便送出一个
<Key Press> 的 "事件" 通知那些登记对这种情况有兴趣的应用程式。这种通
知有一些限制:不是通知目前被滑鼠指标指到的视窗,便是通知目前被指定接
受所有键盘输入的视窗。这种限制称之为设定键盘焦点(focus) 。
当键被松开时(通常几乎是立刻),另外一个<Key Release> 的 "事件"
产生了,一般除了那些修饰键(例如SHIFT 或 CONTROL),很少的应用程式会
对松开键这个 "事件" 有兴趣。
送到client的讯息区块告诉client它们是键盘 "事件" 内容的只是”编号
第几的键已被按下(或松开)”,不包含是不是ASCII 或EBCDIC字元及如何解
释等内容,而把这些留给client程式去处理,这种做法使得client程式看起来
似乎复杂,但是标准的xlib函数馆,有非常简单的副程式可供控制解释键盘 "
事件",而且通常预设成你所希望的键盘型式,换个角度来看,这种”软体”
的键盘字元相关方式允许了很大的弹性:在server这方面,对不同型式的键盘
均可以完全重新对应,在client这方面,每一个单独的键都”可程式化”,例
如按一个键即可以输入一串使用者特定的字串,或者完成一个特殊的功能等。
稍後我们会再详细讨论,不过直到目前,这些将不会影响你使用系统,事
实上,对於X系统如何处理你按下一个”A ”键,并将它转换成一个ASCII 的
”A ”字元送到你的应用程式的这类事情,你不需要太关心。
关於指标位置的 "事件"
client可以要求当萤幕上的指标进入或离开它所控制的视窗时被通知,这
种 "事件" ("<EnterWindow>" 和"<LeaveWindow>") 告诉client程式是进入或
离开视窗以及是哪一个视窗。
当指标进入视窗时通常用类似”高亮度”视窗这一类的方式表式,有些应
用程式是改变视窗的边框(例如从灰到黑),有些则会改变颜色,用以强调你目
前正在处理这个应用程式(视窗)。
当一个视窗未被覆盖时 -- Exposure (曝光 "事件")
X和大多数其它的视窗系统有一个很大的不同点,那就是client必需负责
保持它的视窗最近的内容,server只是维持视窗在任何时刻均在萤幕上显示,
但它不负责保持视窗的内容。
当原先被其它的视窗遮住的视窗(或视窗的一部份)变成可见时,server
并不知道应该显示这个视窗的哪个部份。server送一个exposure(曝光)"事件"
给拥有这个视窗的client,告诉它视窗的哪一个部份刚刚已变成可见,client便
会决定该怎麽作,在大多数的情况(一般为简单的应用程式或小视窗),client
只是重画整个视窗,因为只画视窗未被遮盖的部份往往要多花额外计算,并不
值得,在更复杂的应用程式,client才会只重画视窗必需要出现的部份,这是
由应用程式的撰写者决定,他必需在效率(视窗更新的速度)和只重画部份视
窗程式码的复杂程度间作取舍。
依赖client来重画视窗内容的方式对效率特别重视,尤其是下拉式选单,
你总不希望选下选单之後,选单过了老半天才消失而让下面的视窗显示出来吧
,为了克服这点,有些X的产品包含了被称为save-under(存下层)的便利程
式:
你可以告诉server如果可能的话,尽量在一个视窗被遮盖前将其被遮盖的内容
存下,当遮盖的视窗被移走时便可立即重现而不需要送曝光 "事件" 给client。
一个类似而更常用,被称为backing store 的方式也被发展出来,你可以
告诉server尽可能在一个视窗被遮盖前将其全部内容存下,同样的,这种方式
可以改进client重画视窗的效率,backing store 和save-under两者的不同处
是前者储存整个视窗的内容,而後者只存被遮盖的部份。
虽然有了save-under和back store这两种产品,但此种结构不被担保,
client仍然随时保持准备接受曝光 "事件" ,即使server真的维护(maintain)
了一段时间的视窗内容,也可能因为记忆体不足而被迫停止,转而开始重新送
出曝光 "事件"。
2.3 X的网路风貌
我们曾经提过,client和server只需透过网路便可在不同的机器上执行,
下面几节我们将看看如何利用这种便利、为什麽有用、和它如何因整合了计
算资源而增进了网路的成长。
2.3.1 你如何实际使用X网路
当server在一个连接了显示器的机器上执行,而client在另一部机器上执
行时,滑鼠和键盘的输入由server所在的机器搜集,可是client却可以在别的
地方使用到这些输入,这是如何办到的?我们以下面的例子解释。
你在使用一个由Xserver控制显示器的工作站,如果它是独立的,很明显
地,client也在此工作站上执行,即使连接了网路,大部份的时候你还是在你
自己的工作站执行client,可是因为有一些特殊的便利程式,你的机器上并没
有,而你却希望在你的机器上显示程式的输出,这时你便需要网路上的机器了
。利用你的作业系统提供的一些普通的网路设备程式,你便可以让client程式
在远方的机器上执行,而指定输出显示在你自己工作站的显示器上,如图2-5.
┌—————————————┐
│ p23 fig 2.5 (???) │
│ │
│ 图 2-5 使用X网路典型 │
│ 的面貌 │
└—————————————┘
就如同图上显示的机器名称,假设client程式的名称为xgraph,在Unix系统上
,你所下的命令类似下面:
rsh neptune xgraph -display venus:0
则xgraph程式在远方名为neptune 的机器上执行,且xgraph的输出会送到你自
己名为venus 的机器上的 0号显示器上,从现在起,我们将参照这种远方显示
(remote display)的模式操作,当client在一部机器上执行时,server在另一
部机器上执行。
现在总结一下:你使用远方显示的设备程式使得client程式在远方的机器
上被执行,而且告诉它将输出显示在执行Xserver的本地机器上。
2.3.2 X的网路设备有何用途?
在一部机器上执行client而把输出显示到另一部机器有何用途?这些用途
和便利是极常见的,以下是一小部份的用途:
. 远方的机器速度比你的快很多(可能是因为加了浮点运算器或它根本就
是一部超级电脑。)。
. 在你的区域网路上,远方的机器是一部档案服务器(file server) 提供
了大量磁碟资源,为了降低网路的负担,你可以把一些类似大量的搜寻
操作,需要用到大量磁碟动作的程式放在远方机器上执行,如此一来,
只有执行结果而不是大量操作磁碟的动作会透过网路传送。
. 远方机器有特殊的结构适合特别的工作,可能是专门的资料库机器,或
者是为一个单独的应用特别设计的特殊目的机器。
. 远方的机器有只能在其上执行的特殊软体,在现代的工作站,在网路上
有些软体执照只有少数的机器拥有已是愈来愈多的趋势,因为软体执照
只发给那些有付费的工作站CPU 。在这种情况下,可以实际地在远方的
机器上执行这些有执照的软体,而将显示传回你自己机器上,是相当地
便利。
. 你需要同时存取好几部机器,通常系统的管理者有此需求。
. 你需要同时输出到数部显示器。(下面有一个□例)
一个特别的□例 -- 一个应用程式使用数个显示器
大部份的情况,数个client应用程式共享一个显示器是常见的,例如一个
萤幕上同时有时钟client和编辑器client,但是一个client也可以连接到数个
server,而且同时输出到server所在的萤幕上。
这种情形用於教学特别有效率,如果一个班上的学生们有X视窗工作站连
接在网路上,则老师就可以把萤幕当成动态的黑板,同时输出给学生,再发展
下去,学生也可以有一个client程式把显示输出给老师,达成双向的沟通,只
要网路许可,所有的工作站并不需要在同一个房间,因此老师和学生可以分散
在各处。
2.3.3 X网路结构产生的简易性
就像前面所提过的,所有从client对server发出的 "需求" ,由於它们的
格式和内容是和设备无关的(device-independent),而所有和设备相关的事完
全集中在server,对於任何显示器的硬体,只有对应於此种显示器的server才
需要去关心,只要针对一个显示器的server一旦被提供,所有可执行X client
程式的其它机器立即可使用这个显示器,不需要重新编译或重新连结,甚至连
显示器是什麽型式都不需知道。
这种把设备的相关性独立出来给server的方式,对许多工作站网路的贩卖
商变得可行且轻松,这种弹性在两方面特别有用:
. 当一部执行X client 的新机器加入网路,它立即可以使用任何执行X
的显示器。图2-6 是一个强力的CPU 如何在网路上被当成一个计算服务
器(compute server)的示意图.
┌—————————————┐
│ p25 fig 2.6 (???) │
│ │
│ 图 2-6 已存在的显示器 │
│ 可使用在新的CPU │
│ 上的client │
└—————————————┘
. 相反的,当一个新的显示器加入,它立即可被任何机器上现存的所有
X client 应用程式使用,见图2-7 ,这里有两个极端的例子:
-- 增加一个高效率的显示器:它的高品值和(或)速度可被用来加强
任何现存的X应用程式。
-- 增加一个非常低等(low end) 的显示器(例如X显示器),至少这
是一个使用现在所有软体,并提供图形和视窗的最便宜的方法。
┌—————————————┐
│ p26 fig 2.7 (???) │
│ │
│ 图 2-7 被已存在的client│
│ 程式使用的新显 │
│ 示器 │
└—————————————┘
2.3.4 在网路上使用非X的应用程式 -- 终端机模拟器
如果在远方机器上的程式并不是X client 或甚至连X是什麽都不知道,
你仍然可以像远方的机器一样使用它们,这就需要用到X视窗”终端机模拟器”
(terminal emulator) ,一个假装它是终端机的程式。如此一来,你便可以让
任何程式在这个假的终端机执行。这个终端机模拟器利用X显示输出(和得到
键盘输入),当然输出也可以送到本地或远方的显示器。一个这种型式的□例:
利用xterm 终端机显示器去执行信件程式,见图2-8 ,(xterm是MIT 标准版X
的所提供的一部份) ,这种方式对扩展网路的用途是可想像的,但是注意到一
点,它并非万灵丹,一个不是X的应用程式当然还是无法用到X的特性,终端
机显示器并没有什麽魔法让假的终端机可以使用滑鼠输入或图形操作等。
┌—————————————┐
│ p27 fig 2.8 (???) │
│ │
│ 图 2-8 执行远方的一个 │
│ 非X的信件程式 │
└—————————————┘
2.4 摘要
本章你可以看到包含在X中的基本构成要素:控制显示器的server,要求
server帮它完成输入输出的client应用程式和介於两者之间的通讯通道,你可
以看到它们彼此间如何交谈,如何实地应用,以及它们对你的好处(不管你是
使用者或系统建立者)。
下一章,我们继续概观系统,但是在稍高一点的层次,焦点集中在使用者
介面上。