第3章进程同步(2)演示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
.5 进程的互斥
互斥(mutual exclusion)定义为共享某资源的各进程不能同时进行同一操作。
我们将由共享公有资源而造成的对并发进程执行速度的制约关系称为进程间的间接制约关系。
进程的互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用,其它要使用该资源的进程必须等待,直到占用资源者释放了该资源。例如,一个变量x,如果一个程序执行完毕后再执行一个,那麽这个x的执行结果很明确,是唯一的。但多道程序允许多个作业以进程的方式同时存在,什麽时候谁运行,从外部根本无法知道,那麽就有可能发生同时修改一个变量的情况。此时进程互斥的主要任务,是保证诸进程能互斥地访问资源。
互斥也可看作是一种特殊的同步关系。实现互斥要有工具。
3.5.
1 临界区(Critical Section)
1.临界区的定义和进入
我们把一次仅允许一个进程使用的资源称为临界资源(Critical Resource)。如打印机,绘图仪,磁带机等,公共变量,公用表格,公用队列等。
我们把在每个进程中访问临界资源的那段程序称为临界区,或叫临界段(互斥段)它能够从概。
COUNT。
此时两个进程各自对COUNT作了加操作,而COUNT增加了2。
如果执行是另一种顺序。
虽然两个进程也各自对COUNT作了加一操作,但COUNT却只增加了一。
为了预防这种错误,COUNT这个公用变量应按临界资源处理。诸进程进入临界区时必须互斥,即当P1进入临界区时,不管它对COUNT进行什么操作,必须它退出后这段临界区后,才允许P2访问自己的临界区。这就叫操作不可分割。
p1:return ptr1:=ptr;获得第一个缓冲区的PTR
ptr:=tail(ptr);指针指向下一个
p2:reture ptr2:=ptr;获得第二个缓冲区的PTR
ptr:=tail(ptr);指针指向第三个
但如果程序顺序是:
p1:return ptr1:=ptr ; 获得第一个缓冲区的PTR
发生时钟中断:
p2:reture ptr2:=ptr ; 也获得第一个缓冲区的PTR
p1:ptr :=tail(ptr); 指针指向 第二个PTR
p2:ptr :=tail(ptr); 指针指向第三个PTR
执行结果造成p1,p2共得一个缓冲区,第二个缓冲区丢失,第三个缓冲区成为首部。
此,必须在临界区前面增加一段用于进行上述检查的代码,把这段代码称为进入区(entry section )。相应地,在临界区后面也要加上一段称为退出区(exit section )的代码,用于将临界区正被访问的标志恢复为未被访问标志。
repeat
until false
2.同步机制应遵循的准则
为实现进程互斥,可利用软件方法,也可在系统中设置专门的同步机制来协调诸进程,但所有的同步机制都应遵循下述四条准则:
⑴ 空闲让进。
⑵ 忙则等待
⑶ 有限等待
⑷ 让权等待
3.5.2 实现临界区互斥的锁操作方法
1.关闭中断
最简单的方法是使每个进程在进入临界区后先关闭中断,在离开之前再开中断。中断被关掉后,时钟中断也设法被屏蔽。CPU 只有发生时钟中断或其它中断时才会进行进程切换,这样关中断之后的CPU 将不会被切换到其它进程。于是,一旦进程关中断之后,它就可检查和修改共享内存(公共变量、公共表格),而不必担心其它进程的介入引起与时间有关的错误。
2.设置锁变量
在测试与设置方法中,设置个变量w来代表某种临界资源的状态,因此w又成为锁或锁位。
w=0 表示资源空闲(可用)
w=1 表示资源已被使用
关锁原语: lock(w);
关中断
L:if w=1 then goto L
else w:=1;
开中断
开锁原语: unlock(w);
w:=0;
大家注意:由于原语执行时不可分割(或中断)。
考虑三个进程
P1:P2:P3:
……
1;
……
指令
IBM360/370采用汇编实现
LOCK(X)
TS X 测试锁位并置1,送PSW(条件码)
BNZ *-4 不为0,往回跳4字节,继续执行TSX。
UNLOCK(X)
MVI X,’00’
Intel 8086/8088 汇编指令也能实现锁原语。
OCK PROC FAR;汇编语言的过程保留字
MOV AL,1;将1送入AL寄存器
AGAIN:XCHG AL,FLAG ;交换指令,状态进入AL,FLAG=1关锁
TEST AL,AL;测试AL,看状态是什么
JNZ AGAIN;AL=1时回跳(FLAG=1)
RET;返回主程序
UNLOCK PROC FAR;开锁
MOV FLAG ,0;FLAG=0
RET;
修改后的关锁和开锁原语为:
lock w:
begin if w=1
then begin
block(n);
insert(wL,n);
scheduler
end
else w:=1
end;
unlock w:
begin if wL
then begin
remove(wL,q);
states(q):=‘readya’;
insert(RL,q)
end;
w:=0
end;
3.5.3 信号量机制(semaphores machinist)
在实际的操作系统中,是采用P、V操作。P、V是荷兰语Passeren和 Verhoog的头一个字母,在英语中对应Wait(DOWN、SLEEP)与Signal(UP、WAKEUP),它是由荷兰的Dijkstra提出的一种方法。
P和V是两个原语(两个过程段)在信号量上的操作。
1.信号量
信号量是表示资源的物理实体,是一个与队列有关的整型变量。在类pascal中,将它表示为一个记录。
type semaphore=record
val:integer;值域
L:pointer;指针域
end;
信号量实际是一个计数锁(广义锁),它的值只能由P、V操作来改变。
2.P、V操作(计数信号量机制)
procedure p(s);
var s:semphore;
begin lock out interrupt;关中断
s.value=s.value-1;
if s.value<0
then begin
states(q):=blockeda;活动阻塞
insert(wL,q);插入等待队列
unlock interrupt;开中断
scheduler;重新分配CPU
end
else unlock interrupt;开中断
end;
procedure v(s)
var s:semaphore;
begin
lock out interrupt;关中断
s.value:=s.value+1;
if s.value<=0 等待队列不空
then begin
remove(wl,r);从wl队中摘下r
states(r):=readya;活动就绪
insert(rl,r);插入就绪队列
length(rl):=length(rl)+1
endl;
unlock interrupt 开中断
end;