1、 有五个哲学家,他们的一生只是进行思考和进餐。哲学家们公用一张圆桌(表示没有主席,也没有特权),周围放有五张椅子,每人坐一张。在圆桌上有五个碗和五只筷子,当一个哲学家思考时,他不与其他人交谈,饥饿时便试图取用其左、右最靠近他的筷子,但他可能一只都拿不到。只有在他拿到两只筷子时,方能进餐,进餐完后,放下左、右筷子又继续思考。请设计一个程序使得哲学家们能够协调地使用筷子进餐,要防止其死锁。 1、哲学家餐桌问题。( 1)利用信号量机制解决哲学家进餐问题用一个信号量 chopstick表示一只筷子,这五个信号量构成信号量数组,其描述为: chopsticki。所有信号量被初始化 1,第 i个哲学家的活
2、动可描述为。typedef int semaphore; /定义信号量semaphore chopstick5=1, 1, 1, 1, 1; /初始化信号量void philosopher(int i) /第 i个哲学家的程序while(1)Thinking();P(chopsticki);P(chopstick(i+1) % 5) ;Eating();V(chopsticki);V(chopstick(i+1) % 5) ;虽然上述解法可保证不会有两个相邻的哲学家同时抓住一只筷子,但可能引起死锁。假如五个哲学家同时饥饿而拿起各自左边的筷子,使五个信号量 chopstick均为 0;当他们再试
3、图去拿右边筷子时,他们都将无限期地等待。对于上述死锁问题,可采取几种解决方法解决。( 2)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以获得二只筷子,可以进餐,最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐。例程如下:typedef int semaphore; /定义信号量semaphore chopstick5=1, 1, 1, 1, 1; /初始化信号量semaphore eating = 4; /仅允许四个哲学家可以进餐void philosopher(int i) /第 i个哲学家的程序while(1)thinking(); /工作之一P(eating); /请
4、求进餐,若是第五个则先挨饿P(chopsticki); /请求左手边的筷子P(chopstick(i+1)%5) ; /请求右手边的筷子Eating(); /进餐V(chopstick(i+1)%5) ; /释放右手边的筷子V(chopsticki); /释放左手边的筷子V(eating); /释放信号量给其他挨饿的哲学家( 3)另一种解决方法,同时只允许一位哲学家拿筷子。typedef int semaphore; /定义信号量semaphore chopstick5=1, 1, 1, 1, 1; /初始化信号量semaphore mutex = 1; /设置取筷子的信号量void phil
5、osopher(int i) /第 i个哲学家的程序while(1)thinking();P(mutex); /在取筷子前获得互斥量P(chopsticki);P(chopstick(i+1)%5) ;V(mutex); /释放互斥量Eating();V(chopstick(i+1)%5) ;V(chopsticki);( 4)规定奇数号哲学家先拿起其左边筷子,然后再去拿右边筷子;而偶数号哲学家则相反。按此规定, 1, 2号哲学家竞争 1号筷子, 3, 4号哲学家竞争 3号筷子,即五个哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有某一个哲学家能获得两支筷子而进餐。程序代码如下
6、:typedef int semaphore; /定义信号量semaphore chopstick5=1, 1, 1, 1, 1; /初始化信号量void philosopher(int i) /第 i个哲学家的程序 while(1)thinking();if(i%2 = 0) /偶数哲学家,先右后左P(chopsticki+1%5) ;P(chopsticki);Eating();V(chopsticki+1%5) ;V(chopsticki);Else /奇数哲学家,先左后右P(chopsticki);P(chopsticki+1%5) ;Eating();V(chopsticki);V(
7、chopsticki+1%5) ;( 5)利用 AND信号量机制解决哲学家进餐问题仅当哲学家的左、右两支筷子均可用时,才允许他拿起筷子进餐。AND信号量机制解决哲学家进餐问题本质上是 AND同步问题。故用 AND信号量机制可获得最简洁的解法。typedef int semaphore; /定义信号量semaphore chopstick5=1, 1, 1, 1, 1; /初始化信号量void philosopher(int i) /第 i个哲学家的程序while(1)thinking();P(chopstick(i+1)%5,chopsticki) ; /二个信号量同时 AND判断Eating
8、();V(chopstick(i+1)%5,chopsticki) ;2、设系统中有 3种类型的资源 (A, B, C)和 5个进程 P1、 P2、 P3、 P4、 P5, A资源的数量为 17, B资源的数量为 5, C资源的数量为 20。在 T0时刻系统状态见右表所示。系统采用银行家算法实施死锁避免策略。最大资源需求量 Max已分配资源数量 AlocationA B C A B CP1 5 5 9 2 1 2P2 5 3 6 4 0 2P3 4 0 11 4 0 5P4 4 2 5 2 0 4P5 4 2 4 3 1 4请回答:a T0时刻是否为安全状态?若是,请给出安全序列。b在 T0时
9、刻若进程 P2请求资源( 0, 3, 4),是否能实施资源分配?为什么?c在 b的基础上,若进程 P4请求资源( 2, 0, 1),是否能实施资源分配?为什么?d在 c的基础上,若进程 P1请求资源( 0, 2, 0),是否能实施资源分配?为什么?3、有相同类型的 5个资源被 4个进程所共享,且每个进程最多需要 2个这样的资源就可以运行完毕。试问该系统是否会由于对这种资源的竞争而产生死锁。 解:该系统不会由于对这种资源的竞争而产生死锁。因为在最坏情况下,每个进程都需要 2个这样的资源,且每个进程都已申请到了 1个资源,那么系统中还剩下 1个可用资源。无论系统为了满足哪个进程的资源申请而将资源分
10、配给该进程,都会因为该进程己获得了它所需要的全部资源而确保它运行完毕,从而可将它占有的 2个资源归还给系统,这就保证了其余三个进程能顺利运行。由此可知,该系统不会由于对这种资源的竞争而产生死锁。4、已知某系统中的所有资源是相同的,系统中的进程严格按照一次一个的方式申请或释放资源。在此系统中,没有进程所需要的资源数量超过系统的资源总拥有数量,试对下面列出的各种情况说明是否会发生死锁。情况序号 系统中进程数 资源总量a 1 2b 2 1c 2 2d 2 3解:情况 a:因系统中仅存在 1个进程,且系统中资源总数为 2,由题目所给条件可知,该进程的最大资源需求量不超过 2,显然情况 a不会出现死锁。
11、情况 b:因系统中存在 2个进程,且系统中资源总数为 1,由题目所给条件可知,每个进程的最大资源需求量不超过 1。不妨设两个进程的最大资源需求量为1,若系统将资源分配给其中的一个进程,则此进程已获得它所需要的所有资源并将运行完毕,从而可将分配给它的资源归还给系统,使另一个进程也能顺利执行完成,故不会发生死锁。情况 c:因系统中存在 2个进程,且系统中资源总数为 2,由题目所给条件可知,每个进程的最大资源需求量不超过 2。假设两个进程的最大资源需求量为 2,若系统将资源分配给其中的一个进程,则此进程已获得它所需要的所有资源并将运行完毕,从而可将分配给它的资源归还给系统,使另一个进程也能顺利执行完
12、成,以这种方式分配资源不会发生死锁;若系统将资源分配给每个进程 1个,在此情况下,每个进程均获得 1个资源且系统中已没有空闲资源,当其中的一个进程再次申请 1个资源时,因系统中无空闲资源而使其等待,另一个进程的情况也是如此,因此以这种方式分配资源会发生死锁。 情况 d:因系统中存在 2个进程,且系统中资源总数为 3,由题目所给条件可知,每个进程的最大资源需求量不超过 3。假设两个进程的最大资源需求量为 3,若系统将资源分配给其中的一个进程,则此进程已获得它所需要的所有资源并将运行完毕,从而可将分配给它的资源归还给系统,使另一个进程也能顺利执行完成,以这种方式分配资源不会发生死锁;若系统将资源分
13、配给其中一个进程1个,另一个进程 2个,在此情况下,每个进程均获得部分资源且系统中已没有空闲资源,当其中的一个进程再次申请资源时,因系统中无空闲资源而使其等待,另一个进程的情况也是如此,因此以这种方式分配资源会发生死锁。 5、一台计算机有 8台磁带机。它们由 N个进程竞争使用,每个进程可能需要 3台磁带机。请问 N为多少时,系统没有死锁危险,并说明原因。 解:当 N为 1, 2, 3时,系统没有产生死锁的危险。因为,当系统中只有 1个进程时,它最多需要 3台磁带机,而系统有 8台磁带机,其资源数目已足够系统内的 1个进程使用,因此绝不可能发生死锁;当系统中有 2个进程时,最多需要 6台磁带机,
14、而系统有 8台磁带机,其资源数目也足够系统内的 2个进程使用,因此也不可能发生死锁:当系统中有 3个进程时,在最坏情况下,每个进程都需要 3个这样的资源,且假定每个进程都已申请到了 2个资源,那么系统中还剩下 2个可用资源,无论系统为了满足哪个进程的资源申请而将资源分配给该进程,都会因为该进程已获得了它所需要的全部资源而确保它运行完毕,从而可将它占有的 3个资源归还给系统,这就保证了其余进程能顺利运行完毕。由此可知,当 N为 1, 2, 3时,该系统不会由于对这种资源的竞争而产生死锁。 6、一个操作系统有 N个进程,竞争使用 M个同类资源,申请方式是逐个进行的,一旦某进程获得它所需要的全部资源
15、,则立即执行并归还所有资源。每个进程最多使用 k个资源。若仅考虑这类资源,该系统无可能产生死锁的条件是什么 ? 解 : 当满足 M=(k-1)N+1, 系统无可能产生死锁。7、设一系统有 m个相同类型的资源被 n个进程共享。每个进程每次只能申请或释放 1个资源。试证明:如果下面两条件满足,则系统不会发生死锁:a每个进程最多申请的资源数在 1到 m之间。b所有进程最多申请的资源总数小于 m+n。8、考虑下列资源分配策略;对资源的申请和释放可以在任何时候进行。如果一个进程提出资源请求时得不到满足,若此时无由于等待资源而被阻塞的进程,则自己就被阻塞;若此时已有等待资源而被阻塞的进程,则检查所有由于等
16、待资源而被阻塞的进程。如果它们有申请进程所需的资源,则将这些资源取出分配给申请进程。例如,考虑一个有 3类资源的系统,系统所有可用资源为(4, 2, 2),进程 A申请 (2, 2, 1),可满足;进程 B申请 (1, 0,1),可满足;若 A再申请 (0, 0, 1),则被阻塞。此时,若 C请求(2, 0, 0),它可以分到剩余资源 (1, 0, 0),并从 A已分到的资源中获得一个资源,于是进程 A的分配向量变成 (1, 2, 1),而需求向量变成 (1, 0, 1)。 这种分配策略会导致死锁吗 ?如果会,请举一个例子;如果不会,请说明产生死锁的哪一个必要条件不成立 ? 这种分配方式会导致
17、某些进程的无限等待吗 ?为什么 ? 分析及相关知识 所谓死锁是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将无法向前推进。死锁是计算机系统和进程所处的一种状态。发生死锁的必要条件有以下四个:互斥条件;不剥夺条件;部分分配条件;环路条件。解: 本题所给的资源分配策略不会产生死锁。因为本题给出的分配策略规定若一进程的资源得不到满足,则检查所有由于等待资源而被阻塞的进程,如果它们有申请进程所需要的资源,则将这些资源取出分配给申请进程。从而破坏了产生死锁必要条件中的不剥夺条件,这样系统就不会产生死锁。 这种方法会导致某些进程无限期的等待。因为被阻塞进程的资源可以被剥夺,所以被阻塞进程
18、所拥有的资源数量在其被唤醒之前只可能减少。若系统中不断出现其他进程申请资源,这些进程申请的资源与被阻塞进程申请或拥有的资源类型相同且不被阻塞,则系统无法保证被阻塞进程一定能获得所需要的全部资源。例如,本题中的进程 A申请 (2, 2, 1)后再申请 (0, 0, 1)被阻塞。此后,进程 C又剥夺了进程 A的一个资源,使得进程 A拥有的资源变为 (1, 2,1),其需求向量为 (1, 0, 1)。之后,若再创建的进程总是只申请第 1和第 3类资源,总是占有系统所剩下的第 1和第 3类资源的全部且不阻塞,那么进程 A将会无限期地等待。9、对图示的交通阻塞死锁现象,回答下面问题:a说明在此情况下,发生死锁的四个必要条件都满足。b试增加一个简单的约束,以避免死锁现象。c试按照死锁预防的方法,解决路口的交通问题。