计算机操作系统【慕课版】课后习题解答

第四章 进程同步

一、简答题
1.什么是临界资源?什么是临界区?
临界资源:以互斥形式访问的资源;临界区:访问临界资源的代码。

2.同步机制应遵循的准则有哪些?
空闲让进;忙则等待;有限等待;让权等待。

3.为什么各进程对临界资源的访问必须互斥?
临界资源指的是每次只允许一个进程进行访问的软硬件资源,所以各进程对临界资源进行互斥访问。

4.如何保证各进程互斥地访问临界资源?
1)空闲让进 当临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,从 而有效的利用资源;
2)忙则等待 已经有进程进入临界区时,意味着相应的临界资源正在被访问,所以其他准备进 入临界区的进程必须等待,来保证多进程互斥;
3)有限等待 对要求访问临界资源的进程,应该保证该进程能在有效的时间内进入临界区,防止死等;
4)让权等待 当进程不能进入临界区,应该立即释放处理机,防止进程忙等待。

5.何谓“忙等”?它有什么缺点?
忙等:指的是进程要访问的临界资源被其他进程占用,此进程没有自旋锁便处于自旋状态即忙等状态。
缺点:占用CPU资源、降低CPU效率。

6.试述采用Peterson算法实现临界区互斥的原理。
皮特森算法是双标志加一把锁。首先说自已要(flag i = true),但是先谦让把钥匙给别人(key = j),若是别人也想要(flag j = true),别人也谦让key = i,自己便可以访问临界资源。

7.哪些硬件方法可以解决进程互斥问题?描述它们的用法。
1)关中断:访问临界区时关闭中断。
2)TS(Test-and-Set):TS指令为每个临界区加一个布尔变量,每次进入临界区都必须使用TS指令测试变量。
3)swap指令:使用swap指令为每个进程设置一个局部变量key,使用swap指令交换key的值与临界资源锁的值,判断是否有进程正在访问。

8.如果用于进程同步的信号量的P、V操作不用原语实现,则会产生什么后果?举例说明。
会导致信号量混乱或陷入死锁。如使用记录型信号量进行P操作被中断,s-value已经小于零,但是没有阻塞队列。

9.AND信号量机制的基本思想是什么?它能解决什么问题?
AND信号量机制的基本思想:在PV操作时,把所有进程请求的资源都分配给进程,要么分配够,要么一个也不分配。
解决了一个进程需要多个互斥资源才能执行的问题。

10.利用信号量机制实现进程互斥时,针对互斥信号量的wait()和signal()操作为什么要成对出现?
若只有P,没有V就会造z成进程死锁,若只有V,没有P会造成信号量失效。

11.什么是管程?它有哪些特征?
管程是代表共享数据结构,以及由对该共享数据结构实施操作的过程组成的资源管理程序,是操作系统的一个资源管理模块。特征如下:
1)抽象了临界资源。
2)对临界资源的访问只能调用管程进行。
3)只允许一个进程进入管程。

12.试简述管程中条件变量的含义与作用?
含义:管程为何种阻塞的原因都设置了条件变量,进程若因此原因而阻塞,会把这个进程挂在此条件变量的队列上,若是阻塞条件发生变换,则启动一个进程。
作用:为了解决管程中的进程不能被阻塞,而其他进程不能访问管程的问题。

二、计算题
13.若信号量的初值为2,当前值为-1,则表示有多少个等待进程?请分析。
1个等待进程;当前值为-1时,表示有一个进程正在临界区运行,而另一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程在退出时唤醒。

注:信号量的应用:
设mutex为互斥信号量,其初值为1,取值为(-1,0,1)。当mutex=1时,表示两个进程皆未进入需要互斥访问的临界区;当mutex=0时,表示有一个进程进入临界区运行,另一个必须等待,挂入阻塞队列;当mutex=-1时,表示有一个进程正在临界区运行,而另一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程在退出时唤醒。

14.有m个进程共享同一临界资源,若使用信号量机制实现对某个临界资源的互斥访问,请求出信号量的变化范围。
1到-(m-1) 即1到1-m;

分析:为实现互斥访问,初始值需要设置为1.如果某时刻信号量为-x,则证明等待队列中有x个进程在等待。此题中,有m个进程,那么最多就有m-1个进程等待。对应信号量的值就是-(m-1)=1-m。

15.若有4个进程共享同一程序段,而且每次最多允许3个进程进入该程序段,则信号量值的变化范围是什么?
信号量值的变化范围(3,2,1,0,-1)

结合14、15分析归纳:
设有m个进程共享一个互斥段,对于如下两种情况使用信号量,信号量的值应该怎样变化。
(1)如果每次只允许一个进程进入互斥段:
信号量的初值是1,变化量范围是:1,0,-1,-2,1-n
(2)如果每次最多允许n个进程(n 信号量的初值是n,变化量范围是:n,n-1,n-2…n-m

三、综合应用题
16.3个进程P1、P2、P3互斥地使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数,并用put()将其送入缓冲区的某一空单元中;P2每次用getodd()从缓冲区中取出一个奇数,并用countodd()统计奇数的个数;P3每次用geteven()从该缓冲区中取出一个偶数,并用counteven()统计偶数的个数。请用信号量机制实现这3个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。
这个我也没太懂,嘿嘿,来看看这位大神的描述吧!
本题详解

17.某银行提供了一个服务窗口和10个供顾客等待时使用的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下。

1	cobegin{
2		process顾客i{
3		 从取号机上获取一个号码;
4		 等待叫号;
5		 获取服务;
6		}
7		process营业员{
8		 while(TRUE){
9		  叫号;
10        为顾客服务;
11       }
12      }	
13   }coend

请添加必要的信号量和P、V操作或wait()、signal()操作,实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。

1	int i,j = 0 //i表示当前取号号码,j表示叫号号码
2	n = 10 //空位数
3	mutex_i ,mutex_j = 1 //互斥信号量
4		顾客{
5			p(mutex_i)
6			p(n)
7			i++
8			//取号,待叫号,待获得服务
9			v(mutex_i)
10		}
11		营业员{
12			if(j<i)
13			{
14			p(mutex_j)
15			v(n)
16			// 叫号,为j号服务
17			j++
18			v(mutex_j)
19			}
20		}

18.如图4-3所示,有1个计算进程和1个打印进程,它们共享一个缓冲区,计算进程不断计算出一个整型结果,并将它放入单缓冲区中;打印进程则负责从缓冲区中取出每个结果并进行打印。请用信号量机制来实现它们的同步关系。
计算机操作系统【慕课版】课后习题解答_第1张图片

可从临界资源的角度来思考,先找临界资源,并为每种临界资源设置信号量,在访问临界资源之前加wait操作来申请资源,访问完临界资源后加signal操作以释放临界资源。本题中有两类临界资源:第一类是计算进程争用的空闲缓冲区,初始状态下有一个空闲缓冲可供使用,故可为它设置初值为l的信号量empty;第二类是打印进程争用的已放入缓冲中的打印结果,初始状态下缓冲中无结果可供打印,故可为它设置初值为0的信号量full。当然个人感觉PV操作更简单。

19.有3个进程P1、P2、P3协作解决文件打印问题。P1将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;P2将缓冲区1中的内容复制到缓冲区2中,每执行一次复制一个记录;P3将缓冲区2中的内容打印出来,每执行一次打印一个记录。缓冲区的大小与记录大小一样。请用信号量来保证文件的正确打印。

semaphore mutex_1 = 1,mutex_2= 1,ok_1= 0,ok_2=0,ok_3= 1;
	P1{
		p(ok_3)
		p(mutex_1)v(mutex_1)
		v(ok_1)
	}
	P2{
		p(ok_1)
		p(mutex_1)
		p(mutex_2)v(mutex_1)
		v(mutex_2)
		v(ok_2)
	}
	P3{
		P(ok_2)
		p(mutex_2)v(mutex_2)
		v(ok_3)
	}

20.桌上有一个能盛得下5个水果的空盘子。爸爸不停的向盘中放苹果和橘子,儿子不停地从盘中取出橘子享用,女儿不停地从盘中取出苹果享用。规定3人不能同时向(从)盘子中放(取)水果。使用信号量机制来实现爸爸、儿子和女儿这3个“循环进程”之间的同步。

1	Semaphore empty=5,orange=0,apple=0,mutex=1;
2	Int buffer[5];
3	Dad(){	//父亲进程
4		Int nextp;
5		While(1){
6			Wait(empty);
7			Wait(mutex);
8			Buffer[in]:=nextp;
9			Signal(mutex);
10			If(buffer[in]=orange)
11			Signal(orange);
12			Else signal(apple);
13		}
14	}
15	Son(){	//儿子进程
16		Int nexts;
17		While(1){
18			Wait(orange);
19			Wait(mutex);
20			Nexts:=buffer(out);
21			Signal(mutex);
22			Signal(empty);
23			Eat;
24		}
25	}
26	daughter(){	 //女儿进程
27		Int nextt;
28		While(1){
29			Wait(apple);
30			Wait(mutex);
31			Nextt:=buffer(out);
32			Signal(mutex);
33			Signal(empty);
34			Eat;
35		}
36	}

21.试用记录型信号量写出一个不会死锁的哲学家进餐问题的算法。

semaphore n = 4
semaphore choptick[5] = {1,1,1,1,1}
while(1)
{
p(n)
p(choptick[i])
p(choptick[i+1]%5)
eat…
v(n)
v(choptick[i])
v(choptick[i+1]%5)
}

你可能感兴趣的:(课后习题,linux,windows,考研)