2020-9-24 操作系统 信号量笔记

因为这部分比较难理解,所以记一下笔记 考试之前看一看


1.简单的信号量使用:

首先明确一下几个概念:

  • P操作
  • V操作
  • 互斥信号量mutex

P操作:Swait、P是同一个意思,P(s)的意思是对s进行减一操作,也可以理解为申请资源,也可以理解为封锁某些变量。

V操作:Ssignal、V是一个意思,V(s)的意思是对s进行加一操作,也可以理解为释放资源,也可以理解为解锁某些变量。

mutex:是开关临界资源的一个变量,mutex == 0 则临界资源不能被其他进程访问,mutex == 1 则临界资源开放,可以有新的进程访问它。


下面用一个例子来简单的复习这三个概念:
(直接加入互斥信号量了)
有生产者M个,消费者N个,有一个容量为n的缓冲区,里面可以放产品,
生产者可以将生产的产品放入缓冲区,
消费者可以从缓冲区里取出产品,

但是要注意,
任何一个生产者或者消费者都不能同时与另一个个体访问缓冲区,
也就是说生产者在放入产品的过程中,
消费者不能从中取产品
同理,消费者取产品时生产者不能向内放产品

另外,生产者不能向已满的缓冲区放置产品
消费者也不能从空的缓冲区取出产品

我们设置三个信号量:

  1. mutex互斥信号量,mutex == 0时 任何人不能进入缓冲区操作
    mutex == 1 时允许一个人进入缓冲区操作
  2. empty信号量 表示缓冲区中空池子的个数
  3. full信号量 表示缓冲区中有产品的池子的个数

过程:

生产者:

while(true) {
	// 空池减一
	P(empty);
	// 锁定临界资源(缓冲区)
	P(mutex);
	// 向缓冲区放置一个产品
	i = (i + 1) % n;
	// 解锁临界资源
	V(mutex);
	// 满池(有产品的池子)加一
	V(full);
}

消费者:

while(true) {
	// 满池减一
	P(full);
	// 锁定临界资源
	P(mutex);
	// 从缓冲区取出一个产品
	j = (j + 1) % n;
	// 解锁临界资源
	V(mutex);
	// 空池加一
	V(empty);
}

ps:

  1. mutex的PV操作必须在其他信号量的PV操作之内
  2. 所有信号量的PV操作必须成对出现,empty和full各自的P和V操作必须出现在不同程序中

  1. AND信号量优化问题的解决
    实际上就是将P(empty);P(mutex);改成Swait(empty,mutex);

这里是引用

AND信号量可以用来解决哲学家就餐问题

  1. 信号量集

这里是引用Ssignal(S, d);意为对S进行+d操作


大概就这些内容

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值