这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
考研倒计时:33天
上篇总结了进程和线程的概念,中篇总结了处理机调度和死锁的内容,
本篇解决核心重点【进程同步】,几乎每年一道PV操作大题。
参考资料: 王道操作系统考研复习指导 天勤操作系统高分笔记
进程同步
首先要知道临界区的概念,一次仅允许一个进程使用的资源称为临界资源,访问临界资源的那段代码称为临界区。
可以把资源访问过程分为四个部分:进入区--临界区--退出区--剩余区
同步机制应遵循:空闲让进,忙则等待,有限等待,让权等待
实现临界区互斥的方法
- 软件实现方法
(1)单标志法:违背空闲让进
(2) 双标志法先检查:违背忙则等待(可能同时进入)
(3)双标志法后检查:可能互相谦让导致饥饿
(4)Peterson算法满足了有限等待,利用flag解决互斥、利用turn解决饥饿
- 硬件实现方法
(1)中断屏蔽方法
(2)硬件指令方法,比如TestAndSet、Swap指令执行代码不会被中断
缺点:都不能实现让权等待
- 信号量
所以引入了信号量:
(1)整型信号量:未遵循让权等待
(2)记录型信号量:遵循了让权等待,不存在忙等
ps:还有一个知识点是管程,要和管道相区别。
核心大头【利用信号量实现同步和互斥】
不管是什么类型的问题,可以先画出大致前序图,
对于同步就是前V后P(某个行为前P一下这个资源,某个行为之后V一下这个资源),
对于互斥就是紧紧相夹,中间不能有其他冗余代码,所以同步的P操作要放在互斥P操作之前,以防死锁。
- 生成者消费者问题
- 多生产者多消费者问题
可不可以不要这个互斥信号量mutex?
==本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,而这几个进程一开始都要对这三个信号量进行P操作,因此在任何时刻只有一个进程的P操作不会被阻塞,并顺利地进入临界区!==
升级一下
桌上有一个空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
semaphore empty=1;
semaphore orange=0;
semaphore apple=0;
dad()
{
P(empty);
将水果放入盘中;
若放入的是桔子,
则V(orange);
否则V(apple);
}
son()
{
P(orange);
从盘中取出桔子;
V(empty);
吃桔子;
}
doughter()
{
P(apple);
从盘中取出苹果;
V(empty);
吃苹果;
}
- 读者写者问题
读者之间不互斥、写者之间互斥、写者和读者之间互斥
解决方案见王道书87页,王道给了两种方案一种读优先、一种写优先(相对的)、真正的写者优先补充其他材料(待补充)
- 哲学家进餐问题
施加限制条件来防止死锁发生:哲学家左右两边的筷子都可用的时候才允许他抓起筷子。
还有一种方法是奇偶数编号。
- 吸烟者问题
还有其他很多问题,比如学生和监考老师问题、商品问题等
不管是什么问题,还是起初的话,先画出大致的关系图,找到互斥和同步关系,套框架即可,对于经典问题也要熟稔于心,用宇哥的话来说就是睡前背一背,考前摇一摇。
部分内容待补充完善~
如有误,请多指正!