信号量机制(操作系统重点)

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 内核设计思想》进程间通信与同步机制

信号量机制实现进程互斥同步前驱关系

在windows操作系统中用信号量机制解决生产者消费者问题的代码

4.内核同步机制

QT的总结文章(转)

你知道的Go切片扩容机制可能是错的