习题解答——第3章 进程同步与通信

合集下载

进程的同步与通信

进程的同步与通信
1.
习题6解答1

进程间的制约关系有三类:
读者之间允许同时读 读者与写者之间互斥 写者之间互斥。

解决上述三类的同步
读互斥变量rmutex,使读者互斥地访问共享变量
count 写互斥变量wmutex,用于写者与其它的互斥 共享变量count,用于记录当前读者的数目。
习题6解答2
分析:生产者—消费者问题的变形,两类产品
和两类消费者。
习题5解答

S=1; Sa=0; So=0; //盘子,苹果,桔子 father() { while(1) { p(S); 放水果; if (放桔子) v(So); else v(Sa); }
习题5解答(续)
son() { while(1) { p(So); 拿桔子; v(S); 吃桔子; }
习题2答案

有n个进程都要使用某个共享文件,但系统 限制最多m个进程(n>m>1)同时读文件。 用PV操作管理时信号量的值不可能变化为 (B)。
A) 1
B) n
C) m
D) m-n
习题3

以下活动属于互斥关系还是同步关系?
若干同学去图书馆借书 两队举行篮球赛 流水线生产的各道工序 商品生产和社会消费
习题7

有一个仓库,可以存放A和B两种产品,但 要求:
每次只能存入一种产品(A或B); 2. -N < A数量-B数量 < M。 其中,N和M是正整数。试用P、V操作描述产 品A与B的入库过程。
1.
ห้องสมุดไป่ตู้
习题7解答

mutex=1; sa=M-1; sb=N-1; //允许sa个A入库 process() { while(1) { 取一个产品; if(取的是A产品) { p(sa); p(mutex); 产品入库; v(mutex); v(sb);

第3章死锁习题及答案

第3章死锁习题及答案

第三章死锁习题一、填空题1.进程的“同步”和“互斥”反映了进程间①和②的关系。

【答案】①直接制约、②间接制约【解析】进程的同步是指在异步环境下的并发进程因直接制约而互相发送消息,进行相互合作、相互等待,使得各进程按一定的速度执行的过程;而进程的互斥是由并发进程同时共享公有资源而造成的对并发进程执行速度的间接制约。

2.死锁产生的原因是①和②。

【答案】①系统资源不足、②进程推进路径非法【解析】死锁产生的根本原因是系统的资源不足而引发了并发进程之间的资源竞争。

由于资源总是有限的,我们不可能为所有要求资源的进程无限地提供资源。

而另一个原因是操作系统应用的动态分配系统各种资源的策略不当,造成并发进程联合推进的路径进入进程相互封锁的危险区。

所以,采用适当的资源分配算法,来达到消除死锁的目的是操作系统主要研究的课题之一。

3.产生死锁的四个必要条件是①、②、③、④。

【答案】①互斥条件、②非抢占条件、③占有且等待资源条件、④循环等待条件【解析】互斥条件:进程对它所需的资源进行排它性控制,即在一段时间内,某资源为一进程所独占。

非抢占条件:进程所获得的资源在未使用完毕之前,不能被其它进程强行夺走,即只能由获得资源的进程自己释放。

占有且等待资源条件:进程每次申请它所需的一部分资源,在等待新资源的同时,继续占有已分配到的资源,循环等待条件:存在一进程循环链,链中每一个进程已获得的资源同时被下一个进程所请求。

4.在操作系统中,信号量是表示①的物理实体,它是一个与②有关的整型变量,其值仅能由③原语来改变。

【答案】①资源,②队列,③P-V【解析】信号量的概念和P-V原语是荷兰科学家E.W.Dijkstra提出来的。

信号量是一个特殊的整型量,它与一个初始状态为空的队列相联系。

信号量代表了资源的实体,操作系统利用它的状态对并发进程共享资源进行管理。

信号量的值只能由P-V原语来改变。

5.每执行一次P原语,信号量的数值S减1。

如果S>=0,该进程①;若S<0,则②该进程,并把它插入该③对应的④队列中。

第3章 进程的同步与通信

第3章 进程的同步与通信

2)打印进程只有当缓冲区有结果时,才能从缓冲区取
计算结果打印。
定义两个信号量:Sempty、 Sfull ,用于控制这两个约束:
Sfull — 控制打印进程从缓冲区取计算结果打印。 Sempty — 控制计算进程向缓冲区送计算结果。
设: Sempty 初值为1 Sfull初值为0 — 表示缓冲区为空。
(proposed by Dijkstra in 1965)
What a Semaphore is?
An integer variable Represent the number of resources available
(when it is greater than or equals to 0) Represent the number of processes waiting for the
Chap.3 进程的同步与通信 本章讨论的主要问题
1、如何控制和协调并发进程异步执行 的时序?
进程的同步机制
2、进程之间如何互相联系,传递信息?
进程的通信
3.1 进程间的相互作用
进程间的联系 进程的同步机制──信号量及P.V操
作(解决进程同步互斥问题)
1.进程间的联系
相交进程与无关进程 相交进程:指多个并发进程在逻辑上有
resources( when it is less than 0)
Operations on a semaphore
Initialization P operation ------- to test V operation ------- to increment
信号量:semaphore
② P、V操作有严格的不可分割性;执行过程不允许中断; ③ P、V操作成对出现。

(完整版)第三章进程同步与通信作业习题与答案

(完整版)第三章进程同步与通信作业习题与答案

第三章一.选择题(50题)1.以下_B__操作系统中的技术是用来解决进程同步的。

A.管道B.管程C.通道D.DMA2.以下_B__不是操作系统的进程通信手段。

A.管道B.原语C.套接字D.文件映射3.如果有3个进程共享同一程序段,而且每次最多允许两个进程进入该程序段,则信号量的初值应设置为_B__。

A.3B.2C.1D.04.设有4个进程共享一个资源,如果每次只允许一个进程使用该资源,则用P、V 操作管理时信号量S的可能取值是_C__。

A.3,2,1,0,-1B.2,1,0,-1,-2C. 1,0,-1,-2,-3D.4,3,2,1,05.下面有关进程的描述,是正确的__A__。

A.进程执行的相对速度不能由进程自己来控制B.进程利用信号量的P、V 操作可以交换大量的信息C.并发进程在访问共享资源时,不可能出现与时间有关的错误D.P、V操作不是原语操作6.信号灯可以用来实现进程之间的_B__。

A.调度B.同步与互斥C.同步D.互斥7.对于两个并发进程都想进入临界区,设互斥信号量为S,若某时S=0,表示_B_ _。

A.没有进程进入临界区B.有1个进程进入了临界区C. 有2个进程进入了临界区D. 有1个进程进入了临界区并且另一个进程正等待进入8. 信箱通信是一种_B__方式A.直接通信B.间接通信C.低级通信D.信号量9.以下关于临界区的说法,是正确的_C__。

A.对于临界区,最重要的是判断哪个进程先进入B.若进程A已进入临界区,而进程B的优先级高于进程A,则进程B可以打断进程A而自己进入临界区C. 信号量的初值非负,在其上只能做PV操作D.两个互斥进程在临界区内,对共享变量的操作是相同的10. 并发是指_C__。

A.可平行执行的进程B.可先后执行的进程C.可同时执行的进程D.不可中断的进程11. 临界区是_C__。

A.一个缓冲区B.一段数据区C.一段程序D.栈12.进程在处理机上执行,它们的关系是_C__。

考研操作系统-进程的同步与通信

考研操作系统-进程的同步与通信

考研操作系统-进程的同步与通信(总分:82.00,做题时间:90分钟)一、单项选择题(总题数:12,分数:24.00)1.相关临界区是指( )。

A.一个共享资源B.并发进程中涉及相同变量的那些程序段√C.并发进程中与共享变量有关的程序段D.一个独占资源2.下列关于P、V操作的说法中正确的是( )。

A.P、V操作是两个操作,而且都是原语操作√B.P、V操作中P操作可以不用原语方式,而V操作必须使用原语操作C.P、V操作是一个过程,同一般函数,过程一样,只是执行管理临界区的操作D.P、V操作中P操作必须使用原语方式,而V操作可以不使用原语操作3.由于并发进程之间( )不能由进程本身控制,当它们在共享某些资源的时候可能会产生与时间有关的错误。

A.分配外部设备B.分配内存空间C.执行的相对速度√D.占用存储器的位置4.下面对线程的描述中,错误的是( )。

A.同一进程中的线程可共享该进程的主存空间B.线程是调度和执行单位C.不同的线程可执行相同的程序D.线程是资源分配单位√5.如果有4个进程共享同一程序段,每次允许3个进程进入该程序段,若用P、V操作作为同步机制,则信号量的取值范围是( )。

A.4,3,2,1,-1B.2,1,0,-1,-2C.3,2,1,0,-1 √D.2,1,0,-2,-36.在进程通信中,( )常用信件交换信息。

A.低级通信B.高级通信√C.信息缓冲D.消息通信7.下列关于进程和线程的说法中正确的是( )。

A.线程是进程中可独立执行的子任务,一个进程可以包含一个或多个线程,一个线程可以属于一个或多个进程B.多线程技术具有明显的优越性,如速度快、通信简便、设备并行性高等√C.由于线程不作为资源分配单位,线程之间可以无约束地并行执行D.线程又称为轻型进程,因为线型都比进程小8.并发进程之间相互通信时两个基本的等待事件是( )。

A.等信件和等信箱√B.等消息和等信件C.等发送原语和接收原语D.等消息和等信箱9.对若干个并发进程共享某—变量的相关临界区的管理,下列说法中不正确的是( )。

第3章 进程同步与通信_2

第3章  进程同步与通信_2
semaphore mutex = 1, s = 100; void consumeri(void) (i=1,2,…,k) { while(TRUE){ P(s); P(mutex); 进超市入口处,取一辆购物车; 进超市入口处,取一辆购物车; V(mutex); …… 购物; 购物 …… P(mutex); 结帐,并归还购物车; 结帐,并归还购物车 V(mutex); V(s); } }
吃水果问题2 吃水果问题
题目:桌上有一只盘子,允许存放一个水果, 题目:桌上有一只盘子,允许存放一个水果,父亲 专向盘中放苹果,母亲专向盘中放桔子, 专向盘中放苹果,母亲专向盘中放桔子,儿子专等 吃盘里的桔子,女儿专等吃盘里的苹果。 吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子 则父亲或母亲可向盘中放水果, 空,则父亲或母亲可向盘中放水果,仅当盘中有自 己需要的水果时,儿子或女儿可从中取出。 己需要的水果时,儿子或女儿可从中取出。 请给出四人之间的同步关系,并用 操作实现四人 请给出四人之间的同步关系,并用PV操作实现四人 正确活动的程序。 正确活动的程序。
用信号量解决“生产者 消费者 生产者-消费者 用信号量 生产者 消费者”问 题
semaphore mutex =1; semaphore empty = n; semaphore full = 0; int i,j; ITEM buffer[n]; ITEM data_p, data_c;
void producer() //生产者进程 void consumer()//消费者进程 生产者进程 消费者进程 {while (true) {while (true) {produce an item in data_p; { P(full); P(empty); P(mutex); P(mutex); data_c = buffer[j]; buffer[i] = data_p; j = (j + 1) % n; i = (i + 1) % n; V(mutex); V(mutex); V(empty); V(full);} consume the item in data_c;} } }

进程同步与通信作业习题与答案

进程同步与通信作业习题与答案

第三章一.选择题(50题)1.以下_B__操作系统中的技术是用来解决进程同步的。

A.管道B.管程C.通道2.以下_B__不是操作系统的进程通信手段。

A.管道B.原语C.套接字D.文件映射3.如果有3个进程共享同一程序段,而且每次最多允许两个进程进入该程序段,则信号量的初值应设置为_B__。

4.设有4个进程共享一个资源,如果每次只允许一个进程使用该资源,则用P、V操作管理时信号量S的可能取值是_C__。

,2,1,0,-1 ,1,0,-1,-2 C. 1,0,-1,-2,-3 ,3,2,1,05.下面有关进程的描述,是正确的__A__。

A.进程执行的相对速度不能由进程自己来控制B.进程利用信号量的P、V 操作可以交换大量的信息C.并发进程在访问共享资源时,不可能出现与时间有关的错误、V操作不是原语操作6.信号灯可以用来实现进程之间的_B__。

A.调度B.同步与互斥C.同步D.互斥7.对于两个并发进程都想进入临界区,设互斥信号量为S,若某时S=0,表示_B__。

A.没有进程进入临界区B.有1个进程进入了临界区C. 有2个进程进入了临界区D. 有1个进程进入了临界区并且另一个进程正等待进入8. 信箱通信是一种_B__方式A.直接通信B.间接通信C.低级通信D.信号量9.以下关于临界区的说法,是正确的_C__。

A.对于临界区,最重要的是判断哪个进程先进入B.若进程A已进入临界区,而进程B的优先级高于进程A,则进程B可以打断进程A而自己进入临界区C. 信号量的初值非负,在其上只能做PV操作D.两个互斥进程在临界区内,对共享变量的操作是相同的10. 并发是指_C__。

A.可平行执行的进程B.可先后执行的进程C.可同时执行的进程D.不可中断的进程11. 临界区是_C__。

A.一个缓冲区B.一段数据区C.一段程序D.栈12.进程在处理机上执行,它们的关系是_C__。

A.进程之间无关,系统是封闭的B.进程之间相互依赖相互制约C.进程之间可能有关,也可能无关D.以上都不对13. 在消息缓冲通信中,消息队列是一种__A__资源。

第3章 进程同步与通信2

第3章 进程同步与通信2

进程写管道
进程向管道写数据时,可能有以下两种情况:
管道中有足够的空间存放要写的数据,此时每写 一数据块后核心便自动增加地址项的大小.写操 作完成后,核心修改索引节点中的写指针,并唤 醒所有因该管道空而睡眠等待的读进程. 管道中无足够的空间存放要写入的数据,此时核 心对该索引节点作标记后让写进程睡眠,等待数 据从管道中排出.上述情况的一个例外是,当进 程写的数据量大于管道的容量时,核心将尽可能 多的数据写到管道中,然后使进程睡眠,直到获 得更多的空间.
pipe文件的建立 文件的建立
pipe系统调用建立一个无名管道.其语法格式如下:
int pipe(fdes); int fdes[2];
核心创建一个管道时须完成下述工作:
分配磁盘和内存索引节点. 为读进程和写进程分配文件表项. 分配用户文件描述符.在读进程和写进程的用户文件描述 符表中,分别分配一个表项,并将文件描述符fdes[0]和 fdes[1]分别返回给读进程和写进程.
设置信号的处理方式
系统调用signal用于设置信号的处理方式.其 语法格式如下: void (* func)( ) signal(sig,func) 其中,func为收到软中断信号sig后进程希望 调用函数的地址. 19类信号如表所示.
func的取值情况
func的取值可以分成三种情况:
func=1时,进程对信号sig不予理睬. func=0时,即缺省处理,对大多数软中断信号的 缺省处理是终止进程. func为其他整数值时,它的值是指向信号处理程 序的指针.
管道通信示意图1
初始时,其长度为4,系统将管道看成一个循环 队列.按先进先出的方式读写.
A out B C D in
写入字符E后,管道长度为5

操作系统课后习题答案 3 进程同步与通信

操作系统课后习题答案 3 进程同步与通信

习题 3 进程同步与通信一、选择题题号1 2 3 4 5 6 7 8 9 10答案A D D C B C A B A A题号11 12答案D C二、综合题1、答:临界资源也称独占资源、互斥资源,它是指某段时间内只充许一个进程使用的资源。

比如打印机等硬件资源,以及只能互斥使用的变量、表格、队列等软件资源。

各个进程中访问临界资源的、必须互斥执行的程序代码段称为临界区,各进程中访问同一临界资源的程序代码段必须互斥执行。

为防止两个进程同时进入临界区,可采用软件解决方法或同步机构来协调它们。

但是,不论是软件算法还是同步机构都应遵循下述准则:①空闲让进。

②忙则等待。

③有限等待。

④让权等待。

2、答:忙等待意味着一个进程正在等待满足一个没有闲置处理器的严格循环的条件。

因为只有一个CPU 为多个进程服务,因此这种等待浪费了CPU 的时钟。

其他类型的等待:与忙等待需要占用处理器不同,另外一种等待则允许放弃处理器。

如进程阻塞自己并且等待在合适的时间被唤醒。

忙等可以采用更为有效的办法来避免。

例如:执行请求(类似于中断)机制以及PV 信号量机制,均可避免“忙等待”现象的发生。

3、答:在生产者—消费者问题中,Producer 进程中P(empty)和P(mutex)互换先后次序。

先执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没有空缓冲区可供其使用,后续的P(empty)原语没有通过,Producer 阻塞在信号量empty 上,而此时mutex 已被改为0,没有恢复成初值1。

切换到消费者进程后,Consumer 进程执行P(full)成功,但其执行P(mutex)时由于Producer 正在访问缓冲区,所以不成功,阻塞在信号量mutex 上。

生产者进程和消费者进程两者均无法继续执行,相互等待对方释放资源,会产生死锁。

在生产者和消费者进程中,V 操作的次序无关紧要,不会出现死锁现象。

第3章课后习题+进程同步与通信

第3章课后习题+进程同步与通信

售票大厅可容纳200
人购票,说明最多允 许200人共享售票大 厅,用信号量empty 表示,初值为200;
售票员一次只能为一 个购票者服务,说明 必须互斥地进行购票 ,用信号量mutex表 示,初值为1。
5. 进程之间的关系如图3-16所示,试用P、V操作描 述它们之间的同步。
A
S2 C
S1 B
S4 F D
答:同步关系;因为一个工序必须在前一个工序完成后才能开始, 他们必须相互协作才能使进程圆满完成。
(4)商品的入库出库。
答:同步关系;因为商品出库可以为入库提供空间。
(5)工人做工与农民种粮。
答:没有制约关系。
4. 设有一个售票大厅,可容纳200人购票。如果厅 内不足200人则允许进入,超过则在厅外等候; 售票员某时只能给一个购票者服务,购票者买完 票后就离开。试问:
(1)购票者之间是同步关系还是互斥关系?
答:互斥关系。只能有一个人获得售票员的服务。
(2)用P、V操作描述购票者的工作过程。
semaphore empty=200; semaphore mutex=1;
void buyer() { P(empty);
P(mutex); 买票; V(mutex); V(empty); }
wait(mutexB); if (countB==0) wait(mutex);
countB++; signal(mutexB);
过桥;
wait(mutexB); countB--;
if (countB==0) signal(mutex); signal(mutexB); }
S3
S5
E
S6 G
semaphore A,B,C,D,E,F,G=0,0,0,0,0,0,0; P1( ){S1;V(A);V(B);} P2( ){P(A);S2;V(C);} P3( ){P(B);S3;V(D);V(E);} P4( ){P(D);S4;V(F);} P5( ){P(E);S5;V(G);} P6( ){P(C);P(F);P(G);S6;}

第3章进程同步与通信-同步

第3章进程同步与通信-同步

互斥问题举例3
某车站售票厅有20个窗口,任何时刻最多可容 纳20名购票者进入,当售票厅中少于20名购票 者时,则厅外的购票者可立即进入,否则需在 厅外等待。若把一个购票者看作一个进程,请 用P、V操作管理这些并发进程,要求如下: ⑴.在主函数中给出信号量的定义和初值。 ⑵.给出一个购票者进程的算法。 ⑶.给出当购票者最多不超过n (设n>20)个时, 信号量可能的变化范围。
-(n-20) ≤ mutex ≤ 20 其物理含义是:
当mutex=20时,表示售票厅内没有购票者进入,20个窗口都是 空闲的,表示可用资源个数;
当mutex=0时,表示售票厅内已经进入了20个购票者,每个窗口 都被分配,没有等待的购票者,可用资源为0; 当mutex=-(n-20)时,表示一共有n个购票者,其中20个购票者 已经进入厅内,分别占有一个窗口,还有n-20个购票者在厅 外等待,绝对值表示等待进程个数。
① sem减1 ② 若sem减1后仍大于1或等于零, 则P返回,进程继续; ③ 若 sem 减 1 后小于零,则该进程 阻塞转等待队列中。
5
信号灯的PV操作
void wait(semaphore s) { s.value = s.value - 1; if (s.value < 0) block(s.queue);
24
1.同步进程举例1-病人就诊
唤 醒 后
门诊医生: 等 待 …… 开化验单; …… 等 等化验结果; 待 …… 继续诊病;
化验员: …… 等化验单; …… 唤 化验; 醒 填写化验结果; 后 ……
化验单
继续诊病
化验结果
对于医生的操作步骤: 有病人时:
① 开化验单(化验单多一个) ② 等待化验结果

习题解答——第3章 进程同步与通信

习题解答——第3章 进程同步与通信

第3章进程同步与通信6.有三个并发执行的进程A、B和C,A负责输入信息到缓冲区,B负责加工输入到缓冲区中的数据,C负责将加工后的数据打印输出。

在下列情况下:(1)单缓冲区。

(2)由N个缓冲区组成的缓冲池。

分别写出三个进程的并发关系。

答:(1)semaphore S1=1,S2=S3=0A: B: C:while(1) { while(1) { while(1) {P(S1); P(S2); P(S3);输入信息到缓冲区; 加工缓冲区中数据; 输出缓冲区中数据;V(S2); V(S3); V(S1);} } }(2)semaphore S1=N;semaphore S2=0,S3=0;semaphore mutex=1;int i.,j,k;ITEM buffer[N];ITEM data_i,data_o;A: B: C:while(1) { while(1) { while(1) {P(S1); P(S2); P(S3);P(mutex) ;P(mutex) ;P(mutex);输入数据data_i; data_o= buffer[k];buffer[i]=data_i; 处理中buffer[j]的数据k=(k+1)%N;i=(i+1)%N; j=(j+1)%N; 输出data_o;V(mutex); V(mutex); V(mutex) ;V(S2); V(S3); V(S1);} } }7.三个并发执行的进程A、B和C,A与B共享缓冲区M,B与C共享缓冲区N,如图所示:假如缓冲区的大小只能存放一个单位的数据,试写出A、B、C三个进程的同步关系。

答:semaphore S1=M;S3=N;semaphore S2=0,S4=0;semaphore mutex=1;int i.,j,k,l;ITEM buffer1[M];ITEM buffer2[N];ITEM data_i,data_o;A: B: C:while (1) { while (1) { while (1) {P(S1); P(S2); P(S4);P(mutex); P(mutex) ;P(mutex);输入数据data_i; data_o=buffer1[j]; data_o= buffer[l];buffer1[i]=data-i; j=(j+1)%M; l=(l+1)%N;i=(i+1)%M; V(mutex); 输出data_o;V(mutex); V(S1); V(mutex);V(S2); P(S3) V(S3);} P(mutex); }buffer2[k]=data_o;k=(k+1)%N;V(mutex);V(S4)}9.设有两个优先级相同的进程P1,P2如下,令信号量S1、S2的初值为0,已知z=2,试问P1、P2并发运行结束后x=?y=?z=?进程P1 进程P2y: =1;x:=1;y:=y+2 ;x:=x+1;V(S1);P(S1);z:=y+1;x:=x+y;P(S2);V(S2);y:=z+y;z:=x+z;解答:由题意可知执行顺序存在如下5种情况:z:=y+1----→ x:=x+y----→ y:=z+y----→ z:=x+z ……z:=y+1----→ x:=x+y----→ z:=x+z----→ y:=z+y ……x:=x+y----→ z:=y+1 ----→ z:=x+z----→ y:=z+y ……x:=x+y----→ z:=y+1 ----→ y:=z+y----→ z:=x+z ……x:=x+y----→ z:=x+z ----→ z:=y+1----→ y:=z+y ……和的结果为:x=5,y=7,z=9;和结果为:X=5,y=12,z=9;的结果为:x=5,y=7,z=4;*10.有一个隧道,由于很窄,只能容纳一个方向的车辆通过。

操作系统第3章(进程的同步与通信习题与解答)

操作系统第3章(进程的同步与通信习题与解答)

第3章进程的同步与通信习题与解答3.2 例题解析例3.2.1 多道程序系统程序的执行失去了封闭性和再现性,因此多道程序的执行不需要这些特性,这种说法是否正确?解这种说法不正确。

可以想象,如果一个程序在多道程序系统中,在相同的输入的情况下,多次执行所得结果是不同的,有谁还敢使用这个程序?因此,多道程序的执行也需要封闭性和再现性,只不过单道程序系统的封闭性和再现性是先天固有的,多道程序系统的程序执行要想获得封闭性和再现性,需通过程序员的精心设计才能得到。

所使用的方法就是同步和互斥的方法。

例3.2.2 多个进程对信号量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;例3.2.3 如下锁的实现方法存在什么缺点?如何改进?LOCK(X) UNLOCK(X){ {do while X=1 ; X=0;X=1} }解存在的缺点是:当锁是关闭时,采用的是循环等待的方法,这样的等待还是要占用处理机的时间,应该采用阻塞等待的方法。

改进的锁实现如下:LOCK(X) UNLOCK(X){ {if X.value=1 if not empty(X.L) { insert( *, X.L); { P=remove(X.L);Block (*) Wakeup(P) } }else X.Value=1 else X.Value=0} }这里X.value是锁的值,X.L是存放由于锁X而阻塞的进程的队列。

insert( *, X.L)将当前进程的进程号插入到X.L,remove(X.L)是从X.L中移出一个进程号。

例3.2.4 使用多个进程计算Y=F1(X)+F2 (X).解(1) 确定并发和顺序操作在这个问题中,F1(X)和F2 (X)的计算是可以并行处理的,因此F1(X)和F2 (X)可以分别出现在两个进程中。

第3章 进程的同步与通信

第3章 进程的同步与通信

第3章 进程的同步与通信
Ssignal(S1, S2, …, Sn) { for (i = 1; i <= n; ++i) { ++Si; //释放占用的资源; 释放占用的资源; 释放占用的资源 for (each process P waiting in Si.queue) //检查每种资源的等待队列的所有进程; 检查每种资源的等待队列的所有进程; 检查每种资源的等待队列的所有进程 { 从等待队列Si.queue中取出进程 中取出进程P; 从等待队列 中取出进程 if (判断进程 是否通过 判断进程P是否通过 中的测试) 判断进程 是否通过Swait中的测试 中的测试 //注:与signal不同,这里要进行重新判断; 不同, 注 不同 这里要进行重新判断; { //通过检查(资源够用)时的处理; 通过检查( 通过检查 资源够用)时的处理; 进程P进入就绪队列 进入就绪队列; 进程 进入就绪队列 } else { //未通过检查(资源不够用)时的处理; 未通过检查( 未通过检查 资源不够用)时的处理; 进程P进入某等待队列 进入某等待队列; 进程 进入某等待队列; } } } }
Var n, integer;//缓冲区数目 缓冲区数目 type item=…; var buffer:array[0, 1, …, n-1] of item; [ ] //产品缓冲区 产品缓冲区 in, out: 0, 1, …, n-1; //输入指针、输出指 输入指针、 输入指针 针 counter: 0, 1, …, n; //产品数量 产品数量
第3章 进程的同步与通信
3. AND型信号量 型信号量 在两个进程中都要包含两个对Dmutex和 Emutex的操作 , 和 的操作, 在两个进程中都要包含两个对 的操作 即 process A: wait(Dmutex); wait(Emutex); process B: wait(Emutex); wait(Dmutex);

第3章 进程同步与通信

第3章  进程同步与通信

用软件方法解决互斥问题
——双标志、先修改后检查算法
//进程0 //进程1
flag[0]=true; while (flag[1])
//什么也不做;
flag[1]=true; while (flag[0])
//什么也不做;
临界区;
临界区;
flag[0] =false;
剩余区; ●两进程先后同时作
flag[1] =false ;
void writer() /*写者进程*/ { while (true) { P(Wmutex); write; /* 执行写操作 */ V(Wmutex); } }
哲学家进餐问题
●五个哲学家,他们的生活方式是交替地思考和
进餐。 ●哲学家们共用一张圆桌,围绕着圆桌而坐,在 圆桌上有五个碗和五支筷子,平时哲学家进行思 考,饥饿时拿起其左、右的两支筷子,试图进餐, 进餐完毕又进行思考。 ●这里的问题是哲学家只有拿到靠近他的两支筷 子才能进餐,而拿到两支筷子的条件是他的左、 右邻居此时都没有进餐。
剩余区;
flag[i]=true; ●缺点:保证了不同时进入临界区,但又 可能都进不去。不能保证“有空让进”。
用软件方法解决互斥问题
——先修改、后检查、后修改算法
//进程0 flag[0]=true; turn=1; while (flag[1]) && (turn==1) //什么也不做; 临界区; flag[0] =false ; 剩余区;
第3 章
进程同步与通信
●进程同步与互斥
本章要点
●经典进程同步问题
●AND信号量 ●管程
●进程通信





一些进程在系统中执行时需要与其他进程共享数 据,以完成一项共同的任务,这些进程之间具有 协作关系。 进程之间的协作关系包括互斥、同步和通信。 互斥是指多个进程不能同时使用同一资源。当某 个进程使用某种资源时,其他进程必须等待。 同步是指多个进程中发生的事件存在着某种时序 关系,某些进程的执行必须先于另一些进程。 进程通信是指多个进程之间要传递一定量的信息。

第三章 进程的同步和通信

第三章 进程的同步和通信

南京晓庄学院 · 操作系统
10
利用TS指令实现进程互斥可以描述为:
repeat while TS(lock) do skip; critical section lock:=false; remainder section until false; 在进入临界区之前,首先用TS指令测试lock,如果测 试出 lock是false,说明没有进程在临界区,则可以进 入。否则必须循环测试,直到测到TS(lock) 为false。
南京晓庄学院 · 操作系统



17
2. 记录型信号量机制:
信号量S为一个记录型数据结构,其中一 个分量为整形量value,另一个分量为信号量队 列queue, value是一个具有非负初值的整形变量, 是信号量的值;queue是一个信号量队列的指针, 初始状态为空。
南京晓庄学院 · 操作系统
18
南京晓庄学院 · 操作系统
5
int Xi; /*进程Ti工作时所用的工作单元*/ Ti( ) /*i=1,2*/ {
按旅客要求找到Aj; Xi = Aj if Xi >=1 Xi = Xi -1;
Aj = Xi;
输出一张票; else 输出票已售完;
}
南京晓庄学院 · 操作系统
6
由于T1和T2是两个可同时运行的并发进程,同在一个计算机系统中 运行,共享同一批票源数据,因此可能出现如下所示的运行情况。 T1: X1=Aj; X1=nn (nn>0) T2: X2=Aj; X2=nn T2: X2=X2-1; Aj =X2; 输出一张票; Aj=nn-1 T1: X1=X1-1; Aj =X1; 输出一张票; Aj=nn-1 显然此时出现了把同一张票卖给两个人的状况。

第三章 进程同步问题习题答案

第三章 进程同步问题习题答案

进程同步练习1.有一阅览室,共有100个座位。

读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名。

读者离开时要消掉登记内容。

试用P、V操作描述读者进程的同步结构。

varmutex : semaphere;信号量,用于互斥full : semaphere; 信号量,用于同步table : array 0..n-1 of item; 登记表procedure reader;读者进程beginP(full);P(mutex);Register_name(table);V(mutex);Reading;P(mutex);Delet_name(table);V(mutex);V(full)end;beginseminitsal(mutex.v,1; full.v,100);初始化cobeginreader;reader;...coendend.2.设公共汽车上有一位司机和一位售票员,它们的活动如下:售票员:动车辆售票正常行车开车门到站停车关车门请分析司机与售票员之间的同步关系,如何用PV操作实现。

答:为了安全起见,显然要求:关车门后才能启动车辆;到站停车后才能开车门。

所以司机和售票员在到站、开门、关门、启动车辆这几个活动之间存在着同步关系。

用两个信号量S1、S2分别表示可以开车和可以开门,S1的初值为1,S2的初值为0。

用PV操作实现司机进程和售票员进程同步的算法描述如下:售票员:(S1)售票动车辆P(S2)正常行车开车门到站停车关车门V(S2)V(S1)另外,程序中PV操作出现的顺序与信号量的初值设置有关,以本题为例,算法如下描述时,S1、S2的初值均应为0。

售票员:常行车售票站停车P(S2)V(S2)开车门P(S1)关车门启动车辆V(S1)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第3章进程同步与通信
6.有三个并发执行的进程A、B和C,A负责输入信息到缓冲区,B负责加工输入到缓冲区中的数据,C负责将加工后的数据打印输出。

在下列情况下:
(1)单缓冲区。

(2)由N个缓冲区组成的缓冲池。

分别写出三个进程的并发关系。

答:(1)semaphore S1=1,S2=S3=0
A: B: C:
while(1) { while(1) { while(1) {
P(S1); P(S2); P(S3);
输入信息到缓冲区; 加工缓冲区中数据; 输出缓冲区中数据;
V(S2); V(S3); V(S1);
} } }
(2)semaphore S1=N;
semaphore S2=0,S3=0;
semaphore mutex=1;
int i.,j,k;
ITEM buffer[N];
ITEM data_i,data_o;
A: B: C:
while(1) { while(1) { while(1) {
P(S1); P(S2); P(S3);
P(mutex) ;P(mutex) ;P(mutex);
输入数据data_i; data_o= buffer[k];
buffer[i]=data_i; 处理中buffer[j]的数据k=(k+1)%N;
i=(i+1)%N; j=(j+1)%N; 输出data_o;
V(mutex); V(mutex); V(mutex) ;
V(S2); V(S3); V(S1);
} } }
7.三个并发执行的进程A、B和C,A与B共享缓冲区M,B与C共享缓冲区N,如图所示:假如缓冲区的大小只能存放一个单位的数据,试写出A、B、C三个进程的同步关系。

答:
semaphore S1=M;S3=N;
semaphore S2=0,S4=0;
semaphore mutex=1;
int i.,j,k,l;
ITEM buffer1[M];
ITEM buffer2[N];
ITEM data_i,data_o;
A: B: C:
while (1) { while (1) { while (1) {
P(S1); P(S2); P(S4);
P(mutex); P(mutex) ;P(mutex);
输入数据data_i; data_o=buffer1[j]; data_o= buffer[l];
buffer1[i]=data-i; j=(j+1)%M; l=(l+1)%N;
i=(i+1)%M; V(mutex); 输出data_o;
V(mutex); V(S1); V(mutex);
V(S2); P(S3) V(S3);
} P(mutex); }
buffer2[k]=data_o;
k=(k+1)%N;
V(mutex);
V(S4)
}
9.设有两个优先级相同的进程P1,P2如下,令信号量S1、S2的初值为0,已知z=2,试问P1、P2并发运行结束后x=?y=?z=?
进程P1 进程P2
y: =1;x:=1;
y:=y+2 ;x:=x+1;
V(S1);P(S1);
z:=y+1;x:=x+y;
P(S2);V(S2);
y:=z+y;z:=x+z;
解答:
由题意可知执行顺序存在如下5种情况:
z:=y+1----→ x:=x+y----→ y:=z+y----→ z:=x+z ……
z:=y+1----→ x:=x+y----→ z:=x+z----→ y:=z+y ……
x:=x+y----→ z:=y+1 ----→ z:=x+z----→ y:=z+y ……
x:=x+y----→ z:=y+1 ----→ y:=z+y----→ z:=x+z ……
x:=x+y----→ z:=x+z ----→ z:=y+1----→ y:=z+y ……
和的结果为:x=5,y=7,z=9;
和结果为:X=5,y=12,z=9;
的结果为:x=5,y=7,z=4;
*10.有一个隧道,由于很窄,只能容纳一个方向的车辆通过。

如果东西两方向的车辆都想通过该隧道,并有下面的情况:
(1)如东西两方向的车辆都想通过隧道时,便形成了等待队列。

(2)若一个方向没有车辆,允许另一个方向的车辆通过。

(3)若双方都有车辆想通过,则先到达的哪个方向的车辆先通过。

试用PV操作描述东西两方向车辆的同步关系。

解答:方法一:(用信号量)
Semaphore eastmutex,westmutex,mutex=1;
Int east,west=0;
东方向车:
Void eastcar()
{
while(true)
{ P(eastmutex);
If(east==0)
P(mutex);
east++;
V(eastmutex);
Go through the tunnel;
P(eastmutex);
east--;
If(east==0)
V(mutex);
V(eastmutex);
Leave;
}
}
西方向车:
Void westtcar()
{
while(true)
{ P(westmutex);
If(west==0)
P(mutex);
west++;
V(westmutex);
Go through the tunnel;
P(westmutex);
west--;
If(west==0)
V(mutex);
V(westmutex);
Leave;
}
}
方法二:(用一般“信号量集”)
Semaphore eastmutex,westmutex=N;
东方向车:
Void eastcar()
{
swait(eastmutex,1,1; westmutex,N,0);
Go through the tunnel;
Ssignal(eastmutex,1);
}
西方向车:
Void westcar()
{
swait(westmutex,1,1; eastmutex,N,0);
Go through the tunnel;
Ssignal(westmutex,1);
}
*13.在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。

给出读者、写者问题的另一个解决方案:即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,即写者优先。

解答:
Semaphore Rmutex,Wmutex,mutex1=mutex2=1;
Int Rcount,Wcount=0;
读者:
Void reader()
{
while(true)
{ P(mutex1);
V(mutex1);
P(Rmutex);
If(Rcount==0)
P(Wmutex);
Rcount++;
V(Rmutex);
reading;
P(Rmutex);
Rcount--;
If(Rcount==0)
V(Wmutex);
V(Rmutex);
Leave;
}
}
写者:
Void writer()
{
while(true)
{ P(mutex2);
If(Wcount==0)
P(mutex1);
Wcount++;
V(mutex2);
P(Wmutex);
Writing;
V(Wmutex);
P(mutex2);
Wcount--;
If(Wcount==0)
V(mutex1);
V(mutex2);
Leave;
}
}。

相关文档
最新文档