分布式计算题目解析
填空题
1、名字按结构可分为()和()
(绝对名字)和(相对名字)
- 绝对名字:这是完全确定的路径名字,也就是从根目录开始的完整路径。例如在文件系统中,“/usr/local/bin” 就是一个绝对名字,它明确指向系统上的一个特定位置。无论你当前在哪个位置,使用同一个绝对名字都可以找到相同的位置或者资源。
- 相对名字:这是相对于某个参考点(通常是当前路径)的路径名字。例如,当你在"/usr/local"目录下时,“./bin"就是一个相对名字,它就代表”/usr/local/bin"这个位置。但在其他位置,"./bin"就可能代表完全不同的位置。相对名称的解析取决于当前所在的路径。
2、名字解析方法有两种()、()
(重复)、(递归)
- 递归解析:在这种解析方式下,当客户端向DNS服务器发送请求后,DNS服务器会负责整个解析过程。如果它没有请求的记录,它会向其他DNS服务器查询,直到找到正确的记录,然后返回给客户端。
- 重复解析:在这种解析方式下,当客户端向DNS服务器发送请求后,如果服务器没有请求的记录,它会将其他可能知道信息的DNS服务器的地址返回给客户端,然后客户端继续向这些服务器查询,直到找到正确的记录。
3、分布式文件系统中有如下共享语义:()、()、()、()
(Unix语义)、(对话语义)、(事物处理语义)、(不可改变的共享文件语义)
分布式文件系统中的共享语义,主要包括以下几种:
- Unix语义:这是最常用的共享语义,也被大部分文件系统所接受。当两个或更多的进程同时打开同一文件时,如果其中一个进程对文件写入,其他所有进程能够马上看到这个改变。这种语义要求文件系统在数据写入后能立即更新,所以在实现分布式系统时,要注意文件同步的效率和数据一致性问题。
- 对话语义:如果文件在被一个进程打开后,其他进程所做的所有修改都将不可见,除非重新打开该文件。 这种语义更适合于那些网络带宽非常有限,且并发写操作相对较少的环境。
- 事务处理语义:事务处理寻求的是“所有或无”的语义,在一个操作序列中,要么所有操作都成功被执行,要么一个都不执行。 这种语义对于保证数据在故障中的一致性非常有用,如果在一个事务中的某个操作失败,那么整个事务将回滚到未执行状态。
- 不可改变的共享文件语义:是改变文件共享语义的一种极度激进的方法。只有两个操作- 创建和读取。你可以用新文件替换旧文件- 即可以更改目录。这种语义直接消除了数据一致性问题,能够用于高并发读的操作。
4、发生死锁的四个充分必要条件是:()、()、()、()
(互斥)、(不可剥夺)、(占有并等待)、(循环等待)
- 互斥条件:一个资源每次只能被一个进程使用,也就是说,如果一个资源已经被某个进程占用,那么其他进程就必须等待,直到该进程结束使用。
- 占有并等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已经获得的资源在未使用完之前,不能被其他进程强行剥夺,只有自己使用完毕后才释放资源。
- 循环等待条件:存在一个进程资源的循环等待序列,即每一个进程都在等待下一个进程所占有的资源。
5、处理死锁的方式有如下四种:()、()、()、()
(预防死锁)、(避免死锁)、(忽略死锁)、(检测死锁和从死锁中恢复)
- 互斥条件:一个资源每次只能被一个进程使用,也就是说,如果一个资源已经被某个进程占用,那么其他进程就必须等待,直到该进程结束使用。
- 占有并等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已经获得的资源在未使用完之前,不能被其他进程强行剥夺,只有自己使用完毕后才释放资源。
- 循环等待条件:存在一个进程资源的循环等待序列,即每一个进程都在等待下一个进程所占有的资源。
6、原子事物处理具有如下特性:()、()、()、()
(原子性)、(一致性)、(孤立性)、(持久性)
- 原子性(Atomicity):在分布式系统中,原子性保证了一个事务要么全部执行成功,要么全部失败。原子性在分布式环境下是一个挑战,因为事务可能涉及到跨多个节点的操作,但是需要确保所有的操作都成功执行或者如果其中有失败的则都需回滚。
- 一致性(Consistency):一致性确保分布式系统的状态在事务之前和之后保持一致。也就是说,事务需要遵循一定的规则,以使系统状态持续保持一致。比如,如果我们正在进行银行转账操作,则转账金额从一个账户扣除,并添加到另一个账户,系统的总金额应保持不变。这需要在所有的分布式节点上维持一致性。
- 孤立性(Isolation):尽管在分布式环境下有可能会有多个事务并行执行,孤立性确保了任何正在进行的事务都不会影响其他事务的执行。事务进行时,操作和使用的数据对其他事务是隔离的。例如,如果两个事务同时从同一账户转账,孤立性会确保这两个事务互不影响,并且每个事务都认为它是唯一正在操作账户的事务。
- 持久性(Durability):即便在事务已经提交之后发生系统故障,持久性也确保事务所做的更改都会持久保存。在分布式环境内,为达成这个目标可能需要借助一些复制和恢复机制,以确保每个节点都保存了事务的状态。
7、如果有n个进程参加互斥,使用时间戳算法完成一次互斥需要()个报文,使用Ricart-Agrawala互斥算法完成一次互斥需要()个报文
3(n-1),2(n-1)
在Ricart-Agrawala算法中,每次资源的使用都会产生 2n-2 条报文,其中 N 是系统中进程的数量。具体来说,进程i发出一个请求会产生 n-1 条请求报文,接收到来自其他n-1个进程的答复会产生 N-1 条答复报文。所以总共需要2(n-1)条报文完成一次互斥。
时间戳算法中,完成一次互斥实际上需要3*(N-1)个报文。具体来说,这包括:
- 当一个进程想要获得资源时,它会给所有其他进程发送一个请求消息,因此需要 N-1 个报文。
- 当它收到所有其他进程的答复后,这个进程可以开始使用资源。这一步需要 N-1 个报文。
- 当该进程使用完资源并释放它时,它会向所有其他进程发送一个释放消息。这一步也需要 N-1 个报文。
8、一个文件有n个副本,使用同步表表决发完成一次更新,共需传送()个报文
2n(n-1)
完成一次同步表决至少需要2N(N-1)个报文,其中每个控制者需要向所有其他N-1个控制者发送投票报文,每个控制者完成本地副本更新后需要向所有其他N-1个控制者发送END报文。
9、由局部检查点组成的两种不一致的全局状态为()、()
(丢失报文)、(孤儿报文)
a)丢失报文。进程Pi的检查点状态显示它给进程Pj发送了报文m,但是进程Pj并没有关于该报文的纪录。
b)孤儿报文。进程Pj的检查点状态显示它收到了一个来自进程Pi的报文m,但是进程Pi的状态显示它没有向进程Pj发送过报文m。
10、在分布式共享存储器中,目录方式的缓存一致性协议有如下三种:()、()、()
(全映像目录)、(有限目录)、(链式目录)
目录协议有三种主要类型:全映像目录、有限目录和链式目录 。
全映像目录的每个目录项保持N个指针,这里N是系统中处理器的个数。有限目录和全映像目录的不同之处在于,有限目录的每个目录项具有固定数量的指针,与系统中处理机数量无关。链式目录与全映像目录相似,只是它将目录分布于各缓存器。
11、传统的加密方法有两种,他们是()、()
(替换法)、(位置交换法)
替换法:在这种加密方法中,每个字符都被另一个字符所代替。这种加密方法称为恺撒密码,因为它最初被恺撒使用。
位置交换法:在这种方法中,字符将保持它们在原文中的格式,但是它们的位置将被改变来创建密文。
12、在分布式系统中,两种基本的检查点算法分别是()、()
(同步检查点)、(异步检查点)
在同步检查点算法中,各相关的进程协调它们的局部检查点的建立行为,以保证所有的最近的检查点都是一致的。在同步检查点中,只有最近的一致的检查点集合才需要被维护和保存。
异步检查点算法中程序中检查点状态的保存过程较为简单,程序中各进程周期性地相互独立地保存自己的运行状态,程序各进程之间不需要相互协商。
13、进程转移的形式有两种:()、()
(抢先方式(又称为进程迁移))、(非抢先方式(又称为进程放置))
抢先方式和非抢先方式,非抢先方式又称为进程放置,抢先方式又称为进程迁移。进程放置是为进程选择一个执行节点,在此节点上启动此进程。进程迁移是把进程转移到一个较好的执行节点继续执行。
选择题判断题
1、在公开密钥的加密方法中,A向B发送保密数据,A应该选择哪个密钥加密数据,为什么?
在公开密钥的加密方法中,如果A想要向B发送保密数据,应该选择B的公钥进行加密。
这与公开密钥加密的工作原理有关。公开密钥(Public Key)加密算法就是一种非对称加密算法,每个用户都有一对密钥,即公开密钥和私人密钥(Private Key)。
假设A需要向B发送加密信息,工作过程如下:
- 首先,A需要获取到B的公开密钥。这可以通过网络获取,因为公钥就是为了公之于众的,任何人都可以获取。
- 然后,A使用B的公钥对数据进行加密。
- 最后,A将加密后的数据发送给B。因为只有B的私人密钥才能解开用B的公钥加密的数据,所以只有B才能解密并阅读数据。
当然,如果B向A回复的话,则B需要用A的公钥加密数据。
通过这种方式,公开密钥的加密方法能有效保障电子信息的安全性,它解决了如何在不安全的网络中安全地传输密钥的问题,并能在一定程度上防止泄密和篡改数据。
2、分布式计算系统属于什么并行结构,为什么?
分布式计算系统是属于多指令流多数据流(MIMD)并行结构。
MIMD结构指的是多个处理器可以同时执行多个不同的指令序列(即指令流)并且这些指令可以在不同的数据集(即数据流)上操作。MIMD结构的并行计算机系统可以在任何给定的时间内运行多个不同的程序,并且每个程序都在属于它自己的数据集上进行操作。
分布式计算系统是这样的一种系统:其中的每个计算节点都有自己的内存空间,并且彼此通过网络进行通讯。这跟MIMD并行结构高度匹配。因为每个分布式计算的节点可以运行自己的程序(即指令流)并操作自己的数据(即数据流)。当然,为了完成同一个大的任务,这些节点之间可能需要进行通信,共享某些数据或者同步进度。
这种并行计算模型具有很高的并行度和可扩展性,可以大规模并行地处理数据和计算任务,尤其适合于大规模数据处理和计算密集型任务。
3、在使用公开密钥加密方法实现数字签名时,A向B发送签名报文,A应该选择哪个密钥对数据签名,为什么?
在使用公开密钥加密方法实现数字签名时,A向B发送签名报文**,A应该使用自己的保密密钥进行签名。**
这是因为数字签名的目的主要有两个:一是验证消息的完整性,确认消息在传输过程中没有被篡改;二是确认消息的来源,确保消息确实是所声称的发送者发送的。
在这种情况下,A使用自己的私钥对数据进行加密生成签名,然后将原始数据和签名一起发送给B。由于私钥是唯一的,并且只有A知道,所以这个签名也是唯一对应于A的。当B收到数据和签名时,B可以使用A的公钥对签名进行解密,如果解密后的数据与收到的原始数据一致,那么就证明数据是完整的,且确实是A发送的。这就实现了数字签名的目的
所以,简单来说,A应该选择自己的私钥对数据进行签名,以保证数据的完整性和来源的准确性。
4、对于两阶段封锁,下面说法正确的是:
A、两阶段封锁的优点之一是不会出现层叠回退的问题
B、层叠回退只会出现在锁的收缩阶段
C、层叠回退只会出现在锁的增长阶段
D、层叠回退在锁的增长阶段和锁的收缩阶段都可能出现
答案:B
解析:
两阶段封锁: 两阶段封锁可以保证一致性,实现正确的并发控制。两阶段封锁的主要内容如下:访问一个对象前先封锁它,为此必须先获得锁;对所有要访问的对象封锁前不对任何对象进行解锁;不要封锁已经被封锁的对象,为此不同的事务处理不可同时获得冲突的锁;事务处理执行结束前,为每个被它封锁的对象解锁;一旦一个事务处理释放一个锁,该事务处理就不能再获得另外的锁。每个事务处理锁的过程可分成两个阶段:锁的增长阶段和锁的收缩阶段。增长阶段中事务处理获得所有的锁而不释放任何锁;收缩阶段释放所有的锁而不取得另外的锁。
在锁的增长阶段会出现死锁的问题。发生死锁是因为在加锁机制中,锁是一种竞争的资源。
在锁的收缩阶段容易出现层叠回退(cascaded aborts)的问题。层叠回退的问题发生在一个事务处理操作失败后回退,在回退前由于该进程已经释放了某些数据对象上的锁,所以其他事务处理可能已经读取了被这个事务处理修改过的数据对象,这些事务处理也必须回退。
5、对于某个文件有5个副本,为了最有利于读操作,下面那种分配度定额(NR)和写定额(NW)的方案最合适?
A、NR = 4, NW = 5
B、NR = 1, NW = 5
C、NR = 4, NW = 2
D、NR = 3, NW = 3
答案:B
解析:
设具有某文件副本的服务员数目为N。要读取一个文件,必须要得到NR(读定额)个服务员同意。要修改一个文件,需要得到NW(写定额)个服务员同意。NR和NW应满足:NR+NW>N。只有当通过询问知道了有足够多的服务员愿意参加并同意之后,才能进行某种操作。
一般说来,NR取值小一些可使读操作易于得到满足,但是写操作的执行就难一些,反之亦然。NR,NW的最佳选择取决于读、写操作哪个更频繁。
满足以下2个条件使得某一系列读操作对一个文件最有利:
- 读操作的数量非常大。
- 读操作比写操作更频繁。
NR(读定额)和NW(写定额)是一个分布式系统中两个关键参数。NR是指一个读操作需要读取的最小副本数,而NW是指为了更新一个对象,必须要更新的副本数。
在分布式系统中,为了提高读性能,你希望尽可能减小读定额 (NR),这样在读取时就可以更快得到结果,因为你不需要从所有副本中读取数据。所以,当NR=1时,读取操作的性能最好,因为你只需要从一份副本中读取即可。
同时,为了保持数据的一致性,你希望在写入时能更新所有的副本,即NW应等于副本的总数,这样才能保证以后从任何一个副本读取到的数据都是最新的。
因此,对于读操作最有利的是NR=1,NW=5这个选项,即B选项。
6、在分布式文件系统中,对于更新策略和共享语义之间的关系,下面说法正确的是:
A、“关闭时写”适合对话语义,“立即写”适合UNIX语义
B、“关闭时写”适合UNIX语义,“立即写”适合对话语义
C、“关闭时写”既适合UNIX语义,又适合对话语义
D、“立即写”既适合UNIX语义,又适合对话语义
答案:A
解析:
“关闭时写”适合“对话语义”; “立即写”方法比较适合UNIX语义。
分布式文件系统中的两项关键概念是更新策略(更新是立即发生还是在关闭时发生)和共享语义(文件的变更如何在不同的客户端间可见)。
“关闭时写”是指文件的更新只在关闭文件时被写入磁盘, 而在文件打开的期间,所有的修改都只在内存中。这个策略适合于所谓的“对话语义”。对话语义下,在一个进程打开文件并一直到关闭文件的期间,无论其他进程对该文件做了怎样的修改,这个进程视图下的文件内容始终不变。 因此,在这种语义下,进行“关闭时写”的策略十分合适。
相反,“立即写”是指文件的任何更新都立即写入磁盘,这种策略适应于所谓的“UNIX语义”。在UNIX语义下,一个进程所做的修改立即对任何其他查看这个文件的进程可见,因此,“立即写”的策略在这种语义下最为合适。
7、对于程序的粒度和聚类之间的关系,下面说法正确的是:
A、对于粗粒度程序而言,性能最优的聚类在线性聚类中
B、对于粗粒度程序而言,性能最优的聚类在非线性聚类中
C、对于细粒度程序而言,性能最优的聚类在线性聚类中
D、对于细粒度程序而言,性能最优的聚类在非线性聚类中
答案:A
解析:
当表示一个应用程序的给定的有向无环图DAG(任务优先图)是粗粒度时,也就是它的一个链接上的通信代价小于分叉或者合并操作连接的相邻节点的计算代价,任何非线性聚类可以被转换成具有更少或相等执行时间的线性聚类。注意,上面的结论暗示了一个粗粒度程序的线性聚类性能优于任何非线性聚类。 然而,对细粒度程序而言,可能存在也可能不存在一个非线性聚类优于线性聚类。
8、对于平面地址和分层地址,下面说法正确的是:
A、分层地址是的路由选择容易,但是不容易创建新的地址;
B、平面地址是的路由选择容易,但是不容易创建新的地址;
C、分层地址容易支持进程迁移,但是不容易创建新的地址;
D、平面地址容易支持进程迁移,但是不容易创建新的地址;
答案:D
解析:
分层地址由若干段组成,这些段反映了网络的层次结构。
平面地址与物理位置或任何其他层次没有任何关系,可以想象平面地址的分配可以使用一个单一的全系统范围的计数器进行,任何时候需要一个新地址时读此计数器并且将计数器加1,这样,地址是唯一的,但和位置无关。
③两种地址结构的优缺点:
a)分层地址的优点:分层地址使得路由选择容易;容易创建新的地址,即可在每一个网络内单独决定主机号码;自动给出高位号码,即在主机内不用给出它所属的网络号,正如在城市内拨电话时不必拨国家和地区号码一样。
b)分层地址缺点:当一个进程迁移到另一个机器上时不能使用原来的地址。不容易支持进程迁移
c)平面地址的优点:当进程迁移时仍可使用原来的地址,容易支持进程迁移。
d)平面地址的缺点:路由选择比较困难,因为每个路由选择节点必须保持一个能对所有可能的地址进行变换的路由选择表,地址的赋值也比较复杂,必须确信每个地址是唯一的。不容易创建新的地址
9、两阶段提交协议的主要作用:
A、实现分布式事务处理的全局恢复
B、实现原子事物处理的孤立性
C、实现原子事物处理的一致性
D、实现原子事物处理的局部恢复
答案:A
解析:
两阶段提交协议(2PC) 是一个分布式提交协议,分布式提交用于保证一个进程组中的每一个成员要么都执行某一个操作,要么都不执行这个操作。分布式提交用于分布式事务处理的全局恢复。
10、对于以有向图表示的名字空间,下面说法正确的是:
A、该有向图中所有目录节点不仅有输入的弧,而且有输出的弧,而叶节点只有输入的弧;
B、该有向图只有一个根节点
C、该有向图中某个节点可能有多个输入的弧
D、该有向图中任何节点只能有有一个输入的弧,但是可以有多个输出的弧
答案:C
解析:
名字空间的表示:用一个带标号的有向图来表示,这个图中有两类节点,一类是叶节点(leaf node),另一类是目录节点(directory node)。一个叶节点代表一个命名的实体,叶节点没有输出弧(outgoing edge),只有输入弧(incoming edge)。每个节点有一个 标识符,每个弧有个名字。
叶节点:一般用来存放一个实体所表示的信息,例如这些信息可以包含这个实体的地址,顾客使用这个地址可以访问到这个实体;还例如这些信息还可以包含这个实体的状态,如果一个叶节点代表一个文件,它不仅包含整个文件,还包含这个文件的状态。
目录节点:每个目录节点保存了一个表,表中的一项代表了一条输出弧,每条输出弧由(弧标号、节点标识符)表示,这样的一个表被称为目录表(directory table)。
根节点:有一个特殊的节点,该节点只有输出弧而没有输入弧,该节点被称为命名图中的根节点(root node),或简称为根。一个命名图中可能会有多个根 。
举例:n5节点有多个输入的弧
11、原子事物处理的恢复技术用于实现原子事物处理的如下特性:
A、原子性和一致性
B、原子性和孤立性
C、原子性和持久性
D、孤立性和持久性
答案:B
原子性(Atomicity):原子性是指事务应该被视为一个不可分割的最小工作单元,事务中的所有操作要么全部提交成功,要么全都不做。例如,如果一个事务包含将一个银行账户的资金转移到另一个账户的两个操作,那么这两个操作应该同时成功或同时失败。如果中途出现故障,恢复技术应该能撤销已经进行的操作,保证数据一致性,这就是实现原子性。
持久性(Durability):持久性是指一旦事务提交,则其结果永久保存在数据库中。即使出现系统崩溃、电源中断等故障,恢复技术也能从日志(记录系统的运行情况)中重新构造出提交事务的修改操作,确保数据不会丢失,这就实现了持久性。
12、复制控制算法是为了保证分布式数据库内部的一致性
正确,书里原话
13、分布式文件系统的事务处理语义可以通过加锁的方法来实现
正确,书里原话,直接背
简答题
1、动态调度算法由哪几个策略组成?
答:动态调度算法有六个策略:启动策略、转移策略、选择策略、收益性策略、定位策略和信息策略。
①启动策略的责任是决定谁应该激活负载平衡活动。
②转移策略决定一个节点是否在合适的状态参与负载转移。
③选择策略选择最适合转移最能起平衡作用的任务,并发送给合适的目标处理器。
④收益性策略量化系统中负载不平衡程度,并且作为系统负载平衡潜在受益的估计,评估系统负载平衡是否是有收益的。
⑤定位策略是寻找合适的节点共享负载。
⑥信息策略决定收集系统中其他节点状态信息的时机、收集的方法和收集的信息。
2、在进程等待图中,什么是“结”?如何区分“结”与循环?
答:一个结K是一个节点集合,对于K中的任何节点a,a能到K中的所有节点,并且只能到达K中的节点。
满足循环的节点不一定是结,因为集合中的某个节点可能有不属于集合的后继结点。尽管循环环路中的节点可以互相到达,但可能存在环路中的某个节点可以到达环路之外的其他节点。
3、互斥算法的目的是什么?并发控制的目的是什么?
答:互斥算法的主要目标是保证在任一个时刻只能有一个进程访问临界区。
并发控制的目的是在有多个用户的情况下允许每个用户像单个用户那样访问共享资源,多个用户同时访问时互相不干扰。
4、什么是透明性?分布式计算系统的透明性含义是什么?
-
透明性:事物本来存在某种属性,但是这种属性从某种角度上来看是不可见的,称这种特性为透明性。
-
分布计算系统的透明性:用户或程序员看不见网络的存在。这样从用户或程序员的角度看来,网络中的全部机器表现为一个,用户或程序员看不到机器的边界和网络本身。用户不必知道数据放在什么地方以及进程在何处执行。
5、什么是访问控制?
访问控制:像多用户单机系统那样,规定什么人可以访问系统的什么数据,得到何种服务,并对用户进行身份鉴别,对他们的访问权限加以限制(授权)。
6、使用公开密钥加密技术实现数字签名,加密函数和解密函数需要满足什么条件?
就是E和D可以互换:
E(D§)=P, 当然同时还有D(E§)=P
7、什么是两个进程的同步点?同步机构的目的是什么?
为了达到合作,各个进程在执行的过程中必须存在若干点,超过这些点时,一个进程在另一个进程执行完某一活动前不能继续执行,这些点称为这两个进程之间的同步点。
同步机构的目的是保证所有相互干扰的活动成为有序的,使得该操作保持原子性(要么完成操作,要么干脆不发生)。 使得目标保持一致状态。
8、并发控制的正确性标准是什么?
正确性标准有两条:
①用户交给系统的每个事务处理最终将被执行,并最终得到完成;
②多个事务处理并发执行的结果和这多个事务处理串行执行的结果相同。
9、复制控制算法的作用是什么?
复制控制算法用来保证兼容可串行化,保持数据库多副本间的相互一致性。
10、什么是有状态服务员?什么是无状态服务员?
当一个服务员在为其顾客请求进行服务的时候,如果它保存其顾客的有关信息时,称该服务员是有状态的(stateful)。相反,如果服务员在为其顾客请求进行服务的时候不保存该顾客的任何信息,就称该服务员是无状态的(stateless)。无状态服务更加坚定
大题
1、对于下图所示的由三个进程组成的分布式系统,为所有的时间提供标量逻辑时间和向量逻辑时间,假设每个LCi (i = 1,2,3)初始化为0,而且P1,P2,P3,的d为1。
(1)题目解析:
水平方向代表空间,垂直方向代表时间,圆点代表事件,竖线代表进程,进程之间带箭头的线代表报文。
对任何事件a和b,如果a→b,则
C(a)<C(b)
①若a和b是同一进程Pi中的两个时间,并且a→b,则Ci(a)<Ci(b);
②若a代表“一个Pi进程发送一个报文”这个事件,b代表“另一个进程Pj接收这个报文”这个事件,Ci(a)<Cj(b)。
标量逻辑时间更新:
任何一个逻辑时钟LCi基于以下两条规则更新它的逻辑时钟值:
①当发生一个事件(一个外部发送或内部事件)之前,我们更新LCi: LCi:=LCi+d (d>0)
②当收到一个带时间戳的报文(m,LCj,j)时,我们更新LCi: LCi:=max(LCi,LCj)+d (d>0)
向量逻辑时间:
每个进程Pi和一个时间向量LCi[1,…,n]相关联,其中
①向量元素LCi[i]描述了进程Pi的逻辑时间进展情况,即自身的逻辑时间进展情况;
②向量元素LCi[j]表示进程Pi所知的关于进程Pj的逻辑时间进展情况;
③向量LCi[1,…,n]组成进程Pi对于逻辑全局时间的局部视图。
进程Pi发送的每个报文m都被标上LCi的当前值和进程的标号i,从而形成一个三元组(m,LCi,i)。
向量逻辑时间基于以下两条规则更新它的逻辑时钟值:
①当发生一个事件(一个外部发送或内部事件)之前,Pi更新LCi[i]:
LCi[i]:=LCi[i]+d (d>0)
②每个报文捎带发送方在发送时的时钟向量,当收到一个带时间戳的报文(m,LCj,j)时,Pi更新LCi:
LCi[k]:=max(LCi[k],LCj[k]) 1≤k≤n
LCi[i]:= LCi[i]+d (d>0)
(2)解答步骤:
标量逻辑时间更新比较简单
- 如果没有报文传下来,就是前面的时间+d
- 如果有报文传下来,就是前面的时间和报文传过来的时间取更大的+d
向量逻辑时间更新:
- 首先弄明白向量中每个参数的含义
- Pi自身的逻辑时间进展情况LCi[i],比如一个向量三个值(1,2,3),那么第一个值对应第一个向量,1对应的就是第一个向量逻辑时间进展。
- 向量元素LCi[j]表示进程Pi所知的关于进程Pj的逻辑时间进展情况
- 更新规则
- 下一个时间来之前自己更新自己
- 下一个报文来了之后,取更大值
(3)解答:(左边为标量,右边为向量)
2、画出下列调度的串行化图,指出下列调度中哪些可串行化调度
L 1 = w 2 ( y ) w 1 ( y ) r 3 ( y ) r 1 ( y ) w 2 ( x ) r 3 ( x ) r 3 ( z ) r 2 ( z ) L 2 = r 3 ( z ) r 3 ( x ) w 2 ( x ) r 2 ( z ) w 1 ( y ) r 3 ( y ) w 2 ( y ) r 1 ( y ) L 3 = r 3 ( z ) w 3 ( y ) w 2 ( x ) r 1 ( y ) r 3 ( y ) r 2 ( z ) r 3 ( x ) w 1 ( y ) L 4 = r 2 ( z ) w 2 ( y ) w 2 ( x ) w 1 ( y ) r 1 ( y ) r 3 ( y ) r 3 ( z ) r 3 ( x ) \begin{aligned}&\mathrm{L_1=w_2(y)w_1(y)r_3(y)r_1(y)w_2(x)r_3(x)r_3(z)r_2(z)}\\&\mathrm{L_2=r_3(z)r_3(x)w_2(x)r_2(z)w_1(y)r_3(y)w_2(y)r_1(y)}\\&\mathrm{L_3=r_3(z)w_3(y)w_2(x)r_1(y)r_3(y)r_2(z)r_3(x)w_1(y)}\\&\mathrm{L_4=r_2(z)w_2(y)w_2(x)w_1(y)r_1(y)r_3(y)r_3(z)r_3(x)}\end{aligned} L1=w2(y)w1(y)r3(y)r1(y)w2(x)r3(x)r3(z)r2(z)L2=r3(z)r3(x)w2(x)r2(z)w1(y)r3(y)w2(y)r1(y)L3=r3(z)w3(y)w2(x)r1(y)r3(y)r2(z)r3(x)w1(y)L4=r2(z)w2(y)w2(x)w1(y)r1(y)r3(y)r3(z)r3(x)
(1)题目解析:
有冲突就有路径,三种情况可以画一条边::ri(x)<wj(x)、wi(x)<rj(x),wi(x)<wj(x)
可以删除的情况是:如果从Ti到Tj有一条路径存在,则可以删除从Ti到Tj的边。
不可串行调度:存在环就是不可串行调度
(2)解答步骤:
- 分类:按xyz分类。
- 找冲突 ri(x)<wj(x)、wi(x)<rj(x),wi(x)<wj(x)
- 画图
- 判断是否有环,有环就是不可串行调度
(3)解答:
3、在下面的任务优先图中标出每个任务的优先级,给出在双处理器上的最优调度。假设每个任务的执行时间是1,忽略通信代价。
(1)题目解析:
最高层优先(highest-level-first)方法,也就是说,通过节点的优先级来选择节点。
(2)解答步骤:
- 第一步: 标记优先级,标记优先级的规则为最底层的优先级最低,从下往上标,从左往右标(终止节点是直接从左往右,但是其他的节点同一层不一样)
- 注意同一层结点的怎么排?按照其子节点的最小数值进行排序,最小数值越小,优先级越低。
- 第二步: 排序优先级队列
- 第三步: 画出调度图
(3)解答:
4、说明G.Ricart等人提出的最佳互斥算法,使用该算法完成一次互斥共需要多少个报文。
Ricart-Agrawala互斥算法由以下规则组成 :
①一个进程申请资源时向所有其他进程发出申请报文;
②其它进程收到申请报文后若不在临界区并且自己未申请进入临界区,或者自己虽然发出了申请报文,但自己的报文排在收到的申请报文之后,则回答表示同意;
③申请资源的进程仅在收到所有进程的回答报文后才进入临界区使用资源;
④一个进程使用完资源后,它向所有未给回答的其它申请发送回答报文。
一共要2(n-1)个报文。 在Ricart-Agrawala算法中,每次资源的使用都会产生 2n-2 条报文,其中 N 是系统中进程的数量。具体来说,进程i发出一个请求会产生 n-1 条请求报文,接收到来自其他n-1个进程的答复会产生 N-1 条答复报文。所以总共需要2(n-1)条报文完成一次互斥。
5、对于如下的任务优先图,计算出它的粒度。
(1)题目解析:
任务优先图是一个有向无环图(DAG ),图中每个链接定义了任务间的优先关系,节点和链接上的标记表示任务的执行时间和任务完成后启动后续任务所需的时间间隔。
节点数值表示任务的执行时间,链接上的数值表示通信时间
一个给定任务聚类的粒度被定义为任务的计算量(Ck)与通信量(lk)的比值。
一个任务优先图可以认为是许多分叉和合并操作的集合,分叉x(合并x)的粒度是:(每个节点计算分叉和和和合并的粒度
g
(
x
)
=
min
1
≤
k
≤
n
{
C
k
}
/
max
1
≤
k
≤
n
{
l
k
}
g(x)=\min_{1\leq k\leq n}\{C_k\}/\max_{1\leq k\leq n}\{l_k\}
g(x)=1≤k≤nmin{Ck}/1≤k≤nmax{lk}
分叉与合并操作,该怎么选取节点?根据以下操作进行选取:
给定任务优先图G的粒度是:
g
(
G
)
=
min
∀
x
∈
G
{
g
(
x
)
}
g(G)=\min_{\forall x\in G}\{g(x)\}
g(G)=∀x∈Gmin{g(x)}
(2)解答步骤:
-
第一步:先计算每个节点的分叉和合并的粒度,然后取其中较小的作为这个节点的粒度
- 注意多个分叉或者多个合并的时候,是取结点值的最小值,和通信量的最大值。
-
第二步: 取所有节点的粒度的最小值作为该任务优先图的粒度。
(3) 解答:
6、有三个账户A、B、C,分别存款400,500,600元,有如下应用实例:A向B转账100元,B向C转账150元,C向A转账200元。
问:如何编制转账程序以实现可串行化调度(程序只需要给出读写原语和加锁解锁原语)在此情况下,三个实例是否可能发生死锁,如果有可能发生死锁,死锁是怎么发生的?是否会发生 层叠回退的现象,如果发生层叠回退,层叠回退是怎么发生的?
(1)题目解析:
(2)解答步骤:
先上锁再解锁。(两个read连在一起读,不会发生冲突)
(3)解答:
7、假设使用OR模型,确定下图是否存在死锁。
(1)题目解析:
死锁条件是存在结。一个结K是一个节点集合,对于K中的任何节点a,a能到达K中的所有节点,并且只能到达K中的节点。
(2)解答步骤:
看环中是否存在出环的节点,如果有就说明不是死锁。
(3)解答:
第一个图中,P4可以到达P1,所以不是死锁,是循环。
第二个图中,P2,P3,P4,P5构成的环不能到达其他顶点,构成了死锁。
8、在Maekawa互斥算法中,设有7个进程(P1,P2,P3,P4,P5,P6,P7),请给出每个进程的请求子集,要求请求子集中的进程尽量少,并且每个请求子集包含的进程数相同,各进程在请求子集中出现的机会均等,以本例说明Maekawa互斥算法的两个极端情况是什么?
(1)题目解析:
在Maekawa互斥算法中,一个进程P在发出申请报文后,不用得到所有其他进程的回答,而只须得到一个进程子集S中的所有进程的回答即可进入临界区。称S是P的请求子集。假设Ri和Rj分别是进程Pi和Pj的请求子集,要求Ri∩Rj≠NULL。
(2)解答步骤:
直接看PPT,不知道哪里来的。
(3)解答:
考虑一个七个进程的例子,每个进程的请求子集如下:
R1:{P1,P3,P4};
R2:{P2,P4,P5};
R3:{P3,P5,P6};
R4:{P4,P6,P7};
R5:{P5,P7,P1};
R6:{P6,P1,P2};
R7:{P7,P2,P3}。
Maekawa算法的两个极端情况:
①退化为集中式互斥算法。Pc(c∈{1,2,…,n})作为协调者,对所有进程Pi,有:Ri:{Pc},1≤i≤n
②完全分布式的互斥算法。对所有进程Pi,有: Ri:{P1,P2,…,Pn},1≤i≤n ,所有进程都是协调者。
9、说明意图表方法和先写运行记录方法这两种实现原子事物处理局部恢复的方法中,哪种与两阶段封锁相匹配,哪种与严格两阶段封锁相匹配?
(1)题目解析:
(2)解答步骤:直接背
(3)解答:
意图表方法与严格两阶段封锁相匹配,事物处理一直独自占有资源、意图表写入坚固存储器中,直到操作完成,不会产生死锁和层叠回退现象;
先写运行记录方法与两阶段封锁相匹配,收缩阶段/事物处理夭折时,容易产生层叠回退现象。
10、在使用对话语义的分布式文件系统中,文件F的内容为"IAMASTUDENT",有A,B,C,D,E五个用户访问文件F,A、B、C在同一主机上,D、E在另一个主机上,A、B、D同时打开文件F,A将文件改为"IAMATECHER",C,E是在A将文件F关闭后,打开文件F的。
问:A修改文件F后,关闭F前,B,D分别文件F,读取到的内容是什么?关闭文件F后,C,E分别读文件F,读到的内容是什么?
(3)解答:
- 因为B与A是在同一主机上,可以看见修改的内容,所以B读到内容为"IAMASTUDENT",因为D与A不在同一主机上,看不见修改的内容,所以D读到是"IAMASTUDENT",
- 因为文件F已经关闭,所以用户再次访问文件F的内容为修改后的内容,所以C,E读到内容为"IAMATECHER"
11、以sprite系统为例,说明进程迁移的基本过程
Sprite系统的进程迁移包括以下几个步骤:
① 向目的节点发送一个RPC,确认是否允许迁移该进程。
②当要迁移该进程时,使用标准信号中断该进程的执行。
③传送该进程的“进程状态”,包括各寄存器的内容、用户标识符和小组标识符、信号处理信息、基地节点和该进程标识符。
④传送虚拟地址空间。把所有重写的页送到文件服务器,把对应的交换文件的页表和说明符送到目的节点。
⑤将该进程已打开的文件的说明符和当前工作目录打包并传送。
⑥发送一个RPC结束迁移,允许被迁移的进程在目的节点上恢复执行。
⑦最后,该进程在目的节点上恢复。
12、下面的以太网,连接有A,B,C、D四个节点,D节点为共享主存,有两个页面p1和p2,A,B,C可共享者两个页面。A,B,C各有一个缓存,且只能缓存一个页面,p1的初始值为w1,p2的初始值为w2。A,B,C的缓存初始状态为空。
如果缓存一致性协议采用的事Berkeley探听缓存写无效协议,按顺序有如下各步操作,写出每步操作之后,各缓存和主存的值,以及各缓存的状态(重写、有效、无效、共享重写或空)
- A读p1
- B读p2
- C向p1写入w3
- A读p2
- C向p2写入w4
(1)题目解析:
- 各类状态定义:
(1)无效。该缓存块不包含有效数据。
(2)有效。该缓存块中数据是有效的。
(3)重写。共享存储器中的数据是不正确的,该缓存块是唯一有效的数据副本。该缓存块是数据的所有者。
(4)共享重写。共享存储器中的数据是不正确的,该缓存块是数据的所有者,其他缓存中有同样的副本。
- 重写规则:
- 数据只能由所有者提供。
- 有效块和无效块在替换时可以简单地扔掉。
- 重写块和共享重写块在替换时要写回共享存储器,并把共享存储器设置为所有者。
- 写操作:
- 缓存块的状态是重写:则写操作可以直接进行;
- 缓存块是共享重写、或有效:必须向其他缓存器(是指其他副本,而不是所有)发送“无效”信号,然后可以进行写操作;
- 缓存块是无效:从当前所有者那里取得数据块,再向其他缓存器发送“无效”信号,然后可以进行写操作。
(2)解答步骤:
- 如果只是读操作,简单赋值即可。并将状态置为有效
- 如果是包含写操作,则分析当前状态(有效、无效、重写、共享重写),得到当前状态之后根据写操作的规则对缓冲块的值和状态进行更新,对主存的值进行更新。
(3)解答:
议,按顺序有如下各步操作,写出每步操作之后,各缓存和主存的值,以及各缓存的状态(重写、有效、无效、共享重写或空)
- A读p1
- B读p2
- C向p1写入w3
- A读p2
- C向p2写入w4
(1)题目解析:
- 各类状态定义:
(1)无效。该缓存块不包含有效数据。
(2)有效。该缓存块中数据是有效的。
(3)重写。共享存储器中的数据是不正确的,该缓存块是唯一有效的数据副本。该缓存块是数据的所有者。
(4)共享重写。共享存储器中的数据是不正确的,该缓存块是数据的所有者,其他缓存中有同样的副本。
- 重写规则:
- 数据只能由所有者提供。
- 有效块和无效块在替换时可以简单地扔掉。
- 重写块和共享重写块在替换时要写回共享存储器,并把共享存储器设置为所有者。
- 写操作:
- 缓存块的状态是重写:则写操作可以直接进行;
- 缓存块是共享重写、或有效:必须向其他缓存器(是指其他副本,而不是所有)发送“无效”信号,然后可以进行写操作;
- 缓存块是无效:从当前所有者那里取得数据块,再向其他缓存器发送“无效”信号,然后可以进行写操作。
(2)解答步骤:
- 如果只是读操作,简单赋值即可。并将状态置为有效
- 如果是包含写操作,则分析当前状态(有效、无效、重写、共享重写),得到当前状态之后根据写操作的规则对缓冲块的值和状态进行更新,对主存的值进行更新。