PV操作
1.基本概念
1.1临界资源
一次只允许一个或有限个进程访问的资源。
1.1临界区(Critical Section)
又叫关键段,是对临界资源进行访问的程序片段。
1.2信号量(Semaphore)
通常是一个整型变量S和一个队列。物理意义是:S>=0表示某资源的可用数目,S<0其绝对值表示堵塞队列中等待该资源的进程(线程被称为轻进程)数。
1.3互斥量(Mutex)
是简化版的信号量,只有两种状态:解锁和加锁。常常使用一个整型量,0表示解锁,其他值表示加锁。
1.4P操作
S = S-1,若S<0,则置该进程进入堵塞状态,并将该进程插入阻塞队列;否则继续执行。
BlockQueue bq;
Procedure P(var S:Semaphore);
Begin
S = S-1;
if (S<0){
then
sleep();
bq.push_back(this process);
End;
}
1.5V操作
S = S+1,若S<=0,则从阻塞队列中唤醒一个进程,并将其插入就绪队列,然后执行V操作的进程继续执行。否则执行V操作的进程继续执行。
ReadyQueue rq;
Procedure V(var S:Semaphore);
Begin
S = S+1;
if (S<=0)
then
rq.push_back(bq.front() );
bq.pop_front();
End;
}
2.互斥问题
如果多个进程要都要访问一个临界资源,访问的这段代码称为临界区,为了实现进程互斥的进入各自的临界区,采用下面的方式:
S = 1
P(S)
临界区
V(S)
3.同步问题
进程A在进程B到达L2前,不应前进到超过L1。
S = 0
进程A
…
L1: P(S)
…
进程B
…
L2: V(S)
…
4.生产者消费者问题
BufEmpty = 缓冲区总数 // 空闲的缓冲区数量
BufFull = 0 //已填充的缓冲区数量
Mutex = 1 //保证同时只有一个进程在写缓冲
// 生产者
Loop
生产一个产品
P(BufEmpty)
P(Mutex)
产品存入缓冲区
V(Mutex)
V(BufFull)
endloop
// 消费者
Loop
P(BufFull)
V(BufEmpty)
从缓冲区中取产品;
使用产品;
endloop
参考资料
《系统架构设计师教程》