饥饿、死锁、互斥

1:饥饿是指一个可运行的进程尽管能继续执行,但被调度程序无限期地忽略,而不能被调度执行的情形。

2:死锁是两个或两个以上的进程其中每个进程都在等待其它进程做完某些事而不能继续执行。

3:互斥是当一个进程在临界区访问共享资源时,其它进程不能进入该临界区访问任何共享资源。

4:同步比较好理解

题目中说一个进程已经占有很多资源了,它还需要更多的资源,所以在没得到这些资源之前,它所占有的这些资源不能得到释放,其它进程就无法获得这些资源,而改程序所需要的资源也很可能被其它进程所占有,因此造成死锁;

顺便复习下死锁产生的四个必要条件:

  • 互斥条件:一个资源每次只能被一个进程使用
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已获得的资源在未使用完之前,不能强行剥夺
  • 循环等待条件:若干进程之间形成头尾相接的循环等待资源关系

相应的预防措施:

  • 采用静态资源分配策略,破坏部分分配条件
  • 允许进程剥夺其它进程的资源,破坏不可剥夺的条件
  • 采用资源有序分配,破坏环路条件
  • 注意:互斥条件是无法被破坏的
时间: 2024-10-21 19:53:37

饥饿、死锁、互斥的相关文章

java并发-线程饥饿死锁测试

线程饥饿死锁 <Java并发编程实践>中对线程饥饿死锁的解释是这样的:在使用线程池执行任务时,如果任务依赖于其他任务,那么就可能产生死锁问题.在单线程的Executor中,若果一个任务将另一个任务提交到同一个Executor,并且等待这个被提交的任务的结果,那么这必定会导致死锁.第一个任务在工作队列中,并等待第二个任务的结果:而第二个任务则处于等待队列中,等待第一个任务执行完成后被执行.这就是典型的线程饥饿死锁.即使是在多线程的Executor中,如果提交到Executor中的任务之间相互依赖

基于请求的分布式互斥算法

一个悲剧的文章,研究的东西确实比较老,但是因为这些研究,让我对分布式的底层的关系有了更加清晰的认识,也算是不枉此功. 下面贴出来核心的部分. 引言 分布式系统中的一组进程可能会同时访问一个资源或者同时执行一个给定的函数,我们称这些资源或者函数为临界区(Critical Section),若不加控制的话,会造成资源或者环境的不一致的现象.保证任何给定时刻只允许一个进程或者给定的进程去执行临界区的算法称为互斥算法.互斥也可以称为并发控制. 这个问题最早由Dijkstra[1]在1965年提出.互斥可

深入浅出 Java Concurrency (37): 并发总结 part 1 死锁与活跃度[转]

死锁与活跃度 前面谈了很多并发的特性和工具,但是大部分都是和锁有关的.我们使用锁来保证线程安全,但是这也会引起一些问题. 锁顺序死锁(lock-ordering deadlock):多个线程试图通过不同的顺序获得多个相同的资源,则发生的循环锁依赖现象. 动态的锁顺序死锁(Dynamic Lock Order Deadlocks):多个线程通过传递不同的锁造成的锁顺序死锁问题. 资源死锁(Resource Deadlocks):线程间相互等待对方持有的锁,并且谁都不会释放自己持有的锁发生的死锁.也

并发编程---死锁||递归锁---信号量---Event事件---定时器

死锁 互斥锁:Lock(),互斥锁只能acquire一次 递归锁:  RLock(),可以连续acquire多次,每acquire一次计数器+1,只有计数为0时,才能被抢到acquire # 死锁 from threading import Thread,Lock import time mutexA = Lock() mutexB = Lock() class MyThread(Thread): def run(self): self.f1() self.f2() def f1(self):

25多线程之互斥锁

例子:利用两个子进程从50进行降序输出 int g_num=50; //偶数 void *threadEven(void *lParam) { while(g_num>0) { if(!(g_num&1)) { printf("even:%d\n",g_num); } g_num--; usleep(1); } return NULL; } //奇数 void *threadOdd(void *lParam) { while(g_num>0) { if(g_num&

不得不知道的golang之sync.Mutex互斥锁源码分析

针对Golang 1.9的sync.Mutex进行分析,与Golang 1.10基本一样除了将panic改为了throw之外其他的都一样.源代码位置:sync\mutex.go.可以看到注释如下: Mutex can be in 2 modes of operations: normal and starvation. In normal mode waiters are queued in FIFO order, but a woken up waiter does not own the m

IOS 多线程02-pthread 、 NSThread 、GCD 、NSOperationQueue、NSRunLoop

注:本人是翻译过来,并且加上本人的一点见解. 要点: 1.前言 2.pthread 3.NSThread 4.Grand Central Dispatch(GCD) 5.Opearation Queues 6. Run Loops 7. 多线程编程中面临的挑战 8. 资源共享 9. 互斥锁 10. 死锁 11. 资源饥饿(Starvation) 12. 优先级反转 1. 前言 其实把RunLoop叫做多线程不正确,因为它不能真正的并行,不过因为它与并发编程有莫大关系,所以值得我们深入了解. 2.

深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]

主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的一点是:所有锁(包括内置锁和高级锁)都是有性能消耗的,也就是说在高并发的情况下,由于锁机制带来的上下文切换.资源同步等消耗是非常可观的.在某些极端情况下,线程在锁上的消耗可能比线程本身的消耗还要多.所以如果可能的话,在任何情况下都尽量少用锁,如果不可避免那么采用非阻塞算法是一个不错的解决方案,但是却也不是绝对的.

(转)操作系统总结

转自:http://my.oschina.net/pangyangyang/blog/188507?p=2#OSC_h3_56 计算机组成 计算机的运行简单理解为这三层:硬件即组成计算机的所有摸得见看得着的东西是计算机运行的基础:应用程序即完成特定功能.目的的用户程序是计算机的价值体现:中间就是操作系统,连接了硬件和应用程序负责硬件调度.资源管理和分配(内存.文件.CPU等等).安全等一系列功能. 硬件层 主要硬件包括CPU(算术.逻辑单元).主存.辅助存储.系统总线.I/O设备(即输入输出).

java 2017/6/26杂记

mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下: new File("/tmp/one/two/three").mkdirs(); 执行后, 会建立tmp/one/two/three四级目录 new File("/tmp/one/two/three").mkdir(); 则不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false 关于死锁,活锁以及饥饿 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因