Difference between revisions of "Prove scritte 2021"

From Sistemi Operativi
Jump to navigation Jump to search
Line 1: Line 1:
  
 
= Prova 2021/06/23 =
 
= Prova 2021/06/23 =
 +
 +
== Esercizio C1 ==
 +
 +
=== Consegna ===
 +
Esercizio c.1: Scrivere il monitor delayvalue con una sola procedure entry:
 +
  int delay(int value);
 +
Il monitor deve sospendere i primi NDELAY processi che chiamano la delay. Le successive chiamate di delay
 +
devono mantenere costante il numero di processi sospesi, ogni successiva chiamata devo riattivare il primo
 +
processo in attesa prima di sospendersi, la delay ritorna il valore passato come parametro dal processo che
 +
ne ha riattivato l'esecuzione. e.g. se NDELAY è 2:
 +
  P1: delay(44) -> P1 si sospende
 +
  P2: delay(40) -> P2 si sospende
 +
  P3: delay(42) -> P1 si riattiva e ritorna 42, P3 si sospende
 +
  P4: delay(22) -> P2 si riattiva e ritorna 22, P4 si sospende
 +
 +
=== Soluzione proposta 1 ===
 +
Soluzione proposta da [https://so.v2.cs.unibo.it/wiki/index.php/User:Flecart Flecart], da controllare
 +
 +
<syntaxhighlight lang=C>
 +
 +
// variabile definita altrove.
 +
extern int NDELAY;
 +
 +
class Monitor {
 +
    Queue<condition> stopped;
 +
    int curr_value;
 +
    Monitor {
 +
        stopped = Queue<condition>();
 +
        curr_value = 0;
 +
    }
 +
 +
    int delay(int value) {
 +
        curr_value = value;
 +
        if (stopped.size() == NDELAY) {
 +
            condition first = stopped.dequeue();
 +
            first.signal();
 +
        }
 +
        condition c = new condition();
 +
        stopped.enqueue(c);
 +
        c.wait();   
 +
 +
        return curr_value;
 +
    }
 +
}
 +
 +
</syntaxhighlight>
 +
  
 
== Esercizio c2 ==
 
== Esercizio c2 ==

Revision as of 15:13, 11 December 2022

Prova 2021/06/23

Esercizio C1

Consegna

Esercizio c.1: Scrivere il monitor delayvalue con una sola procedure entry:

 int delay(int value);

Il monitor deve sospendere i primi NDELAY processi che chiamano la delay. Le successive chiamate di delay devono mantenere costante il numero di processi sospesi, ogni successiva chiamata devo riattivare il primo processo in attesa prima di sospendersi, la delay ritorna il valore passato come parametro dal processo che ne ha riattivato l'esecuzione. e.g. se NDELAY è 2:

 P1: delay(44) -> P1 si sospende
 P2: delay(40) -> P2 si sospende
 P3: delay(42) -> P1 si riattiva e ritorna 42, P3 si sospende
 P4: delay(22) -> P2 si riattiva e ritorna 22, P4 si sospende

Soluzione proposta 1

Soluzione proposta da Flecart, da controllare

// variabile definita altrove.
extern int NDELAY;

class Monitor {
    Queue<condition> stopped;
    int curr_value;
    Monitor {
        stopped = Queue<condition>();
        curr_value = 0;
    }

    int delay(int value) {
        curr_value = value;
        if (stopped.size() == NDELAY) {
            condition first = stopped.dequeue();
            first.signal();
        }
        condition c = new condition();
        stopped.enqueue(c);
        c.wait();    

        return curr_value;
    }
}


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