- 死锁和饥饿的区别
定义与现象:
死锁(Deadlock)是指两个或多个线程互相等待对方持有的资源而无法继续执行的情况。每个线程至少持有一个资源,并尝试获取另一个由其他线程持有的资源,从而形成一个循环等待的僵局,没有外力干预(如手动中断或系统回收资源),这些线程都将永久阻塞。
饥饿(Starvation)是指一个或多个线程因为资源分配不公平或优先级问题,长期无法获得所需资源而无法执行的现象。尽管资源最终可能被释放,但由于调度策略或其他线程的持续占用,低优先级或不幸的线程可能永远得不到执行机会。
资源等待情况:
死锁中,线程处于相互等待的固定状态,形成闭环依赖,无法推进。
饥饿中,线程可能在等待资源被释放的同时,还可能在等待调度执行,这种等待并非固定不变,但持续时间过长。
涉及的进程数量:
死锁至少涉及到两个进程或线程,每个至少持有一个资源并等待另一个资源。
饥饿可能涉及单个或多个线程,主要与资源分配策略和线程调度相关。
解决策略:
解决死锁通常需要预防(如避免循环等待、使用锁顺序)、检测(运行时检测死锁的存在)和恢复(中断或重启线程)等策略。
针对饥饿,可以通过调整资源分配策略(如公平锁)、优先级调整、老化机制(提升长时间等待线程的优先级)等方法来缓解。
后果与影响:
死锁导致涉及的线程完全停止,无法继续执行任何工作,除非外部干预。
饥饿可能导致某些线程长时间无法执行,影响系统整体性能和响应速度,严重时可能导致“饿死”,即线程永远无法完成其任务。
如果大家需要视频版本的讲解,欢迎关注我的B站: