Author : 张一极
18:55-20201030
xxxxxxxxxx
1void wait(int Flag){
2 while(Flag<=0);
3 Flag-=1;
4}
flag代表当前系统设备数目,仅为可用设备,此时flag如果大于0,则代表当前系统有空闲设备,可以分配给进程使用.
31void signal(int Flag){
2 Flag+=1;
3}
signal作为退出调用的方法,会重置Flag到这个进程调用这个设备之前的数量水平.
那么调用过程就是这样的:
1.首先使用wait(flag)判断是否需要等待
2.接着如果发现需要等待,就继续循环,不断循环直到信号量满足条件跳过循环阶段
3.运行进程代码
4.执行signal函数,重置信号量值回到调用之前
31wait(Flag);
2doing...
3signal(Flag);
wait原语上锁和检查一气呵成,避免并发
不满足让权等待,进不了临界区,只会不断循环,占用cpu.
xxxxxxxxxx
1typedef struct{
2 int value;
3 struct process *L
4}flag
5void wait(flag){
6 flag--;
7 if(flag.value<0)
8 {
9 block(flag.L)'''当前进程阻塞并且挂载到处理机阻塞队列
10 }
11}
12void signal(flag)
13{
14flag.value++;
15 if(flag.value<=0)
16 {
17 wakeup(flag.L);'''阻塞队列放回就绪队列
18 }
19}
1.设置初始设备数目
2.使用wait原语
3.每有一个进程使用设备,设备号-1,2->1->0->(-1)->(-2)
4.每次执行signal都会使得value+1,如果此时value依然小于0,将会唤醒挂起队列第一个进程到就绪队列,并且分配给这个进程刚释放的这个设备.
优点 : 不会出现持续等待的情况,进一步提高系统执行效率
End
晚安
19:47-2020-1030