第六章并发、死锁和饥饿浙江工业大学解析
- 格式:ppt
- 大小:1.42 MB
- 文档页数:13
死锁的概念什么是死锁?各进程互相等待对方手里的资源, 导致各进程都阻塞, 无法向前推进
死锁、饥饿、死循环的区别
死锁至少是两个进程一起死锁, 死锁进程处于阻塞态
饥饿可以只有一个进程饥饿, 饥饿进程可能阻塞也可能就绪
死循环可能只有一个进程发生死循环, 死循环的进程可以上处理机
死锁和饥饿时操作系统要解决的问题, 死循环是应用程序员要解决的死锁产生的必要条件
互斥条件对必须互斥使用的资源的争抢才会导致死锁
不剥夺条件进程保持的资源只能主动释放, 不可强行剥夺
请求和保持条件保持着某些资源不放的同时, 请求别的资源
循环等待条件
存在一种进程资源的循环等待链
循环等待未必死锁, 死锁一定需要循环等待
什么时候会发生死锁?对不可剥夺资源的不合理分配, 可能导致死锁
死锁的处理策略
预防死锁破坏死锁产生的四个必要条件
避免死锁避免系统进入不安全状态(银行家算法)
死锁的检测和解除允许死锁发生, 系统负责检测出死锁并解除。
Java并发中死锁、活锁和饥饿是什么意思解答死锁是指两个或者两个以上的进程(或线程)在执⾏过程中,因争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,他们将⽆法推进下去。
如果线程的智⼒不够, 且都秉承着“谦让”的原则,主动将资源释放给他⼈使⽤,那么就会导致资源不断地在两个线程间跳动,⽽没有⼀个线程可以同时拿到所有资源正常执⾏。
这种情况就是活锁。
饥饿是指某⼀个或者多个线程因为种种原因⽆法获得所需要的资源,导致⼀直⽆法执⾏。
⽐如它的线程优先级可能太低,⽽⾼优先级的线程不断抢占它需要的资源,导致低优先级线程⽆法⼯作。
补充死锁是指两个或两个以上的进程(或线程)在执⾏过程中,因争夺资源⽽造成的⼀种互相等待的现象,若⽆外⼒作⽤,它们都将⽆法推进下去。
此时称系统处于死锁状态或系统产⽣了死锁,这些永远在互相等待的进程称为死锁进程。
产⽣死锁的原因互相争夺共享资源产⽣死锁的4⼤条件1.互斥条件:共享资源被⼀个线程占⽤2.请求与保持条件(占有且等待):⼀个进程因请求资源⽽被阻塞时,对已经获得资源保持不释放3.不可剥夺条件(不可抢占):进程已获得资源,在未使⽤完之前,不能进⾏剥夺4.循环等待条件:多个线程循环等待资源,⽽且是循环的互相等待死锁如何解决?只需要破坏上⾯ 4 个条件中的⼀个就能破坏。
1.请求与保持条件:放⼤锁范围,去除对资源的抢占2.不剥夺:换成可重⼊锁ReentrantLock3.循环等待:改成顺序加锁,避免循环等待4.互斥是多线程的特性,所以这个条件⽆法避免活锁是指线程1可以使⽤资源,但它很礼貌,让其他线程先使⽤资源,线程2也可以使⽤资源,但它很绅⼠,也让其他线程先使⽤资源。
这样你让我,我让你,最后两个线程都⽆法使⽤资源。
活锁不会被阻塞,⽽是不停检测⼀个永远不可能为真的条件。
除去进程本⾝持有的资源外,活锁状态的进程会持续耗费宝贵的CPU时间。
任务或者执⾏者没有被阻塞,由于某些条件没有满⾜,导致⼀直重复尝试、失败、尝试、失败。
死锁与饥饿:解决并发编程中的常见问题死锁和饥饿是并发编程中常见的问题,对于开发人员来说,理解和解决这些问题是至关重要的。
本文将对死锁和饥饿问题进行深入探讨,并提供一些解决方案。
一、死锁死锁是指在多线程情况下,两个或多个线程无限期等待彼此持有的资源,以致于无法继续执行下去。
这种情况下,程序将无法正常结束并可能导致系统崩溃。
死锁产生的四个必要条件是:互斥、占有并等待、不可抢占和循环等待。
1.互斥:在一段时间内,某资源只能被一个线程占有。
2.占有并等待:一个线程持有一些资源并请求新的资源。
3.不可抢占:资源只能在不持有的情况下被其他线程抢占。
4.循环等待:线程之间形成一种循环等待资源的关系。
解决死锁的常见方法有:1.预防死锁:通过破坏死锁产生的四个必要条件中的一个或多个,来预防死锁的发生。
例如,避免循环等待,按照资源的顺序请求资源等。
2.检测死锁:通过算法检测系统是否存在死锁,并在检测到死锁时采取相应的措施,如终止某个线程或回滚操作。
3.避免死锁:通过预测资源的使用情况,采取控制策略来避免发生死锁。
例如,银行家算法可以根据资源的剩余量来决定是否允许分配资源。
4.解决死锁:当死锁发生时,可以通过剥夺某个线程的资源来解除死锁。
二、饥饿饥饿是指一个或多个线程一直无法获取到所需的资源,以致于无法继续执行。
饥饿可能导致线程无法正常运行并无限期等待资源的情况。
饥饿问题的常见原因包括:1.优先级问题:高优先级的线程占用了资源,导致低优先级的线程无法获取到资源。
2.锁竞争:多个线程竞争同一把锁,导致某些线程一直无法获取到锁。
3.错误的资源分配策略:某些线程的资源分配策略导致其他线程无法获取到需要的资源。
解决饥饿问题的常见方法有:1.公平分配资源:按照先来先服务的原则,公平地分配资源,避免某个线程长时间无法获取到所需的资源。
2.使用合适的锁:在多线程环境下,选择合适的锁类型和策略,避免锁竞争导致某些线程无法获得锁。
3.优先级调整:根据线程的执行情况和重要性,适当调整线程的优先级,避免低优先级线程一直被其他线程抢占资源。
死锁死锁什么是死锁每个⼈都占有⼀个资源,同时⼜在等待另⼀个⼈⼿⾥的资源。
发⽣“死锁”。
在并发环境下,各进程因竞争资源⽽造成的⼀种互相等待对⽅⼿⾥的资源,导致各进程都阻塞,都⽆法向前推进的现象,就是“死锁”。
发⽣死锁后若⽆外⼒⼲涉,这些进程都将⽆法向前推进。
死锁、饥饿、死循环的区别死锁:各进程互相等待对⽅⼿⾥的资源,导致各进程都阻塞,⽆法向前推进的现象。
饥饿:由于长期得不到想要的资源,某进程⽆法向前推进的现象。
⽐如:在短进程优先〈SPF)算法中,若有源源不断的短进程到来,则长进程将⼀直得不到处理机,从⽽发⽣长进程“饥饿”。
死循环:某进程执⾏过程中⼀直跳不出某个循环的现象。
有时是因为程序逻辑bug导致的,有时是程序员故意设计的。
共同点区别死锁都是进程⽆法顺利向前推进的现象(故意设计的死循环除外)死锁⼀定是“循环等待对⽅⼿⾥的资源”导致的,因此如果有死锁现象,那⾄少有两个或两个以上的进程同时发⽣死锁。
另外,发⽣死锁的进程⼀定处于阻塞态。
饥饿都是进程⽆法顺利向前推进的现象(故意设计的死循环除外)可能只有⼀个进程发⽣饥饿。
发⽣饥饿的进程既可能是阻塞态(如长期得不到需要的I/o设备),也可能是就绪态(长期得不到处理机)死循环都是进程⽆法顺利向前推进的现象(故意设计的死循环除外)可能只有⼀个进程发⽣死循环。
死循环的进程可以上处理机运⾏(可以是运⾏态),只不过⽆法像期待的那样顺利推进。
死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,⽽死循环是由代码逻辑的错误导致的。
死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题。
死锁产⽣的必要条件产⽣死锁必须同时满⾜⼀下四个条件,只要其中任⼀条件不成⽴,死锁就不会发⽣。
互斥条件:只有对必须互斥使⽤的资源的争抢才会导致死锁(如哲学家的筷⼦、打印机设备)。
像内存、扬声器这样可以同时让多个进程使⽤的资源是不会导致死锁的(因为进程不⽤阻塞等待这种资源)。
不剥夺条件:进程所获得的资源在未使⽤完之前,不能由其他进程强⾏夺⾛,只能主动释放。
第六章习题翻译第一部分复习题6.1给出可重用资源和可消费资源的例子。
答:可重用资源:处理器,I/O通道,主存和辅存,设备以及诸如文件,数据库和信号量之类的数据结构。
可消费资源:中断,信号,消息和I/O缓冲区中的信息。
6.2可能发生死锁所必须的三个条件是什么?答:互斥,占有且等待,非抢占。
6.3产生死锁的第4个条件是什么?答:循环等待。
6.4如何防止占有且等待的条件?答:可以要求进程一次性地请求所有需要的资源,并且阻塞这个资源直到所有请求都同时满足。
6.5给出防止无抢占条件的两种方法。
答:第一种,如果占有某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它最初占用的资源,如果有必要,可再次请求这些资源和另外的资源。
第二种,如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。
6.6如何防止循环等待条件?答:可以通过定义资源类型的线性顺序来预防。
如果一个进程已经分配到了R类型的资源,那么它接下来请求的资源只能是那些排在R类型之后的资源类型。
6.7死锁避免,检测和预防之间的区别是什么?答:死锁预防是通过间接地限制三种死锁必要条件的至少一个或是直接地限制循环等待的发生来避免死锁的出现。
死锁避免允许可能出现的必要条件发生,但是采取措施确保不会出现死锁的情况。
而死锁检测允许资源的自由分配,采取周期性的措施来发现并处理可能存在的死锁情况。
第二部分习题6.1写出图6.1(a)中死锁的四个条件。
解:互斥:同一时刻只有一辆车可以占有一个十字路口象限。
占有且等待:没有车可以倒退;在十字路口的每辆车都要等待直到它前面的象限是空的。
非抢占: 没有汽车被允许挤开其他车辆。
循环等待: 每辆汽车都在等待一个此时已经被其他车占领的十字路口象限。
6.2按照6.1节中对图6.2中路径的描述,给出对图6.3中6种路径的简单描述。
解:1.Q 获得 B 和A, 然后释放 B 和 A. 当 P 重新开始执行的时候, 它将会能够获得两个资源。