
计算机系统中,拥有一些独占性的资源,在任一时刻她们都只能被一个进程使用。每个进程访问这种特殊资源所需要的顺序可抽象为:
当一个进程的请求得到资源的允许后,该进程往往会对资源加锁,以保证资源的排它性使用。这时,其它进程对加锁资源的请求就会被拒绝,加锁资源或是使用资源的进程会对其它进程声明:“嘿,哥们,你来迟了,这已经名花有主啦,看到那个锁标志了吗?”于是,其它进程要么搜索其它未加锁资源;要么就休眠,等待一段时间再次发起请求。
这种策略在理想状态下是可行的,但现实往往是残酷的。个别“不高尚”的进程,会请求一个资源,加锁,之后再请求一个资源,再加锁,。。。而从不解锁。这就造成虽然加锁资源没有被使用,但是也处于加锁状态,使得真正需要该资源的进程无法发送请求,或请求无法得到响应。而且,加锁进程不断请求资源会造成死锁,试想一下:进程A加锁了资源a,然后请求使用资源b;而进程B加锁了资源b,然后请求使用资源a。。。一旦发生这种情况,在此次运行中,所有卷入死锁的进程和资源就无法正常工作了,只有等待系统复位。现实中,进程/资源比处于大于1或小于1的情况更为普遍,所以理想的策略不可能有效率地工作。
针对现实情况,应该修改策略。有建议如下:
系统运行中,进程、资源的相互状态都是有限的、稀有的,根据进程和资源的个体特点,各自使用的策略,都需要在效率和满意度之间进行权衡和折衷。
各位兄弟姐妹,你加/被加锁了没?