信号量机制(操作系统重点)
Posted 每天告诉自己要努力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信号量机制(操作系统重点)相关的知识,希望对你有一定的参考价值。
一个信号量对应一种资源
信号量的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
实现进程互斥
P——申请一个资源,如果资源不够,那就会阻塞
V——释放一个资源,如果有进程在等待该资源,则唤醒阻塞队列队头的进程
1.分析并发进程的关键活动,划定临界区(如对临界资源打印机的访问就放在临界区)
2.设置互斥信号量mutex,初值设为1(表示进入临界区的名额数量,初始值为1,说明一开始能进入临界区的名额只有1个)
//记录型信号量结构体
typedef struct {
int val; //剩余的资源数量
struct process* L;//等待队列
} semaphroe;
semaphore mutex = 1;
p1() {
……
P(mutex); //使用临界资源前要上锁,mutex--
临界区代码……
V(mutex);//使用临界资源后要解锁,mutex++
……
}
注意:对不同的临界资源需要设置不同的互斥信号量,这个很容易理解。打印机跟摄像机没必要互斥访问。
信号量机制实现进程同步
进程异步:各并发进程的推进顺序不确定
进程同步:各并发进程按要求有序推进,比如你要读取数据之前必须先写入数据,这个操作必须有先后顺序
用信号量实现进程同步:
1.分析什么地方需要“同步”,既保证“一前一后”的两个操作顺序
2.设置同步信号量S,初始化为0;
3. 在“前操作”之后 执行 V(S);
4. 在“后操作”之前 执行 P(S);
信号量机制实现前驱关系
1.对每一对前驱关系设置一个同步信号量
2.在“前操作”之后进行V操作
3.在“后操作”之前进行P操作
生产者与消费者问题
能够改变相邻P、V操作的顺序呢?
不能!实现互斥的P操作一定要在实现同步的P操作之后
(P操作是有阻塞操作的)
V操作不会导致阻塞,因此V可以随便换(V操作是有唤醒操作的)
生产产品其实可以放在缓冲区里面(PV操作之间),但是这样让临界区代码变长,上锁时间增长,系统效能会降低。
多生产者多消费者模型
注:如果缓冲区的大小大于1,就必须专门设置一个互斥信号量mutex来保证互斥访问缓冲区,否则可能会造成写入缓冲区的数据被覆盖。
实现互斥的P操作一定要在实现同步的P操作之后,否则可能会引起死锁。
吸烟者问题
读者-写者问题
以上是关于信号量机制(操作系统重点)的主要内容,如果未能解决你的问题,请参考以下文章
细读《深入理解 Android 内核设计思想》进程间通信与同步机制