欢迎来到天天文库
浏览记录
ID:38317653
大小:1.29 MB
页数:70页
时间:2019-06-09
《进程同步与通信xiuga》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第3章进程同步与通信●进程同步与互斥●经典进程同步问题●管程●AND信号量●进程通信本章要点取空闲块的进程Getspace:Begin局部变量gg=stack[top]top=top-1返回值为gEnd释放数据块ad的进程Release(ad):Begintop=top+1stack[top]=adEnd设t0时刻,top=3。假设执行顺序为:先执行Release(ad)的第一条:top=top+1=3+1=4再执行Getspace:g=stack[4],top=top-1=3再执行Release(ad)的第二条:stack[3]=ad●3.1进程的同步与互斥●3.1进程的
2、同步与互斥同步与互斥的引入●OS引入进程后,由于进程的异步性,可能会导致程序执行结果的不确定性,使程序执行时出现不可再现性。●进程互斥与同步的主要任务是使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。程序的制约方式有如下两种:(1)间接制约方式。互斥这是由于竞争相同资源而引起的,得到资源的程序段可以投入运行,而得不到资源的程序段就是暂时等待,直至获得可用资源时再继续运行。(2)直接制约方式。同步这通常是在那些逻辑上相关的程序段之间发生的。一般是由于各种程序段要求共享信息引起的。进程同步的基本概念●同步:指多个进程中发生的事件存在着某种时序
3、关系,它们必须按规定时序执行,以共同完成一项任务。●互斥:多个进程不能同时使用同一资源。●临界资源:某段时间内仅允许一个进程使用的资源。●临界区:每个进程中访问临界资源的那段代码。例:P1,P2两进程共享变量COUNT(COUNT的初值为5)P1:{R1=COUNT;R1=R1+1;COUNT=R1;}P2:{R2=COUNT;R2=R2+1;COUNT=R2;}分析:●1》执行顺序P2→P1执行结果P1:COUNT为7,P2:COUNT为6。●2》执行顺序P1:{R1=COUNT}P2:{R2=COUNT}P1:{R1=R1+1;COUNT=R1}P2:{R2=R2=1;
4、COUNT=R2}执行结果P1:COUNT为6,P2:COUNT为6。临界资源实例例:P1,P2两线程共享变量COUNT(COUNT的初值为5)P1:{R1=COUNT;R1=R1+1;COUNT=R1;}P2:{R2=COUNT;R2=R2+1;COUNT=R2;}用Bernstein条件考察R(P1)={R1,COUNT}W(P1)={R1,COUNT}R(P2)={R2,COUNT}W(P2)={R2,COUNT}R(P1)∩W(P2)<>{}临界资源实例●P1、P2不符合Bernstein条件●必须对程序的执行顺序施加某种限制While(1){●空闲让进当无进程处于
5、临界区时,临界资源处于空闲状态。此时允许进程进入临界区。●忙则等待当已有进程进入临界区时,临界资源正在被访问,其他想进入临界区的进程必须等待。●有限等待对于要求访问临界资源的进程,应保证在有效的时间内进入,以免进入“死等”状态。●让权等待当进程不能进入临界区时,应立即释放处理机,以免进程进入“忙等”。进入区临界区退出区剩余区}同步机制应遵循的准则访问临界资源的进程描述为互斥实现的硬件方法●禁止中断●专用机器指令●TS(TestandSet)指令●Swap指令//TS指令:booleanTS(lock);booleanlock;{booleantemp;temp=lock;l
6、ock=true;returntemp;}●Lock有两种状态:●当lock=false时,表示资源空闲;●当lock=true时,表示资源正在被使用。●为了实现互斥,设布尔变量lock,其初值为false,表示资源空闲。利用TS指令实现互斥。●缺点:没有做到:“让权等待”。//TS指令的使用while(TS(lock))/*什么也不做*/;临界区;lock=false;剩余区;TS(TestandSet)指令互斥实现的软件方法//进程0while(turn!=0)//什么都不做;临界区;turn=1;剩余区;//进程1while(turn!=1)do//什么都不做‘;临界
7、区;turn=0;剩余区;●设置公共整型变量turn,用于指示进入临界区的进程编号i(i=0,1)。使P0、P1轮流访问临界资源。●缺点:强制性轮流进入临界区,不能保证“空闲让进”。——单标志算法//进程0while(flag[1])//什么都不做;flag[0]=true;临界区;flag[0]=false;剩余区;//进程1while(flag[0])//什么都不做;flag[1]=true;临界区;flag[1]=false;剩余区;●设置数组flag,初始时设每个元素为false,表示所有进程都未进入临界区
此文档下载收益归作者所有