第一篇:进程同步与互斥练习
进程同步与互斥
练习题
选择题
1.任何两个并发进程之间存在着()的关系。
A.各自完全独立
B.拥有共享变量
C.必须互斥
D.可能相互制约
2.并发进程执行的相对速度是()。
A.由进程的程序结构决定的B.由进程自己来控制的C.在进程被创建时确定的D.与进程调度策略有关的3.并发进程执行时可能会出现“与时间有关的错误”,这种错误是由于并发进程()引起的。
A.使用共享资源
B.执行的顺序性
C.要求计算时间的长短
D.程序的长度
4.并发进程中与共享变量有关的程序段称为()。
A.共享子程序
B.临界区
C.管理区
D.公共数据区
5.用来实现进程同步与互斥的PV操作实际上是由()过程组成的。
A.一个可被中断的B.一个不可被中断的C.两个可被中断的D.两个不可被中断的6.进程从运行态变为等待态可能由于()。
A.执行了V操作
B.执行了P操作
C.时间片用完
D.有高优先级进程就绪
7.用PV操作管理互斥使用的资源时,信号量的初值应定义为()。
A.任意正整数
B.1
C.0
8.用P、V操作管理临界区时,互斥信号量的初值应定义为()。
A.任意值
B.1
C.0
D.-
19.现有n个具有相关临界区的并发进程,如果某进程调用P操作后变为等待状态,则调用P操作时信号量的值必定为()。
A.≤0
B.1
C.n-1
D.n
10.用PV操作管理临界区时把信号量的初值定义为1,现已有一个进程在临界区,但有n个进程在等待进人临界区,这时信号量的值为()。
A.-1
B.1
C.-n
D.n
11.用V操作唤醒一个等待进程时,被唤醒进程的状态应变成()状态。
A.执行
B.就绪
C.运行
D.收容
12.进程间的同步是指进程间在逻辑上的相互()关系。
A.联接B.制约
C.继续D.调用
多项选择题
1.有关并发进程的下列叙述中,()是正确的。
A.任何时刻允许多个进程在同一CPU上运行
B.进程执行的速度完全由进程自己控制
C.并发进程在访问共享资源时可能出现与时间有关的错误
D.同步是指并发进程中存在的一种制约关系
E.各自独立的并发进程在执行时不会相互影响
2.一个正在运行的进程调用P(s)后,若S的值为(),则该进程可以继续运行。
A.S>0
B.S<0
C.S≠0
E.S≤0
判断题
1.有交往的并发进程一定共享某些资源。()
2.如果不能控制并发进程执行的相对速度,则它们在共享资源时一定会出现与时间有关的错误。()
3.并发进程的执行结果只取决于进程本身,不受外界影响。()
4.多道程序设计必然导致进程的并发执行。()
有m个进程共享同一临界资源,若使用信号量机制实现对资源的互斥访问,则信号量值的变化范围是________________。
对于两个并发进程,设互斥信号量为mutex,若mutex=0,则________
A 表示没有进程进入临界区B 表示有一个进程进入临界区
C表示有一个进程进入临界区,另一个进程等待进入
D 表示有两个进程进入临界区
设系统中有n(n>2)进程,且当前不在执行进程调度程序,试考虑下述4种情况哪种不能发生:
A没有运行进程,有2个就绪进程,n-2个进程处于等待状态。
B有1个运行进程,没有就绪进程,n-1个进程处于等待状
C有1个运行进程,有1个就绪进程,n-2个进程处于等待状态
D有1个运行进程,有n-1个就绪进程,没有进程处于等待状态
设有一个作业由四个进程组成,这四个进程在运行时必须按图所示的顺序,用P、V原语操作表达四个进程的同步关系。
应用题
设系统中只有一台打印机,有三个用户的程序在执行过程中都要使用打印机输出计算结果。设每个用户程序对应一个进程。问:这三个进程间有什么样的制约关系?试用P、V操作写出这些进程使用打印机的算法。
判断下面的同步问题的算法是否正确?若有错,请指出错误原因并予以改正
(1)设A、B两进程共用一个缓冲区Q,A向Q写入信息,B则从Q读出信息,算法框图如图所示。
设A、B为两个并发进程,它们共享一临界资源。其运行临界区的算法框图如图所示。
某套装服装厂有甲乙两个制作室和一个配套室。两个制作室分别生产上衣和裤子,每制作一件上衣或裤子后制作室工人都要分别把它们送到配套室的衣架F1和裤架F2上,衣架F1上存放上衣,裤架F2上存放裤子,衣架最多能放50件上衣,裤架最多能放50条裤子。配套室工人每次从架上取一件上衣和一条裤子,然后将它们配成套装,并进行包装。为防止操作出错,甲制作室工人及配套室工人对衣架F1的存取动作应互斥进行,乙制作室工人及配套室工人对裤架F2的存取动作应互斥进行。用P、V原语进行正确管理,分别描述甲制作室工人、乙制作室工人以及配套室工人的工作过程。
解:
(1)设公用信号量mutex1和mutex2控制进程对衣架和裤架的互斥操作
设私用信号量empty1和empty2分别表示衣架和裤架的空位数,full1表示衣架上的衣服数,full2表示裤架上的裤子数
(2)初始化mutex1=1,mutex2=1,empty1=50,empty2=50,full1=0,full2=0
(3)描述:
甲制作室工人工作过程:乙制作室工人工作过程:
L1:生产一件上衣L2:生产一条裤子
P(empty1)P(empty2)
P(mutex1)P(mutex2)
将上衣放到衣架上将裤子放到裤架上
V(mutex1)V(mutex2)
V(full1)V(full2)
Goto L1Goto L2
配套工人工作过程:
L3:P(full1)
P(full2)
P(mutex1)
P(mutex2)
分别取上衣和裤子进行配套
V(mutex1)
V(mutex2)
V(empty1)
V(empty2)
Goto L
3在一个盒子里,混装了数量相等的黑白围棋子。现在利用自动分拣系统把黑子、白子分开,设分拣系统有两个进程P1和P2,其中进程P1拣白子;进程P2拣黑子。规定每个进程一次拣一子,当一个进程在拣时不允许另一个进程去拣,当一个进程拣了一子时,必须让另一个进程去拣。试写出进程P1和P2能够正确并发执行的程序。
设私有信号量S1=1;S2=0
P1(){P2(){
P(S1);P(S2);
拣白子;拣黑子;V(S2);}V(S1);}
有一个仓库,可存放X、Y两种产品,仓库的存储空间足够大,但要求:(1)每次只能存入一种产品X或Y,(2)满足-N 设互斥信号量mutex=1;私有信号量sx=M-1;sy=N-1; storeX(){storeY(){ P(sx);P(sy); P(mutex);P(mutex); 将X产品入库;将X产品入库; V(mutex);V(mutex); V(sy);}V(sx);} 答案 1.D 2.D 3.A 4.B 5.D 6.B 7.B 8.A 9.C 10.B 11.B 12.B 13.A 14.C 15.C 16.D 17.A 18.B 二、多项选择题 1.[分析]任何一台CPU在每一时刻只能解释执行一条指令,因而,不可能在同一时刻为多个进程服务。进程可同时执行的含义是一个进程的工作没有全部完成之前另一进程就可开始工作。所以,实际上多个进程是轮流占用CPU运行的。到底哪个进程能占用处理器不仅与进程自身有关,且受外界因素的影响;当多个进程竞争CPU时,必须由进程调度来决定当前哪个进程可以占用CPU;故每个进程都是走走停停的,进程执行的速度不能完全由进程自己来控制。 并发进程相互之间可能是无关的,即它们是各自独立的,这些进程中每一个进程的执行既不依赖于其它进程也不会影响其它进程的执行。但是,有些并发进程需使用共享资源,为保证进程执行的正确性,对共享资源的使用必须加以限制。同步就是并发进程中的一种制约关系,一个进程能否使用共享资源取决于其它进程的消息,只有指定的消息到达才可使用共享资源。如果无约束地使用共享资源,则可能出现多个进程交替地访问共享资源,于是就可能会出现与时间有关的错误。故本题的答案为C、D、E。 [题解]C、D、E。 2.[分析]根据P操作的定义,当调用P操作时, P操作把信号量S减去1,若结果小于0则调用者将等待信号量,否则可继续运行。因而,若调用P(S)后S的值为>=0则进程可以继续运行,故应选择A和D。要注意不能选择C,因S<>0包含了S>0和S<0,当S<0时进程将成为等待状态而不能运行。[题解]A,D。 3.[题解]A,C,E。 4.[题解]A,B,C,D,E。 三、判断题 1.[题解]是。2.[分析]如果不控制并发进程执行的相对速度,则它们在共享资源时可能会出现两种情况:一种是并发进程交替使用共享资源,这样就可能会发生与时间有关的错误;另一种是并发执行的速度没有致使它们交替使用共享资源,这时就不会出现与时间有关的错误。因而,本题的结论“一定会出现与时间有关的错误”是不对的。[题解]否。 3.[分析]所谓防止死锁是指采用了某种方法后系统一定不会发生死锁。但是,使用PV操作不一定能防止死锁,教材中的五个哲学家问题就是例证。所以, PV操作可以防止死锁的说法是错误的。 [题解]否。 4.[分析]如果一个进程单独执行时,那么执行结果只取决于进程本身,不受外界影响。但多个进程并发执行时,无论是进程本身的原因还是外界的因素都会影响到进程的执行速度。如果并发进程有共享变量且其执行速度造成了它们交替访问共享变量,那么进程的执行结果可能不惟一。故本题的阐述不确切。[题解]否。 5.[题解]是。 6.[题解]是。 7.[分析]限制共享资源互斥使用后仍可能引起系统死锁,可举例说明。例如,教材中五个哲学家问题,采用了PV操作来保证共享资源的互斥使用,但还是发生了循环等待,且这种等待永远不能结束,引起了死锁。所以,资源的互斥使用不能保证系统不会死锁。[题解]否。 8.[分析]若任何一个进程在申请新资源前总是先归还已得到的资源,则任何进程都不会发生“占有且等待资源”的情况。也就是说,这种资源分配策略能破坏形成死锁的四个必要条件中的第二个条件,故可防止死锁。[题解]是。 四、填空题 1.封闭性,可再现性 2.并发进程 3.与时间有关的 4.临界区 5.P, V 6.竞争(或互斥),协作(或同步) 7.P, V 8.等待信号量,就绪 9.[分析]因规定该资源只能互斥使用,因而信号量的初值应定义为1。当n个进程各调用一次P操作时将使信号量的值为最小。[题解]1,(1-n)或-(n-1)。 10.[分析]由于初值为10,因而调用了18次P操作后的值为(l0-18)=-8。再调用15次V操作的话则信号量的值为(-8+15)=7。「题解」7。 11.send(或发送),receive(或接收)12.发送者的信件,信箱 13.互斥使用资源,循环等待资源 14 死锁防止,死锁避免 15.防止 16.静态分配,按序分配,剥夺式分配 17.不安全 18.银行家 19.安全 20.处理器,主存储器 21.循环等待资源 22.静态 四、填空题 1.封闭性,可再现性 2.并发进程 3.与时间有关的 4.临界区 5.P, V 6.竞争(或互斥),协作(或同步) 7.P, V 8.等待信号量,就绪 9.[分析]因规定该资源只能互斥使用,因而信号量的初值应定义为1。当n个进程各调用一次P操作时将使信号量的值为最小。[题解]1,(1-n)或-(n-1)。 10.[分析]由于初值为10,因而调用了18次P操作后的值为(l0-18)=-8。再调用15次V操作的话则信号量的值为(-8+15)=7。「题解」7。 11.send(或发送),receive(或接收)12.发送者的信件,信箱 13.互斥使用资源,循环等待资源 14 死锁防止,死锁避免 15.防止 16.静态分配,按序分配,剥夺式分配 17.不安全 18.银行家 19.安全 20.处理器,主存储器 21.循环等待资源 22.静态 进程同步练习题 1.在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。 司机 售票员 启动车辆 关车门 正常行车 售票 到站停车 开车门 图 司机和售票员工作流程图 ① 约束:怎么密切配合协调工作才能保证安全呢? a)关车门之后再启动车辆;利用前驱图解释 b)到站停车之后再开车门; ② 根据约束定义信号量; 关车门和启动车辆需要一个信号量进行同步S1;到站停车和开车门之间需要一个信号量进行同步S2; ③ 建立几个进程呢? a)为司机建立一个进程Driver; b)为售票员建立一个进程Conductor; Driver: Repeat 启动车辆; 正常行驶; 到站停车; Until false;Conductor: Repeat 关车门; 售票; 开车门; Until false; ④ 加入同步关系: Var s1,s2:semorphore=0,0; Driver: Repeat Wait(s1); 启动车辆; 正常行驶; 到站停车; Signal(s2)Until false;Conductor: Repeat 关车门; Signal(s1); 售票; Wait(s2) 开车门; Until false;main(){ Driver(); Conductor();} 2.桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用PV操作实现他们之间的同步机制。分析: ①约束: a)爸爸和妈妈竞争盘子,往盘子放水果,爸爸在放时,妈妈等待,或者相反; b)爸爸和女儿要同步,即爸爸放完苹果之后通知女儿来吃;同时女儿吃完之后要通知盘子可用; c)妈妈和儿子要同步,即妈妈放完橘子之后通知儿子来吃;同时儿子吃完之后要通知盘子可用; ② 经上述分析可知: 需要3个信号量:S1表示临界资源盘子,初值1;爸爸和女儿需要一个信号量进行同步S2=0 妈妈和儿子需要一个信号量进行同步S3=0;③ 建立进程? 爸爸: 妈妈: 女儿: 儿子: Repeat repeat repeat repeat 取一个苹果; 取一个橘子; 从盘子取一个苹果; 从盘子取一个橘子; 放入盘子; 放入盘子 吃苹果; 吃橘子; Until false; Until false; Until false; Until false;④ 加入同步关系。 爸爸: 妈妈: 女儿: 儿子: Repeat repeat repeat repeat wait(S2); wait(S3);取一个苹果; 取一个橘子; 从盘子取一个苹果; 从盘子取一个橘子; Wait(S1); Wait(S1); signal(S1); signal(S1); 放入盘子; 放入盘子 吃苹果; 吃橘子; Signal(S2); Signal(S3); Until false; Until false; Until false; Until false; 3.a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:(1)当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待; (2)当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入; (3)当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。 请用信号量为工具,对ab段实现正确管理以保证行驶安全。分析: ① 约束: a)ab两点的单行车道是一种临界资源;两端的车辆对该资源进行竞争; b)同步关系:(1),(3); ② 经上述分析可知: 首先,设置互斥信号量Sab=1,用于a、b点的车辆互斥进入ab段; 然后,分别设置共享变量ab=0用于记录当前ab段上由a点进入的车辆数量;共享变量ba=0用于记录当前ab=段上由b点进入车辆的数量; 最后,设置互斥信号量S1=1用于ab段的车辆互斥访问共享变量ab;设置互斥信号量S2=1用于ba段的车辆互斥访问共享变量ba ③建立进程? semaphore S1=1,S2=1,Sab=1;int ab=ba=0;Pab: pba: Repeat repeat Wait(S1) Wait(s2) abcount=abcount+1; bacount=bacount+1;if abcount==1 then wait(sab) if bacount==1 then wait(sab)signal(S1) signal(s2)进入车道行驶; 进入车道行驶; Wait(s1) Wait(s2)abcount=abcount-1; bacount=bacount-1;if abcount==0 then signal(sab) if bacount==0 then signal(sab)signal(s1) signal(s2); until false; until false;main(){ Pab(); Pba();} 5.一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过。但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。分析: ① 约束: a)桥属于临界资源,两岸的人对该资源进行竞争; b)桥上的人数是有限制的,设这个桥由N个桥墩构成,桥上同时只能有N个人过桥,其它人要进行等待。相当于共享资源数。 ② 设置信号量 信号量s:互斥使用桥,初值为1 变量count1:方向1上过河人计数器 变量count2:方向2上过河人计数器 信号量scount1:对方向1上过河人计数器count1的互斥使用,初值为1 信号量scount2:对方向2上过河人计数器count2的互斥使用,初值为1 信号量scount:代表桥上过河人的计数信号量,初值为桥墩个数N ③ 建立进程 Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0; void direct1(int i){ wait(scount1);count1++;if(count1==1) wait(s);signal(scount1); wait(scount); 上桥,过桥,下桥; signal(scount); wait(scount1);count1--;if(count1==0) signal(s);signal(scount1);} void direct2(int i){ wait(scount2);count2++;if(count2==1) wait(s);signal(scount2); wait(scount);上桥,过桥,下桥; signal(scount); wait(scount2);count2--;if(count2==0) signal(s);signal(scount2);} main(){ cobegin{ direct1(1); … direct1(n); direct2(1); … direct2(m); } } 6.有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B); (2)-N<A产品数量-B产品数量<M。其中,N和M是正整数。试用同步算法描述产品A与产品B的入库过程。分析: ① 约束: a)仓库是一种临界资源,两种产品为之竞争; b)A产品数量不能比B产品数量多M个以上即A产品数量比B产品数量最多多M-1个;A产品数量不能比B产品数量少N个以上即B产品数量比A产品最多多N-1个。② 设置信号量 设置互斥信号量mutex互斥使用仓库; 设置两个信号量来控制A、B产品的存放数量,sa表示当前允许A产品比B产品多入库的数量(当前允许A产品入库数量); sb表示当前允许B产品比A产品多入库的数量(当前允许B产品入库数量)。 初始时,sa为M一1,sb为N一1。当往库中存放入一个A产品时,则允许存入B产品的数量也增加1;当往库中存放入一个B产品时,则允许存入A产品的数量也增加1。 ③ 建立进程 semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1) { 取一个产品; wait(sa);wait(mutex);将产品入库; signal(mutex);signal(sb);} } process putb(){ while(1) { 取一个产品; wait(sb);wait(mutex);将产品入库; signal(mutex);signal(sa); } } main(){ cobegin{ puta();putb();} } 4.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。试用P、V操作正确实现“读者”与“写者”的同步。(第二类读者写者问题,信号量解决方法) 分析: ① 约束: a)写者与写者之间需要互斥访问; b)读者与写者之间需要互斥;(有一个读者在读就让写者等待),因此,此时需要一个计数变量记录读者的数量。c)允许多个读者同时读数据; d)一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。 ② 建立进程 Write: Repeat 执行读操作 Until false;Read: Repeat 执行写操作; Until false;③ 设置信号量 a)设置互斥信号量mutex=1实现写者与写者之间的互斥访问; Write: Repeat Wait(mutex) 执行读操作; Signal(mutex);Until false; b)实现读者与写者之间的互斥,设置整型变量readcount=0记录读者数量,if readcount==1 then wait(mutex)Read: Repeat readcount++;if(readcount==1)wait(mutex); 执行读操作; readcount--;if(readcount==0)signal(mutex); until false;由于readcount 是共享变量,所以读者之间要互斥访问,因此设置一个互斥信号量rmutex=1.Read: Repeat Wait(rmutex)readcount++;if(readcount==1)wait(mutex);signal(rmutex)执行读操作; Wait(rmutex)readcount--;if(readcount==0)signal(mutex);signal(rmutex)until false; c)要想实现d)的互斥,需让读者和写者再共享一个互斥信号量s,因此设置互斥信号量s=1,一旦有写者等待时,就wait(s)让读者等待。Write: Repeat wait(wmutex);writecount++;if(writecount==1)wait(s);signal(wmutex); Wait(mutex) 执行读操作; Signal(mutex); wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex); Until false;Read: Repeat Wait(s);Wait(rmutex)readcount++;if(readcount==1)wait(mutex);signal(rmutex)signal(s);执行读操作; Wait(rmutex)readcount--;if(readcount==0)signal(mutex);signal(rmutex)until false; ④ 完整代码 Process reader(){ while(1) { wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s); perform read operation; wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex);} } Process writer(){ while(1) { wait(wmutex);writecount++; if(writecount==1)wait(s);signal(wmutex); wait(mutex);perform write operation;signal(mutex); wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin { reader(); writer(); } } 1、在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。 司机 售票员 启动车辆 关车门 正常行车 售票 到站停车 开车门 图 司机和售票员工作流程图 【答案】 设置两个资源信号量:S1、S2。S1表示是否允许司机启动汽车,其初值为0;S2表示是否允许售票员开门,其初值为0.semaphoere S1=S2=0;void Driver(){ while(1) { wait(S1); 启动车辆; 正常行车; 到站停车; signal(S2); } } void Busman(){ while(1) { 关车门; signal(S1); 售票; wait(S2); 开车门; } } main(){ cobegin{ Driver(); Busman(); } } 2.桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用PV操作实现他们之间的同步机制。 【答案】 信号量S用来实现盘子的互斥访问,S1表示盘子中苹果个数,S2表示盘子中橘子的个数。 semaphore S=1,S1=S2=0;void father(){ while(1) { 准备苹果; wait(S); 将苹果放在盘子内; signal(S1); } } void mother(){ while(1) { 准备橘子; wait(S); 将橘子放在盘子内; signal(S2); } } void daughter(){ while(1) { wait(Sl); 从盘子里拿走苹果; signal(S); 吃苹果; } } void son(){ while(1) { wait(S2); 从盘子里拿走橘子; signal(S); 吃橘子; } } main(){ cobegin{ father(); mother(); daughter(); son(); } } 3.a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:(1)当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待; (2)当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入; (3)当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。 请用信号量为工具,对ab段实现正确管理以保证行驶安全。【答案】 此题是读者-写者问题的变形。设置3个信号量S1、S2和Sab,分别用于从a点进入的车互斥访问共享变量ab(用于记录当前ab段上由a点进入车辆的数量),从b点进入的车互斥访问共享变量ba(用于记录当前ab段上由b点进入车辆的数量)和a、b点的车辆互斥进入ab段。3个信号量的初值分别为1、1和1,两个共享变量ab和ba的初值分别为0、0。 semaphore S1=1,S2=1,Sab=1;int ab=ba=0;void Pab(){ while(1) { wait(S1); if(ab==0) wait(Sab); ab=ab+1; signal(S1); 车辆从a点驶向b点; wait(S1); ab=ab-1; if(ab==0) signal(Sab); signal(S1); } } void Pba(){ while(1) { wait(S2); if(ba==0) wait(Sab); ba=ba+1; signal(S2); 车辆从b点驶向a点; wait(S2); ba=ba-1; if(ba==0) signal(Sab); signal(S2); } } main(){ cobegin{ Pab(); Pba(); } } 4.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。试用P、V操作正确实现“读者”与“写者”的同步。(第二类读者写者问题,信号量解决方法) 【答案】 为了使写者优先,可在原来的读优先算法的基础上增加一个互斥信号量s,初值为1,使得当至少有一个写者准备访问共享对象时,它可以使后续的读者进程等待; 整型变量writecount,初值为0,用来对写者进行计数; 互斥信号量wmutex,初值为1,用来实现多个写者对writecount进行互斥访问。Process reader(){ while(1) { wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s); perform read operation; wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex); } } Process writer(){ while(1) { wait(wmutex);if(writecount==0)wait(s);writecount++;signal(wmutex); wait(mutex);perform write operation;signal(mutex); wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin { reader(); writer(); } } 5.一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过。但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。 【答案】 信号量s:互斥使用桥,初值为1 信号量scount1:对方向1上过河人计数器count1的互斥使用,初值为1 信号量scount2:对方向2上过河人计数器count2的互斥使用,初值为1 信号量scount:代表桥上过河人的计数信号量,初值为桥墩个数N 变量count1:方向1上过河人计数器 变量count2:方向2上过河人计数器 Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0; void direct1(int i){ wait(scount1);if(count1==0) wait(s);count1++;signal(scount1); wait(scount); 上桥,过桥,下桥; signal(scount); wait(scount1);count1--;if(count1==0) signal(s);signal(scount1);} void direct2(int i){ wait(scount2);if(count2==0) wait(s);count2++;signal(scount2); wait(scount);上桥,过桥,下桥; signal(scount); wait(scount2);count2--;if(count2==0) signal(s);signal(scount2);} main(){ cobegin{ direct1(1); … direct1(n); direct2(1); … direct2(m); } } 6、有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B);(2)-N<A产品数量-B产品数量<M。其中,N和M是正整数。试用同步算法描述产品A与产品B的入库过程。 【答案】 A产品的数量不能比B产品的数量少N个以上,A产品的数量不能比B产品的数量多M个以上. 设置两个信号量来控制A、B产品的存放数量,sa表示当前允许A产品比B产品多入库的数量(当前允许A产品入库数量),即在当前库存量和B产品不入库的情况下,还可以允许sa个A产品入库; sb表示当前允许B产品比A产品多入库的数量(当前允许B产品入库数量),即在当前库存量和A产品不入库的情况下,还可以允许sb个B产品入库。 初始时,sa为M一1,sb为N一1。当往库中存放入一个A产品时,则允许存入B产品的数量也增加1;当往库中存放入一个B产品时,则允许存入A产品的数量也增加1。 semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1) { 取一个产品; wait(sa);wait(mutex);将产品入库; signal(mutex);signal(sb);} } process putb(){ while(1) { 取一个产品; wait(sb);wait(mutex);将产品入库; signal(mutex);signal(sa); } } main(){ cobegin{ puta();putb();} } 进程同步练习题 1.在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。 司机 售票员 启动车辆 关车门 正常行车 售票 到站停车 开车门 图 司机和售票员工作流程图 2.桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用PV操作实现他们之间的同步机制。 3.a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:(1)当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待; (2)当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入; (3)当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。 请用信号量为工具,对ab段实现正确管理以保证行驶安全。 4.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。试用P、V操作正确实现“读者”与“写者”的同步。(第二类读者写者问题,信号量解决方法) 5.一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过。但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。6.有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B); (2)-N<A产品数量-B产品数量<M。其中,N和M是正整数。试用同步算法描述产品A与产品B的入库过程。 1、在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。 司机 售票员 启动车辆 关车门 正常行车 售票 到站停车 开车门 图 司机和售票员工作流程图 【答案】 设置两个资源信号量:S1、S2。S1表示是否允许司机启动汽车,其初值为0;S2表示是否允许售票员开门,其初值为0.semaphoere S1=S2=0;void Driver(){ while(1) { wait(S1); 启动车辆; 正常行车; 到站停车; signal(S2); } } void Busman(){ while(1) { 关车门; signal(S1); 售票; wait(S2); 开车门; } } main(){ cobegin{ Driver(); Busman(); } } 2.桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用PV操作实现他们之间的同步机制。 【答案】 信号量S用来实现盘子的互斥访问,S1表示盘子中苹果个数,S2表示盘子中橘子的个数。 semaphore S=1,S1=S2=0;void father(){ while(1) { 准备苹果; wait(S); 将苹果放在盘子内; signal(S1); } } void mother(){ while(1) { 准备橘子; wait(S); 将橘子放在盘子内; signal(S2); } } void daughter(){ while(1) { wait(Sl); 从盘子里拿走苹果; signal(S); 吃苹果; } } void son(){ while(1) { wait(S2); 从盘子里拿走橘子; signal(S); 吃橘子; } } main(){ cobegin{ father(); mother(); daughter(); son(); } } 3.a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:(1)当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待; (2)当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入; (3)当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。 请用信号量为工具,对ab段实现正确管理以保证行驶安全。【答案】 此题是读者-写者问题的变形。设置3个信号量S1、S2和Sab,分别用于从a点进入的车互斥访问共享变量ab(用于记录当前ab段上由a点进入车辆的数量),从b点进入的车互斥访问共享变量ba(用于记录当前ab段上由b点进入车辆的数量)和a、b点的车辆互斥进入ab段。3个信号量的初值分别为1、1和1,两个共享变量ab和ba的初值分别为0、0。 semaphore S1=1,S2=1,Sab=1;int ab=ba=0;void Pab(){ while(1) { wait(S1); if(ab==0) wait(Sab); ab=ab+1; signal(S1); 车辆从a点驶向b点; wait(S1); ab=ab-1; if(ab==0) signal(Sab); signal(S1); } } void Pba(){ while(1) { wait(S2); if(ba==0) wait(Sab); ba=ba+1; signal(S2); 车辆从b点驶向a点; wait(S2); ba=ba-1; if(ba==0) signal(Sab); signal(S2); } } main(){ cobegin{ Pab(); Pba(); } } 4.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。试用P、V操作正确实现“读者”与“写者”的同步。(第二类读者写者问题,信号量解决方法) 【答案】 为了使写者优先,可在原来的读优先算法的基础上增加一个互斥信号量s,初值为1,使得当至少有一个写者准备访问共享对象时,它可以使后续的读者进程等待; 整型变量writecount,初值为0,用来对写者进行计数; 互斥信号量wmutex,初值为1,用来实现多个写者对writecount进行互斥访问。Process reader(){ while(1) { wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s); perform read operation; wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex);} } Process writer(){ while(1) { wait(wmutex);if(writecount==0)wait(s);writecount++;signal(wmutex); wait(mutex);perform write operation;signal(mutex); wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin { reader(); writer(); } } 5.一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过。但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。 【答案】 信号量s:互斥使用桥,初值为1 信号量scount1:对方向1上过河人计数器count1的互斥使用,初值为1 信号量scount2:对方向2上过河人计数器count2的互斥使用,初值为1 信号量scount:代表桥上过河人的计数信号量,初值为桥墩个数N 变量count1:方向1上过河人计数器 变量count2:方向2上过河人计数器 Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0; void direct1(int i){ wait(scount1);if(count1==0) wait(s);count1++;signal(scount1); wait(scount); 上桥,过桥,下桥; signal(scount); wait(scount1);count1--;if(count1==0) signal(s);signal(scount1);} void direct2(int i){ wait(scount2);if(count2==0) wait(s);count2++;signal(scount2); wait(scount);上桥,过桥,下桥; signal(scount);wait(scount2);count2--;if(count2==0) signal(s);signal(scount2);} main(){ cobegin{ direct1(1); … direct1(n); direct2(1); … direct2(m); } } 6、有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B);(2)-N<A产品数量-B产品数量<M。其中,N和M是正整数。试用同步算法描述产品A与产品B的入库过程。 【答案】 A产品的数量不能比B产品的数量少N个以上,A产品的数量不能比B产品的数量多M个以上. 设置两个信号量来控制A、B产品的存放数量,sa表示当前允许A产品比B产品多入库的数量(当前允许A产品入库数量),即在当前库存量和B产品不入库的情况下,还可以允许sa个A产品入库; sb表示当前允许B产品比A产品多入库的数量(当前允许B产品入库数量),即在当前库存量和A产品不入库的情况下,还可以允许sb个B产品入库。 初始时,sa为M一1,sb为N一1。当往库中存放入一个A产品时,则允许存入B产品的数量也增加1;当往库中存放入一个B产品时,则允许存入A产品的数量也增加1。 semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1) { 取一个产品; wait(sa);wait(mutex);将产品入库; signal(mutex);signal(sb);} } process putb(){ while(1) { 取一个产品; wait(sb);wait(mutex);将产品入库; signal(mutex);signal(sa); } } main(){ cobegin{ puta();putb();} } 案例4 对互斥事件的教学设计 [设计者] 房之华(江苏省苏州大学附属中学) 设计符合现代教育理念和新课程标准的教学方案,是当前教育探讨的热门话题,而概率又是新增加的高中数学内容,具有一定的难度,学生在学习中会产生许多困惑,为了让学生能正确地理解并掌握,精心地设计教学方案显得格外重要.笔者就概率中较难学习的一节内容“互斥事件有一个发生的概率”给出教学方案的一个设计,供大家参考.[课题] 互斥事件有一个发生的概率 [教学目标] 通过探究式教学,使学生能正确地理解并掌握“互斥事件”、“彼此互斥”和“对立事件”等概念,理解并掌握当AB互斥时“事件A+B”的含义及其概率的求法,了解对立事件的概率的和为1的结论,会应用所学知识解决实际问题.通过探究式教学,引导学生学会学习“互斥事件有一个发生的概率”,学会如何观察、推理和评价,潜移默化地激发学生的情感,使学生形成一种积极的态度和正确的人生价值观.通过探究式教学,让学生养成手、口、眼、耳、脑五官并用的良好习惯,强化动作技能的熟练.(点评:教学目标是对教学行动结果的预期.教学目标一般涉及三大领域:认知领域、情感领域和动作领域,认知领域的目标是现代学校教育最重要的领域,根据教学目标是重视学生的学习结果还是过程,教学目标又可分为行为目标和过程目标,我们在确定教学目标时应全方位地加以考虑.) [教学重点] 互斥事件的概念及其概率的求法 [教学难点] 对立事件与互斥事件的关系,事件A+B的概率的计算方法.[教学模式] 以探究为主导策略的教学模式,“帮助学生发展理智素养和理智技能”.(点评:在探究模式中,大部分时间由教师控制,但仍需要学生积极参与活动,教师的主要任务是为学生的探究活动去精心地创设问题情境,并对学生的探究结果给出客观性的评价) [教学程序] 1、创设情境,让学生的思维“动”起来 [问题1] 在一个盒子内放有10个大小相同的小球,其中有7个红球,2个绿球,1个黄球.若从盒中摸出1个红球记为事件A,从盒中摸出1个绿球记为事件B,从盒中摸出1个黄球记为事件C,则事件A、B、C之间存在怎样的关系(如图1)? 思考1:如果从盒中摸出1个是红球,则说明事件A怎么样? 思考2:如果从盒中摸出的1个球是绿球,即事件B发生,则说明事件A又如何呢? 思考3:通过对1、2的探究你发现了什么? (点评:以上几个思考题不能和盘托出,应逐个抛出,并留给学生思维的空间,让学生的头脑动起来.)学生展开思维活动,并将探索出来的结论加以归纳概括.[探究结论1] 事件A与B不可能同时发生,这种不可能同时发生的两个事件叫做互斥事件.同理,事件B与C、事件A与C都是互斥事件.思考4:若事件A、B、C中任何两个都是互斥事件,则就事件A、B、C彼此互斥,那么,三个以上的事件是否也能存在这样的关系呢?若能,请你把它推广到n个事件的情形.(点评:引导学生的思维向纵深发展,由特殊的情形去大胆地猜想一般的情形是否也存在,从而培养学生由特殊到一般的推理思维方式.) 2、广泛联想,让学生的思维“活”起来 为了加深对概念的深刻理解,更清楚地认识事物的本质属性,迅速地建构起知识的认知结构,教师应引导学生展开广泛的联想.(点评:集合是数学中基本概念之一,是联系中学数学中众多不同知识的纽带,当从集合的角度去认识排列、组合和概率时,求排列数、组合数和概率,都可看成一个全集下的某个子集到数的集合的不同的映射,这样有助于揭示这些概念的本质及其内在联系,可见广泛的联想能让学生的思维活跃起来.) [设问1] 联想集合的知识,想一想,能用集合的知识来解释互斥事件的概念吗?若能,请给出互斥事件的集合意义.[联想与思考] 要求学生在联想与独立思考的基础上开展小组讨论,并归纳概括出建立在集合意义上的互斥事件的形象解释.[探究结论3] 从集合的角度看,几个事件彼此互斥,是指由各个事件所含的结果组成的集合彼此不相交,即交集是空集,如图1所示.[设问3] 互斥事件与对立事件存在着怎样的关系? 学生思考、讨论与概括可得如下的探究结论: [探究结论5] 一般地,两个事件对立是两个事件互斥的充分条件,但不是必要条件.[反馈训练]判别下列每对事件是否是互斥事件: 从一堆产品(其中正品与次品都多于2个)中任取2件,其中:(1)恰有1件次品和恰有2件次品;(2)至少有1件正品和全是次品;(3)至少有1件正品和至少有1件次品;(4)至少有1件次品和全是正品; 先由学生独立思考与求解,再请一名学生公布所做的答案,让大家来评判与讨论,直至得到正确答案.(点评:及时反馈是检验概念掌握情况的有效措施,通过练习来纠正学生对概念理解中的错误,从而强化概念的理解与掌握.) 3、变式教学,让学生的思维“跳”起来 对问题不断地进行变换,在变换中增加思维的难度,让学生的思维“跳一跳”才能够得着,以便培养学生探究与创新的能力.[变换1] 对上面的问题1稍作变形:“若从盒中摸出1个球,得到红球或绿球的概率是多少?”(点评:经变换后的问题,显然增加了思维的难度,为了让学生“跳一跳”能够得着,有必要把问题加以分解,为问题的解决搭设思维的台阶,本题难在其事件的结果为若干个,而不是单一的.) 为了解答这个问题,我们可以设计系列思考题,从而降低问题的难度.思考1:满足怎样的条件,才表示这个事件发生? 思考2:这个事件是否能分解为若干个基本事件? 思考3:若把这个事件记作A+B,则A+B的概率如何求? 引导学生思考与讨论,可得出如下结论: 4、注重反思,让学生的思维“深”下去 解决问题不能只追求得出一个答案,应注重解题后的反思,这样才能从题海中解脱出来,达到举一反 三、触类旁通的功效,才能训练学生思维的深刻性.例1 某地区的年降水量在下列范围内的概率如下表所示: 引导学生分析与探究,并让学生登台讲解,然后引导学生反思,归纳求解的方法与步骤,以及应当注意的问题.[反思1] 设定义过的事件A、B、C、D是彼此互斥的事件组,要结合题意分析清楚互斥的原因;所求事件是关于互斥事件A、B、C、D中两个或几个的和的事件,不符合这两点,就不能运用互斥事件的概率加法公式.[反思2] 解题步骤可归结为如下四步: (1)用数学符号来表示问题中的有关事件;(2)判断各事件间的互斥性;(3)应用概率加法公式进行计算;(4)写出答案.例2 在20件产品中,有15件一级品,5件二级品,从中取3件,其中至少有1件为二级品的概率是多少? 引导学生分析,求解与反思.[反思1] 当问题所涉及的事件包含若干个事件时,要注意进行合理的分类讨论,如:“至少有1件为二级品”可分解为3个事件:示3件全是二级品的事件.[反思2] 在求某些稍复杂的事件的概率时,通常有两种方法:一是将所求事件的概率化成一些彼此互斥的事件的概率的和,二是先去求此事件的对立事件的概率,前者是直接法,后者为逆向思维法,即间接法.5、学会建构,让学生的思维得以升华 零散的知识点,不易被人们所接受和记忆,教师要引导学生对所学的内容给予高度的抽象和概括,建构精炼的知识结构的框架,便于记忆和应用.本教案的教学设计试图依据新课程所倡导的教学理念,注重课程的发生和开发过程,注重师生交往、互动、共同发展的过程,关注学生的发展和情感体验.参考文献: 1.陈希平.实验直观 抽象 目标 评价 调控.数学通报.2002,6 表示恰有1件为二级品的事件,表示恰有2件为二级品的事件,表2.房之华.对互斥事件的教学设计.数学教学.2004,4 3.傅建明.课堂教学基本技能训练.杭州大学出版社,1995,11 4.奚定华.数学教学设计.华东师范大学出版社,2001,1 5.徐英俊.教学设计,教育科学出版社,2001.9 6.王书臣,刘长华,蒋永晶.数学新课程教学设计,辽宁师范大学出版社,2002.5 7.张景斌.中学数学教学教程.科学出版社2000,12 计算机操作系统实验报告 一、实验名称:售票员和汽车司机的进程同步问题 二、实验内容:创建两个进程模拟售票员和汽车司机的同步行为。具体内容如下: 1.司机的活动:启动车辆,正常行车,到站停车。2.售票员活动:关车门,售票,开车门。 3.当发车时间到,售票员关好车门后,司机才能启动车辆,售票员才开始售票。当到站时,司机停稳车后,售票员才能打开车门,车上乘客先下车,然后站牌乘客上车。 三、问题分析与设计 分析:司机与售票员要协同工作:一方面只有售票员把门关好之后司机才可开车,因此售票员关好门之后要通知司机开车,然后售票;另一方面,也只有司机把车停下之后售票员才能开门让乘客下车和上车,因此,此时司机应通知售票员。汽车当前正在始发站停车让乘客让乘客上车,因此,必须设置一定的信号量来实现他们之间的同步问题。 设计:设置司机与售票员的信号量为全局变量,并且客车的人数:现在人数、下车人数、上车人数为全局变量;设置司机与售票员的线程。考虑到第一站和最后一站的问题,应单独处理,故在各自的线程中分情况讨论: 具体的思路是下面的图示。其中S1是司机的信号量,S2是售票员的信号量。 程序的实现(代码): #include int Recent_num=0;//某一时刻的客车上的人数 int Get_on_num;//上车的人数 int Get_off_num;//下车的人数 int pork=1;//客车到达路线的站数 HANDLE Semaphore_driver;//Driver的信号量 HANDLE Semaphore_conductor;//Conductor的信号量 //产生一定范围的随机数,可避免下面程序的判断是否超出客车的最大容量问题 int Get_random(int min,int max){ int a;srand((int)time(0));while(1){ a=rand()%(Total_num+1);if(a>=min && a<=max)return a;} } //Driver的线程 DWORD WINAPI Thread_Driver(LPVOID Driver){ while(pork<=Total_num){ if(pork==Total_pork){ WaitForSingleObject(Semaphore_driver,INFINITE);printf(“终点站到了,谢谢乘坐该公交车,祝您愉快!n”);printf(“到达终点站时汽车上还有 %d 人。n”,Recent_num);ReleaseSemaphore(Semaphore_conductor,1,NULL);return 0;} else { if(pork==1)printf(“发车时间到,现在是第 %d 站n”,pork);else printf(“ %d 站到了n”,pork);if(pork!=1)printf(“司机已停车。n”); ReleaseSemaphore(Semaphore_conductor,1,NULL);// 增加信号量 WaitForSingleObject(Semaphore_driver,INFINITE);printf(“已关门,汽车开始行使。n”);ReleaseSemaphore(Semaphore_conductor,1,NULL);} Sleep(1000);} return 0;} //Conductor的线程 DWORD WINAPI Thread_Conductor(LPVOID Conductor){ while(1){ if(pork < Total_pork){ WaitForSingleObject(Semaphore_conductor,INFINITE);if(pork==1){ Get_on_num=Get_random(0,Total_num-Recent_num);printf(“ %d 人已经从该站上车。n”,Get_on_num);Recent_num+=Get_on_num;} else { printf(“售票员请开门让乘客上下车!n”);Get_off_num=Get_random(0,Recent_num);printf(“%d人从第 %d 站下车。n”,Get_off_num,pork);Sleep(1000);//避免了时间的问题带来的不是随机数的现象 Recent_num-=Get_off_num;Get_on_num=Get_random(0,Total_num-Recent_num);printf(“%d人从该第 %d 站上车。n”,Get_on_num,pork);Recent_num+=Get_on_num;} printf(“此时车上共有:%d人n”,Recent_num);printf(“上车或下车完毕,售票员请关门!n”);ReleaseSemaphore(Semaphore_driver,1,NULL); WaitForSingleObject(Semaphore_conductor,INFINITE);printf(“现在售票员开始售票。n”);printf(“nnnn”);pork++;} if(pork==Total_pork){ ReleaseSemaphore(Semaphore_driver,1,NULL); WaitForSingleObject(Semaphore_conductor,INFINITE);printf(“售票员请开门让乘客下车!n”);return 0;} Sleep(1000);} return 0;} //主函数 int main(){ HANDLE Driver;HANDLE Conductor; Semaphore_driver=CreateSemaphore(NULL,0,1,“semaphore_driver”);//创建Driver的信号量 Semaphore_conductor=CreateSemaphore(NULL,0,1,“semaphore_conductor”);//创建Conductor的信号量 Driver=CreateThread(NULL,0,Thread_Driver,&Driver,0,NULL);//创建Driver的线程 Conductor=CreateThread(NULL,0,Thread_Conductor,&Conductor,0,NULL);//创建Conductor的线程 CloseHandle(Driver);//关闭Driver的线程 CloseHandle(Conductor);//关闭Conductor的线程 //GetLastError();while(1);system(“pause”);return 0;} 程序执行结果: 实验心得与反思: 通过本次实验,加深了我们对进程同步与互斥的理解,而且懂WaitForSingleObject函数的作用,它相当于P操作;而ReleaseSemaphore函数相当于V操作,用这两个函数来实现P,V操作,以改变信号量的值,从而实现进程同步。实验过程中,我们发现以下是我们应该反思的: 1:线程的创建的函数的参数的理解还不太懂,主要是没学过,对于其中的一些调用函数不太懂里面的意思。 2:线程的设计要考虑到各个情况,第一站和最后一战,还有其中的全局的变量的运算的放到的是售票员的线程中,也就是其中的一些操作的位置问题,要考虑到同步的两个线程之间的关系。3:关于信号量的问题,其要的是全局变量。 4:最最重要的是一些Win32 API 中的库函数有关线程的创建等的理解,对其中的函数参量的理解有待进一步学习理解。 09信管(2)班 何美西 109253030212 樊丽彬 109253030215 孔娜 109253030218第二篇:进程同步典型例题(操作系统)
第三篇:新版进程同步典型例题(操作系统)
第四篇:互斥事件(示范教案)
第五篇:售票员和汽车司机的进程同步问题