Difference between revisions of "Prove scritte 2021"

From Sistemi Operativi
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();
}