操作系统答案文档格式.docx
《操作系统答案文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统答案文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
假设将管程中的wait和signal操作替换成一个单一的构件await(B),这里B是一个普通的布尔表达式,进程执行直到B变成真
a.用这种方法写一个管程实现读者—作者问题。
b.解释为什么一般来说这种结构实现的效率不高。
c.要使这种实现达到高效率需要对await语句加上哪些限制?
(提示,限制B的一般性,参见Kessels[1977].)
a.读者—作者问题可以进行以下修改,修改中产生了await声明:
读者可以执行“await(activewriters==0&
&
waitingwriters==0)”来确保在进入临界区域时没有就绪的作者和等待的作者。
作者可以执行“await(activewriters==0&
activereaders==0)”来确保互斥。
b.在signal操作后,系统检查满足等待条件满足的等待线程,检查其中被唤醒的等待线程。
这个要求相当复杂,并且可能需要用到交互的编译器来评估在不同时间点下的条件。
可以通过限制布尔条件,使布尔变量和其他部分分开作为独立的程序变量(仅仅用来检查是否相等的一个静态值)。
在这种情况下,布尔条件可以传达给运行时系统,该系统可以执行检查每一个它所需要的时间,以确定哪些线程被唤醒。
6.23
为什么Solaris、Linux和Windows2000都使用自旋锁作为多处理器系统的同步机制而不作为单处理器系统的同步机制?
Solaris,Linux和Windows2000中只有在多处理器系统才能使用自旋锁作为一个同步机制。
自旋锁不适合单处理器的系统,因为打破了这一进程的自旋锁只有通过执行不同的进程才可以得到。
如果这一进程不会放弃此处理器,其他进程就无法设置第一个进程所要求的程序条件,从而不能继续操作。
在一个多处理器系统,其他进程执行其他处理器,从而修改程序状态从自旋锁中释放第一个进程。
6.24
在基于日志的系统中可以给事务提供支持,在相应日志记录写到稳定存储之前不能允许真正地更新数据项。
为什么这个限制是必需的?
如果事务需要放弃,那么更新的数据项的值应该要恢复到原来的值。
这就需要原来值的数据在进行操作之前完成更新。
6.25
证明两段锁协议能确保冲突的串行执行。
调度是指一个或多个事务的执行顺序。
一个串行调度是指每个事务执行的原子调度。
如果一个调度由两个不同的事务组成,通过连续的操作从这两个事务中获得相同的数据,并至少有一个write操作,然后有所谓的冲突。
如果一个调度可以通过一系列非冲突操作的交换而转化成串行调度,那么这个调度为是冲突可串行化。
这两阶段加锁协议确保冲突串行化,因为独占锁(这是用于写操作)必须连续收购,不释放任何锁在获取(增长)的阶段。
其他事务希望获得同样的锁必须等待第一个事务开始释放锁。
通过要求任何锁必须首先释放所有锁,从来避免潜在的冲突。
6.26
分配一个新时间戳给已经恢复到原值的事务有什么影响?
对于新进入系统进程的事务,其所赋予的时间戳是如何大于原先事务的时间戳的?
在原先事务的访问变量改变后执行事务,那么相应的事务也恢复到原先的值。
如果他们没有执行此项操作(也就是说没有重复的原先事务的访问变量值),那么这些操作在适当的时候就不会受到约束。
6.27
假设数目有限的资源中的一个单一的资源型必须加以管理。
进程需要一定数量的这种资源,一旦用完将释放它们。
例如,许多商业软件包提供了一定数量的许可证,这表明一些应用程序可以同时运行.当应用程序启动时,许可证的计数递减。
当申请终止,许可证计数递增。
如果所有的许可证都在使用,那么要求启动该应用程序的申请被剥夺了。
只有当现有的许可证持有人终止申请并切许可证已经返还,那么这种申请将被授予.下列程序段是用来管理一个数目有限的情况下的可用资源。
最多的资源数量和一些可用的资源数量如下所示:
#defineMAXRESOURCES5
intavailableresources=MAXRESOURCES;
Whenaprocesswishestoobtainanumberofresources,itinvokesthe
decreasecount()function:
/*decreaseavailableresourcesbycountresources*/
/*return0ifsufficientresourcesavailable,*/
/*otherwisereturn-1*/
intdecreasecount(intcount){
if(availableresources<
count)
return-1;
else{
availableresources-=count;
return0;
}
Whenaprocesswantstoreturnanumberofresources,itcallsthede-
creasecount()function:
/*increaseavailableresourcesbycount*/
intincreasecount(intcount){
availableresources+=count;
前面的程序段将会产生一个竞争的条件。
如下:
a.确定数据参与竞争
b.当竞争的条件发生时,确定代码段的位置(或是区域)
c.利用Java同步,确定竞争的条件,同时修改decreaseCount()以使一个线程在没有足够的现有的资源下阻塞。
a.确定数据参与竞争:
可以利用的变量资源
b.当竞争的条件发生时,确定代码段的位置(或是区域):
代码使现有的资源递减和代码现有资源递增的声明可以放在竞争的条件。
c.使用信号量,确定竞争条件:
使用信号量表示当前可用资源变量,并且用信号量递增和信号量递减的操作代替递增和递减的操作。
7.1
假设有如图7.1所示的交通死锁。
a.证明这个例子中实际上包括了死锁的四个必要条件。
b.给出一个简单的规则用来在这个系统中避免死锁。
a.死锁的四个必要条件:
(1)互斥;
(2)占有并等待;
(3)非抢占;
(4)循环等待。
互斥的条件是只有一辆车占据道路上的一个空间位置。
占有并等待表示一辆车占据道路上的位置并且等待前进。
一辆车不能从道路上当前的位置移动开(就是非抢占)。
最后就是循环等待,因为每个车正等待着随后的汽车向前发展。
循环等待的条件也很容易从图形中观察到。
b.一个简单的避免这种的交通死锁的规则是,汽车不得进入一个十字路口如果明确地规定,这样就不会产生相交。
7.2
考虑如下的死锁可能发生在哲学家进餐中,哲学家在同个时间获得筷子。
讨论此种情况下死锁的四个必要条件的设置。
讨论如何在消除其中任一条件来避免死锁的发生。
死锁是可能的,因为哲学家进餐问题是以以下的方式满足四个必要条件:
1)相斥所需的筷子,2)哲学家守住的筷子在手,而他们等待其他筷子,3)没有非抢占的筷子,一个筷子分配给一个哲学家不能被强行拿走,4)有可能循环等待。
死锁可避免克服的条件方式如下:
1)允许同时分享筷子,2)有哲学家放弃第一双筷子如果他们无法获得其他筷子,3)允许筷子被强行拿走如果筷子已经被一位哲学家了占有了很长一段时间4)实施编号筷子,总是获得较低编号的筷子,之后才能获得较高的编号的筷子。
7.3
一种可能以防止死锁的解决办法是要有一个单一的,优先于任何其他资源的资源。
例如,如果多个线程试图访问同步对象A?
…E,那么就可能发生死锁。
(这种同步对象可能包括互斥体,信号量,条件变量等),我们可以通过增加第六个对象来防止死锁。
每当一个线程希望获得同步锁定给对象A?
?
E,它必须首先获得对象F的锁.该解决方案被称为遏制:
对象A?
E的锁内载对象F的锁。
对比此方案的循环等待和Section7.4.4的循环等待。
这很可能不是一个好的解决办法,因为它产生过大的范围。
尽可能在狭隘的范围内定义死锁政策会更好。
7.4
对下列问题对比循环等待方法和死锁避免方法(例如银行家算法):
a.运行费用
b.系统的吞吐量
死锁避免方法往往会因为追踪当前资源分配的成本从来增加了运行费用。
然而死锁避免方法比静态地防止死锁的形成方法允许更多地并发使用资源。
从这个意义上说,死锁避免方案可以增加系统的吞吐量。
7.5
在一个真实的计算机系统中,可用的资源和进程命令对资源的要求都不会持续很久是一致的长期(几个月)。
资源会损坏或被替换,新的进程会进入和离开系统,新的资源会被购买和添加到系统中。
如果用银行家算法控制死锁,下面哪些变化是安全的(不会导致可能的死锁),并且在什么情况下发生?
a.增加可用资源(新的资源被添加到系统)
b.减少可用资源(资源被从系统中永久性地移出)
c.增加一个进程的Max(进程需要更多的资源,超过所允许给予的资源)
d.减少一个进程的Max(进程不再需要那么多资源)
e.增加进程的数量
f.减少进程的数量
a.增加可用资源(新的资源被添加到系统):
这个可以在没有任何问题的情况下安全地改变
b.减少可用资源(资源被从系统中永久性地移出):
这可能会影响到系统,并导致可能性死锁因为系统的安全性假定其拥有一定数量的可用资源
c.增加一个进程的Max(进程需要更多的资源,超过所允许给予的资源):
这可能会影响到系统,并可能导致死锁
d.减少一个进程的Max(进程不再需要那么多资源):
e.增加进程的数量:
如果允许分配资源给新进程,那么该系统并没有进入一个不安全的状态。
f.减少进程的数量:
7.6
假设系统中有四个相同类型的资源被三个进程共享。
每个进程最多需要两个资源。
证明这个系统不会死锁。
假设该系统陷入死锁。
这意味着,每一个进程持有一个资源,并且正等待另一个资源。
因为有三个进程和四个资源,一个进程就必须获取两个资源。
这一进程并不需要更多的资源,因此当其完成时会返回其资源。