笑对 死锁
第一次听到这个词是在今年九期师哥李社河讲的,大概是关于我们学校的考试系统,因为死锁引起了一些列的问题,最终被社河师哥解决,当时,听到死锁这个词,可谓是一头雾水,什么都不知道,什么都不明了,事后也查过死锁这个词,但是,还是不明所以
没有想到,在我们学习自考的操作系统中,就有一小章节来专门讲了这个死锁,顿时,又懵了,看书,上网,总算是有了点体悟:(个人学习理解,不一定对,日后定有更新)
要说死锁的形成,就要讲一下什么是并发进程,因为,死锁是当一组进程(至少有两个),它们中的每一个进程都占用了某种资源,而又都在等待其他进程所占用的资源,造成组进程一直处于等待不能结束的状态如图:
下面给大家解释一下,如图所示,进程T1占用了资源R1,进程T2占用了资源R2,可是,大家知道,处理器一次只能执行一个进程,所以要想进程T1或者T2结束进程并释放资源的话,就要等着对方先把资源释放出来给自己,但是要命的是双方都是这么想,所以就一直僵持,等着对方把资源释放,可是由于进程进行所需要申请的资源被对方占用并且不能释放,所以,造成一种死等待,就是死锁。不知道这么说大家能理解不能
其实在我们的社会中,也有不少类似死锁的问题,其中最形象的是交通:
就像这幅交通图,四个方向的车就好比一组四个并发进程,他们只需要直行,中心路就就是他们所欲要的资源(共享),可是,这个资源被其他方向的车占用,导致自己的车想通过路口就要让其他所有停在路口的车让开,可每个司机都是这么想,所以就一直等待啊等待,等待啊等待,一直也没有结果,为了解决这个问题(交通死锁),我们装上了交通红绿灯(我们的PV操作)
同样,针对我们电脑编程上的死锁,我们也有解决办法:
通过总结,我们得出,系统出现死锁必须同时保持四个必要条件:
1、互斥的使用资源(一个资源每次只能给一个进程使用)
2、占有等待资源(当一个进程申请资源得不到满足的时候,会处于等待状态且由于没 有之行结束,不会 释放所占有的资源)
3、非抢夺是分配资源(不能抢夺对方已占用的资源)
4、循环等待资源
有了这四条,我们就可以见缝插针,对症下药了
一、死锁的防治:
1、静态分配资源(通俗点讲,就是在进程开始执行之前,就将其所需要的资源全都备 齐,不需要再额外 申请资源,可是,这大大的降低了资源的利用率啊)
2、按序分配资源(给资源编上大小号,规定所有申请两个以上资源的进程都要先申请 小号资源,逐渐加 大,这样就避免了所有进程都处于等待别人的占用资源的现象)
3、剥夺式分配资源(这就不用多说了吧)(目前只适用于处理器和主存资源的分配)
举个例子:
就拿课本上的例子来说,五个哲学家,五根筷子,一盘面,每两个人之间放一根筷子
如果这些哲学家懂得谦让还好,一个人吃完另一个人在吃,就都能吃到,可是,谁又想饿着呢?如果每个人都拿起自己身边的一根筷子,就没个人就只有一根筷子,结果还得到别人给自己一根让自己吃,怕就怕每个人都这么想
解决办法:
1、P1分两根筷子,P5分两根筷子,等自己吃饱后,就把自己手中的两个筷子一起传给 下一个人(还没吃 饭的)——静态分配法
2、给筷子编上号,1,2,3,4,5,规定,每个人拿自己身边筷子的时候必须从小号开始,有 了小号才能拿 大号,否则乱棍打死,这样,不管怎么样,肯定有至少一个人能吃到 面,当他吃饱后把筷子放回 去,别人也就能吃饭了——按序分配法
3、看谁壮谁就能吃饭,打架夺筷子——剥夺式分配资源
小结,吃个饭,真不容易