N进程M资源死锁问题
N进程M资源死锁问题
京东2022C++开发岗一道笔试题:
n进程,100个文件,每个进程并发处理4个文件,每个文件只能同时由一个进程访问,请问产生死锁最少的进程数n
A.31
B.32
C.33
D.34
以前总觉得自己线程进程理解到位了,但是一遇到这道题立马投降了。
考试的时候一直在满脑子100/4=25,然后以100+25=125,且31*4=124,32*4=128为由,选择了32便略过了这道题
但是这个思路忽略了这道题的一个核心思想,那就是死锁,也就是说这道题本身有互斥的概念,是可以通过进程释放来互斥读取的
其实这道题就是一个哲学家吃饭的问题的变体,也是网上随处可见的N进程M资源死锁问题的换壳:
n进程共享m个资源,每个进程需访问x个资源,求不会产生死锁的条件
这个问题的出发点应该由n个进程来切入,当我每个进程都需要x个资源的时候,就有一个临界点(x-1)
以上题作为例子,我先为n个进程分配3个文件(x-1),如果此时文件就只有3*n个,也就是说此时没有多余的文件来满足每个进程4个文件的要求:每个进程都会卡死在自己等不到第4个文件而不释放手上的3个文件的情况,此时就会出现死锁。
但是如果只要再有多一个文件,只要某个进程获得这个文件,就满足4个文件的需求,用完就释放给别的进程,就不会产生死锁现象
所以得到式子m = n(x-1)+1
那么有这个式子就好办了,题目要求的是已知文件数,求进程数
我们要注意的是,式子对应的进程数,是不会发生死锁现象的临界点,也就是不会产生死锁的最大进程数
所以当代入式子100=n(4-1)+1后得出的n=33并不是答案,只要把33+1=34,就是会产生死锁的最小进程数,也就是答案D
现在再反过来想为什么不能是32,当32个进程都分配3个文件的时候,占用了3*32=96个文件,剩下四个文件可以允许进程互相释放来互斥访问
33个进程的时候,3*33=99,依然存在100-99=1个文件来满足上面不会产生死锁的情况
34个进程的时候,3*34=102,100个文件甚至都不够。也就是产生死锁的最少进程数的临界点
那么有人问了,如果我其中一个进程少拿一个,给另外一个缺一个的进程不就可以解决死锁互斥了吗,请留意题意,题目的目的是产生死锁的条件/临界点,而不是解决死锁。
表达可能不清晰,还是希望以记录的形式来让自己长点记性,不然连这种基础的题都得跪,就真的不值得了