信号量机制

信号量机制

用户进程可以通过使用操作系统的一对原语(不可被中断的程序)来对信号量进行操作,从而很方便的实现了进程同步,进程互斥。
信号量其实就是一个变量,可以用一个信号量来表示系统中某种资源的数量

在实现进程互斥的软件实现方法的时候,在双标志先检查法和双标志后检查法由于“检查”和“上锁”不能一气合成,给了进程的异步性空子可钻,所以干脆我们就让他一气合成,所以我们把“检查”和“上锁”使用原语实现。

一对原语:wait(S)和signal(S),wait和signal相当于函数,信号量S就相当于函数调用传入的一个参数。简称P,V操作,P(S),V(S)。

整型信号量

用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。

int S = 1;//假设表示当前系统中可用打印机的数量

void wait(int S){//wait原语 相当于进去区
	while(S<=0);//如果S<=0的话 会一直循环等待   "检查"
	S = S - 1; //如果资源数不为0  则占用一个 并将当前S-1 "上锁"
}

void signal(int S){//signal原语 相当于退出区
	S = S + 1;	//使用完资源后 释放刚占用的打印机 并将S+1
}
P0

wait(S);	//进入区,申请资源

进入临界区,使用打印机资源 //临界区 使用资源
	
signal(S);	//退出区,释放资源


P1

wait(S);	//进入区,申请资源

进入临界区,使用打印机资源 //临界区 使用资源
	
signal(S);	//退出区,释放资源


假设当前有两个进程P0和P1,信号量S初始值为1,P0先上处理机。
进入进入区执行wait(S),由于当前S>0,所以不需要等待,直接申请到打印机资源,同时S-1,进入临界区使用打印机资源,此时如果P1也进入了进入区,由于当前S=0,所以P1会一直在等待,P0使用资源 完事,执行Signal(S)原语,将S+1,P1发现S>0,成功的申请到了打印机资源,进入临界区,使用资源,使用完资源,执行Signal(S)原语,S+1。

在这个过程中,P0在进入临界区的时候,P1一直在循环等待,违反了“让权等待”的原则,会发生“忙等”

记录型信号量

整型信号量存在"忙等"的问题,于是又出现了记录型信号量,即用记录型数据结构表示的信号量。

typedef struct{
	int value;		//资源剩余数量
	struct process *L;//等待队列
}semaphore;


void wait(semaphore S){
	S.value--;
	if(S.value < 0){//暂时没有可用资源
		block(S.L);//自我进行阻塞  避免”忙等“问题
	}
}

void signal(semaphore S){
	S.value++;
	if(S.value <= 0){//s.value的绝对值等同于阻塞进程数  如果发现还有阻塞进程的话 则唤醒队首元素。
		wakeup(S.L);//去唤醒等待队列的队首元素
	}
} 

1.某进程要使用资源时,通过wait原语进行申请,如果资源数不够的话,就会进行自我阻塞,从运行态->阻塞态,并把自己放到等待队列的队尾。
2。使用完资源,通过signal原语进行释放资源,使用wakeup原语进行唤醒等待队列中的队首进程,使队首进程从阻塞态->就绪态

栗子:

计算机系统中有两台打印机,则初始时信号量S中的value=2,S.L队列为null.
p0,p1,p2,p3四个进程想要使用打印机资源。
1.假设p0先被调度,p0申请打印机资源执行wait原语,对S.value–,此时S.value=1,对其进行判断不需要阻塞
2.此时p1也被调度,p1申请打印机资源执行wait原语,对S.value–,此时S.value=0,对其进行判断不需要阻塞
3.p0时间片用完,p2被调度,p2申请打印机资源执行wait原语,对S.value–,此时S.value=-1,对其进行判断,阻塞自身进程,从运行态->阻塞态,并到等待队列中。
4.p1使用完打印机(访问完临界区资源),执行signal原语,S.value++,此时S.value=0,判断出等待队列中有进程在等待,于是唤醒该进程,p2从阻塞态->就绪态,等待被调度。

这样就避免了”忙等“问题,遵循了让全等待原则。

总结

在这里插入图片描述

好困~~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值