(一)简答题
1.什么是临界资源?什么是临界区?
答:临界资源是指每次仅允许一个进程访问的资源。属于临界资源有硬件打印机、磁带机等,软件在消息缓冲队列、变量、数组、缓冲区等。
(2)不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区
2.同步机制应遵循的准则有哪些?
答:
同步机制应遵循的四个准则是:
(1) 空闲让进:当无进程处于临界区时,相应的临界资源处于空闲状态,因而应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用资源。
(2) 忙则等待:当已有进程进入临界区时,表示相应的临界资源正被访问,因而所 有其它试图进入相关临界区的进程必须等待,以保证诸进程互斥访问临界资源。
(3) 有限等待:对要求访问临界资源的进程,应保证该进程能在有限的时间内进入 自己的临界区,以免陷入“永远等待”状态。
(4) 让权等待:当进程不能进入临界区时,应立即释放处理器,以免陷入“忙等”状态。
3.为什么各进程对临界资源的访问必须互斥?
答: 临界资源本身的特性决定了它们只能被诸进程互斥地访问,如果并发执行的多个进程同时访问临界资源,将会造成系统的混乱或程序执行结果的不确定性,这样,用户得到的便可能是不希望得到的、或者是不正确的处理结果。如多个用户同时使用同一台打印机,将使他们的输出结果交织在一起,而难于区分;又如两个用户使用程序段:
mov ax.(counter)
inc ax
mov (counter),ax
对初值为0的共享变量counter 进行计数(加1)操作,则最终counter的值可能是正确的结果2,也可能是错误的结果1,即计算结果出现了不确定性。所以,诸进程对临界资源的访问必须互斥地进行。
4.如何保证各进程互斥地访问临界资源?
答:
为了互斥地访问临界资源,系统必须保证进程互斥地进入临界区。为此,必须在临界区前增加一段称作进入区的代码,以检查是否有其他进程已进入临界区使用临界资源。若有,则进程必须等待:否则,允许进程进入临界区,同时设置标志表示有进程正在临界区内。同样,在临界区后必须增加一段称作退出区的代码,用于将已有进程进入临界区访问临界资源的标志,改为无进程进入临界区使用临界资源。进入区、退出区具体可用多种同步机制实现,如锁、信号量机制等。
5.何谓“忙等”?它有什么缺点?
答:
所谓“忙等”是指“不让权”的等待,即进程因某事件的发生而无法继续执行时,它仍占有 CPU,并通过不断地执行植环画试相令来等待该事件的完成.
“忙等”的主要缺点是浪费 CPU的时间,另外,它还可能引起预料不到的后果。例如考虑某个采取高优先权优先调度原则的系统,目前有两个进程 A 和B共享某个临界资源,A的优先权较高,B的优先权较低,且B已处于临界区内,而A欲进入自己的临界区,则A、B都不可能继续向前推进,陷入“死等”状态。
6.试述采用Peterson算法实现临界区互斥的原理。
答:
Peterson算法是两个进程间的经典解决方案,用于实现临界区的互斥。该算法基于两个进程之间的协同工作,确保每次只有一个进程可以进入临界区。
以下是Peterson算法的基本原理:
两个标志位:每个进程都有一个标志位,表示其是否希望进入临界区。例如,对于两个进程P0和P1,有标志位flag[0]和flag[1]。
轮到谁:一个公共的变量
turn
用于表示哪个进程的轮次进入临界区。算法步骤:
- 当一个进程(例如P0)希望进入临界区时,它首先将其标志位设置为true,表示它希望进入临界区。
- 同时,它将
turn
设置为另一个进程的标号(在这里是1,表示P1)。- 然后它会检查另一个进程是否也想进入临界区(即flag[1]是否为true),以及
turn
是否指向它自己。只有当另一个进程不希望进入临界区,或者虽然另一个进程也想进入但turn
指向自己时,该进程才会进入临界区。- 完成临界区的操作后,该进程将其标志位设置为false,表示它已经退出了临界区。
互斥性:由于
turn
变量和flag
数组,任何时候只能有一个进程进入其临界区。空闲让权:如果一个进程不想进入临界区(其标志位为false),另一个进程可以自由地进入其临界区。
公平性:由于
turn
变量,算法确保没有进程会因连续进入临界区而饿死。
7.哪些硬件方法可以解决进程互斥问题?简述它们的用法。
答:
1)关中断:访问临界区时关闭中断。
2)TS(Test-and-Set):TS指令为每个临界区加一个布尔变量,每次进入临界区都必须使用TS指令测试变量。
3)swap指令:使用swap指令为每个进程设置一个局部变量key,使用swap指令交换key的值与临界资源锁的值,判断是否有进程正在访问。
8.如果用于进程同步的信号量的P、V操作不用原语实现,则会产生什么结果?举例说明。
答:如果用于进程同步的信号量的P(Proberen,尝试)和V(Verhogen,增加)操作不用原语(即原子操作)实现,它们就可能会被中断,从而导致竞态条件(Race Condition)。这可能会导致多个进程在不应该的时候同时进入临界区,从而破坏数据的一致性和完整性。
9.AND信号量机制的基本思想是什么?它能解决什么问题?
答:AND同步机制的基本思想是,将进程在整个运行过程中所需要的所有临界资源一次性全部分配给进程,待该进程使用完后再一起释放。只要尚有一个资源未能分配给该进程,其他所有可能为之分配的资源也不分配给它。亦即,对若干个临界资源的分配采取原子操作方式,要么全部分配到进程,要么一个也不分配。它能解决的问题:避免死锁的发生。
10.利用信号量机制实现进程互斥时,针对互斥信号量的wait()和signal()操作为什么要成出现?
答:
利用信号量机制实现进程互斥时,针对互斥信号量的
wait()
和signal()
操作需要成对出现是为了确保每当一个进程进入临界区时,其他进程不能同时进入。这对于保护临界资源和维护数据的一致性至关重要。
11.什么是管程?它有哪些特性?
答:
管程,是由局部于自己的若干公共变量及其说明和所有访问这些公共变量的过程所组成的软件模块。
具有以下特性:
•共享性
•安全性
•互斥性
12.试简述管程中条件变量的含义与作用。
答:
管程(Monitor)是一种同步原语,用于提供对临界资源的受控访问,并保证同一时刻只有一个进程或线程可以执行管程中的某一过程。而在管程中,条件变量是一个特别重要的组件,用于在某些条件下挂起和恢复进程的执行。
条件变量的含义:
条件:条件变量代表了一种或多种特定条件。例如,一个表示“缓冲区已满”的条件或“队列为空”的条件。
变量:这并不是传统意义上的变量。它不存储数据,而是提供了两个操作:
wait()
和signal()
(有时也有broadcast()
或其他操作,具体取决于实现)。条件变量的作用:
挂起进程:当进程发现某个条件不满足时(例如,消费者进程发现缓冲区为空),它可以使用条件变量的
wait()
操作来将自己挂起。唤醒进程:当某个条件从不满足变为满足时(例如,生产者进程在空的缓冲区中添加了一个项目),使用条件变量的
signal()
操作可以唤醒等待该条件的进程。避免忙等:而不是让进程持续检查某个条件是否满足(这会浪费CPU时间),进程可以简单地等待直到条件变得满足。这可以提高效率并减少资源浪费。
提供更细粒度的同步:与使用互斥量或信号量进行粗粒度同步相比,条件变量允许进程在更具体、更细粒度的条件下同步。这提供了更多的灵活性和效率
(二)计算题
13.若信号量的初值为2,当前值为-1,则表示有多少个等待进程?请分析。
14.有m个进程共享同一临界资源,若使用信号量机制实现对某个临界资源的互斥访间请求出信号量的变化范围。
15.若有4个进程共享同一程序段,而且每次最多允许3个进程进入该程序段,则信号量的变化范围是什么?
(三)综合应用题
16.3个进程P、P2、P3互斥地使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数,并用put()将其送入缓冲区的某一空单元中;P2每次用gem从该缓冲区中取出一个奇数,并用countodd()统计奇数的个数;P3每次用geteven()从该缓冲区取出一个偶数,并用counteven()统计偶数的个数。请用信号量机制实现这3个进程的同步轮活动,并说明所定义的信号量的含义。要求用伪代码描述。
17.某银行提供了1个服务窗口和10个供顾客等待时使用的座位。顾客然行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用.业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下。
cobegin{
process顾客i{
从取号机上获得一个号码;
等待叫号;获得服务;
}
process 营业员{
while(TRUE){
叫号;
为顾客服务;
}
}
}coend
请添加必要的信号量和P、V操作或wait()/signal()操作,实现上述过程中互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。