进程与资源

Posted 3u

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程与资源相关的知识,希望对你有一定的参考价值。

    计算机系统中,拥有一些独占性的资源,在任一时刻她们都只能被一个进程使用。每个进程访问这种特殊资源所需要的顺序可抽象为:

  1. 请求资源。
  2. 使用资源。
  3. 释放资源。

    当一个进程的请求得到资源的允许后,该进程往往会对资源加锁,以保证资源的排它性使用。这时,其它进程对加锁资源的请求就会被拒绝,加锁资源或是使用资源的进程会对其它进程声明:“嘿,哥们,你来迟了,这已经名花有主啦,看到那个锁标志了吗?”于是,其它进程要么搜索其它未加锁资源;要么就休眠,等待一段时间再次发起请求。

    这种策略在理想状态下是可行的,但现实往往是残酷的。个别“不高尚”的进程,会请求一个资源,加锁,之后再请求一个资源,再加锁,。。。而从不解锁。这就造成虽然加锁资源没有被使用,但是也处于加锁状态,使得真正需要该资源的进程无法发送请求,或请求无法得到响应。而且,加锁进程不断请求资源会造成死锁,试想一下:进程A加锁了资源a,然后请求使用资源b;而进程B加锁了资源b,然后请求使用资源a。。。一旦发生这种情况,在此次运行中,所有卷入死锁的进程和资源就无法正常工作了,只有等待系统复位。现实中,进程/资源比处于大于1或小于1的情况更为普遍,所以理想的策略不可能有效率地工作。

    针对现实情况,应该修改策略。有建议如下:

  1. 资源预设临界缓冲区。进程对临界缓冲区的请求可以得到资源状态及时响应(如:是否加锁、平均使用率、满意率等)。进程根据反应的信息做出调度,是坚持请求,直到资源被解锁;还是直接请求其它未加锁资源。
  2. 提高进程素质。由于某些无法预测和判断的原因,进程与自己请求的加锁资源状态不再统一,进程应该显示地释放、并解锁该资源(若一个程序员只在需要是申请内存,而运行后不释放,那么他不是合格的程序员,他的作为从某种程度上说就是犯罪)。一个“高尚”的进程,同一时刻不应该申请多个独占资源。就算进程全速申请使用一个资源,也未必能真正达到独占资源的满意度,何况多个。
  3. 增加进程的功能。进程除了对资源发出请求外,还应允许非加锁进程对处于长期未被使用、满意率低等消极状态的加锁资源进行发送解锁请求,一旦该进程与资源能达成某种双方满意的积极状态,该进程对加锁资源解锁成功,并可以加上自己的锁。
  4. 设置加锁资源复位功能。每隔一段时间,加锁资源会统计、分析与加锁进程各种参数,一旦参数长期低于某种阈值状态,加锁资源可以选择复位,自解锁,清除前一个进程留下的数据,更新资源状态,以响应其它进程的请求消息。

    系统运行中,进程、资源的相互状态都是有限的、稀有的,根据进程和资源的个体特点,各自使用的策略,都需要在效率和满意度之间进行权衡和折衷。

    各位兄弟姐妹,你加/被加锁了没?

以上是关于进程与资源的主要内容,如果未能解决你的问题,请参考以下文章

java线程同步

进程之间的通信

进程间通信之信号量

进程同步

进程调度的时机切换与过程方式

进程-PV操作