Difference between revisions of "Prove scritte 2021"
Jump to navigation
Jump to search
(Created blank page) |
|||
| Line 1: | Line 1: | ||
| + | = Prova 2021/06/23 = | ||
| + | |||
| + | == Esercizio c2 == | ||
| + | |||
| + | === Consegna === | ||
| + | |||
| + | |||
| + | Esercizio c.2: Implementare usando semafori ordinari (fair, fifo) un servizio di semafori a priorità lifo che | ||
| + | fornisca le seguenti primitive: | ||
| + | void PLP(int prio); | ||
| + | void PLV() | ||
| + | PLP e PLV si devono comportare rispettivamente come P e V. Quando la PLV deve riattivare un processo | ||
| + | sceglie fra quelli in attesa quello a priorità massima, nel caso siano presenti più processi a priorità massima | ||
| + | sceglie quello in attesa da meno tempo. | ||
| + | |||
| + | === Soluzione proposta 1 === | ||
| + | |||
| + | Esercizio c2 (da controllare) da Flecart. | ||
| + | |||
| + | <source lang="c"> | ||
| + | |||
| + | Stack<semaphore> stack[MAX_PRIORITY]; | ||
| + | int num_V = 0; | ||
| + | semaphore mutex(1); | ||
| + | |||
| + | void PLP(int prio) { | ||
| + | mutex.P(); | ||
| + | if (num_V > 0) { | ||
| + | num_V--; | ||
| + | mutex.V(); | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | semaphore sem = semaphore(0); | ||
| + | stack[prio].push(sem); | ||
| + | mutex.V(); | ||
| + | sem.P(); | ||
| + | |||
| + | mutex.V(); | ||
| + | } | ||
| + | |||
| + | |||
| + | void PLV() { | ||
| + | mutex.P(); | ||
| + | |||
| + | for (int i = MAX_PRIORITY - 1; i >= 0; i--) { | ||
| + | if (stack[i].size() > 0) { | ||
| + | sem = stack[i].pop(); | ||
| + | sem.V(); | ||
| + | return; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | num_V++; | ||
| + | |||
| + | mutex.V(); | ||
| + | } | ||
| + | |||
| + | </source> | ||
Revision as of 14:52, 11 December 2022
Prova 2021/06/23
Esercizio c2
Consegna
Esercizio c.2: Implementare usando semafori ordinari (fair, fifo) un servizio di semafori a priorità lifo che fornisca le seguenti primitive:
void PLP(int prio); void PLV()
PLP e PLV si devono comportare rispettivamente come P e V. Quando la PLV deve riattivare un processo sceglie fra quelli in attesa quello a priorità massima, nel caso siano presenti più processi a priorità massima sceglie quello in attesa da meno tempo.
Soluzione proposta 1
Esercizio c2 (da controllare) da Flecart.
Stack<semaphore> stack[MAX_PRIORITY];
int num_V = 0;
semaphore mutex(1);
void PLP(int prio) {
mutex.P();
if (num_V > 0) {
num_V--;
mutex.V();
return;
}
semaphore sem = semaphore(0);
stack[prio].push(sem);
mutex.V();
sem.P();
mutex.V();
}
void PLV() {
mutex.P();
for (int i = MAX_PRIORITY - 1; i >= 0; i--) {
if (stack[i].size() > 0) {
sem = stack[i].pop();
sem.V();
return;
}
}
num_V++;
mutex.V();
}