目录
二、第二章——【锁】
1、互斥锁编辑
2、信号量机制
(1)信号量机制——整形信号量
(2)信号量机制——记录信号量
(3)总结(重点——记录信号量)
3、信号量机制——实现互斥、同步
(1)信号量设置为1——互斥
(2)前V后P——同步
(3)前V后P——前驱图
(4)总结
4、生产者-消费者问题
(1)画出前驱图
(2)写代码——PV操作
(3)思考——PV操作的顺序可以换么?
(4)总结
5、多生产者-多消费者问题
(1)画出前驱图(互斥-PV, 同步-VP)
(2)写代码——PV操作
(3)写代码——PV操作(改进:不用互斥信号量)
(4)具体问题,具体分析
6、吸烟者问题
(1)问题分析
(2)问题解决
7、读者-写者问题
(1)解决方案
(2)思考
8、哲学家进餐问题(死锁问题)
(1)问题分析
(2)方案实现
(3)考点
9、管程
(1)来历(PV操作太麻烦)
(2)定义 & 特征
(3)具体实现
(4)拓展1——封装思想
(4)拓展2——Java中的管程思想(sync-同步)
(4)拓展3——Java中的同步+异步(和前端的请求+返回操作差不多)
(5)总结
10、死锁
(1)死锁、饥饿、死循环
(2.1)死锁产生条件——清华笔记
(2.2)死锁产生条件——软考笔记
(2.3)死锁产生条件——王道笔记
(3)总结
11、预防死锁(破坏四个条件之一)
(1)破坏互斥(优缺点)
(2)剥夺资源【破坏不剥夺条件】(优缺点)
(3)破坏请求+保持条件(一次性拿完)
(4)破坏循环等待(按照顺序申请资源)
(5)总结——王道版
(5)总结——清华版
12、银行家算法(避免死锁 ※※※)
(1)清华版——银行家算法
(2)软考版——银行家算法
(3)王道版——银行家算法
13、死锁的检测 & 解除
(1)清华版——检测 & 解除
(2)王道版——检测方法(理解-资源分配图-能够化简!)
(3)王道版——解除方法
(4)总结
二、第二章——【锁】
1、互斥锁
2、信号量机制
信号量机制——可以很好的解决【互斥、同步】的问题
PV操作——proberen —— verhogen
(1)信号量机制——整形信号量
缺点:如果需要资源被占用,那么会进行忙等
(2)信号量机制——记录信号量
用来解决——“忙等”问题
在整形的基础上,创建了一个【等待队列】,当资源不够时,自我阻塞,等待别人唤醒~
(3)总结(重点——记录信号量)
3、信号量机制——实现互斥、同步
(1)信号量设置为1——互斥
(2)前V后P——同步
PV操作——P拿,V释放
如果实现的同步?
1、执行在前面的代码段——用V操作(必须让他执行了,才会释放资源)
2、执行在后面的代码段——用P操作(有了资源,才可以跳出等待)
这样就是实现了同步~
(3)前V后P——前驱图
这样就实现同步啦~
(4)总结
4、生产者-消费者问题
(1)画出前驱图
(2)写代码——PV操作
其中1个PV是用于——互斥
2个PV是用于同步(有两个同步信号量)
(3)思考——PV操作的顺序可以换么?
不能乱改——可能会导致死锁!(具体问题,具体分析!)
(4)总结
5、多生产者-多消费者问题
(1)画出前驱图(互斥-PV, 同步-VP)
(2)写代码——PV操作
(3)写代码——PV操作(改进:不用互斥信号量)
(4)具体问题,具体分析
当缓冲区大小为1,那么可能不需要设置——【互斥信号量】
6、吸烟者问题
(1)问题分析
(2)问题解决
不需要——互斥信号量~(因为桌子上只能放一个资源!)
7、读者-写者问题
读者——共享锁(乐观锁)
写者——互斥锁(悲观锁)
在这个锁的基础上——可以设计的锁的粒度
(粒度大小说明)用生活举例:
你不允许别人进入你的房子,那么就给房子上了锁——【房子锁】
你允许别人进入你的房子,但你不允许别人进入你的房间,就给房间上了锁——【房间锁】
你允许别人进入你的房间,但你不允许别人打开你的柜子,就给柜子上了锁——【柜子锁】
- 写优先
- 读共享
(1)解决方案
写优先——读写公平法(先来先服务)【防止写进程饿死~】
(2)思考
8、哲学家进餐问题(死锁问题)
(1)问题分析
(2)方案实现
(3)考点
9、管程
(1)来历(PV操作太麻烦)
(2)定义 & 特征
(3)具体实现
程序员封装一层——PV操作(实现同步、异步)
然后提供简单的接口,用来之后使用~
(4)拓展1——封装思想
(4)拓展2——Java中的管程思想(sync-同步)
就比如——下载文件(异步任务——多线程——你得设置线程池的大小!)
1、你需要规定同步队列的大小!
2、然后设置同步方法
3、调用同步方法
(4)拓展3——Java中的同步+异步(和前端的请求+返回操作差不多)
异步任务可以设置数量(设置连接池大小),避免有太大的异步任务
(5)总结
10、死锁
(1)死锁、饥饿、死循环
死锁和饥饿——是【操作系统】关心并解决的问题!
(2.1)死锁产生条件——清华笔记
(2.2)死锁产生条件——软考笔记
基本问题:该系统至少需要多少资源?可以不发生死锁?
总资源数 = K * (N -1) + 1
K:进程数量
N:一个进程需要的资源数
死锁 => 四种条件 必然存在
(2.3)死锁产生条件——王道笔记
(3)总结
11、预防死锁(破坏四个条件之一)
- 互斥(加入buffer——把【互斥资源】变为【共享资源】)
- 不剥夺(他在等待资源后,就强行让他休息,夺走他手里的资源)
- 请求和保持(占有资源的情况)
- 循环等待(给所有资源编号【从小到大】——按顺序申请资源~)
(1)破坏互斥(优缺点)
优点:简单(把互斥资源——变为——共享资源)
缺点:应用点比较少(毕竟很多地方需要互斥性!)
(2)剥夺资源【破坏不剥夺条件】(优缺点)
(3)破坏请求+保持条件(一次性拿完)
不准持有——一次性拿完!!!(简单,但是资源利用率低)
(4)破坏循环等待(按照顺序申请资源)
(5)总结——王道版
(5)总结——清华版
12、银行家算法(避免死锁 ※※※)
(1)清华版——银行家算法
(2)软考版——银行家算法
- 求出剩下的资源数
- 求出各项进程还需要的资源数
- 按照选项——开始推算是否满足!(如果满足,则选择即可)
(3)王道版——银行家算法
13、死锁的检测 & 解除
(1)清华版——检测 & 解除
(2)王道版——检测方法(理解-资源分配图-能够化简!)
(3)王道版——解除方法
(4)总结
重点!!!加油吧!!!不能放弃啊!!!
时间:2023年8月20日12:20:10