操作系统课件+进程同步与通信
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法描述:
Main() { int S空=1;
int S满 =0; cobegin
A( ); B( ); coend }
A( ) { while true
{ P(S空); 放信息到缓冲区buf; V(S满 ); } }
B( ) { while true
{ P(S满); 到缓冲区buf取数据; V(S空 );
if (s.value<0) {该进程状态设置为等待状态;
该进程的PCB插入相应的等待队列s.queue的末尾; } }
P原语操作的主要动作是: ①s=s-1 ②若s>=0,则进程继续执行; ③若s<0,则该进程被阻塞,并将它插入到该
信号量的等待队列中,然后转进程调度。
V原语如下:
V(S) {s.value=s.value++;
进程A
缓冲区
进程B
当缓冲区空时,打印进程B将因不能获得所需数据而阻塞, 一旦进程A将数据送入缓冲区,便唤醒B;反之,当缓冲区 满,进程A不能再向缓冲区投放数据,进程A阻塞,仅当进 程B将缓冲区内数据取走时才能唤醒进程A.
2. 进程的互斥(源于资源共享)
由于两个或两个以上进程竞争某些一次被一个进 程使用的资源而导致的进程间的制约关系
2)用信号量实现进程同步
方法: 找出进程之间的同步关系,并为每种关系设 置一个信号量,然后在需要等待某种动作的 地方插入P操作,在被等待的动作完成之后插 入V操作。
Eg:
A
缓冲区
B
同步问题:
1)有哪些信息?“缓冲区空”,“缓冲区满” 2)每个信息设一个信号量:S空,S满 3)信号量初值: S空=1,S满=0
从有界缓冲区中取产品;
v(mutex); v(empty);
coend
}
}
}
消费一个产品;
}
}
在生产者-消费者问题中应注意:
①在每个程序中必须先做P(mutex),后做V(mutex),二者 要成对出现,夹在二者中间的代码段就是该进程的临 界区;
②对同步信号量full和empty的P、V操作同样必须成对出 现,但他们分别位于不同的程序中;
第4章 进程同步与通信
4.1 进程间的相互作用 4.2 进程通信 4.3 死锁
4.1 进程间的相互作用
进程的同步 进程的互斥 信号量和P、V操作 进程通信
4.1.1 进程间的联系
进程同步
进程间的制约关系
进程互斥
1.进程同步(源于进程合作)
进程之间存在逻辑上的先后顺序关系
【例】一个计算进程A通过单缓冲区向打印进程B提供数据
P1: R1=count; R1=R1+1; count=R1;
P2: R2=count; R2=R2+1; count=R2;
P1: R1=count; P2: R2=count; P1: R1=R1+1;
count=R1; P2: R2=R2+1;
count=R2;
【例】一飞机订票系统,两个终端T1和T2连接到订票系统 所在的服务器上,同时运行P1和P2进程。
{ while(生Βιβλιοθήκη Baidu未完成)
{ while(还要继续消费)
int empty=n;
{ p(empty);
{ p(full);
int mutex=1; cobegin
produceri( ); consumerj( );
p(mutex);
送一个产品到有界缓冲区;
v(mutex); v(full);
p(mutex);
1.信号量
信号量是一个确定的二元组(s,q), s是一个具有非负初值的整型变量,q是一 个初始状态为空的排队站。
整型变量s代表资源的实体或并发进程的状 态,它的值可以改变,以反应资源或并发 进程状态的改变。
2. P、V操作
信号量的数值仅能由P,V原语操作改变。
P原语如下:
P(S) {s.value=s.value--;
swait(s,1,0):当s>=1,允许多个进程进入某 临界区;当s=0后,阻止任何进程进入临 界区。
4.1.5 经典的同步问题
1.生产者-消费者问题
描述了一组生产者向一组消费者提供产品,它
们共享一个有界缓冲区,生产者向其中投放产
品,消费者从中取得产品。
c1
p1 c2
p2
c3
p3
ck pm
满
in 需要两个同步信号量:full、empty out
将所有等待Si资源的进程移到就绪队列
}
一般“信号量集”机制
Swait(S1,t1,d1, S2,t2,d2, …, Sn,tn,dn, ) { if(S1>=t1&&…&&Sn>=tn)
for(i=1;i<=n;i++) Si=Si-di;
else
将进程插入第i(Si<1)个等待队列 设该进程的程序计数器到Swait操作的开始
综合前面两种算法,让两个进程共享两个变量:flag数 组表示进程要求进入临界区或正在临界区中执行;turn用 于表示系统允许哪个进程进入临界区。
Int flag[2]={0,0}; P1: While(1) {flag[0]=1;turn=2;
while(flag[1]&&turn==2) no-op; critical section flag[0]=0; }
2.读者-写者问题
在计算机系统中,有些文件是可共享的。当若干个并发进程 都要访问某个共享文件时,应区分是读还是写(修改)文件。 显然可允许多个进程同时读文件,但不允许在进程读文件时让 另一个进程去修改文件,或者有进程在修改文件时让另一个进 程去读,否则会造成读出的内容不正确,尤其是绝对不允许多 个进程同时修改同一个文件,这样一类问题称为“读者-写者” 问题。
No-op; Critical section Turn=2; }
2.标识算法
将公共变量turn改为一个公共数组flag,以记录 系统中个别进程的状态,其中每个元素初值为0, 表示所有进程都未进入临界区。
Int flag[2]={0,0}; P1: While(1) {while(flag[1])
③无论在生产者进程中还是在消费者进程中,两个P操作 的次序不能颠倒。应先执行同步信号量的P操作,再执 行互斥信号量的P操作,否则可能造成进程死锁;
有一只铁笼子,每次只能放入一只动物。 猎手向笼中放入老虎,农民向笼中放入猪, 动物园等待取笼中的老虎,饭店等待取笼中 的猪,试用P,V操作写出能同步执行的程 序。
Pa( ) { ……
Pb( ) { ……
cobegin
Pa( ); Pb ( ); coend
}
P(mutex); csa; V(mutex); ……
}
P(mutex); csb; V(mutex); ……
}
信号量变化: Mutex=1,表示没有进程进入临界区; Mutex=0,表示有一个进程进入临界区; Mutex=-1,表示一个进程进入临界区,另一个进程等待进入。
1)用信号量实现进程间互斥(若干进程互斥访问一个临界资源)
方法:
设互斥信号量mutex mutex=1 在临界区前加P(mutex) 在临界区后加V(mutex)
设两个并发进程Pa 和Pb,具有相对于变量n的临界段csa和 csb,用信号量实现他们的互斥。
描述如下:
Main() { int mutex=1;
一个互斥信号量:mutex
初值:
full=0 ,表示放有产品的缓冲区数目
空
empty=n,表示可供使用的缓冲区数目
环形缓冲池
mutex=1,互斥信号量,表示互斥进入临界区
Main( )
Produceri( ) //i=1,2,…m consumerj( ) //i=1,2,…k
{ int full=0;
if (s.value<=0) {唤醒相应等待队列s.queue中等待的一个进程;
改变其状态为就绪态,并将其插入就绪队列; } }
V原语的操作主要动作是:
①s=s+1 ②若s>0,进程继续执行; ③若s<=0,则从该信号的等待队列中唤醒
一等待进程,使其状态变为就绪,然后 再返回原进程继续执行。
3. 信号量的应用
4.1.3 利用硬件方法解决进程互斥问题
1. 利用test-and-set指令实现互斥 2. 利用swap指令实现进程互斥
4.1.4 信号量和P、V操作
信号是铁路交通管理中的一种常用设备 ,交通管理人员利用信号颜色的变化来 实现交通管理。在操作系统使用的信号 量正是从交通管理中引用过来的一个术 语。
}
Ssignal(S1,t1,d1, S2,t2,d2, …, Sn,tn,dn, ) {
for(i=1;i<=n;i++)
Si=Si+di;
将所有等待Si资源的进程移到就绪队列
}
特殊情况:
swait(s,d,d):一个信号量,每次可申请d个 资源;
swait(s,1,1):记录型信号量(s>1)或互斥信 号量(s=1);
【例】有两个进程A和B共享一台打印机 打印机
进程A
进程B
若系统已将打印机分配给进程A使用,此时如果进程B申 请占用打印机,那么进程B只能阻塞等待,当进程A释放 打印机后,系统便唤醒进程B,使之由阻塞变为就绪,并 将打印机分配给进程B使用。
3.临界资源
一次仅允许一个进程访问的资源
【例】进程P1、P2共享变量count ,统计两进程对共享变量 Count访问的次数。
打印数据;
} }
小结:
互斥:每个临界资源设一个信号量,初值 =1(表示只有一个资源可用),每个进 程使用该资源前p(s),使用该资源后v(s).
同步:每个信息设置一个信号量,初值按 照要求设定,发信号的进程执行v(s),检 查信号的进程执行p(s).
信号量的物理意义: S>0: 表示有S个资源可用。 S=0:表示无资源可用。 S<0:则S的绝对值表示S等待队列中的进程个数 P(S):表示申请一个资源。 V(S):表示释放一个资源。
do{ Entry section critical section
Exit section
/*入口区*/ /*临界区*/ /*出口区*/
remaider section /*剩余区*/ }while(1) ;
如图所示的三个并发进程,其中ab、ef段对某一变量Q进行写入 操作,cd段对该变量Q进行读出操作。此时,Q为这三个进程的临界 资源,而ab、cd、ef就是对Q进行操作的临界区。这三个进程中最多 只能有一个可以进入临界区,否则就会造成混乱。
P1 …… READ(X) IF X>=1 THEN X:=X-1 WRITE(X) ……
P2 …… READ(X) IF X>=1 THEN X:=X-1 WRITE(X) ……
4. 临界区(CS)
把每个进程中访问临界资源的那段程序代码称为临界区
各进程对临界资源的访问必须互斥地进入临界区,即进
入临界区先申请,经允许后方可进入。
no-op; flag[0]=1; critical section flag[0]=0; }
Int flag[2]={0,0}; P1: While(1) { f lag[0]=1;
while(flag[1]) no-op; critical section flag[0]=0; }
3.算法综合
AND同步机制的思想: Swait(S1,S2,…,Sn) { if(S1>=1&&…Sn>=1)
for(i=1;i<=n;i++) Si--;
else
将进程插入第i(Si<1)个等待队列 设该进程的程序计数器到Swait操作的开始
}
Ssignal(S1,S2,…,Sn) {
for(i=1;i<=n;i++) Si++;
AND型信号量集机制
问题引入: 进程P、Q访问共享数据A和B 信号量 Amutex=1 , Bmutex=1
Process P: wait(Amutex); wait(Bmutex);
Process Q: wait(Bmutex); wait(Amutex);
P、Q交替执行 Process P:wait(Amutex),则Amutex=0 Process Q:wait(Bmutex),则Bmutex=0 Process P:wait(Bmutex),则Bmutex=-1,P阻塞 Process Q:wait(Amutex),则Amutex=-1,Q阻塞 发生死锁
e
a
Q
c
b
f
d
进程A
进程B 进程C
具有临界区的并发进程
5.临界区的调度原则
a、空闲让进 b、忙则等待 c、有限等待 d、让权等待
4.1.2利用软件方法解决进程互斥问题
1.交替算法 设公共变量turn,这个变量负责指出目前允许进
入临界区的是哪个进程。如果turn=1,表示允 许进程p1进入临界区。 While(1) { while(turn!=1)