考研408总结【操作系统】---进程管理(下)

531 阅读4分钟

这是我参与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操作之前,以防死锁。
  • 生成者消费者问题

在这里插入图片描述

  • 多生产者多消费者问题

image.png

在这里插入图片描述

可不可以不要这个互斥信号量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页,王道给了两种方案一种读优先、一种写优先(相对的)、真正的写者优先补充其他材料(待补充)

  • 哲学家进餐问题

施加限制条件来防止死锁发生:哲学家左右两边的筷子都可用的时候才允许他抓起筷子。

还有一种方法是奇偶数编号。

  • 吸烟者问题

在这里插入图片描述

在这里插入图片描述

还有其他很多问题,比如学生和监考老师问题、商品问题等

不管是什么问题,还是起初的话,先画出大致的关系图,找到互斥和同步关系,套框架即可,对于经典问题也要熟稔于心,用宇哥的话来说就是睡前背一背,考前摇一摇。


部分内容待补充完善~

如有误,请多指正!