收藏 分享(赏)

4.2同步与互斥实现方法.ppt

上传人:dreamzhangning 文档编号:3327116 上传时间:2018-10-14 格式:PPT 页数:20 大小:176.50KB
下载 相关 举报
4.2同步与互斥实现方法.ppt_第1页
第1页 / 共20页
4.2同步与互斥实现方法.ppt_第2页
第2页 / 共20页
4.2同步与互斥实现方法.ppt_第3页
第3页 / 共20页
4.2同步与互斥实现方法.ppt_第4页
第4页 / 共20页
4.2同步与互斥实现方法.ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、第八讲 同步与互斥实现方法,目的与要求:理解互斥问题的硬件实现方法;掌握信号量机制及使用它解决进程同步互斥问题的方法。 重点与难点:信号量实现与应用。 作业:4,6, 11,4.2.2实现临界段的硬件方法,利用处理机提供的特殊指令实现临界区加锁 常见硬件指令有: 1.屏蔽中断 举例存取balance: ParbeginA(amount)disableInterrupt();R1=balance;R2=amount;R1=R1+R2;balance=R1;enableInterrupt(); ;,B(amount) disableInterrupt();R1=balance;R2=amount;

2、R1=R1-R2;balance=R1;enableInterrupt(); ; Parend;,2、“Test_and_Set”指令。 该指令功能描述为: boolean Test_and_Set(boolean ,设Lock为全局布尔变量(初值为false),利用Test&Set指令,即可实现对临界区的加锁与解锁:,“test&set” 指令实现互斥汇编实例:T&S Ri,Aj (将(Aj)地址所指内存单元内容读到Ri寄存器中,同时将1置入Aj所指的内存单元中)设Lock为临界段锁变量,则安排如下指令,即可实现加锁与解锁:*,临界段,非临界段,A1 (如果R1=1则转 Loop ),A1

3、=(0置Lock内存单元),3、“Swap”指令。 该指令功能描述为: void Swap(boolean &a, boolean &b) boolean temp=a;a = b;b = temp;,设Lock为全局布尔变量(初值为false),每个进程设一个局部布尔变量Key。利用Swap指令,可实现对临界区的加锁与解锁。,do key = true;while(key=ture)Swap (lock, key);critical section;lock = false;non-critical section while(1);,4.2.3 信号量,信号量机制:“信号量”、“P、V操作

4、”。信号量S为一整型变量:P(S): While S0 ;空操作S = S-1 ;V(S):S = S1;P、V操作是两条原语,即保证P、V操作对变量S的访问是互斥操作。,一. 原语概念与实现 原语:指完成某种功能且不被分割或不被逻辑上中断执行的操作序列。 原语可通过硬件实现不可中断性;或通过实现临界段的元方法达到不被逻辑上中断。 实现临界段的元方法: 屏蔽中断(只用于单机) 加硬锁。,下面我们用屏蔽中断方法实现P(s)和V(s)的原子性。P(s)disableInterrupt(); while (s0) enableInterrupt();disableInterrupt(); ;s =

5、s - 1;enableInterrupt();V(s)disableInterrupt(); s = s +1;enableInterrupt();,二、信号量的应用(互斥与同步)互斥:用于n个进程的临界段互斥,n进程共享一个信号量mutex,初值为1,任一进程Pi的结构为:,P(mutex),V(mutex),临界段,非临界段,do,while(1),同步:有P1、P2 两进程,必须在P1执行完S1语句后,P2才能执行S2。需同步的两进程共享信号量synch,初值为0。,Parbegin,P2(): ,P1(): ,S1;,V(synch);,;,P(synch);,S2;,;,Paren

6、d;,请同学们用并行语句和PV操作描述,操作系统实现信号量时与进程调度相结合,消除忙等待现象。原则是:在P操作循环等待的地方加入放弃处理机/挂入等待队列动作,在V操作时,从等待队列中摘取进程变为就绪态。 (P、V原语本身的互斥操作通过屏敝中断或为信号量加硬锁实现),三.信号量的具体实现,1、信号量定义typedef structint value;struct process *L;semaphore; 2、P操作P(S):S.Value=S.value 1;If S.value0 then 保存现场,将本进程挂入S.L队列,重新调度。 3、V操作V(S):S.value:=value+1If

7、 S.value 0 then 从S.L队列取一进程,挂入就绪队列。,举例:用两个进程实现共享数组data1000累加,答: (1)设置共享变量:sum=0,i0,data1000 定义一个互斥信号量mutex,初值1 进程A: for(; ;) P(mutex); if(i1000) break; sum+=datai; i+; V(mutex); printf(“sum=%dn”,sum);进程B: for(; ;) P(mutex); if(i1000) break; sum+=datai; i+; V(mutex); ,(2)设置共享变量:sum1=0,sum2=0,data1000 定义一个同步信号量sync,初值0 进程A:int i; for(i=0; i500; i+) sum1+=datai; P(sync); sum1+=sum2; printf(“sum=%dn”,sum1);进程B: int j for(j=500; j1000; j+) sum2+=dataj; V(sync);,4.2.4管程基本思路:共享资源用共享数据结构表示,把分散的临界段集中于管程中,管程中的临界程序一次只允许一个进程调用。 管程主要构成:共享数据结构;对共享结构操作的一组函数;对数据结构的初始化程序,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报