分布式系统期末复习题汇总

来源:互联网 发布:企业应用开发实战源码 编辑:程序博客网 时间:2024/05/29 16:23

37 移动实体、宿主代理和宿主位置的理论

  分布式服务器的基本思想就是客户从一个可靠的、高性能的、稳定点服务器中受益。如何在系统中设立一个稳定长期有效地访问点对于移动实体在分布式系统中的访问来说是很有意义也是很值得研究的一个方向,那IP版本6中的移动支持(MIPv6)。 在MIPv6中, 一个移动节点假设有一个宿主网络( home network ) ; 并且这个可移动节点通常都是呆在这个宿主网络中,并且在该宿主网络中有着一个常用的稳定的地址, 这个地址称为是宿主地址( home address ) 。 在宿主网络中通常有一个特别的路由器,我们称该路由器为宿主代理*( home agent ) 。 当移动结点不在该宿主网络中的时候, 这个特别的路由器即宿主代理将会处理(接受和转发) 要传递给移动结点的网络包( traffic ) . 当移动结点附着到一个外部的网络上的时候,他就会收到一个临时需要的地址( care of address ) , 其他结点可以将网络包发送到这个地址的上面。这个临时地址通告给宿主代理, 他随后就可以转发送给移动结点的网络包这个临时的地址。 并且在整个的过程中,与移动结点进行通信的应用程序只会看到移动结点在宿主网络中的地址, 而看不到中间被屏蔽的临时地址。


问题: 为了支持大规模网络中的移动实体,可以采用Home-based 即 Home-location 的方法, 请试着说明其工作原理, 并说明这种解决方案中存在的问题和相应的解决方法?


在大型网络中支持移动实体定位是引入了宿主位置(home location) 的方法, 也就是( home based )。 这种方法的工作原理是这样的, 系统会持续的跟踪实体当前的位置,可以使用特殊的技术来预防网络故障或是进程调用的失败, 在实践中通常会选择创建实体的位置来作为该实体的宿主位置。

每个移动主机都会使用一个固定的IP地址,所有的与该IP地址进行的通信一开始都会被转发到改移动实体所在的宿主网络中的宿主代理中, 宿主代理( home agent ) 位于局域网中, 与包含在移动主机的IP地址中的网络地址是相对应的, 当一台移动主机转移到另一个网络中时, 他就会请求一个可以使用的通信的临时地址。应用程序在向改移动实体发送数据包的时候,是发往这个移动实体的所在宿主网络中的宿主代理这个特殊的路由器,在这个特殊的路由器中会同时存放着移动实体在这个常用宿主网络中的宿主IP地址同时也会存放着移动实体在其他网络中被分配到的临时地址。当有应用程序向宿主常用地址发送数据包的时候, 这个数据包会被宿主网络中的宿主代理接受,并通过查阅路由表的方式将该数据包转发到当前移动实体所被分配的临时网络地址上。

这种解决方案所存在的问题就是,移动实体使用了一个固定的宿主位置一方面应该保持宿主的位置是始终存在的,也就是保证该宿主服务器始终处于运行状态,否则一旦服务器崩溃的话, 那么用户将无法与移动实体取得联系。并且如果决定把一个长期存在的实体永久地转移到网络的一个完全不同的部分中,而不是转移到宿主位置所在的网络部分, 那么问题就会进一步恶化。

针对这一问题的解决方法就是,在传统的命名服务器中采取主存宿主位置的方法,然后每当用户要访问某一个宿主的话,就会让客户首先查找对应的命名服务器,以明确宿主服务器所在系统中的确切的位置,由于可以假定宿主的位置是相对较稳定的所以在查找到宿主的位置之后,可以将它的位置暂时的存放在缓存中,方便下次快速的访问。


38. 在DHT-based系统中可以采用finger table 的方法来相应的提高查询效率,试着说明其工作原理以及在实际中的应用案例

DHT 是 distributed hash table 的缩写,是为了方便在P2P网络中发现资源的一种对资源的组织方式,通过分布式哈希表来存储资源,可以防止在实际查找资源中的网络中数据包的洪泛效应从而导致了耗费大量的网络资源。


DHT的工作原理是这样的,在P2P网络中,将各个计算机节点以环的方式组织在一起, 这些节点是在逻辑上相邻的但是在物理上未必是相邻的,通常在查找一个特定的资源的时候, 会遍历整个环,但是这样也同样会降低查找的效率。所以提出了一种替代线性查找的方式,在环结构中查找相关的资源。


相应的节点是通过环的方式组织在一起的,并且在环中会为每一个结点分配一个节点ID号码,这个ID号码是在很大的地址空间中生成的,地址空间之所以大是为了方式所选取的ID号会出现重复。 每一个结点上面都会维护着一张数据表,我们称之为finger table, 在这个finger table 我们可以用FTP 来表示,其中记录的是当前结点所管理的其他的相应子节点的ID号,也就是所在这张表中记录了可以直接到达结点的ID号码,也就是说记录了这些结点在整个系统中的IP地址。


假定这个结构化的P2P网络已经存在,现在要在这个结构中查找一个 key = X 的资源,在知道了key值之后,下面要做的就是查询这个key值所在结点的ID号码是多少,相应的资源就是存放在 ID 大于等于 X 值得结点集合中的,ID 数值最小的结点上的,

 大致的算法是这样的:

假定环中的结点ID号码为 0 ~ N-1 , 并且假定在每个结点所维护的 FT表中的结点ID号码都是从小到大有序排列的。

并且还需假定的是每个结点上所维护的FT表中的最多表项 介于 [1, n ] 之间。


首先在环中 id = p  结点所维护的FTP中查找满足条件  FTp [j] <= X < FTp [j+1] 这样的一个数值 j (0< = j < N )

      如果, FTp[1] > X ,也就是说 在FT表中的第一个ID号就大于 X的数值, 那么下一跳将会跳至 ID = FTp[1] 的结点上对FT表继续查找

      如果, 找到满足条件 FTp[j] <= X < FTp[j+1] 的数值 j 的话,那么下一跳就会跳至ID号码 = xiangying de FTp[j] 的结点上对该结点上的FT表进行查询。

     如果, 在查询了当前结点的FP表之后, FTp[ n ] < X 的数值,就是说在该节点P上所维护的FT表中的最大表项的数值都要小于 key 值 X, 这样的话,下一跳的结点ID号

ID = FTp[n] 

在跳至下一跳结点上之后,先判断 该节点ID号码是否 >= X 键值号,如果大于等于的话,则将改结点在网络中的地址返回给查询资源X的节点上的进程,该查询进程在的值目的结点的地址之后,通过该地址就会访问该地址所指定的结点在该节点上请求该资源的访问权。



35.说明虚拟化的含义,为了实现虚拟化,计算机系统通常提供四种类型的接口,说明这四种接口,并说明两种实现虚拟化的方式。

在编程语言中我们通常使用接口,通过接口来将某些方法的具体实现细节给隐藏掉,而仅将函数签名留给用户以供他们传递参数,虚拟化的实现也是如此,所谓的虚拟化本质上就是扩展和替换现存的界面(界面=interface = 接口)来模拟和仿真另一个系统的行为。

为了实现虚拟化,计算机通常会提供四种类型的接口,这四种接口分别是

1.由机器指令组成,系统中的任何程序都可以调用

2.由机器指令组成,仅供系统中特殊权限的程序(操作系统)才可以触发调用。


12 . 在支持多线程的系统中,可以采用三种模型来组织多线程,详细说明这三种模型。如果在不支持多线程的系统中实现文件服务,如何构造文件服务器呢?


这三种模型分别是

12.1 派遣者/工作者模型: 

某一个线程作为派遣者,它会从系统邮箱里面读出来自客户端的请求,然后对该请求进行检查,在从空闲的工作者中选取一个工作者线程去处理该请求。工作者在被派遣者调用的时候,是从睡眠的状态中被唤醒后,工作者会检查一下共享块的缓冲区是否可以满足分配给它的请求在运行过程中多需要的内存空间的大小,如果满足的话,则该工作者就睡相应该请求,根据请求来执行相应的调用。若不满足,则工作者会向磁盘空间去所求内存空间, 在发出请求之后,工作者将会继续进入睡眠状态,直到磁盘同意分配内存而向改工作者发出信号将处于睡眠状态的工作者唤醒。


12.2  团队模型

在团队模型中,所有的线程都是平等存在的,每个都会接受来自客户端的请求,并处理请求。在团队模型中是没有派遣者的,如果工作到来却不能够处理的话,也就是如果每个线程用来处理一种特定的工作,并且每一个团队的成员都会对应一个线程,这个线程会对应一个被维护的队列。这个队列是用来缓存该提供特定功能的线程来不及相应的请求的,以挂起的方式存放到该队列中,当线程执行结束一个调用之后,它会首先检查这个缓冲队列,然后如果该缓冲队列为空的话,才会查看系统中的邮箱队列。


12.3 管道线模型

这种模型中的第一个线程产生一些数据并将其传给下一个线程去处理,数据持续从一个线程传递到下一个线程,与团队模型所不同的是,团队模型中是每一个线程对应处理一个请求,而在管道线模型中,通常是一组线程处理一个请求,即前一个线程处理之后的结果输出会作为管道线模型总下一个线程的输入。 数据持续会从一个线程到另一个线程,每的经过一个线程都会对该数据进行处理。


对于一个不支持多线程的系统中可以通过创建一个无限的死循环的方式来不断地相应来自各个客户端的请求连接:

for ( ;  ; )

{

与请求的客户端建立连接

accept 来自各个客户端的请求

对请求调用的相关方法给予相应,并调用本地的程序。

得到调用结果,将其回复给请求的客户端

断开与该客户端的连接。

}


这种方法是最简单的服务器响应客户端的连接的方法,他不能够同时响应来自一个或多个的客户端的多个请求,同时也不具备在服务器端开辟缓存空间用来缓存,由于当前服务器状态比较繁忙而没有时间及时响应的客户端的连接。


12. 在交换式Dash 多处理机的系统中,为了保持缓存的一致性而采用了Dash 协议,某一簇中的-cpu 写一未缓存的数据块,之后另一个簇中的另外一个cpu读取该数据块,是详细说明这个写操作和读操作是如何进行的。

设这个将要执行写操作的Cpu 为C1, 想要写的数据块设其为B,后续操作中的将要执行读操作的cpu 为C2 ,同时设数据块B所在的宿主机为C。

首先,C1将要对未被缓存的数据块C1进行写操作,首先C1会向自己的缓存区中发出查询命令,由于为缓存所以此次读失败。接下来C1会向本簇中的其他cpu的缓冲区中发出查询命令,由于数据块是没有被缓存的所以在C1所在的簇中的任何一个缓冲区没有副本,所以此次的读操作也失败。 C1, 此时会向B所在的宿主机中C中查找数据块B, 又根据题意可知数据块B是未经过缓存的,所以这个B的状态时clean的, C1 向C发出信号请求拷贝B的备份。 C响应C1的请求之后,将数据块拷贝到C1的上面, C1将会对数据块B在本地进行缓存,然后更新C1所在的主机所在的簇中的目录表,用以标示在此簇中留有数据块B的备份,然后对数据块B进行写操作,B数据块的状态将会从原先的clean状态修改为dirty状态。同时C1 会将数据块B被修改的消息发送到数据块B所在的宿主机C中,C在接受到信号之后,会更新自己所在簇中的目录表,使其对应数据块B的状态置为无效状态,目的是为了保证分布式系统中的数据的一致性。

截止到这个时候,系统中唯一存在的有效数据块B是在C1中,并且其状态是dirty的状态,此时C2在另一个cluster 中请求读取数据块B, 首先C2会在自己cpu专属缓存中查找数据块B,并且由于没有备份而查找失败即读失败,然后C2会在自己所在的簇中其余cpu的本地高速缓存中查找数据块B,同样读失败。 

随后,C2会向数据块所在的宿主主机C发送请求拷贝的信号, 由于上一次C1的写操作而造成宿主机C中的数据块B变为无效,所以数据块B所在的宿主机并不会将该数据块拷贝给C2,但是在宿主机C中留有系统中唯一一个有效的数据块B的存放的地址,即C1 的地址, C将会将该地址发送给C2 , C2接下来会向请求拷贝的信号发送到C1的上面,然后C1会将数据块B发送到C2的上面, 因为C2的上面也有了dirty状态的数据块B的备份,所以C1在将B拷贝到C2 的之后,会将本地保存的B数据块的重新置成clean状态。同理C2在接受到数据块B之后, 会更新本簇上面的目录表,然后将自己缓存中的数据块B的状态置为clean的状态。


*在分布式系统中,为什么要对代码进行迁移?代码的迁移可以分为 sender-intiated 和receiver-initated, 请解释其中的含义,并举例对其进行说明?

代码迁移的最主要的目的有两个, 一个是减轻系统的负担,均衡系统的负载,通过代码迁移的方式将运行中的程序从负载较重的服务器迁移到负载较轻的服务器上去。另一个原因是在不对数据移动的情况下,使得对数据进行访问的程序距离数据所存放的地点更近一些,以减少在网络中所频繁发送的数据包,以减轻系统的网络资源的消耗。

代码的迁移可以有两种区分方法,一个是强移植的代码迁移另一种是弱迁移的代码迁移。另一种区分代码迁移的方法就是 发送者启动的代码迁移和接收者所启动的代码迁移。 我们先来了解一下发送者启动的代码迁移: 发送者启动的代码迁移指的就是代码正在运行的主机或是代码当前正在驻留的主机作为主动方而所发起的代码迁移。在实际应用中的例子就是客户端需要访问服务器端上的数据而把相应的运行中的程序段上传至服务器的上面进行数据的抓取,网络爬虫的实现就是这样的,客户端将会把正在客户端运行的程序上传至所想要抓取数据包的服务器端, 上传的程序在服务器上对数据进行抓取,然后在将所抓取的数据包发送到客户端。

而对于,接受者所发起的代码迁移,指的是代码迁移使用代码将要运行的目标主机发起的,这种情况通常发生在 请求运行服务器端的客户端将 服务器端的正在运行的代码下载到本地上,在本地上运行改代码。在实际应用中的例子就是 java applet 小程序,客户端也就是代码迁移中的目的主机,想要在本地运行服务器端的applet 小程序,首先目标机即客户端会主动的向服务器端发送请求,然后在经由服务器端同意之后,会将该applet 小程序下载到本地,然后运行这段小程序。


*P2P 是典型的非集中式的体系结构,说明在结构化的P2P系统中是如何组织结点和数据的? 如何在结构化的P2P网络中对资源进行查找? P2P的结构化网络中,如何对其中的成员进行管理?

问题一:

在P2P网络中,数据指的就是想要存放在点对点系统中的资源 首先是通过哈希分布式散列表中的键值对的方式进行标示的,在将一个资源存放到某一个结点之前,会为其在很大的地址空间中分配一个 用于在散列表中标志该 value 的 key这个关键之,我们知道在hashtable中, key , value pair 二者是一一对应的。

在为其分配该 关键key 之后,我们设它为K, 接下来就是要寻找一个合适的结点来存放该资源。 会通过K值与系统中(逻辑环) 的各个结点的ID号码进行比对, 首先找到所有ID数值大于等于 K 值的所有结点集合,然后从该集合中选取ID数值最小的结点, 然后将该资源项存放到该节点的上面。


问题二:

如果想要在结构化的P2P网络中寻找一个资源所在的结点的话,必须是要被告知该资源在 分布式散列表中的 关键字的值的,在这里我们设它为 X,

在知道X之后,与将一个资源节点安放到结构化的网络中的步骤是一样的, 首先寻找到系统中的所有的结点值 大于等于 X的结点的集合,然后选取该节点集合中的最小数值的结点,这个结点即是资源key = X 的资源所存放的结点ID号吗。将它在系统中的地址发送到,请求寻找的结点之上即可。

问题三:

结构化的P2P管理结点的方式可以分成两点来介绍:

1. 结点加入到网络中

一个结点在加入到环形网络中之前,同样也是需要为他在很大的地址空间中分配一个ID号吗, 我们设其为 idx , 然后通过该idx 的数值到环形网络中去寻找,所有的结点ID值 大于等于idx 的结点的集合,然后在该集合中寻找到ID值最小的结点我们舍它为 idY , idY 就会成为idx 的前趋结点, idx 会将自身的结点信息,包括所包含的资源以及在网络中的地址,作为一个表项存放在它的前趋结点所维护并管理的结点表中。 然后idx对应的结点就会插入到该逻辑环中, idY 是他的直接前去。

2.结点从结构化网络中退出

当idx 从环形网络中退出的时候, 它自身的管理表中也会管理着一个或是多个以它为前驱的结点的信息,idx将会把自己所管理的表交付给它的直接前趋idY ,然后,将idY 中所对应的记录idx表项的信息,从该表中进行删除, 然后自己退出该逻辑环形网络即可。


之所以以结构化的方式来组织P2P网络是为了提高对资源查找的速度,是每个结点有组织的方式来存放资源,使得查找有序,以防止无序的查找资源而在网络中发送大量的信息报文而造成系统的洪泛现象, 而之所以使用分布式的哈希散列表来组织资源也是为了提高资源的查找速率,可以通过一些算法来将原来的线性查找方式从O(N)复杂度降低到时间复杂度为O(logN) 的算法。


*请说明RPC的主要步骤,还有在形式说明书中,输入参数,输出参数,输入,输出参数的含义指的是什么? 为什么要这样的规定呢?



RPC的主要步骤如下:

1. 客户端的程序或是过程以普通的方式来调用远程调用

2. 该远程调用会被客户存根打包成消息,并触发内核陷阱

3. 内核将会把打包好的消息发送到(服务器端) 远程内核中

4.远程内核在接受到消息之后,将会把该消息传送到本地的服务器存根

5.服务器存根将会对该消息进行解析,从中抽取所需要调用的本地的方法以及参数等等信息

6. 服务器存根将会根据消息中的请求来调用本地的程序或是过程,并将传来的参数传入其中,并从所调用的程序中得到运行结果

7.服务器存根程序会将运行结果打包成网络中传送的信息包,然后出发本地的内核陷阱

8. 服务器端的内核将会将该消息报发送到请求远程调用的客户端内核

9.客户端内核在接受到消息之后,将它交付给客户端的存根

10.存根程序对该信息包中的结果信息进行抽取,然后将其交付给刚刚运行的程序,程序在得到结果之后,继续后续的运行。


我们在进行RPC调用的时候,其中扮演角色最为重要的程序实质上是位于服务器端和客户端的存根程序。

其中存根程序的生成,是通过用户对通信的双方所规定的形式说明书进行编译而得到的服务存根和客户存根程序的。

其中的参数通常是通过 in/out 关键字来对其进行修饰以表示 参数在进行远程过程调用的时候,参数的运动的方向,其中in表示的是,参数运动的方向是从客户端被发送到服务器端。 而out 关键字用以表示的是参数运动的方向是从服务器端到客户端。 形式说明书之所以十分重要,是因为通过它而编译生成的双方的存根是需要根据说明书中所指定的in/out 来在各自的存根程序运行空间中开辟相应的缓冲区来用来接受数据和发送数据。当然这种情况针对的是当远程过程访问的时候,所传递的参数是地址也就是指针的时候,要考虑的。 因为指针在本地传递的时候所指代的是本地的地址空间,但是在远程调用的情况下完全不受用,所以在这个时候就要使用数组的传送方式来代替指针的传送。而数组的传送会涉及到接收双方对缓冲区的开辟的问题。


position: 是这样的,如果服务器是没有状态的话,那么每当结束一次与客户端的会话之后,就会将内部表中的信息完全删除,包括上一次会话中对文件读取的位置,也就是我们常说的文件的偏移量。 如果后续进行的会话的进程想要对文件在同一个位置进行访问的话,在向服务器发起会话的时候,是需要自己携带文件偏移量这样的信息的,因为服务器上不会对上一次文件的偏移量进行记录的。

 


1. 在DHT-based 系统中可以采用finger-table来提高查找效率,试说明其工作原理,并对其进行举例说明。

DHT 是distributed hash table的缩写,分布散列表的数据结构。是对P2P结构化环形网络中的结点之上,组织资源的一种方式,

以散列表的方式来组织 资源,是为了提高在各个节点之上寻找资源的效率,使得线性的沿着逻辑环遍历各个节点O(N) 的查找算法,

变为时间复杂度为O(lgN) 的查找方式。每个逻辑环上都会维护一个被称为finger-table 的数据表,其中记录了

从当前结点可以跳到的其他结点的具体位置。 同样也是为了规范寻找资源的方式,避免不必要的数据包的发送而造成网络洪泛的发生。

其工作原理是这样的,设有一个N个结点组成的一个逻辑环形网络,每个结点上维护一个n个数据项的finger-table FT[0..n-1], 先在想要找到<K,V>对

中key = x 的资源所在的结点的具体地址,知道地址之后可以对该结点上面的资源进行访问。

我们都知道,key= x 的资源,是存放于结点id = y 的上面, y 满足 set(id ) = { id | ID >= x } && y = min ( set(id) ) 的上面。 


首先,设起始为p , 在p 上面发出查询,首先将x 与 结点p上面的FT表中的表项进行比对:


最先判断,当前结点 是否是 >= x, 如果不满足的话,如果满足的话, 则 p当前结点就是所要寻找的结点,

将该节点的在网络中的地址发送到发出查询请求的结点的上面,随后发送请求的进程在得知该地址之后,

会向该地址发送请求访问资源的信息。


进行下面的查询,并为其分配不同的情况:

1. FTp[0] > x , 那么下一跳直接跳到 ID = FTp[0] 的结点上继续查找, 

2. FTp[n-1] <x , 那么下一跳直接跳到 ID = FTp[n-1] 的结点上进行查找,

3, FTp[i] <= x < FTp[i] , 那么下一跳直接跳到 ID= FTp[i] 结点的上面进行查找




2. 客户机服务器应用可以将软件层分分为三层,请说明每一层的作用,并说明Internet搜索引擎是如何按照三层结构组织软件成分的?

客户机和服务器应用可以将软件层分为: 用户接口层, 处理层,数据层。

其中用户接口层上面包含了所有系统或是软件与用户进行交互的所有的接口,用户接口层主要是用来处理与用户之间的一些交互等操作。

处理层中通常包含有相应的应用层序的核心实现,用来调用这些应用程序而向用户请求提供具体的实现方法,然后将具体的实现方法通过

用户接口层而向用户进行屏蔽。

数据层,数据层主要是用来管理在实际应用中所用到的数据,和系统中的底层数据的存放和访问的方式,在实际的系统应用中主要是以数据库

的形式出现的,还有一些是以文件形式存放的数据。


对于用户接口层,该层允许终端用户可以与应用程序相交互的程序组成的,Internet搜索引擎中的用户接口是这样实现的,用户在相应的窗口中输入

关键字的字符串,然后会显示出以Web网页的形式显示出所搜索出的Web网页的列表。而这个Web网页的后端是由一个巨大的Web网页数据库组成的,

搜索引擎的核心是将用户写入到搜索框中的查询字符串转换成发送到一个十分巨大的数据库中的查询语句,然后再将查询所得到的结构返回并以Web

页面的方式显示给用户。 在这里,用户接口层,应该是向用户展示接口,用来接收用户查询请求的浏览器的页面,即主要用来和用户进行交互的。

而处理层应该是,将用户输入的关键字转换成查询数据库的语句,向数据库发送查询,并将查询的结果传会给用户,以页面的方式展示给用户的相关

应用层序,这个是处理层。 而对于数据层,主要是根据应用的发送的查询,实际操纵Web后台所维护的巨大的数据库,根据应用程序传送过来的查询语句

而对数据执行查询访问等工作,然后将查询结果以某种特定的格式发送给处理层的核心应用程序。


3. 说明RPC的主要思想, 在客户发送请求之后, 客户机正常,但是没有收到应答,试分析这种情况是由哪些原因照成的。说明在服务器崩溃的情况下,可以采用哪些方法对其进行处理、


RPC的主要思想就是: 在客户单的本地调用远程服务器上的过程或是程序(子函数)就像是调用本地的程序(过程)是一样的,中间复杂的通信细节都是被隐藏的。

主要的原因有两种

{

1. 服务器崩溃

2.服务器正常工作

2.1 服务器由于网络阻塞而没有收到来自客户端发送的请求

2.2 服务器接收到了来自客户端的请求,并对该请求予以回复但是由于网络环境不好而 使得信息丢失,或是延迟到达(客户端计时器到时之后)

2.3 服务器处于繁忙状态,没有及时的相应来自客户端的请求,也没有对其进行及时的相应

}

在服务器崩溃了的话,可以有四种处理方法

首先是这样的,客户端在发现服务器端没有对其发送的请求予以回复的话,在计时器到时之后,会重复的发送请求,然后在计时多次,

然后最终认定,服务器崩溃。

1. 至少一次语义

Client在发现服务器崩溃之后,会等待该服务器重新的启动,在服务器崩溃到重新恢复的这段时间内,会重复的发送请求,直至服务器给他回复,

这样的处理方法,可以确保客户端发送的 RPC请求至少被执行一次。

 2. 至多一次语义 

这种处理方法是,一旦Client发现Server崩溃之后,就会立即放弃此次的RPC操作然后对该服务器崩溃的事件进行报告,这种处理方法会使得RPC

操作最多被执行一次或是一次都不会被执行,这种处理机制主要适用于不是幂等的RPC操作中,以防止多次执行相同的操作,会对服务器上面的数据有害。

3. 不予以保证 

Client在发现服务器崩溃之后,不提供任何机制来保证该RPC被处理的次数。

4. 精确一次语义

精确地保证该RPC操作,无论是服务器崩溃与否,仅会被执行一次,这种实现起来有相当大的难度,需要十分精确的处理。


4. 组通信系统中,原子性的含义是什么? 请举出具体的实例来说明为什么要保证原子性,在保证原子性的同时还需要保证消息的顺序,请举例说明保证消息

顺序的必要性。


在组通信中的原子性指的是: 当有一条信息发送给一个组之后,只能够保证仅产生下列结果中的一种

{

1. 该组中的所有成员进程都收到了该条信息。

2.该组长的所有成员进程都没有收到该条信息

}

除了这两种情况之外,不允许出现介于二种情况之间的任何一种情况:在这个通信组中一部分成员接收到了该信息,而有一部分成员没有收到该信息。

这种要么全做要么全部做,映射到通信组中即为: 组中成员要么全收到消息,要么全部没有收到,而不存在介于二者之间的情况,这种要么全有要么全没有的性质来源于数据库理论,说明了整个操作过程将作为一个整体,而这个整体是不可分的, 因为原子就是不可再分的。所以在通信组中我们称之为原子性或是原子广播。 下面是关于原子性在具体应用中的例子:

比如在一个分布式数据库中个,向一个通信组中的位于不同结点上的所有进程发送消息,使其在各自所在的结点上的数据库表中创建一条记录,然后,再次发送一条信息,是这个通信组中的所有进程对该刚刚创建的这条记录进行某一个字段的变更。如果整个操作是不满足原子性的话,那么对于第一次传递的消息,将会存在组中有一部分进程没有接收到,所以记录是不会被创建的,接下来的操作对该记录进行修改,则会造成在分布式数据库的各个节点上该字段的数据的不一致性。所以这个实例说明了,原子性通信在实际的应用中是十分重要的所以必须要保证。


关于消息的顺序到达的例子是这样的,设进程组中有两个进程 X, Y , 这两个进程同时通过发送消息的方式对共享变量m 进行修改,m 的初始值为2,

X进程对m执行的操作是  m += 8 ; m *= 2 ;

Y 进程对m执行的操作是  m /= 2  ;  且原定的执行顺序是 X, Y的对m数值的操作顺序。

即如果 正常的操作顺序的话, 最后m 的数值将会是: 10

如果不满足消息的按顺序到达的话, 或是由于网络传送数据包的延迟或是由于X , Y 所在的主机上面的时间不同步等原因,

Y消息将会先对m 数值进行修改,得到的 m = 1 ,接下来X进程再次对m数值进行修改 m = 18 , 这样会对数据造成很大的不同,而对系统中数据带来很大的危害。


相应的解决方法,即使得分布式系统中的消息按照顺序到达的方式有两个

 1, 为每一条信息进行编写序列号,序列号从很大的地址空间中选取

2. 序列号是系统时间的 time stamp



5. 在分布式系统中获得互斥的方法之一是采用集中式算法,如果有四个进程 P0 , P1 , P2 , P3 , P0 首先申请资源S, 之后P1,P2,P3随后依次按照顺序对该资源进行申请,

是说明所采用机中式的方法是如何实现对资源进行互斥访问的?


是这样的,若是采用集中式的方法来对资源进行访问的话,系统会为该资源分配并维护一个缓冲队列,用来存放申请该资源但是由于该资源正在被其他进程占用的进程的访问,并会为其分配一个协调者进程对该队列进行维护。

首先, P0申请对资源S的访问, 由于S当前没有其他线程对其进行访问, 所以,S将会被P0使用, 即P0成功的进入S 的临界区。

然后,在P0正在占用资源S并对其进行访问的时候, P1向S 提出访问的申请,即请求进入资源S的临界区的请求, S被占用不对其请求予以响应,而是维护该资源S的缓冲队列的协调者 , 将该P1进程请求存放到缓冲队列中。

接下来, P2的请求到达,S资源仍旧处于被占用状态, 所以同对 P1 的处理方法一样, P2同样被以先进先出的方式被置于资源S的缓冲队列中,

接下来, P3也被放置到资源S的缓冲队列中, 并且从队头到队尾的排列顺序是: P1 , P2 P 3


最后, 进程P0对资源S 访问结束,解除对资源S的占用, 将S资源释放的同时P0会向协调者发送信号, 协调者在接受到该信号之后,将会将从队头取出队头元素P1

并将其唤醒,然后将资源S分配给它, P2 , P3 对资源S的访问过程同上述过程是一样的,不在重复介绍。


7. 说明客户/服务器模式的主要思想, 并说明在采用了阻塞的、有缓存的、 可靠的发送和接收原语的情况下,系统是如何工作的

其工作主要思想是这样的:想要构造一个操作系统, 该操作系统是由一组相互协同的进程所组成的, 这组协同进程我们称之为服务器进程。为客户请求予以接收并

予以响应提供服务的进程,我们称之为服务器。客户进程和服务器进程都运行在同一内核中,并且都是以进程的方式运行的, 一台机器上面运行的客进程

和服务器进程之间的关系可以是 多对多的。 客户/服务器之间的关系以简单的 请求/ 应答协议作为基础进行的。客户向服务器发送一个请求,请求在服务器上的一些

服务的出相应的运行结果之后,服务器会将改运行结果发送返回给客户端。


如果是采用了阻塞的有缓存的方式:

当客户端的继承调用send 原语之后,就会陷入阻塞(挂起) 的状态,直至发送的消息发送到目的端,并且确认被接受之后,才会从阻塞状态重新获得控制权。

同样在receive 一条消息之后,一直都会处于阻塞状态,直至该消息被放入值特定的缓冲区中之后,接受信息的进程才能够从新获得控制权。


若是采用了缓存的方式,指的是,系统为接收到的感兴趣的进程开辟一个缓冲区,我们通常将该缓冲区称之为邮箱。 每次在调用receive原语的时候,首先会到

邮箱中提取一条信息,,并且当邮箱为空的时候将会引起进程的阻塞。这样的话,内核就会知道如何来处理到来的消息,并将这些信息存放到何处。


对于可靠的发送和接受原语,是这样的:

系统会要求接受机器的内核发给发送信息的主机一条确认消息,只有当发送消息的主机接收到该确认消息的时候,才会在本地释放刚刚发送的消息。

这种处理方法是为了防止,接受消息的机器在接受到该消息失败之后,要求消息的发送方对该消息进行重传,而发送方在没有对其设置可靠的发送接收原语的机制下,

会认为接收端已经成功接收到刚刚发送的消息,而将该消息从自己的机器缓存中删除,而造成一定的错误的情况。


8. 在分布式操作系统中, 请说明单内核的含义, 并说明为什么要采用微内核,通常微内核提供那些服务?


在分布式系统中, 微内核和单内核主要涉及到的问题是关于分布式系统设计中的灵活性的问题。

在关于分布式系统的设计中主要有两个观点:

一种观点就是:内核应该提供尽可能少的服务,大量的操作系统服务都可以从用户级服务器上获得的。

而另一种观点就是: 内核应该在本地提供尽可能多的服务,这样可以系统的相应各种服务性能。


这两种观点分别对应者微内核 和单内核。


单内核对应的基本上应用于集中式操作系统的, 并且仅仅是在集中式操作系统上面加上了网络功能和远程服务的功能。

在单内核技术的系统中,大部分的系统调用都是通过内核陷阱的方式到达本地内核中的, 并且由本机内核来完成绝大部分的工作,

在经由内核调用相应的服务,将调用结果返回给请求调用的进程。


相比于应用与集中式主机中的单内核技术,微内核在实现上有着更好的灵活性,它的: 提供尽可能少的服务,绝大部分的服务有位于用户级的服务器来提供

的性质决定了它的灵活性要远远高于单内核,而使其更加的适合应用与分布式系统中。

微内核主要提供四种服务:

1.进程之间相互通信的功能 2. 某些内存管理功能 3. 少量的底层的进程管理和调用 4. 底层输入、输出服务


微内核不提供 对文件系统、目录系统 整个的进程的管理 以及许多的相关系统的调用。


9. 在分布式系统事务提交操作可能需要不同的机器上的多个进程的协作,举一个实际的例子,说明实现原子性提交的两阶段协议的基本思想。


对于两阶段提交的基本思想就是有在提交事务的时候,有一个进程作为协调者,通常是执行执行事务的进程,相应的两阶段协议思想是这样的:

首先,在准备提交阶段,协调者会向日志中写入Prepare , 然后向所有的服务器发送准备提交的信息。服务器在接受到消息之后,会对自己进行检查,

看是否能够提交,如果能够提交的话,则在自己的日志中写入Ready,然后相协调者发送 已经准备好了要提交的信息。截止到目前为止,为第一阶段提交结束。

在提交的阶段,协调者在接受到了所有的参与者发送过来的信息之后,会对此次进行 {提交,终止}操作。如果所接收到的所有信息都是Ready即准备好提交,

则协调者将会执行提交。如果接收到的消息中,有一个或是多个消息显示没有准备好,则协调者将会终止此次提交。 但是无论协调者选取哪种处理操作,它在进行操作

之前都会将将要执行的操作写入到日志文件中,然后将将要执行的操作通知给各个参与者,各个参与者在接收到协调者发送过来的消息之后会将其信息记录在自己的日志文件中,

然后根据协调者的指示执行操作{提交,终止}, 而协调者在发送消息之后也会执行相应的操作{提交, 终止}。


两阶段提交思想很好的实现了,系统中的原子性的思想,即对于参与者+协调者来说,对于要执行同一个操作,要么全做要么全不做,这样的操作方法,会使得

整个系统的状态达到一个一致性的状态,即,要么处于事务执行前的一个一致性的状态,要么处于所有结点执行相同的操作之后的另一个一致性的状态。

而且使用记录日志的方法,使得系统的容错性并且从崩溃的状态中恢复操作更加的可靠。如果协调者崩溃了的话,它的再次恢复正常运行之后,可以通过日志文件中

所描述的信息而恢复到崩溃之前所执行的状态。


11. 在实时的分布式系统中,事件触发和时间触发系统的含义分别是什么? 请给出一个例子, 并说明为什么动态调度适合于事件触发系统,

并给出三种动态调度算法。


事件触发系统是中断驱动的。当一个重要的外部事件触发的时候,会被传感器所捕捉,并导致与传感器相连的CPU得到一个中断请求。

而对于事件触发系统是在这类系统中,每相隔一段时间T就会产生一次时钟中断,在时钟滴答的时候会对特定的传感器进行采样,并且驱动特定

的执行机构。即中断仅仅在时钟滴答的时候发生。


例子:

假设一个正在运行中的服务器,运行的系统是事件触发的系统,在T=100ms的时候接收到来自客户端的写文件a.txt 的请求,

由于服务器处于的是空闲状态,而接受请求,并予以相应进行文件a.txt 的操作, 写操作需要执行200ms ,在T=150ms的时候,

接收到来自另一个客户端的读取文件b.txt 的请求,由于此系统所基于的系统是基于事件响应的,所以他不会立即响应该请求,

而是将该请求存放到本地的缓存中,然后继续的执行T=100ms 的读取a.txt 的请求。直至T=300ms的时候,结束对第一个请求的响应。

而转而执行缓存区中的对文件b.txt 的请求这个操作。


若是,该服务器所运行的系统是时间触发的系统中的话,假设该系统会每经过T=200ms 进行一次采样操作,在T=200ms

的时候在缓存中会同时存在 一个对文件a.txt 的写操作和一个对b.txt 的读取操作。这个时候,服务器会根据相应的优先级对两个请求

的优先程度进行裁决,然后选取一个最适当的请求进行执行。

(例子不合适,继续用电梯的那个例子)


之所以说动态调度 更适合于事件触发的方法,是因为在系统中负载较低的情况下,基于事件触发的系统对动态的未知的请求可以提供及时的相应,

并且对于动态调度来说,它的 预知性是很小的,基于时间调度的系统,更加的适合于对发生的事件预知性较高的请求的。


在实时分布式系统中,最为常用的调度方法有:

1. 比率优先算法

比率算法,类似于集中式的抢占式算法 

2. 最早时限算法

3.最小余数算法





















0 0
原创粉丝点击