信号量机制解决进程同步/互斥问题

在《计算机操作系统》一书中,P,V两个原语的作用不可小觑,下面本萌新想给初学者一些学习上的帮助,也请各位大佬前来提出宝贵意见。一些基础知识在文章末尾,若有朋友不熟悉,可以参考。
//参考资料(本萌新最爱的参考书之一)《计算机操作系统》 赵毅,张慧敏,许曰滨,孙英华(青岛大学)编著 北京邮电大学出版社
复杂互斥问题
读者—写者问题(Readers-Writers problem)是一个并发程序设计问题,计算机系统中的数据常被多个进程共享,但其中某些进程可能只要求读数据;另一些进程则要求写入数据。就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,以下为要求:
(1)可以多个读者同时执行读操作;
(2)不能读者、写者同时操作;
(3)不可以多个写者同时操作。
在这里插入图片描述
多生产者多消费者问题
在这里插入图片描述
生产者-消费者问题是一个十分经典的多线程并发协作的问题,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。但是,这个共享数据区域中应该具备这样的线程间并发协作的功能:
如果共享数据区已满的话,阻塞生产者继续生产数据放置入内;
如果共享数据区为空的话,阻塞消费者继续消费数据;
//以上对于生产者消费者问题的阐述稍作改动,便于初学者学习,原文请您参考下面的链接
//原文链接:https://www.jianshu.com/p/e29632593057

吸烟者问题
假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。还有一个供应者进程,无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。
在这里插入图片描述
当然,我这里所说的是轮流依次分配的情况,若如大家碰到随机分配的情况,请您使用random()函数来写出代码即可。

哲学家进餐问题
五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便去取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子继续思考。哲学家进餐问题可看作是并发进程并发执行时处理共享资源的一个经典问题。
下面的代码只是一种解决方式来避免死锁现象的产生,当然还有其他多种方式,我们大家可以参考教材书中给出的三种方法之一。
在这里插入图片描述
上面的几大问题,我们需要对基础的PV机制有所了解,那么首先要做到的就是熟悉signal()与wait()的关系,如何唤醒如何申请资源,什么时候为阻塞状态等等问题。
为方便各位读者阅读,我在下面给出一些基础知识,方便大家参考。

什么是PV操作?就是夏天吃雪糕。

对于信号量,可以认为是一个冰箱,然后我们应该搞懂容量和当前的雪糕个数这两种东西。 P操作相当于你刚打完球很累从冰箱拿雪糕,如果没有一直等待,那就直到V操作,你老爸又买了雪糕放入冰箱,为了避免P操作一直等待下去,会有一个时间片,你用过之后也会陷入阻塞等待状态,因为不能老是你吃,你还有其他朋友和哥哥姐姐妹妹,他们都相当于其他进程。 你老爸的V操作就是往冰箱送雪糕,如果冰箱满了就等待,直到有P操作,从冰箱中拿走雪糕, P操作:雪糕个数减1,减过之后,雪糕个数大于等于0,说明已经拿到雪糕,线程继续进行。否者线程阻塞。 V操作:雪糕个数加1,加过之后,雪糕个数小于等于容量,说明你老爸买雪糕很成功,线程继续。否者线程阻塞。

发布了13 篇原创文章 · 获赞 2 · 访问量 1041

猜你喜欢

转载自blog.csdn.net/weixin_44033021/article/details/103943234