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; ... }