同步与互斥实现方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T&S Ri,Aj 解释为将(Aj)地址所指内存 单元内容读到Ri寄存器中,同时将1置入Aj 所指的内存单元中.
设Lock为临界段锁变量,则安排如下指令, 即可实现加锁与解锁:*
A1< = &Lock; (将 Lock 单元地址送 A1 寄 存器。Lock单元初始值为0) Loop:T&S R1,A1; JRN R1,Loop; (If (R1=1)then goto Loop ) 临界段
Parbegin
P1(): { …… P2(): { ……
S1; Leabharlann Baidu(synch);
…… };
P(synch); S2;
…… };
Parend;
S1
S2 S3
S4 S5 S6
S7
请同学们用并行语句和PV操作描述
三.信号量的具体实现 操作系统实现信号量时与进程调度相结合, 消除忙等待现象。 原则是:在P操作循环等待的地方加入放弃 处理机/挂入等待队列动作,在V操作时, 从等待队列中摘取进程变为就绪态。 (P、V原语本身的互斥操作通过屏敝中断 或为信号量加硬锁实现)
1、信号量定义 typedef struct{ int value; struct process *L; }semaphore; 2、P操作 P(S):S.Value=S.value –1; If S.value<0 then 保存现场, 将本进程挂入S.L队列,重新调度。 3、V操作 V(S):S.value:=value+1 If S.value ≤0 then 从S.L队列 取一进程,挂入就绪队列。
第八讲 同步与互斥实现方法
目的与要求:理解互斥问题的硬件实现
方法;掌握信号量机制及使用它解决进 程同步互斥问题的方法。 重点与难点:信号量实现及使用。 作业:4,6, 11
4.2.2实现临界段的硬件方法
利用处理机提供的特殊指令实现临界区加锁 常见硬件指令有: 1.屏蔽中断 Parbegin
设Lock为全局布尔变量,利用Test&Set指 令,即可实现对临界区的加锁与解锁:
Do { while Test_and_Set (lock) ; critical section; lock = false; non-critical section while(1);
“test&set” 读后置1指令实现互斥实例:
二、信号量的使用(互斥与同步) 互斥:用于n个进程的临界段互斥,n进程 共享一个信号量mutex,初值为1,任一进 程Pi的结构为:
do{
P(mutex)
临界段 V(mutex) 非临界段
}while(1)
同步:有P1、P2 两进程,必须在P1执行完S1
语句后,P2才能执行S2。需同步的两进程共享 信号量synch,初值为0。
critical section; lock = false; non-critical section while(1);
4.2.3 信号量
信号量机构:“信号量”、“P、V操作”。 • 信号量S为一整型变量:
• P(S): While S≤0 ;空操作 S = S-1 ;
• V(S):S = S+1;
A1 <=&Lock; (A1) <=0;(0置Lock内存单元)
非临界段
设Lock为全局布尔变量(初值为假),每 个进程设一个局部布尔变量Key。利用Swap 指令,可实现对临界区的加锁与解锁。
do { key = true; while(key==ture) Swap (lock, key);
P、V操作是两条原语,即保证P、V操作对 变量S的访问是互斥操作。
一. 原语概念与实现
原语:指完成某种功能且不被分割或不被 中断执行的操作序列。 原语可通过硬件实现不可中断性;或通过 实现临界段的元方法达到不被中断。 实现临界段的元方法: •屏蔽中断(只用于单机) •加硬锁。
下面我们用屏蔽中断方法实现P(s)和V(s)的 原子性。 P ( s) { disableInterrupt(); while (s≤0){ enableInterrupt(); disableInterrupt(); } s = s - 1; enableInterrupt(); } V ( s) { disableInterrupt(); s = s +1; enableInterrupt(); }
A(amount){ disableInterrupt(); R1=balance; R2=amount; R1=R1+R2; balance=R1; enableInterrupt(); };
B(amount) { disableInterrupt(); R1=balance; R2=amount; R1=R1-R2; balance=R1; enableInterrupt(); };
Parend;
2、“Test_and_Set”指令。 该指令功能描述为: boolean Test_and_Set(boolean &target){ Boolean rv=target; target = true return rv; }
3、“Swap”指令。 该指令功能 void Swap(boolean &a, Boolean &b) { boolean temp=a a = b b = temp }