计算机操作系统复习题目2.docx
- 文档编号:11624964
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:36
- 大小:334.51KB
计算机操作系统复习题目2.docx
《计算机操作系统复习题目2.docx》由会员分享,可在线阅读,更多相关《计算机操作系统复习题目2.docx(36页珍藏版)》请在冰豆网上搜索。
计算机操作系统复习题目2
第二章进程管理
(三)进程同步
5、经典同步问题
1、生产者—消费者问题
生产者消费者问题是一种同步问题的抽象描述。
计算机系统中的每个进程都可以消
费(使用)或生产(释放)某类资源。
这些资源可以是硬件资源,也可以是软件资源。
当某一进程使用某一资源时,可以看作是消费,称该进程为消费者。
而当某一进程释放某一资源时,它就相当于生产者。
问题1:
设某计算进程CP和打印进程IOP共用一个单缓冲区,CP进程负责不断地计算数据并送入缓冲区T中,IOP进程负责不断地从缓冲区T中取出数据去打印。
通过分析可知,CP、IOP必须遵守以下同步规则:
(1)当CP进程把计算结果送入缓冲区时,IOP进程才能从缓冲区中取出结果去打印;
(2)当IOP进程把缓冲区中的数据取出打印后,CP进程才能把下一个计算结果送入缓冲区.
(3)为此设有两个信号量Sa=0,Sb=1,Sa表示缓冲区中有无数据,Sb表示缓冲区中有无空位置。
两个进程的同步可以描述如下:
问题2:
一组生产者通过具有N个缓冲区的共享缓冲池向一组消费者提供数据。
问题分析”:
为解决生产者消费者问题,应该设两个同步信号量,一个说明空缓冲区的数目,用empty表示,初值为有界缓冲区的大小N,另一个说明已用缓冲区的数目,用full表示,初值为0。
由于在此问题中有M个生产者和N个消费者,它们在执行生产活动和消费活动中要对有界缓冲区进行操作。
由于有界缓冲区是一个临界资源,必须互斥使用,所以,另外还需要设置一个互斥信号量mutex,其初值为1。
问题的解:
注意:
在每个程序中用于实现互斥的P(mutex)和V(mutex)必须成对的出现
对资源信号量empty和full的P和V操作,同样需要成对地出现,但它们分别处于不同的程序中。
在每个程序中的多个P操作顺序不能颠倒。
先同步后互斥。
2、哲学家就餐问题
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。
每个哲学家的行为是思考,感到饥饿,然后吃通心粉。
为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。
1、为防止死锁发生可采取的措施:
最多允许4个哲学家同时坐在桌子周围;仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子(AND信号量);给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。
设chopstick[5]为5个信号量,初值为均1。
设信号量S,初值为4
S用于封锁第5个哲学家
给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之;
设chopstick[5]为5个信号量,初值均为1;
Philosopheri:
repeat
思考;
if[imod2=1]then
{P(chopstick[i]);P(chopstick[(i+1)mod5]);
进食;
V(chopstick[i]);V(chopstick[(i+1)mod5]);
}
if[imod2=0]then
{
P(chopstick[(i+1)mod5]);
P(chopstick[i]);
进食;
V(chopstick[(i+1)mod5]);
V(chopstick[i]);
}
Untilfalse;
3、读者——写者问题
(1)有两组并发进程:
读者和写者,共享一组数据区
(2)要求:
允许多个读者同时执行读操作
不允许读者、写者同时操作
不允许多个写者同时操作
读者写者问题的解法:
设有两个信号量wmutex=1,rmutex=1
另设一个全局变量readcount=0
wmutex用于读者和写者、写者和写者之间的互斥
readcount表示正在读的读者数目
rmutex用于对readcount这个临界资源的互斥访问
读者:
repeat
P(rmutex);
if(readcount=0)then
P(wmutex);
readcount:
=readcount+1;
V(rmutex);
读;
P(rmutex);
readcount:
=readcount-1;
if(readcount=0)thenV(wmutex);
V(rmutex);
untilfalse;
写者:
repeat
P(wmutex);
写;
V(wmutex);
untilfalse;
同步与互斥的解题思路
①分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问题(具有前后执行顺序要求的)。
②对互斥问题要设置互斥信号量,不管有互斥关系的进程有几个或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允许一个进程对临界资源访问。
③对同步问题要设置同步信号量,通常同步信号量的个数与参与同步的进程种类有关,即同步关系涉及几类进程,就有几个同步信号量。
同步信号量表示该进程是否可以开始或该进程是否已经结束。
④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现同步的PV操作也必须成对出现,但可以分别出现在不同的进程中;在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P操作,但V操作的顺序没有严格要求。
同步与互斥的解题步骤
(1)确定进程。
包括进程的数量、进程的工作内容,可以用流程图描述。
(2)确定同步互斥关系。
根据是否使用的是临界资源,还是处理的前后关系,确定同步与互斥,然后确定信号量的个数、含义,以及对信号量的P、V操作。
(3)用类C语言描述同步或互斥算法。
第二章进程同步举例
例题1:
下面是两个并发执行的进程,他们能正确运行吗?
若不能,请举例说明,并改正。
intx;
Process_P1{
inty,z;
x=1;
y=0;
if(x>=1)
y=y+1;
z=y;
}
Process_P2{
intt,u;
x=0;
t=0;
if(x<=1)
t=t+2;
u=t;
}
例题1答案:
不能正确执行。
X是一个临界资源,没有保护。
intx;
Semaphoremutex=1;//访问X的互斥信号量
Process_P1{inty,z;
wait(mutex);
x=1;y=0;
if(x>=1)y=y+1;
signal(mutex);
z=y;
}
Process_P2{
intt,u;
wait(mutex)
x=0;
t=0;
if(x<=1)
t=t+2;
signal(mutex)
u=t;
}
例题2:
生产者—消费者问题演变。
一个buffer,一个生产者,一个消费者,生产者只生产一个东西,消费者只进行一次消费,即:
生产者只进行一次putdata操作,消费者只进行一次getdata操作。
例题2答案:
varfull:
semaphore:
=0;
buffer:
array[1]ofitem;
producer:
begin
putdata;
V(full);
end
consumer:
begin
P(full);
getdata;
end
例题3:
一个buffer,多个生产者,多个消费者,多个生产者和消费者都在不断地存取buffer,即生产者不断地进行putdata操作,消费者不断地进行getdata操作。
例题4:
三个进程P1P2P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。
请用信号量机制实现这三个进程的同步互斥活动,并说明所定义的信号量的含义(要求用伪代码描述)。
例题4答案:
【答案】
(1)缓冲区是一互斥资源,因此设互斥信号量mutex。
(2)同步问题:
P1、P2因为奇数的放置与取用而同步,设同步信号量odd;P1、P3因为偶数的放置与取用而同步,设同步信号量even;P1、P2、P3因为共享缓冲区,设同步信号量empty。
Semaphoremutex=1;
Semaphoreodd=0,even=0;
Semaphoreempty=N;
Semaphoremetux=1;//缓冲区操作互斥信号量
Semaphoreodde=0,even=0;//奇数偶数进程的同步信号量
Semaphoreempty=N;//空缓冲区单元个数信号量
P1(){
X=produce();//生成一个数
wait(empty);//判断缓冲区是否有空缓冲区
wait(mutex);//互斥访问缓冲区
put();
if(X%2==0)
signal(even);//如果是偶数向P3发出信号
else
signal(odd);//如果是奇数向P2发出信号
signal(mutex);//使用完缓冲区释放
}
P2(){
wait(odd);//是否已产生一个奇数
wait(mutex);//互斥访问缓冲区
getodd();
countodd()=countodd()+1;
signal(mutex);//使用完缓冲区释放
signal(empty);//向P1发出信号,多出一个空单元
P3(){
wait(even);//是否已产生一个偶数
wait(mutex);//互斥访问缓冲区
geteven();
counteven()=counteven()+1;
signal(mutex);//使用完缓冲区释放
signal(empty);//向P1发出信号,多出一个空单元
例:
有3个并发进程R、M、P,它们共享同一个缓冲区,假定缓冲区只能存放一条记录。
进程R负责从输入设备读信息,每读入一个记录后,就把它放进缓冲区;进程M在缓冲区中加工读入的记录;进程P把加工后的记录打印输出。
读入的记录经加工输出后,缓冲区又可以存放下一个记录。
试写出他们能够正确执行的并发程序。
(华南理工大学2006年)
【答案】此题类似与生产者消费者问题
三进程之间的合作关系
由图中可知有三个同步关系:
①读进程与加工进程的同步,
②加工进程与打印进程的同步,
③打印进程与读进程之间的同步,
每一个同步设置一个同步信号量。
①设置一个信号量m1,表示缓冲区是否有未被处理的记录,初值为0,未被处理则由进程M进行处理,在加工进程加工之前加P操作,在读进程加入未处理记录之后加V操作;
②设置一个信号量m2,表示缓冲区是否有被处理过的记录,初值为0,如果有处理过的记录则由进程P取走记录进行打印,在打印进程取数据之前加P操作,在加工进程处理完记录之后加V操作;
③设置一个信号量empty表示缓冲区是否为空,其初值是1,如果为空则进程R可读入数据,在打印数据取走记录之后加V操作,在读入进程放记录之前加P操作。
设置一个互斥信号量mutex,使各进程互斥的访问缓冲区,初值为1。
注意先同步后互斥。
P(R):
(读入进程)
Begin
Repeat
读入一个记录
P(empty);
P(mutex);
将记录放入缓冲区;
V(mutex);
V(m1)
Untilfalse;
End
P(M):
(加工进程)
Begin
Repeat
P(m1);
P(mutex);
在缓冲区中加工记录;
V(mutex);
V(m2)
Untilfalse;
End
P(P):
(打印进程)
Begin
Repeat
P(m2);
P(mutex);
将缓冲区中记录取出;
V(mutex);
V(empty);
打印记录;
Untilfalse;
End
例:
用P、V操作实现下述问题的解。
桌上有一个盘子,可以存放一个水果。
父亲总是放苹果到盘子中,而母亲总是放香蕉到盘子中:
一个儿子专等吃盘中的香蕉,而一个女儿专等吃盘中的苹果。
【答案】在本题中,父亲、母亲、儿子和女儿共用一个盘子,盘子一次只能放一个水果。
当盘子为空时,父亲及母亲均可试着将一个水果放入盘子中,但一次只能有一个人成功放入水果。
若放入盘子中的是香蕉,则允许儿子吃,女儿必须等待;若放入盘子中的是苹果,则允许女儿吃,儿子必须等待。
在本题中,应设置三个信号量dish、apple、banana,信号量dish表示盘子是否为空,其初值为1;信号量apple表示盘中是否有苹果,其初值为0;信号量banana表示盘中是否有香蕉,其初值为0。
进程之间的同步描述如下:
semaphoredish=1;
semaphoreapple=0;
semaphorebanana=0;
father()
{
while(true)
{
p(dish);
将苹果放入盘中;
v(apple);
}}
mother()
{
while(true)
{
p(dish);
将香蕉放入盘中;
v(banana);
}
}
son()
{
while(true)
{
p(banana);
从盘中取出香蕉;
v(dish);
吃香蕉;
}
}
daughter()
{
while(ture)
{
p(apple);
从盘中取出苹果;
v(dish);
吃苹果;
}
}
哲学家就餐扩展
哲学家甲请哲学家乙、丙、丁到某处讨论问题,约定全体到齐后开始讨论;在讨论的间隙思维哲学家进餐,每人进餐时都需使用刀、叉各一把,餐桌上的布置如图所示。
请用信号量及P、V操作说明这四位哲学家的同步、互斥过程。
【答案】在本题中,思维哲学家讨论问题期间的生活方式为交替地进行讨论和进餐。
由于刀和叉资源均为2,而哲学家有四位,这就会出现资源竞争,为此应对他们的进餐进行同步控制。
在本题解决方案中规定:
所有哲学家先申请使用刀,申请到刀后在申请使用叉,刀和叉都拿到后才能进餐。
在本题中,应设置四个信号量fork1、fork2、knife1、knife2,其初值均为1,分别表示资源叉1、叉2、刀1、刀2是否可用。
进程之间的同步描述如下:
semaphorefork1=1;
semaphorefork2=1;
semaphoreknife1=1;
semaphoreknife2=1;
pa()
{while(true)
{
p(knife1);p(fork1);
进餐;
v(knife1);v(fork1);
讨论问题;
}}
Pb()
{
while(true)
{
p(knife2);
p(fork1);
进餐;
v(knife2);
v(fork1);
讨论问题;
}}
pc()
{
while(true)
{
p(knife2);
p(fork2);
进餐;
v(knife2);
v(fork2);
讨论问题;
}}
pd()
{
while(true)
{
p(knife1);
p(fork2);
进餐;
v(knife1);
v(fork2);
讨论问题;
}}
例题5
生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成。
功能如下:
①进程A专门拣黑子,进程B专门拣白子;
②每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子。
Begin
s:
semaphore;
s:
=1;
processA;processB
Beginbegin
L1:
P(s);L2:
P(s);
拣黑子;拣白子;
V(s);V(s);
gotoL1;gotoL2;
end;end;
例题6
如下锁的实现方法存在什么缺点?
如何改进?
LOCK(X)UNLOCK(X)
{{
dowhileX=1;X=0;
X=1
}}
例题6答案:
【解】存在的缺点是:
当锁是关闭时,采用的是循环等待的方法,这样的等待还是要占用处理机的时间,应该采用阻塞等待的方法。
改进的锁实现如下:
LOCK(X)UNLOCK(X)
{{
ifX.value=1ifnotempty(X.L)
{insert(*,X.L);{P=remove(X.L);
Block(*)Wakeup(P)
}}
elseX.Value=1elseX.Value=0
}}
这里X.value是锁的值,X。
L是存放由于锁X而阻塞的进程的队列。
insert(*,X.L)将当前进程的进程号插入到X。
L,remove(X.L)是从X.L中移出一个进程号。
例题7:
多个进程对信号量S进行了5次P操作,2次V操作后,现在信号量的值-3,与信号量S相关的处于阻塞状态的进程有几个?
信号量的初值是多少?
【解】
(1)因为S的当前值是-3,因此因为S处于阻塞状态的进程有3个;
(2)因为每进行一次P(S)操作,S的值都减1,每执行1次V操作S的值加1,故信
量的初值为-3+5-2=0;
例题8:
如果信号量S的初值是5,现在信号量的值是-5,那么系统中的相关进程至少执行了几个P(S)操作?
与信号量S相关的处于阻塞状态的进程有几个?
如果要使信号量S的值大于0,应该进行怎样的操作?
【解】
(1)因为每执行一次P操作S的值减1,5-(-5)=10,在这期间有可能有进程执行V
操作,使S的值加1,所以至少执行了10次P(S);
(2)5个;
(3)6个V(S)或5个以上。
例题9:
设与某资源相关联的信号量初值为3,当前值为1,若M表示该资源的可用个数,N表示等待该资源的进程数,则M,N分别是()。
(2010年统考)A、0,1B、1,0C、1,2D、2,0
【答案】B【解析】信号量初值为3,表示系统中拥有资源个数为3,当前值为1,表明已经分配出去两个,还有一个没有分配出去,则该资源可用个数为1,既然有可用的资源就不存在等待该资源的进程,所以为0。
例题10。
()是可以用来解决临界区问题A.银行家算法B.测试与设置(Test-and-Set)C.时间片轮转算法D.LRU算法
【答案】B
例题11(2010统考)进程P0和P1的共享变量定义及其初值为
booleanflat[2];intturn=0;flag[0]=FALSE;flat[1]=FALSE;
若进程P0和P1访问临界资源的类C代码实现如下
voidP0()//P0进程{while(TURE);
{flat[0]=TRUE;turn=1;while(flag[1]&&turn=1);
临界区
flat[0]=FALSE;
}}
voidP1()//P1进程
{while(TRUE)
{flat[1]=TRUE;turn=0;while(flag[0]&&turn==0);
临界区
flat[1]=FALSE;
}}
例:
则并发执行进程P0和P1时产生的情况是()
A.不能保证进程互斥进入临界区、会出现“饥饿”现象
B.不能保证进程互斥进入临界区、不会出现“饥饿”现象
C.能保证进程互斥进入临界区、会出现“饥饿”现象
D.能保证进程互斥进入临界区、不会出现“饥饿”现象
【答案】D
例题12在操作系统中,P、V操作是一种。
A.机器指令B.系统调用命令C.作用控制命令D.低级进程通信原语
【答案】D【解析】P、V操作交换的信息量小,是低级进程通信原语。
例题13用P、V操作管理临界区时,信号量的初值定义为。
A.-1B.0C.1D.任意值
【答案】C【解析】临界资源的访问应互斥进行,故信号量初值为1。
例题14对于两个并发进程,设互斥信号量为mutex,若mutex=0,则。
A.表示没有进程进入临界区
B.表示有一个进程进入临界区
C.表示有一个进程进入临界区,另一个进程等待进入
D.表示有两个进程进入临界区
【答案】B【解析】互斥信号量的初值为1:
当有一个进程进入临界区且没有进程等待进入临界区时,互斥信号量的值为0;当有一个进程进入临界区且有一个进程等待进入临界区时,互斥信号量的值为-1。
例题15、有m个进程共享同一临界资源,若使用信号量机制实现对临界资源的互斥访问,则信号量值的变化范围是。
【答案】1至-(m-1)【解析】临界资源应互斥使用,互斥信号量m的初值为1。
当没有进程使用临界资源时,m值为1;有一个进程使用临界资源且无进程等待使用该资源时,m值为0;有一个进程使用临界资源且有一个进程等待使用该资源时,m值为-1;依次类推,最多可能有m-1个进程等待使用该临界资源。
例题16、设有4个进程共享一程序段,而每次最多允许2个进程进入该程序段,则信号量的取值范围是
【答案】2至-2。
【解析】为允许2个进程进入该程序段,信号量的初值应为2;当有1个进程进入该程序段且无其他进程申请进入该程序段时,信号量值为1;当有2个进程进入该程序段且无其他进程申请进入该程序段时,信号量值为0;当有2个进程进入该程序段且有2个进程申请进入该程序段时,信号量值为-2。
例题17。
在OS中引入管程的目的是什么?
解:
在OS中引入管程的目的是为了更简便、更可靠地解决进程之间的同步、互斥问题。
在未引入管程之前,进程间的同步、互斥问题是由程序员处理的。
例如,在临界区的前后插入P、V操作。
但是,由程序员处理同步、互斥问题有可能引入种种人为的错误。
管程主要是管理对共享数据的操作和使用,即把对共享数据互斥使用的控制这一任务从程序员身上,交由编译程序去处理,这样既方便了编程,又不会产生人为的同步、互斥上的错误。
例题18、下述哪个选项不是管程的组成部分。
A.局部于管程的共享数据结构
B.对管程内数据结构进行操作的一组过程
C.管程外过程调用管程内数据结构的说明
D.对局部于管程的数据结构设置初始值的语句
【答案】C【解析】管程由局部于管程的共享变量说明、对管程内数据结构进行操作的一组过程以及对局部于管程的数据设置初始值的语句组成。
例题19、每个管程管理若干临界资源,进程要进入管程,其方法是调用特定的入口程序,管程内部任
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 复习 题目