-
-
-
CENAPAD-MGCO
A seguir: 1a Prova
Acima: Respostas
Anterior: Árvores-B: Solução (cont)
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();
}
}