pv操作

pv

整形信号量

整体信号量:
什么是整形信号量?目的是为了实现互斥和同步的。他设置了一个令牌,拿走令牌去访问。没有就乖乖呆着。这样我只要有一个令牌
那么我就可以实现互斥和同步。
什么是互斥:互斥就是我访问了你不能访问。
同步就是,我们之间按照一定的规律或者说是规则。去保持运行。不是指一起跑步。
具体看看例子。
初始化:
s=表示资源数目      整型量S

wait(s){
while(s<=0);//满足条件,卡在循环里面
s=s-1;
}//开始使用,拿走令牌(资源减少)
signal(s){
s=s+1;
}//不再使用,归还许可令。

记录型信号量

Typdef struct{
 int value; 
 struct process *L; 
 }semaphore; 
 void wait (semaphore s){ 
 S.value--; 
 if(S.value<0){
  remove a process p to S.L; 
  wakeup(up);
}
 }
  void signal  (semaphore s){
   S.value++;
    if(S.value<=0){
     remove a process p from S.L; 
     wakeup(up); 
  }
  } 

借助图像理解,举例四个进程 a b c d
p p p p
a b c d
v v v v
对于整型=2,a,p完-1 .b,p完-2======》0. 当遇到c时候,你由于没有令牌了,所以就是站着处理机等待归还令牌,这样就无法实现让权等待
对于记录型,a,p完-1,b,p完-2======》,当遇到c时候,没有令牌,别等 ,直接送去等待队列。不占用处理机。优点:不需要实现让权等待。

用信号量实现互斥

若要实现互斥,用p v夹紧某个行为;

什么是互斥,互斥就是a访问 b不能 怎么做到。设置一个信号量  ====>mutex 并且设置=1;相当于一个令牌。只有一个,谁拿到谁执行。拿不到的只能等着,这样就实现了互斥。
semaphore S=1;
P1(){
//////////////
P(s);//可以用整型,也可以用记录型,记录型好处,不用忙等。
临界区;
V(s);
}
P2(){
/////////
P(s);
临界区
V(s);
}

实现同步

若要实现同步,在某个需要方行为前面p一下,某个提供方行为后面v一下;

用p,v实现同步。
semaphore S=0;
p1() {
////////
//////
x;
V(s);//S==》0到1,之后唤醒阻塞队列中第一个=====>即P2()
//////
/////
}
P2(){
...
P(s);//一开始执行到这个,那么此时S还是0.不满足条件,会一直卡死在while循环里面。(或者这样我为了防止忙等,被放置在阻塞队列中。)
//(被唤醒之后,)看到S变为1,跳出while开始执行。实现了从p1到p2之间的同步.
y;
...
}

你可能感兴趣的:(操作系统)