第一章
1. 分布式系统的另一个定义,它是各自独立的计算机的集合,这些计算机看起来像是一个
单的系统,就是说,它对用户是完全隐藏的,即使他有多个计算机也是如此。请给出一个
实例。
答:并行计算。一个程序在一个分布式的系统中运行,但看起来是在单个系统中运行的。
2.中间件在分布式系统中扮演什么角色?
答:中间件主要是为了增强分布式系统的透明性(这正是网络操作系统所缺乏的),换言之,
中间件的目标是分布式系统的单系统视图,即使种类各异的计算机和网络都呈现为单个系
统。
3. 很多网络系统组织成后端办公系统和前端办公系统。这种组织方式是如何满足分布式系
统要求的?
答:一个比较容易犯错的地方就是假设运行在一个组织下的分布式系统,应该运行在系统的
整个组织框架下。实际上,分布式系统被安装在一个分离的组织中。从这层意义上讲,我们
的分布式系
统可以支持独立的后端处理和前端处理。当然,这两部分可能是耦合的,并不需要要求这个
耦合的部分完全透明。
4. 解释(分布)透明性的含义,并且给出各种类型透明性的例子。
答:分布透明性是一种现象,即一个系统的分布情况对于用户和应用来说是隐藏的。 包括:
访问透明:分布式系统中的多个计算机系统运行可能是不同的操作系统,这些操作系统的文
件命名方式不同,命名方式的差异以及由此引发的文件操作方式的差异应该对用户和应用程
序隐藏起来。 位置透明:从 http://www.prenhal.com/index.htm 这个 url 看不出 parentice hall
的主 web 服务器所在的位置,同时也看不出 index.html 的位置情况。 移植透明:分布式系
统中的资源移动不会影响该资源的访问方式。 重定位透明:资源可以在接受访问的同时进
行重新定位,而不引起用户和应用系统的注意。移动通信用户从一个点到另一个点,可以一
直使用移动设备,而无中断连接。 复制透明:对同一个资源存在多个副本这样一个事实的
隐藏。所有的副本同名。 并发透明:访问位于同一个共享数据库中的一批表。 故障透明:
用户不会注意到某个资源无法正常工作,以及系统随后的恢复过程。 持久性透明:指对转
位于易失性的存储器还是在磁盘上的隐藏。许多面向对象的数据库提供直接调用存储对象的
方法的功能。
5. 在分布式系统中,为什么有时难以隐藏故障的发生以及故障恢复过程?
答:通常,要探测一个服务器是停止服务还是该服务器的反应变慢这些情况是不可能的。因
此,一个系统可能在服务响应变慢的时候报告该服务已经停止了。例如,连接一台繁忙的
web 服务器,浏览器超时,报告该 web 页不可用,这种情况下,用户无法判断该服务器是
否真的崩溃了。
6. 为什么有时候要求最大程度地实现透明性并不好?
答:最大程度地实现透明性可能导致相当大的性能损失,从而导致用户无法接受。 例如,
许多 web 程序会不断尝试连接某台服务器,多次失败后才放弃。这种在用户转向另一台服
务器之前竭力隐藏服务器短暂故障的企图会导致整个系统变慢。
7. 什么是开放的分布式系统?开放性带来哪些好处?
答:开放的分布式系统根据明确定义的规则来提供服务。开放系统能够很容易地与其它系统
协作,同时也允许应用移植到同一个系统的不同实现中。
8. 请对可扩展系统的含义做出准确描述
答:一个系统的可扩展包含下面几个方面:组件的数量、几何尺寸、管理域的数量与尺寸,
前提是这个系统可以在上面几个方面进行增加而不会导致不可接受的性能损失。 系统要能
在规模上可扩展,即方便的把更多的用户和资源加入到系统中。 地域上可扩展,系统中的
用户和资源相隔极远,但仍可访问和使用。 管理上可扩展,分布式系统跨越多个独立的管
理机构,仍可方便对其进行管理。
9. 可以通过应用多种技术来取得可扩展性。请说出这些技术。
答:可扩展性可以通过隐藏通信等待时间,分布式技术、复制和缓存来获得。
10. 请解释一下什么是虚拟组织,并给出如何实现这种组织的提示。
答:属于同一虚拟组织的人或应用,具有访问提供给该组织的资源的权限。这些资源可能分
布在不同的计算机、服务器、数据工具和数据库中。虚拟组织定义了谁能访问什么。 资源
应该保持一个账户用户和访问权限,这通常使用了标准的访问控制机制(类似 UNIX 中的
rwx)。
11. 当一个事务处理被异常中断,将会恢复到它以前的状态,就像这个事务处理从没有发
生过一样。我们这么说其实是不对的。请给出一个无法恢复以前状态的示例。
答:任何情况下,物理端的 I/O 中断,不能重置。例如,如果一个进程是来打印文件,文件
中的墨汁不能从纸中移除。
12. 运行嵌套式事务处理需要某种形式的协作,请解释一下协作者真正应该做什么事情?
答:协作者只需要保证嵌套式的事务中止后,所有的子事务都要被中止。同样,如果事务都
能够被提交,那么就应该协调他们全部都提交。当协调者告诉嵌套的事务该提交时,事务理
解进行提交操作。
13. 我们讨论过,对普适系统来说,分布式透明性可能并不存在。这句话并不是对所有的
透明性都正确,请给出一个示例。
答:考虑迁移透明性。在普适系统中,组件是可移动的,当从一个接入点移动到另一个接
入点时,它可被重新连接。这样的处理应该对用户完全透明。同样,许多其他类型的透明性
也会被支持,然后不该隐藏的是用户可能访问的资源与用户本身所处的环境是耦合的。
14. 我们已经给出了一些分布式普适系统的示例:家庭系统、电子健保系统和传感器网络,
请再给出这样的一个示例。
答:考虑在城市或社区中提供大规模的无线网状网络服务的普适系统,它提供无线上网服务,
当然这个也为其他服务,比如新闻系统提供了通信基础。栖息地的监控系统、监狱中的电子
监控系统、大型综合体育系统、了解员工状态的办公激励系统等。
第二章
1. 如果客户和服务器相隔很远,我们可以看到,网络延时将主导整个性能。我们如何处理
这个问题?
答:这实际上取决于客户端是如何组织起来的。首先,将客户端的代码切割成更小的部分,
这样它们可以单独运行。这种情况下,当一部分正在等待服务器的响应时,我们可以安排另
一部分去做其他的事。或者,我们可以重新安排客户端的处理过程,让他们在向服务器发送
客户请求之后去做其他的事情。 最后有效的解决方案是用单程异步通信取代了客户端-服
务器的同步通信。
2. 什么是三层客户-服务器体系结构?
答:三层客户——服务器体系结构包括三个逻辑层:用户接口层、处理层和数据层,每一层
在理论上来说都在一台单独的机器上实现。最高层包括了客户的用户界面,中间层包括实际
的应用程序,最底层包含了被使用的数据。
3. 纵向分布与横向分布有什么不同?
答:纵向分布指的是多台机器组成的多层架构中各个层的分布,通过按逻辑把不同组件放在
不同的机器上来获得。从理论上说,每一层都在一台不同的机器上实现。横向分布则处理多
台机器上的一个层的分布,客户或者服务器可能在物理上被分隔成逻辑上相对的几个部分,
每个部分都操作在整个数据集中自己共享的部分。例如一个数据库的分布。
4. 考虑一个进程链,该进程链由进程 P1,P2,…,Pn 构成,实现了一个多层客户-服务器体系
结构。进程 Pi 是进程 Pi+1 的客户,Pi 只有得到 Pi+1 的应答之后才能向 Pi-1 发出应答。如
果考虑到进程 P1 的请求-应答性能,这种组织结构主要存在什么问题?
答:如果 n 很大的话性能会很差。从理论上来说,两个邻接层之间的通信应该在两台不同的
机器之间发生。因此,P1 和 P2 之间的性能由 n-2 次其它层之间的请求——应答过程决定。
另一个问题是如果链中的一台机器性能很差甚至临时不可达,这会立刻使最高层的性能降
低。
5. 在结构化的覆盖网络中,消息是根据覆盖的拓扑结构来路由的,这种方法的主要缺点是
什么?
答:问题是我们处理的是逻辑路径。很有可能出现的情况是,在覆盖网络中的两个邻居节点
A 和 B,在物理距离上是相距很远的。因此,A 和 B 之间的逻辑最短路径实际上在底层物理
网络上是很长的一条路径。
6. 图 2.8 中的 CAN 网络,如何把坐标(0.2,0.3)的节点的消息路由到坐标为(0.9,0.6)的
节点?
答:有几种可能性。如果我们想要根据欧几里得距离得到一条最短路径需要进过的路径是:
(0.2,0.3)----(0.6,0.7)----(0.9,0.2),距离是 0.882. 另一条路径:(0.2,0.3)---(0.7,0.2) ----(0.9,0.6),
距离是 0.957
7.假设 CAN 中的一个节点知道其紧邻节点的坐标,一个合理的路由策略是把消息路由给离
目的地最近的节点,这样的策略的好处是什么?
答:从先前的问题可以看出,它不需要去寻找整体最优的路径。如果节点(0.2,0.3)按照题
目要求的策略进行,传送到(0.9,06),它先会将节点发送给(0.7,0.2)。
8. 在非结构化的覆盖网络中,每个节点随机选择 c 个邻接节点。如果 P 和 Q 都是 R 的邻
接节点,那么 P 和 Q 互为邻接节点的概率是多少?
答: 如果网路中有 N 个节点,如果每个节点随机选择 c 个邻居,那么 P 选择 Q 或 Q 选择 p
的概率就是 2c/(N-1)。
9. 在非结构化的覆盖网络中,每个节点随机的选择 c 个邻节点。要查找一个文件,节点将
泛洪一个请求给他的邻接点,这些请求又将再次泛洪,该请求将到达多少个节点?
答: 可到达节点的上界是 c*(c-1),但是这我们忽略了节点 p 同样可以成为其他邻居节点的
邻居。P 的一个邻居泛洪信息给不是 P 邻居节点的概率是 1 减去发送给至少 P 的一个邻居
节点的概率。
这个情况下,泛洪策略将会到达 c*(q-1)个节点。例如,c=20, N= 10000 ,那么一次查询将会到
达的节点数是 365.817 个节点。
10. 在点对点的网络中,并不是每个节点都能成为超级对等体。满足超级对等体的合理要求
是什么?
答:首先,节点是高度可用的,因为其他节点需要依赖该节点。并且,它应该有足够的能力
处理各种请求。最重要的是依靠它能够高效快速的处理任务。
11. 在 Bitgtorren 系统中,每个节点具有一个带宽为 Bout 的输出链接,以及一个带宽为 Bin
的输入链接。这些节点(称为种子节点)中的一些可以自愿的为其他节点提供下载文件。
如果假设在某个时候,一个 BitTorrent 的系统最多只有一个种子节点,那么他的最大下载带
宽是多少?
答:这里需要考虑种子节点的输出带宽需要在客户端间共享。假设有 s 个种子,N 个客户端,
每个客户端随机的选择种子。种子节点结合的输出带宽就是 S*Bout , 每个客户端有
S*Bout/N 的直接下载带宽。另外,如果这些客户端互相协作,每个能够在下载数据块时达
到 Bout,假定 Bin > Bout。因为 tit-for-tat 策略,一个 BitTorrent 客户端的下载带宽主要取决
于他的输出带宽。所以说,整体的下载带宽能够达到 S*Bout/N + Bout.
12. 请从技术的角度来解释,为什么 BitTorrent 中的 tit-for-tat 策略比因特网中的文件共享要
好得多?!
答:大多数的 BitTorrent 客户端是被例如 ADSL 或调制解调器所提供的不对称链接所处理的。
一般来说,BitTorrent 会提供给客户端比较高的进入带宽,但是并不希望客户端可以提供服
务。BitTorrent 不会使用这种假设,把客户端变成协作服务器。对称连接会比 tit-for-tat 策略
提供更好的匹配。
13. 我们给出了在自适应中间件中使用中断器的示例,请问还有其他什么示例?
答:我们利用拦截器来支持移动性。这种情况下,一个 request-level 拦截器在转发请求前,
首先将查看它所引用的对象的当前位置。同样,当安全出现问题时,一个拦截器可以用来透
明的加密消息。另一个例子,如果记录日志是必须的,我们可以简单的插入一 method-specic
拦截器在将消息传递给引用对象前,记录该事件。
14. 中断器与其部署所在的中间件的依赖程度如何?
答:一般来说,它们之间是高度依赖的。客户端很有可能被中间件所提供的下层接口所约束,
正如消息级中断器,它高度依赖中间件和本地操作系统的相互作用。然后,这些接口也可以
标准化,便于开发可移植的拦截器,虽然它作为一种特殊类型的中间件。这些中间件需要满
足 CORBA 的体系结构。
15. 现代的汽车都装备有电子设备,请给出在汽车中的一些反馈控制系统的示例。
答:巡航控制系统。一方面,巡航控制的子系统掌控着当前的速度,当它达到设定要求时,
汽车就会加速或减速。巡航控制系统的设置使驾驶员可以将车速设定在一个固定的速度上,
车辆准确地按照所设定的速度行驶。驾驶员可以不必踩加速踏板,从而大大减轻长途驾车的
疲劳,同时匀速行驶也可以减少燃油的消耗。 防抱死制动系统(ABS),当刹车时,它是
利用阀体内的一个橡胶气囊,在踩下刹车时,给予刹车油压力,充斥到 ABS 的阀体中,此
时气囊利用中间的空气隔层将压力返回,使车轮避过锁死点。防抱死刹车系统可以提高行车
时,车辆紧急制动的安全系数。换句话说,没有 ABS 的车,汽车在遇紧急情况采取紧急刹
车时,容易出现轮胎暴死,也就是方向盘不能转动,这样危险系数就会随之增加,很容易造
成严重后果。 车用传感器是汽车计算机系统的输入装置,它把汽车运行中各种工况信息,
如车速、各种介质的温度、发动机运转工况等,转化成电讯号输给计算机,以便发动机处于
最佳工作状态。
16. 请给出自我管理系统的一个示例,其中的分析组件为完全分布式或隐藏的。
答:我们已经遇到很多这种类型的系统,在非结构化的点对点系统中,节点间在进行信息
交换,如何生成一个拓扑结构。其分析组件包含放弃那些不会帮助目标拓扑结构收敛的链接。
17. 请描述一个解决办法,为 Globule 中的预测复制自动确定最佳跟踪路径长度。
答:源服务器需要利用 Ti 到 Ti+1 的迹线来定期评价策略的预测。判断该策略是否是实际访
问模式所选择的在 Ti-1 到 Ti 阶段所使用的策略。这样可以帮助服务器计算预测误差。通过
改变迹线长度,源服务器能够自动找到预测长度最小的迹线。这样,就可以自动的确定最佳
跟踪路径长度。
第三章 进程
1. 比较使用单线程文件服务器读取文件和使用多线程服务器读取文件有什么不同。花费
15ms 来接收请求、调度该请求并且完成其它必须的处理工作,假定需要的数据存放在主存
储器的缓存中。如果需要磁盘操作,就需要额外多花 75ms 在磁盘操作的过程中线程处于睡
眠状态。如果服务器采用单线程的话,它每秒能处理多少个请求?如果采用单线程呢?
答: 在单线程情况下,命中 cache 花了 15ms,未命中 cache 花了 90ms。加权平均值为 2/3 X
15 + 1/3 X 90。这意味着请求花了 40ms,服务器没秒可以完成 25 次。对于多线程,所有磁
盘等待都是交迭的,所以每个请求花了 15ms,服务器每秒可以处理 66 个请求。
2. 对服务器进程中的线程数目进行限制有意义吗?
答:有。原因有两个:(1)线程需要内存来设置他们的私有堆栈。因此,线程太多可能导致
消耗过多 的存储器。(2)更严重的情况是,对于一个操作系统,独立的线程是以无序的方
式在运行。 在虚拟存储器系统中,构建一个相对稳定的工作环境可能比较困难,从而导致
许多的页错误和过多的 I/O 操作,结果可能导致系统性能的下降。
3、在文中我们描述了一个多线程的文件服务器,说明了为什么它比单线程服务器和有限状
态服务器更好。有没有这样的环境,在其中使用单线程服务器会更好?给出这种环境的例
子。
答:有。如果服务器完全是 CPU 绑定的,就没有必要使用多线程了。多线程可能只是增加
了不必要的复杂性。例如,某个地区拥有 1 百万人口,现要建立一个数据库来保存每个人的
一些信息,如(名字,电话号码),假定每个人的信息大小为 64 字节,则数据库的总大小
为 64M 字节,为了快速查找,应该把这些数据保存在服务器的存储器中。
4、将轻量级进程与单个线程静态关联起来并不好,为什么?
答:这样的关联将在很大程度上迫使只有一个内核级的线程,这就意味着多线程的性能优势
将会被损失掉。
5、如果每个进程只使用单个轻量级进程也不好,为什么?
答:在这种模式下,我们只能拥有用户级的线程,这意味着任何阻塞系统调用都将阻塞整个
进程。
6、描述一种使用与可运行线程数目相等的轻量级进程的方法。
答:开始只有单个轻量级进程并让它选择一个可运行的线程。当发现一个可运行的线程后,
轻量级进程创建另一个轻量级进程来寻找下一个线程来执行。如果没有找到可运行的线程,
轻量级进程就销毁它本身。
7. 略
8. 略
9.代理可以通过调用所有副本来支持引用透明性,能否对(服务器端的)对象的副本进行调
用?
答: 可以。假设一个副本对象 A 调用另一个对象副本 B(非副本),如果 A 包含 K 个副本,
一个 B 的调用将会被 A 的每个副本执行,然而,B 应该只被调用一次。这种复制应该采取一
些特殊的措施。
10.通过生成进程来构建并发服务器与使用多线程服务器相比有有点也有缺点。给出部分优
点和缺点
答:一个重要的优点是每个进程都被保护。在超级服务器处理完全独立的服务的时候是非常
有必要的。另一方面,创建进程的代价也较高,同时,如果进程需要通信,则使用线程在很
多情况下将更为简单,因为它避免了用内核来实现通信。
11.粗略地设想一种多线程服务器的设计,该服务器必须使用套接字作为面对底层操作系统
的传输级接口,以支持多种协议。
答:一个相对简单的设计是,使一个单一的线程 T 等待接收传输层消息(TPDU)。如果我们假
定每个 TPDU 的报头包含一个数字来识别更高层的协议,这个线程可以把它传递给处理特定
协议的模块。每个这样的模块都有一个专门的线程来处理消息,这些模块把消息看作是一个
输入请求。当处理完这个请求后,一个应答消息被传递给 T,这时 T 将把这个应答封装成一
个传输层消息并把它传递给适当的目的地。
12.如何防止应用程序绕过窗口管理器破坏屏幕显示。
答:使用微内核方法,一个包含窗口管理器的窗口系统通过这个方法运行,因此所有的窗口
操作都需要通过这个微内核。从效果上看,这正是第一章中所讲的把客户端——服务器端模
式转换为单计算机的本质。
13.维护到客户的 TCP/IP 连接的服务器是状态相关的还是状态无关的。
答:假设服务器没有在客户端上保存其它消息,就可能认为服务器是状态无关的。问题在于
不是服务器,而是服务器的传输层在客户端上保存了状态。本地操作系统所跟踪的与服务器
无关。
14.想象一下,某个 web 服务器维护一个列表,该列表中的内容是 IP 地址与该地址最近访问
过的 web 页的映射关系。当一个客户连接到该服务器的时候,该服务器在列表中查找该客
户,如果找到的话就返回注册过的页面。这个服务器是状态相关还是状态无关的?
答:是状态无关的。状态无关设计的主要问题不是服务器是否保存了客户端的任何信息,而
是所保存信息的准确度。在本例中,如果表丢失了,客户端与服务器还能正常的进行交互,
就象什么事都没有发生一样。在一个状态相关设计中,这种交互只有在服务器从错误中恢复
过来以后才能进行。
15.在 UNIX 系统中,可以通过让进程在远程机器上派生出一个子进程来支持强可移植性。请
说明这种机制的工作机理。
答:UNIX 中派生的意思是把父进程的完整镜像拷贝给子进程,这意味着在调用完 fork 后,
子进程继续运行。一个相似的方法可以用来做远端克隆,这里假定了目标平台与父进程的平
台是一样的。第一步是让目标操作系统为新建的子进程保存资源并创建相应的进程和存储器
映射。这一步完成之后,父进程的镜像可以被拷贝了,子进程也可以被激活了。
16.图 3.13 指出,强可移植性不能与在目标进程中已迁移代码的执行结合在一起。请举出一
个反例。
答:如果强可移植通过线程迁移发生的话,它就应该能使一个迁移的线程在目标进程的环境
中执行。
17.考虑某个进程 P,它请求访问与自己位于同一台机器上的本地文件 F。在 P 迁移到另一台
机器上以后,它还需要访问 F。如果文件对机器的绑定是紧固的,如何实现对 F 的系统级引
用?
答:一个简单的解决方案是,创建一个单独的进程 Q,用 Q 来处理对 F 的远端请求。提供
给进程 P 与以前一样的接口。例如以代理的形式。从效果上讲,进程 Q 是作为文件服务器
来工作的。
第四章 通信
1、在许多分层协议中,每一层都有自己的报头。如果每个消息前部都只有单个报头,其中
包含了所有控制信息,无疑会比使用单独的多个报头具有更高的效率。为什么不这么做?
答:协议的每一层都必须和其它层相独立。从第 k+1 层传送至第 k 层的数据同时包含了报头
和数据,但是第 k 层协议不能对它们进行辨别。如果使用单个大的报头来包含所有信息的话
将会破坏透明
性,使得一个协议层的变动会影响到其它层,这显然不是我们所希望的。
2、为什么传输层通信服务常常不适于构建分布式应用程序?
答:它们通常不提供分布透明性,这意味着应用程序开发人员需要注意通信的实现,从而导
致解决方案的可扩展性很差。分布式应用程序,例如基于套接字构建的分布式应用程序,将
很难移植或者和其它应用程序交互。
3、一种可靠的多播服务允许发送者向一组接收者可靠地传递消息。这种服务是属于中间件
层还是更低层的一部分?
答:从理论上来说,一种可靠的多播服务可以很容易的成为传输层,甚至是网络层的一部分。
例如,不可靠的 IP 多播服务是在网络层实现的。但是,由于这些服务目前尚无法应用,它
们通常使用传输层的服务来实现,传输层的服务将它们放在中间件中。如果把可扩展性加以
考虑的话,只有充分考虑应用程序的需求时可靠性才能得到保证。用更高、更特殊的网络层
来实现这些服务存在一个很大的争议。
4、考虑一个带有两个整型参数的过程 incr。该过程将两个参数的值分别增加 1.现在假定调
用它时使用的两个参数是同一个变量,比如 incr(i, i)。如果 i 的初始值是 0,在执行引用调用
之后 i 将变为什么值?如果使用复制——还原调用呢?
答:如果执行引用调用,指向 i 的指针被传入 incr。i 将会被增加两次,因此最终的结果是 2。
而使用复制——还原调用时,i 会被两次传值,每次的初始值均为 0。两次都会增加 1,因此
结果均为 1。最后都复制到 i,第二次的复制会覆盖第一次的,因此最终 i 的值为 1,而不是
2。
5、C 语言中有一种称为联合(union)的构造,其中的记录(在 C 语言中称作结构)的字段
可以用来保存几种可能值中的一个。在运行时,没有可靠的办法来分辨其中保存的是那一
个值。C 的这种特性是否与远程过程调用有某些相似之处?请说明理由。
答:如果运行时系统不能分辨一个字段的值类型,它就不能对该字段进行正确的封送处理。
除非有一个标签字段用来清楚的表明一个字段的值类型,联合不能在远程过程调用中使用。
这个标签字段不能被用户所控制。
6、处理 RPC 系统中参数转换的一种方法是,每台机器以自己系统使用的表示方式来发送参
数,由另一方在必要的情况下进行转换。可以通过首字节中的代码来表示发送消息机器所
用的系统。然而,由于要在首个字中找到开头的字节这本身也是一个问题,这种方法能行
得通吗?
答:首先,当一台机器发送字节 0 时,消息肯定已经送到。因此目标机器可以访问字节 0,
而代码就在消息里面。这种方法不考虑字节是高位优先还是低位优先的字节。另一个方法是
将代码放在第一个单词的所有字节中。因此不管检查的是哪一个字节,代码都能被找到。