- - - - CENAPAD-MGCO

contents index A seguir: 1a Prova Acima: Respostas Anterior: Árvores-B: Solução (cont)


Pool de Recursos Idênticos

 (Exercicio 2.5.8)

Cliente i:
loop
  ...
  r = randomChoice(1,R);
  List myResources = pool.getResources(myProcessId, r);
  /* usa os recursos na lista myResources */
  pool.releaseResources(myResources);
  ...
end

class Pool {
  Key mutex;
  AgingQueue q;
  List free = new List();

  List getResources(ProcessId pid, int r) {
    List result;
    lock(mutex);
      Request rq = q.getRequest(pid, r);
      while ((free.count() < r) || (!q.isTheBest(rq)))) {
        wait(rq.bed, mutex);
      }
      q.ok(rq);
      wakeup(q.top().bed, mutex); /* os restantes podem servir */
      result = free.getList(r);
    unlock(mutex);
    return result;
  }
  void releaseResources(List rList) {
    lock(mutex);
      free.put(rList);
      wakeup(q.top().bed, mutex);
    unlock(mutex);
  }
}

class Request {
   int number;
   int age;
   Bed bed;
   ProcessId client;
}

class AgingQueue {
  OrderedQueue waiting = new OrderedQueue(new NumberPlusAgeComparator());

  Request getRequest(ProcessId client, int nResources) {
    Request rq = new Request(client, nResources, 0);
    waiting.put(rq);
    return rq;
  }
  
  void ok(Request rq) {
    waiting.del(rq);
    waiting.getOlder();
  }

  boolean isTheBest(Request rq ) {
    return ( rq == waiting.top() );
  }

  Request top() {
    return (Request) waiting.top();
  }
}



Osvaldo Carvalho - Postscript - Comentários?