预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共79页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

计算机操作系统第三章进程同步与通信3.1进程互斥和同步在多道程序系统中,由于资源共享和进程合作,使各进程之间存在两种类型的制约关系: (1)间接制约关系(互斥) (2)直接制约关系(同步) 进程同步指多个相关进程在执行次序上的协调,用于保证这种关系的相应机制称为进程同步机制 互斥指进程之间竞争使用某种资源3.1.1互斥算法3.1.1.1临界资源举例1:共享变量的修改冲突举例2:竞争条件RaceCondition假定初始状态下count=5 S0:producerexecuteregister1=count{register1=5}S1:producerexecuteregister1=register1+1{register1=6}S2:consumerexecuteregister2=count{register2=5}S3:consumerexecuteregister2=register2-1{register2=4}S4:producerexecutecount=register1{count=6}S5:consumerexecutecount=register2{count=4}竞争条件racecondition举例3操作顺序冲突有6种可能的操作顺序,只有一种结果是正确的。进程的交互关系:可以按照相互感知的程度来分类3.1.1.2临界区的访问过程临界区(criticalsection):进程中访问临界资源的一段代码。 进入区(entrysection):在进入临界区之前,检查可否进入临界区的一段代码。如果可以进入临界区,通常设置相应"正在访问临界区"标志 退出区(exitsection):用于将"正在访问临界区"标志清除。 剩余区(remaindersection):代码中的其余部分。3.1.1.3同步机制应遵循的准则3.1.1.4进程互斥的硬件方法利用TS实现进程互斥硬件方法的优点 适用于任意数目的进程,在单处理器或多处理器上 简单,容易验证其正确性 可以支持进程内存在多个临界区,只需为每个临界区设立一个布尔变量 硬件方法的缺点 等待要耗费CPU时间,不能实现"让权等待" 可能"饥饿":从等待进程中随机选择一个进入临界区,有的进程可能一直选不上 可能死锁3.1.2信号量(semaphore)3.1.2.1信号量和P、V原语信号量数据结构的定义1.P原语wait(s)2.V原语signal(s)3.利用信号量实现互斥4.利用信号量来描述前趋关系3.1.2.2信号量集Swait(S1,S2,…,Sn) //P原语; if(S1>=1andS2>=1and…andSn>=1) //满足资源要求时的处理; fori=1tondoSi=Si-1; //注:与wait的处理不同,这里是在确信可满足 //资源要求时,才进行减1操作; endfor; else //某些资源不够时的处理; 调用进程进入第一个小于1信号量的等待队列Sj.L; 阻塞调用进程; endifSsignal(S1,S2,…,Sn) fori=1tondo Si:=Si+1; //释放占用的资源; for(eachprocessPwaitinginSi.L) //检查每种资源的等待队列的所有进程; 从等待队列Si.L中取出进程P; if(判断进程P是否通过Swait中的测试) //注:与signal不同,这里要进行重新判断; begin //通过检查(资源够用)时的处理; 进程P进入就绪队列; end else//未通过检查(资源不够用)时的处理; 进程P进入某等待队列; endif endfor endfor2.一般“信号量集”Swait(S1,t1,d1;...;Sn,tn,dn);//P原语; if(S1>=t1and….Sn>=tn)then //满足资源要求时的处理; fori=1tondo Si=Si-di; endfor; else //某些资源不够时的处理; 调用进程进入第一个小于tj信号量的等待队列Sj.queue; 阻塞调用进程; endif Ssignal(S1,d1;...;Sn,dn); fori=1tondo Si:=Si+di; //释放占用的资源; for(eachprocessPwaitinginSi.queue) //检查每种资源的等待队列的所有进程; 从等待队列Si.L中取出进程P; if(判断进程P是否通过Swait中的测试) //注:与signal不同,这里要进行重新判断; begin //通过检查(资源够用)时的处理; 进程P进入就绪队列; end else//未通过检查(资源不够用)时的处理; 进程P进入某等待队列; endif endfor endfor 3.1.3经典进