文章目录
进程同步
临界资源:对一些硬件而言,打印机就是一个临界资源,即多个程序共同需要抢占的资源
临界区:每个进程中访问临界资源的代码
实现互斥的结构:
![image-20200622150153590](https://i-blog.csdnimg.cn/blog_migrate/0675b6dce5643e0b2ee515b7adcb31a7.png)
硬件实现:
- 关中断:让处理机始终执行一个程序,不进行程序的切换
- 指令
同步应该遵循的规则:
- 空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
- 忙则等待:当有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。
- 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等"
前驱图:
![image-20200622150703762](https://i-blog.csdnimg.cn/blog_migrate/e2a3e6f77830454bb07b62b1f3e38c64.png)
若想执行S2,则需要先执行S1。
信号量
整型信号量
![image-20200622151744719](https://i-blog.csdnimg.cn/blog_migrate/77b5e3e504c6789c3c7e6e7a40a7b360.png)
记录性信号量(***)
![image-20200622151852525](https://i-blog.csdnimg.cn/blog_migrate/cd5433ab2b004195a677b2445f42f4a2.png)
AND型信号量
![image-20200622154354678](https://i-blog.csdnimg.cn/blog_migrate/6f428b5235ee2370b13284c71c07fe53.png)
信号量的应用(***)
利用信号量实现互斥
![image-20200622153000297](https://i-blog.csdnimg.cn/blog_migrate/d39123a5bc270a4dbf787c84857152ad.png)
实现算法:
![image-20200622153444468](https://i-blog.csdnimg.cn/blog_migrate/d401c1d995d79f71faecb5672e7b9f0c.png)
符合:空闲让进,忙则等待和有限等待
利用信号量实现前驱关系
![image-20200622153525416](https://i-blog.csdnimg.cn/blog_migrate/a82ec3fc4f9218c87b8617ed64dda934.png)
资源的分配
申请资源时需要执行P操作,释放资源时执行V操作
同步的问题
- 生产者-消费者问题
- 哲学家进餐问题
- 读者-写者问题
进程间通信
低级通信:信号量机制
高级通讯:共享存储器系统、消息传递系统、管道通信。
死锁的相关概念
可抢占资源:某进程在获得该资源后,该资源可以再被其他进程或系统抢占。
不可抢占的资源:一旦系统将某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
死锁的定义:如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程就是死锁。
产生死锁的原因:
- 竞争不可抢占资源引发死锁。
- 竞争可消耗资源引发死锁。
- 进程推进顺序不当引发死锁。
处理死锁的基本方法
预防死锁
- 破坏“请求和保持条件”
- 破坏“不可抢占条件”
- 破坏“循环等待条件”:进程统一按照某种线性规则申请资源。例如,输入机资源序号为1,打印机序号为2,磁带机资源序号为3,磁盘资源序号为4,进程在申请资源时,必须按照从1到4或者从4到1的顺序申请。
避免死锁(***)
安全状态:安全状态,是指系统能按某种顺序(P1, P2,Pn)(称此序列为安全序列),来为每个进程Pi分配其所需的资源,直到满足每个进程对资源的最大需求,使每个进程都可以顺利地完成。
不安全状态:如果系统无法找到这样一个安全序列, 称系统处于不安全状态。
要避免死锁,需要使系统处于安全状态;系统处于不安全状态,并不一定处于死锁状态
![image-20200622165340017](https://i-blog.csdnimg.cn/blog_migrate/533e94cccc8664ebdbf7a03056d25b0a.png)
- 根据上述定义,当给P1分配2个资源时,则此时P1、P2和P3都无法满足最大需求,处于不安全状态
银行家算法(***)
![image-20200622170224200](https://i-blog.csdnimg.cn/blog_migrate/8d7a436c1b0df3c55a551c451c5cf143.png)
![image-20200622170321644](https://i-blog.csdnimg.cn/blog_migrate/4fd8997e1f61f5e595d3dab58570018a.png)
- 先假设分配可以满足,做一次安全检测,如果仍能处于安全状态,则允许分配。
- 寻找安全序列的方式只有两种:每次都从最上面开始;按照从上到下顺序循环
应用:
![image-20200622170415300](https://i-blog.csdnimg.cn/blog_migrate/b145557d583635066243b1d7fbd97412.png)
![image-20200622170922576](https://i-blog.csdnimg.cn/blog_migrate/ec902d68dc48872b1d526dc1c4bc473d.png)
如果单向顺序,查找安全序列的流程为:
- 判断P0,返现剩余资源不能满足。判断P1,发现满足,则释放P1分配的资源,此时资源是:5,3,2。
- 继续判断P0,返现剩余资源不能满足。P1结束,则直接跳过。判断P2,返现剩余资源不能满足。判断P3,发现满足,则释放P3分配的资源,此时资源是:7,4,3。
- 继续判断P0,发现满足,则释放P0分配的资源,此时资源是:7,5,3。
- P0、 P1结束,直接跳过。判断P2,发现满足,则释放P2分配的资源,此时资源是:10,5,5.。
- P0、 P1、P2、P3结束,直接跳过。判断P4,发现满足,则释放P4分配的资源。
- 最终的安全序列为:P1、P3、P0、P2、P4。
- 确认分配。
![image-20200622172205550](https://i-blog.csdnimg.cn/blog_migrate/c29725e79f9f77d4c167725d27129b55.png)
- 此时找不到安全序列,拒绝分配。