信号量:semaphore
互斥量:mutex
PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,
P操作意味着请求分配一个资源.
V操作意味着释放一个资源
信号量的值只能通过PV操作来改变。
P表示通过的意思,V表示释放的意思。 P、V(或wait()、signal())
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来
当信号量的值为0时,表示期望的消息尚未产生;
当信号量的值非0时,表示期望的消息已经存在。
用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
举例:
某银行提供1个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务
semaphore empty = 10; //空位数初值
semaphore full = 0; //已使用
semaphore mutex = 1; //互斥访问叫号机
semaphore service = 0; //控制服务同步关系
process 顾客i
{
P(empty); //等空位,在营业员那边V,所以是一个同步关系
P(mutex);// 从取号机取号;
V(mutex);//释放取号机
V(full);//营业员那边在P,也是一个同步关系
P(service); //营业员那边在V,同步关系
}
process 营业员
{
while(1)
{
P(full);
V(empty);
V(service);
为顾客服务;
}
}
某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一个人通过。参观者的活动描述如下: cobegin 参观者进程i: { … 进门; … 参观; … 出门; … } coend
Semaphore empty=500; //博物馆可以容纳的最多人数
Semaphore mutex=1; //用于出入口资源的控制
cobegin 参观者进程i:
{
P(empty);
P(mutex); 进门;
V(mutex); 参观;
P(mutex); 出门;
V(mutex);
V(empty);
} coend
有一个理发师,一把理发椅和 N 把供等候理发的顾客坐的椅子。
如果没有顾客,则理发师便在理发师椅子上睡觉;
当一个顾客到来时,必须唤醒理发师进行理发;
如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。
为理发师和顾客各编一段程序(伪代码)描述他们的行为,要求不能带有竞争条件。
int wait = 0; //顾客等待的数量
semaphore mutex = 1; //互斥访问 wait
semaphore barber = 0; //理发师信号量
semaphore customer = 0; //顾客的信号量
//理发师
void barber() {
while (true) {
P(customer); //等待顾客来理发
P(mutex); //申请互斥访问wait
wait = wait - 1; // 等待人数减少一人
V(mutex);//释放临界资源
V(barber);//让理发师去理发
进行理发;
}
}
//顾客
void customer () {
while (true) {
P(mutex);//申请互斥访问wait
if (wait < 10) { //代表10把椅子没有坐满 还可以坐人
wait = wait + 1 ;
V(mutex);
V(customer );
P(barber);//等待理发师来理发
去理发;
} else {
//人满了 顾客直接离开
V(mutex);
}
}
}
PV操作:由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作如下:P(S)是将信号量S减1,若S>=0则P(S)执行完毕,否则执行P(S)的进程置为阻塞状态,进入等待队列;V(S)是将信号量S加1,若S<=0则释放一个因执行P(S)而等待的进程。
信号量(semaphore):其数据结构为一个值和一个指针,指针指向等待该信号量的下个进程。S>=0时,S表示可用资源的数量;S<0时,表示没有可用的资源请求者必须等待别的进程释放该类资源。信号量可以解决进程同步(私有信号量)与互斥(公有信号量)。
临界区(critical section):是指一个访问公共资源的程序片段,而这些公共资源又无法同时被多个进程/线程访问的特性。即进程间的互斥(公有信号量,也称互斥信号量)
进程的状态:就绪状态(ready):进程已获得除处理器外的所需资源,等待分配处理器资源,只要分配了处理器资源进程就可执行。运行状态(runing):进程占用处理器资源,处于此状态的进程数小于等于处理器数目。阻塞状态(blocked):由于进程等待某种条件,在条件满足之前无继续执行。