4.5同步和P-V操作
4.5.1 同步和互斥的概念
4.5.2 P-V操作概念
4.5.3 P-V操作解决互斥问题
4.5.4 P-V操作解决同步问题
4.5.5 经典同步问题
4.5.1进程同步和互斥的概念
进程的互斥关系:
多个进程由于共享了独占性资源,必须协调各进程对资源的存取顺序:确保没有任何两个或以上的进程同时进行存取操作。
互斥和资源共享相关
资源:临界资源
存取操作区域:临界区
进程的同步关系:
若干合作进程为了完成一个共同的任务,需要相互协调运行步伐。一个进程开始某个操作之前必须要求另一个进程已经完成某个操作,否则前面的进程只能等待。
进程的同步关系——另一种解释
合作进程中某些操作之间需要满足某种先后关系或某个操作能否进行需要满足某个前提条件,否则只能等待。
4.5.2 P-V操作的概念
信号灯概念
P-V操作的定义
P-V操作实现进程同步
经典同步问题
信号灯是一种卓有成效的进程同步机制
1965年荷兰学者Dijkstra提出
进程在运行过程中受信号灯状态控制,并能改变信号灯状态。
- 进程受控制:信号灯的状态可以阻塞或唤醒进程。
- 改变信号灯:信号灯的状态可以被进程改变、
信号灯的数据结构:
信号灯变量定义为一个二元矢量(S,q)
S:整数,初值非负(S又称信号量)
q:PCB队列(进程队列),初值为空集
struct SEMAPHORE{
int S;
pointer_PCB q;
};
两个操作:
P操作(函数或过程,P(S,q))
V操作(函数或过程,V(S,q))
P,V是荷兰语:Passeren通过,Vrijgeven释放。
P(S,q)
{
S = S - 1;
if (S < 0){
Insert(Caller , q);
Block(Caller);
转调度函数();
}
}
- P操作原理(P(S,q),P(S))
S值减1;
若差大于或等于零,该进程继续;
若差小于零,则该进程阻塞并加入到队列q中,并转调度函数。
提示:P操作可能使进程在调用处阻塞。
提示:S初值非常重要
- V操作原理(V(S,q),V(S))
S值+1;
若和大于零,则该进程继续;
若和小于等于零,该进程继续同时从q中唤醒一个进程。
V(S,q){
S = S + 1;
if ( S < 0 ){
Remove( q , pid );
Wakeup( pid );
}
}
4.5.3 P-V操作解决互斥问题
实质是实现对临界区的互斥访问
允许最多一个进程处于临界区
- 应用过程:
进入临界区之前先执行P操作;
离开临界区之后再执行V操作;
main(){
cobegin
Pa();
Pb();
Pc();
coend
}
Pa(){
P(mutex );
CSa;
V(mutex );
}
Pb(){
P(mutex );
CSb;
V(mutex );
}
Pc(){
P(mutex );
CSc;
V(mutex );
}
4.5.4 P-V操作解决同步问题
利用信号灯P-V操作实现同步
- 同步机制实质:
运行条件不满足时,能让进程暂停。
运行条件满足时,能让进程立即继续。
P-V操作应用与进程同步的基本思路:
暂停当前进程:在关键操作之前执行P操作
必要时可暂停
继续进程:在关键操作之后执行V操作
必要时唤醒合作进程
定义有意义的信号量S,并设置合适的初值。
信号量S能明确地表示“运行条件”。
分析售票员与司机的进程合作关系。
4.5.5 经典同步问题
经典同步问题1:生产者和消费者问题
一群生产者向一群消费者提供产品(数据),共享缓冲区
规则:
1.不能向满缓冲区存产品
2.不能从空缓冲区取产品
3.每个时刻仅允许1个生产者或消费者存或取1个产品
经典同步问题2:读者和编者问题
问题描述:有一本书;
有读者读书;有多个读者
有编者编书;有多个编者
要求:
1.允许多个读音同时读
2.不允许读者、编者同时操作
3.不允许多个编者同时操作
信号灯机制P-V操作解决同步问题
1.区分关键操作或运行条件或影响;
2.关键操作之前P操作
3.关键操作之后V操作
生产者-消费者问题:
同步和互斥混合;
读者-写者问题
互斥问题;