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操作


大概就这些内容

猜你喜欢

转载自blog.csdn.net/weixin_45543674/article/details/108775077