1. 死锁。
1. 一系列进程集合中,每个进程都因为等待其他进程引发的事件而阻塞,就是死锁。
2. 死锁的原因有三点,一是系统资源不足,二是系统资源分配不合理,三是进程运行
推进的顺序不当。
3. 死锁四个必要条件是:互斥条件,一个资源只能被一个进程使用;请求和保持条件
一个进程在等待请求的资源而阻塞时,自身已获取的资源不会释放;不可剥夺条件
一个进程已经获取的资源不能被剥夺,只能自己释放;循环等待条件,若干进程之
间形成头尾相连循环等待资源关系。
4. 解决死锁方法:死锁预防,就是设计之初就破坏死锁四个必要条件之一,达到预防
效果,比方说,1.破坏互斥,一切都使用假脱机技术,虚拟设备功能使多个进程可
以同时使用一个独享设备;2.破坏请求等待,在开始就请求全部资源;3 破坏不可
抢占,抢占资源;4.破坏环路等待,对资源按序编号。死锁避免,就是每次申请资
源的时候,系统都判断这次申请是否会导致死锁,如果会就不分配资源,比如:银
行家算法,判断请求是否到达不安全状态,如果是,就延迟请求,其中安全状态和
不安全状态,可以用资源轨迹图来寻找。安全状态就是如果没有死锁发生,并且即
使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每个进
程运行完毕。死锁的检测, 系统执行死锁检测算法,来检测是否有死锁,比如:每
种类型一个资源的话,可以判断有向图是否有环;多个资源的话,可以基于矩阵的
检测,现有资源、可用资源、当前占有资源和请求资源的矩阵,来检测是否会产生
死锁。死锁恢复,如果存在死锁,就采取措施恢复。比如撤销死锁进程,回收他们
占用的资源;或者挂起死锁进程,抢占他们的资源;利用回滚恢复到检查点。
2. 活锁。
1. 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝
试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是在不断的改
变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁
则不能。
2. 活锁例子:单一实体的活锁:线程从队列中拿出一个任务来执行,如果任务执
行失败,那么将任务重新加入队列,继续执行。假设任务总是执行失败,或者某种
依赖的条件总是不满足,那么线程一直在繁忙却没有任何结果。协同导致的活锁:
两个线程发生了某些条件的碰撞后重新执行,那么如果再次尝试后依然发生了碰撞
长此下去就有可能发生活锁。
3. 解决方案:引入一些随机性;约定重试机制避免再次发生冲突。
3. 饥饿。
一个进程的请求无限制的被推后,而没有阻塞。比方说打印机优先打印小文
件,所以一个大文件可能会一直被推迟打印,但是没有阻塞。可以用先来先
评论0