《分布式系统原理与范型》习题答案 3.进程
1.比较使用单线程文件服务器读取文件和使用多线程服务器读取文件有什么不同。花费15ms来接收请求、调度该请求并且完成其它必须的处理工作,假定需要的数据存放在主存储器的缓存中。如果需要磁盘操作,就需要额外多花75ms在磁盘操作的过程中线程处于睡眠状态。如果服务器采用单线程的话,它每秒能处理多少个请求?如果采用单线程呢?
答: 在单线程情况下,命中cache花了15ms,未命中cache花了90ms。加权平均值为2/3 X 15 + 1/3 X90。这意味着请求花了40ms,服务器没秒可以完成25次。对于多线程,所有磁盘等待都是交迭的,所以每个请求花了15ms,服务器每秒可以处理66错误!未找到引用源。 个请求。
2. 对服务器进程中的线程数目进行限制有意义吗?答:有。原因有两个:
(1)线程需要内存来设置他们的私有堆栈。因此,线程太多可能导致消耗过多的存储器。
(2) 更严重的情况是,对于一个操作系统,独立的线程是以无序的方式在运行。在虚拟存储器系统中,
构建一个相对稳定的工作环境可能比较困难,从而导致许多的页错误和过多的I/O操作,结果可能导致系统性能的下降。
3、在文中我们描述了一个多线程的文件服务器,说明了为什么它比单线程服务器和有限状态服务器更好。有没有这样的环境,在其中使用单线程服务器会更好?给出这种环境的例子。
答:有。如果服务器完全是CPU绑定的,就没有必要使用多线程了。多线程可能只是增加了不必要的复杂性。例如,某个地区拥有1百万人口,现要建立一个数据库来保存每个人的一些信息,如(名字,电话号码),假定每个人的信息大小为64字节,则数据库的总大小为64M字节,为了快速查找,应该把这些数据保存在服务器的存储器中。
4、将轻量级进程与单个线程静态关联起来并不好,为什么?
答:这样的关联将在很大程度上迫使只有一个内核级的线程,这就意味着多线程的性能优势将会被损失掉。
5、如果每个进程只使用单个轻量级进程也不好,为什么?
答:在这种模式下,我们只能拥有用户级的线程,这意味着任何阻塞系统调用都将阻塞整个进程。
6、描述一种使用与可运行线程数目相等的轻量级进程的方法。
答:开始只有单个轻量级进程并让它选择一个可运行的线程。当发现一个可运行的线程后,轻量级进程创建另一个轻量级进程来寻找下一个线程来执行。如果没有找到可运行的线程,轻量级进程就销毁它本身。
7、本章解释过,代理可以通过调用所有副本来支持引用透明。能否对(服务器端的)对象的副本进行调用?
答:可以。假设一个副本对象A调用另一个对象B(非副本),如果A包含K个副本,一个B的调用将会被A的每个副本执行,然而,B应该只被调用一次。这种复制调用应该采取一些特殊的措施。
8、通过生成进程来构建并发服务器与使用多线程服务器相比有优点也有缺点。给出部分优点和缺点。
答:一个重要的优点是每个进程都被保护。在超级服务器处理完全独立的服务的时候是非常有必要的。另一方面,创建进程的代价也较高,同时,如果进程需要通信,则使用线程在很多情况下将更为简单,因为它避免了用内核来实现通信。
9、粗略地设想一种多线程服务器的设计,该服务器必须使用套接字作为面对底层操作系统的传输级接口,以支持多种协议。
答:一个相对简单的设计是,使一个单一的线程T等待接收传输层消息(TPDU)。如果我们假定每个TPDU的报头包含一个数字来识别更高层的协议,这个线程可以把它传递给处理特定协议的模块。每个这样的模块都有一个专门的线程来处理消息,这些模块把消息看作是一个输入请求。当处理完这个请求后,一个应答消息被传递给T,这时T将把这个应答封装成一个传输层消息并把它传递给适当的目的地。
10、如何防止应用程序绕过窗口管理器破坏屏幕显示。
答:使用微内核方法,一个包含窗口管理器的窗口系统通过这个方法运行,因此所有的窗口操作都需要通过这个微内核。从效果上看,这正是第一章中所讲的把客户端——服务器端模式转换为单计算机的本质。
11、解释对象适配器的概念。
答:对象适配器是一种普通的程序,它可以接收输入的调用请求并把它们传递给对象的服务器存根。对象适配器主要负责实现调用策略,这些策略确定是否、怎样以及多少多线程被用来调用一个对象。
12、举出几个用于支持持久性对象的对象适配器设计方面的问题。
答:最重要的问题可能是产生一个对象引用,这个引用可以被当前服务器和适配器独立地使用。这样的引用应该能被传递给一个新的服务器并可能为相应的对象指定特定的活动策略。其它的问题包括,持久性对象什么时候、怎样被写到磁盘上,以及对象保存在主存储器中的内容和保存到磁盘上的内容有什么区别。
13、改变对象适配器示例中的thread_per_object过程,使用单个线程来处理受该适配器控制的所有对象。
答:代码基本保持不变,除了我们需要创建一个single线程,该线程用修改过的版本thread_per_object来运行。这个线程作为adapter_thread来被引用。当多路输出选择器调用这个适配器的时候,它向adapter_thread的缓冲区中存放一条消息,然后再读取它。适配器线程调用适当的stub并处理响应消息。
#include
#include
#define MAX3OBJECTS 100
#define NULL 0
#define ANY −1
METHOD3CALL invoke[MAX3OBJECTS];
THREAD *root;
THREAD *adapter3thread
void single3thread(long object3id) {
message *req, *res;
unsigned size;
char **results;
while(TRUE){
get3msg(&size,(char*) &req);
(invoke[req->object 3id]*)(req->size,req->data, &size, results);
res =malloc(sizeof(message)+size);
res->object3id = object3id;
res->method3id = req.method3id;
res->size = size;
memcpy(res->data, results, size);
put3msg(root, sizeof(res), res);
free(req);
free(*results); }
}
void invoke3adapter(long oid, message *request){
put3msg(adapter3thread, sizeof(request),request);
}
14、维护到客户的TCP/IP连接的服务器是状态相关的还是状态无关的。
答:假设服务器没有在客户端上保存其它消息,就可能认为服务器是状态无关的。问题在于不是服务器,而是服务器的传输层在客户端上保存了状态。本地操作系统所跟踪的与服务器无关。
15、想象一下,某个web服务器维护一个列表,该列表中的内容是IP地址与该地址最近访问过的web页的映射关系。当一个客户连接到该服务器的时候,该服务器在列表中查找该客户,如果找到的话就返回注册过的页面。这个服务器是状态相关还是状态无关的?
答:是状态无关的。状态无关设计的主要问题不是服务器是否保存了客户端的任何信息,而是所保存信息的准确度。在本例中,如果表丢失了,客户端与服务器还能正常的进行交互,就象什么事都没有发生一样。在一个状态相关设计中,这种交互只有在服务器从错误中恢复过来以后才能进行。
16、Java RMI对代码迁移依赖到何种程度?
答:把对象引用看作是可移动的代理,对象引用每次被传递的时候,我们实际上通过网络来迁移代码。幸运的是,代理没有执行状态,因此支持简单的移动性。
17、在UNIX系统中,可以通过让进程在远程机器上派生出一个子进程来支持强可移植性。请说明这种机制的工作机理。
答:UNIX中派生的意思是把父进程的完整镜像拷贝给子进程,这意味着在调用完fork后,子进程继续运行。一个相似的方法可以用来做远端克隆,这里假定了目标平台与父进程的平台是一样的。第一步是让目标操作系统为新建的子进程保存资源并创建相应的进程和存储器映射。这一步完成之后,父进程的镜像可以被拷贝了,子进程也可以被激活了。
18、图3.13指出,强可移植性不能与在目标进程中已迁移代码的执行结合在一起。请举出一个反例。
答:如果强可移植通过线程迁移发生的话,它就应该能使一个迁移的线程在目标进程的环境中执行。
19、考虑某个进程P,它请求访问与自己位于同一台机器上的本地文件F。在P迁移到另一台机器上以后,它还需要访问F。如果文件对机器的绑定是紧固的,如何实现对F的系统级引用?
答:一个简单的解决方案是,创建一个单独的进程Q,用Q来处理对F的远端请求。提供给进程P与以前一样的接口。例如以代理的形式。从效果上讲,进程Q是作为文件服务器来工作的。
20、D’Agents系统中的每个代理都由单独的进程实现。代理通信的主要方式是共享文件以及消息传递,而文件无法在机器之间传递。如果按照3.4节中给出的移动框架结构,代理的那一部分状态包含了资源段?
答:资源段包含了所有本地以及全局的资源引用。同样地,它由那些指向其它代理、本地文件等等的变量组成。在D’Agents系统中,这些变量主要包含在全局程序变量部分中。事实上,在D’Agents系统中,所有的资源都是不可转移的,这就使得事情变得简单了。只有代理能在机器之间传递。因为代理已经被全局引用命名,即:一个(address,local-id)对,在提供迁移的情况下转换引用到资源,在D’Agents中就相对比较简单了。
21、将D’Agents的体系结构与FIPA模型所实现的代理平台的体系结构进行比较。
答:它们之间的主要区别是,D’Agents没有单独的目录服务,事实上,它只提供了低级的命名服务,通过这个服务,代理能被全局引用。FIPA体系结构中的管理组件对应D’Agents中的服务器,然而ACC是由通信层实现的。与D’Agents相比,FIPA没有提供代理的体系结构的更进一步的信息。
22、代理通信语言(ACL)在哪些方面与OSI模型相符?
答:这些语言是应用层的一部分。
23、在系统顶层实现代理通信语言以进行电子邮件处理时,这中代理通信语言又有哪些方面与OSI模型相符?这种方案有什么优点?
答:它应该还是应用层的一部分。在e-mail的顶层实现ACL的一个重要原因是简单。一个完整,全世界范围内的通信基础设施对于处理代理之间的异步消息传递来说是可使用的。实际上,它与第二章讨论的消息队列系统很相近。
24、为什么ACL消息中通常必须指定实体(ontology)?
答:在这个特定的环境下,实体最好被解释为对ACL消息中包含的实际数据的标准解释的一个引用。通常,消息传递系统中的数据总是被假定能被消息的发送者和接收者正确地解释。代理经常被认为是高度独立的。因此,不能总是假定接收方能正确地解释接收到的数据。当然,对实体域的解释形成一些约定是必须的。