预计阅读本页时间:-
8.4 分布式系统
到此为止有关多处理机、多计算机和虚拟机的讨论就结束了,现在应该转向最后一种多处理机系统,即分布式系统(distributed system)。这些系统与多计算机类似,每个节点都有自己的私有存储器,整个系统中没有共享的物理存储器。但是,分布式系统与多计算机相比,耦合更加松散。
首先,一台多计算机的节点通常有CPU、RAM、网卡,可能还有用于分页的硬盘。与之相反,分布式系统中的每个节点都是一台完整的计算机,带有全部的外部设备。其次,一台多计算机的所有节点一般就在一个房间里,这样它们可以通过专门的高速网络通信,而分布式系统中的节点则可能分散在全世界范围内。最后,一台多计算机的所有节点运行同样的操作系统,共享一个文件系统,并处在一个共同的管理之下,而一个分布式系统的节点可以运行不同的操作系统,每个节点有自己的文件系统,并且处在不同的管理之下。一个典型的多计算机的例子如一个公司或一所大学的一个房间中用于诸如药物建模等工作的512个节点,而一个典型的分布式系统包括了通过Internet松散协作的上千台机器。在图8-29中,对多处理机、多计算机和分布式系统就上述各点进行了比较。

通过这个表可以清楚地看到,多计算机处于中间位置。于是一个有趣的问题就是:“多计算机是更像多处理机还是更像分布式系统?”很奇怪,答案取决于你的角度。从技术角度来看,多处理机有共享存储器而其他两类没有。这个差别导致了不同的程序设计模式和不同的思考方式。但是,从应用角度来看,多处理机和多计算机都不过是在机房中的大设备机架(rack)罢了,而在全部依靠Internet连接计算机的分布式系统中显然通信要多于计算,并且以不同的方式使用着。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
在某种程度上,分布式系统中计算机的松散耦合既是优点又是缺点。它之所以是优点,是因为这些计算机可用在各种类型的应用之中,但它也是缺点,因为它由于缺少共同的底层模型而使得这些应用程序很难编程实现。
典型的Internet应用有远程计算机访问(使用telnet、ssh和rlogin)、远程信息访问(使用万维网(World Wide Web)和FTP,即文件传输协议)、人际通信(使用e-mail和聊天程序)以及正在浮现的许多应用(例如,电子商务、远程医疗以及远程教育等)。所有这些应用带来的问题是,每个应用都得重新开发。例如,e-mail、FTP和万维网基本上都是将文件从A点移动到另一个点B,但是每一种应用都有自己的方式从事这项工作,完全按照自己的命名规则、传输协议、复制技术以及其他等。尽管许多Web浏览器对普通用户隐藏了这些差别,但是底层机制仍然是完全不同的。在用户界面级隐藏这些差别就像有一个人在一家提供全面服务的旅行社的Web站点中预订了从纽约到旧金山的旅行,后来发现她所购买的只不过是一张飞机票、一张火车票或者一张汽车票而已。
分布式系统添加在其底层网络上的是一些通用范型(模型),它们提供了一种统一的方法来观察整个系统。分布式系统想要做的是,将松散连接的大量机器转化为基于一种概念的一致系统。这些范型有的比较简单,而有的是很复杂的,但是其思想则总是提供某些东西用来统一整个系统。
在上下文稍有差别的情形下,统一范例的一个简单例子可以在UNIX中找到。在UNIX中,所有的I/O设备被构造成像文件一样。对键盘、打印机以及串行通信线等都使用相同的方式和相同的原语进行操作,这样,与保持原有概念上的差异相比,对它们的处理更为容易。
分布式系统面对不同硬件和操作系统实现某种统一性的途径是,在操作系统的顶部添加一层软件。这层软件称为中间件(middleware),如图8-30所示。这层软件提供了一些特定的数据结构和操作,从而允许散布的机器上的进程和用户用一致的方式互操作。

在某种意义上,中间件像是分布式系统的操作系统。这就是为什么在一本关于操作系统的书中讨论中间件的原因。不过另一方面,中间件又不是真正的操作系统,所以我们对中间件有关的讨论不会过于详细。较为全面的关于分布式系统的讨论可参见《分布式系统》(Distributed Systems,Tanenbaum和van Steen,2006)。在本章余下的部分,首先我们将快速考察在分布式系统(下层的计算机网络)中使用的硬件,然后是其通信软件(网络协议)。接着我们将考虑在这些系统中的各种范型。
8.4.1 网络硬件
分布式系统构建在计算机网络的上层,所以有必要对计算机网络这个主题做个简要的介绍。网络主要有两种,覆盖一座建筑物或一个校园的LAN(局域网,Local Area Networks)和可用于城市、乡村甚至世界范围的WAN(广域网,Wide Area Network)。最重要的LAN类型是以太网(Ethernet),所以我们把它作为LAN的范例来考察。至于WAN的例子,我们将考察Internet,尽管在技术上Internet不是一个网络,而是上千个分离网络的联邦。但是,就我们的目标而言,把Internet视为一个WAN就足够了。
1.以太网(Ethernet)
经典的以太网,在IEEE802.3标准中有具体描述,由用来连接若干计算机的同轴电缆组成。这些电缆之所以称为以太网(Ethernet),是源于发光以太,人们曾经认为电磁辐射是通过以太传播的。(19世纪英国物理学家James Clerk Maxwell发现了电磁辐射可用一个波动方程描述,那时科学家们假设空中必须充满了某些以太介质,而电磁辐射则在该以太介质中传播。不过在1887年著名的Michelson-Morley实验中,科学家们并未能探测到以太的存在,在这之后物理学家们才意识到电磁辐射可以在真空中传播)。
在以太网的非常早的第一个版本中,计算机与钻了半截孔的电缆通过一端固定在这些孔中而另一端与计算机连接的电线相连接。它们被称为插入式分接头(vampire tap),如图8-31a中所示。可是这种接头很难接正确,所以没过多久,就换用更合适的接头了。无论怎样,从电气上来看,所有的计算机都被连接起来,在网络接口卡上的电缆仿佛是被焊上一样。

要在以太网上发送包,计算机首先要侦听电缆,看看是否有其他的计算机正在进行传输。如果没有,这台计算机便开始传送一个包,其中有一个短包头,随后是0到1500字节的有效信息载荷(payload)。如果电缆正在使用中,计算机只是等待直到当前的传输结束,接着该台计算机开始发送。
如果两台计算机同时开始发送,就会导致冲突发生,两台机器都做检测。两机都用中断其传输来响应检测到的碰撞,然后在等待一个从0到T微秒的随机时间段之后,再重新开始。如果再一次冲突发生,所有碰撞的计算机进入0到2T微秒的随机等待。然后再尝试。在每个后续的冲突中,最大等待间隔加倍,用以减少更多碰撞的机会。这个算法称为二进制指数补偿算法(binary exponential backoff)。在前面有关减少锁的轮询开销中,我们曾介绍过这种算法。
以太网有其最大电缆长度限制,以及可连接的最多的计算机台数限制。要想超过其中一个的限制,就要在一座大建筑物或校园中连接多个以太网,然后用一种称为桥接器(bridge)的设备把这些以太网连接起来。桥接器允许信息从一个以太网传递到另一个以太网,而源在桥接器的一边,目的地在桥接器的另一边。
为了避免碰撞问题,现代以太网使用交换机(switch),如图8-31b所示。每个交换机有若干个端口,一个端口用于连接一台计算机、一个以太网或另一个交换机。当一个包成功地避开所有的碰撞并到达交换机时,它被缓存在交换机中并送往另一个通往目的地机器的端口。若能忍受较大的交换机成本,可以使每台机器都拥有自己的端口,从而消除掉所有的碰撞。作为一种妥协方案,在每个端口上连接少量的计算机还是有可能的。在图8-31b中,一个经典的由多个计算机组成以太网连接到交换机的一个端口中,这个以太网中的计算机通过插入式分接头连接在电缆上。
2.因特网
Internet由ARPANET(美国国防部高级研究项目署资助的一个实验性的分组交换网络)演化而来。它自1969年12月起开始运行,由三台在加州的计算机和一台在犹他州的计算机组成。当时正值冷战的顶峰时期,它被设计为一个高度容错的网络,在核弹直接击中网络的多个部分时,该网络将能够通过自动改换已死亡机器周边的路由,继续保持军事通信的中继。
ARPANET在20世纪70年代迅速地成长,结果拥有了上百台计算机。接着,一个分组无线网络、一个卫星网络以及成千的以太网都联在了该网络上,从而变成为网络的联邦,即我们今天所看到的Internet。
Internet包括了两类计算机,主机和路由器。主机(host)有PC机、笔记本计算机、掌上电脑,服务器、大型计算机以及其他那些个人或公司所有且希望与Internet连接的计算机。路由器(router)是专用的交换计算机,它在许多进线中的一条线上接收进来的包,并在许多个出口线中的一条线上按照其路径发送包。路由器类似于图8-31b中的交换机,但是路由器与这种交换机也是有差别的,这些差别就不在这里讨论了。在大型网络中,路由器互相连接,每台路由器都通过线缆或光缆连接到其他的路由器或主机上。电话公司和互联网服务提供商(Internet Service Providers,ISP)为其客户运行大型的全国性或全球性路由器网络。
图8-32展示了Internet的一部分。在图的顶部是其主干网(backbone)之一,通常由主干网操作员管理。它包括了大量通过宽带光纤连接的路由器,同时连接着其他(竞争)电话公司运行管理的主干网。除了电话公司为维护和测试所需运行的机器之外,通常没有主机直接联在主干网上。

地区网络和ISP的路由器通过中等速度的光纤连接到主干网上。依次,每个配备路由器的公司以太网连接到地区网络的路由器上。而ISP的路由器则被连接到供ISP客户们使用的调制解调器汇集器(bank)上。按照这种方式,在Internet上的每台主机至少拥有通往其他主机的一条路径,而且每台经常拥有多条通往其他主机的路径。
在Internet上的所有通信都以包(packet)的形式传送。每个包在其内部携带着目的地的地址,而这个地址是供路由器使用的。当一个包来到某个路由器时,该路由器抽取目的地地址并在一个表格(部分)中进行查询,以找出用哪根出口线发送该包以及发送到哪个路由器。这个过程不断重复,直到这个包到达目的主机。路由表是高度动态的,并且随着路由器和链路的损坏、恢复以及通信条件的变化在连续不断地更新。