欢迎来到天天文库
浏览记录
ID:24946227
大小:176.50 KB
页数:20页
时间:2018-11-16
《4.2同步与互斥实现方法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、第八讲同步与互斥实现方法目的与要求:理解互斥问题的硬件实现方法;掌握信号量机制及使用它解决进程同步互斥问题的方法。重点与难点:信号量实现与应用。作业:4,6,114.2.2实现临界段的硬件方法利用处理机提供的特殊指令实现临界区加锁常见硬件指令有:1.屏蔽中断举例存取balance:ParbeginA(amount){disableInterrupt();R1=balance;R2=amount;R1=R1+R2;balance=R1;enableInterrupt();};B(amount){disableInterrupt();R1=balance;R2=amoun
2、t;R1=R1-R2;balance=R1;enableInterrupt();};Parend;2、“Test_and_Set”指令。该指令功能描述为:booleanTest_and_Set(boolean&target){Booleanrv=target;target=true;returnrv;}设Lock为全局布尔变量(初值为false),利用Test&Set指令,即可实现对临界区的加锁与解锁:Do{whileTest_and_Set(lock);criticalsection;lock=false;non-criticalsectionwhile(1);“t
3、est&set”指令实现互斥汇编实例:T&SRi,Aj(将(Aj)地址所指内存单元内容读到Ri寄存器中,同时将1置入Aj所指的内存单元中)设Lock为临界段锁变量,则安排如下指令,即可实现加锁与解锁:*临界段非临界段A1<=&Lock;(将Lock单元地址送A1寄存器。Lock单元初始值为0)Loop:T&SR1,A1;JRNR1,Loop;(如果R1=1则转Loop)A1<=&Lock;(A1)<=0;(0置Lock内存单元)3、“Swap”指令。该指令功能描述为:voidSwap(boolean&a,boolean&b){booleantemp=a;a=b;b=t
4、emp;}设Lock为全局布尔变量(初值为false),每个进程设一个局部布尔变量Key。利用Swap指令,可实现对临界区的加锁与解锁。do{key=true;while(key==ture)Swap(lock,key);criticalsection;lock=false;non-criticalsectionwhile(1);4.2.3信号量信号量机制:“信号量”、“P、V操作”。信号量S为一整型变量:P(S):WhileS≤0;空操作S=S-1;V(S):S=S+1;P、V操作是两条原语,即保证P、V操作对变量S的访问是互斥操作。一.原语概念与实现原语:指完成某
5、种功能且不被分割或不被逻辑上中断执行的操作序列。原语可通过硬件实现不可中断性;或通过实现临界段的元方法达到不被逻辑上中断。实现临界段的元方法:屏蔽中断(只用于单机)加硬锁。下面我们用屏蔽中断方法实现P(s)和V(s)的原子性。P(s){disableInterrupt();while(s≤0){enableInterrupt();disableInterrupt();};s=s-1;enableInterrupt();}V(s){disableInterrupt();s=s+1;enableInterrupt();}二、信号量的应用(互斥与同步)互斥:用于n个进程的临
6、界段互斥,n进程共享一个信号量mutex,初值为1,任一进程Pi的结构为:P(mutex)V(mutex)临界段非临界段do{}while(1)同步:有P1、P2两进程,必须在P1执行完S1语句后,P2才能执行S2。需同步的两进程共享信号量synch,初值为0。ParbeginP2():{P1():{……S1;V(synch);……};……P(synch);S2;……};Parend;S1S2S3S4S5S6S7请同学们用并行语句和PV操作描述操作系统实现信号量时与进程调度相结合,消除忙等待现象。原则是:在P操作循环等待的地方加入放弃处理机/挂入等待队列动作,在V操作
7、时,从等待队列中摘取进程变为就绪态。(P、V原语本身的互斥操作通过屏敝中断或为信号量加硬锁实现)三.信号量的具体实现1、信号量定义typedefstruct{intvalue;structprocess*L;}semaphore;2、P操作P(S):S.Value=S.value–1;IfS.value<0then保存现场,将本进程挂入S.L队列,重新调度。3、V操作V(S):S.value:=value+1IfS.value≤0then从S.L队列取一进程,挂入就绪队列。举例:用两个进程实现共享数组data[1000]累加答:(1)设置共享变量:s
此文档下载收益归作者所有