因为这部分比较难理解,所以记一下笔记 考试之前看一看
1.简单的信号量使用:
首先明确一下几个概念:
- P操作
- V操作
- 互斥信号量mutex
P操作:Swait、P是同一个意思,P(s)的意思是对s进行减一操作,也可以理解为申请资源,也可以理解为封锁某些变量。
V操作:Ssignal、V是一个意思,V(s)的意思是对s进行加一操作,也可以理解为释放资源,也可以理解为解锁某些变量。
mutex:是开关临界资源的一个变量,mutex == 0 则临界资源不能被其他进程访问,mutex == 1 则临界资源开放,可以有新的进程访问它。
下面用一个例子来简单的复习这三个概念:
(直接加入互斥信号量了)
有生产者M个,消费者N个,有一个容量为n的缓冲区,里面可以放产品,
生产者可以将生产的产品放入缓冲区,
消费者可以从缓冲区里取出产品,
但是要注意,
任何一个生产者或者消费者都不能同时与另一个个体访问缓冲区,
也就是说生产者在放入产品的过程中,
消费者不能从中取产品
同理,消费者取产品时生产者不能向内放产品
另外,生产者不能向已满的缓冲区放置产品
消费者也不能从空的缓冲区取出产品
我们设置三个信号量:
- mutex互斥信号量,mutex == 0时 任何人不能进入缓冲区操作
mutex == 1 时允许一个人进入缓冲区操作 - empty信号量 表示缓冲区中空池子的个数
- 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:
- mutex的PV操作必须在其他信号量的PV操作之内
- 所有信号量的PV操作必须成对出现,empty和full各自的P和V操作必须出现在不同程序中
- AND信号量优化问题的解决
实际上就是将P(empty);P(mutex);改成Swait(empty,mutex);
AND信号量可以用来解决哲学家就餐问题
- 信号量集
Ssignal(S, d);意为对S进行+d操作
大概就这些内容