分布式系统
Web浏览器连接到地球上其他地方的We b服务器时,它就会参与似乎是简单形式的客户端/服务器(client/server)分布式系统。当你连上Google和Facebook等现代网络服务时,不只是与一台机器进行交互。在幕后,这些复杂的服务是利用大量机器(成千上万台)来提供的,每台机器相互合作,以提供站点的特定服务。
通信基础
通信基本是不可靠的。无论是在广域Internet,还是Infiniband等局域高速网络中,数据包都会经常丢失、损坏,或无法到达目的地
不可靠的通信层
UDP是不可靠通信层的一个很好的例子。如果你使用它,就会遇到数据包丢失(丢弃),从而无法到达目的地的情况。发送方永远不会被告知丢失。但是,这并不意味着UDP根本不能防止任何故障。例如,UDP包含校验和(checksum),以检测某些形式的数据包损坏。
可靠的通信层
常用的可靠通信层称为TCP/IP,或简称为TCP。TCP比上面描述的要复杂得多,包括处理网络拥塞的机制[VJ88],多个未完成的请求,以及数百个其他的小调整和优化。
通信抽象
分布式共享内存(Distributed Shared Memory,DSM)系统使不同机器上的进程能够共享一个大的虚拟地址空间[LH89]。这种抽象将分布式计算变成貌似多线程应用程序。唯一的区别是这些线程在不同的机器上运行,而不是在同一台机器上的不同处理器上。
在DSM系统中,一些访问是便宜的,但是其他访问导致页面错误和远程机器的昂贵提取。
远程过程调用(RPC)
操作系统抽象对于构建分布式系统来说是一个糟糕的选择,但编程语言(PL)抽象要有意义得多。最主要的抽象是基于远程过程调用(Remote Procedure Call),或简称RPC [BN84]①。
远程过程调用包都有一个简单的目标:使在远程机器上执行代码的过程像调用本地函数一样简单直接。因此,对于客户端来说,进行一个过程调用,并在一段时间后返回结果。服务器只是定义了一些它希望导出的例程。其余的由RPC系统处理,RPC系统通常有两部分:存根生成器(stub generator,有时称为协议编译器,protocol compiler)和运行时库(run-time library)。
存根生成器
存根生成器的工作很简单:通过自动化,消除将函数参数和结果打包成消息的一些痛苦。这有许多好处:通过设计避免了手工编写此类代码时出现的简单错误。此外,存根生成器也许可以优化此类代码,从而提高性能。