Prove scritte 2014

From Sistemi Operativi
Revision as of 09:07, 30 August 2020 by Acsor (talk | contribs) (Created page with "== Esame 16/07/2014 == [http://www.cs.unibo.it/~renzo/so/compiti/2014.07.16.tot.pdf 2014.07.16.tot.pdf] === Esercizio c.1 === <source lang="c"> /* Monitor Bounded Buffer: (non...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Esame 16/07/2014

2014.07.16.tot.pdf

Esercizio c.1

/* Monitor Bounded Buffer: (non richiesto dall'esercizio) */
queue q;
condition oktoread; // q.length() > 0
condition oktowrite; // q.length() < MAX

procedure entry type read():
    if (q.length() == 0) oktoread.wait(); // controllo
    retval = q.dequeue(); // cambio lo stato
    // abilito coloro che possono essere abilitati dal cambiamento di stato
    oktowrite.signal() 
    return retval;

procedure entry void write(type elem):
    if (q.length() >= MAX) oktowrite.wait(); //controllo
    q.enqueue(elem); // cambio lo stato
    oktoread.signal(); // abilito chi può essere abilitato

/* NOTE:
 * procedure entry ==> dichiarazione di funzioni (senza vedere l'implementazione 
 * dall'esterno)
 */


/* Min-Max Monitor Bounded Buffer: */

Queue Q;

// Condition: OKTOREAD: Q.Length > MIN
// Condition: OKTOWRITE: Q.Length < MAX

procedure entry: Type Read():
{
    if (Q.Length <= MIN) OKTOREAD.Wait(); // Controllo
    retval = Q.Dequeue(); // Cambio di stato
    OKTOWRITE.Signal(); // Abilito chi vuole scrivere
    return retval; // Qui sono sicuro perchè ne ho eliminato uno prima
}

procedure entry: void Write(Type elem):
{
    if (Q.Length >= MAX) OKTOWRITE.Wait() // Controllo
    Q.Enqueue(elem); // Cambio di stato
    if (Q.Length > MIN) OKTOREAD.Signal(); // Abilito chi vuole leggere
}


Esercizio c.2

Semaphore mutex = 1;

struct Elem
{
    Semaphore s;
    int counter;
}

struct Elem V[]; // Vettore a dimensione variabile. I nuovi elementi sono initializzati a s = 0, counter = 0.

void RendezVouz(int n)
{
    mutex.P(); // Blocco, decremento di 1 (il processo si blocca se il semaforo vale 0)
    V[n].counter++;
    if (V[n].counter < n)
    {
        mutex.V(); // Rilascia, incrementa di 1
        V[n].s.P();
    }
    V[n].counter--;
    if (V[n].counter > 0)
        V[n].s.V();
    else
        mutex.V();       
}


Esercizio g.1

    0241302 ==> soluzione corretta
(0)2   2200
(1)3   1111
(2)4   4442
(3)0   0333

    2 3 4 0 1 2 3 4  0  1  2  3 ==> soluzione proposta, non corretta perchè non è la stringa più corta 
2           1 1 1 1  0  0  0  0
3           3 2 2 2  2  1  1  1
4           4 4 3 3  3  3  2  2
0           0 0 0 4  4  4  4  3


Esame 03/06/2014

2014.06.03.tot.pdf

Esercizio c.1 (da controllare)

monitor sabelev
{
    #define N n //numero dei piani

    condition ok2enter[N][2]; //piano di partenza e direzione
    condition ok2exit[N]; //piano di arrivo

    procedure entry: void atfloor(int floor, int direction)
    {
        ok2exit[floor].signal(); //da il via al primo del piano che deve uscire
        ok2enter[floor][direction].signal(); //da il via al primo del piano che deve entrare e deve andare in questa direzione
    }

    procedure entry: void enter(int from, int to)
    {
        int direction;
        if(to > from) //controllo sulla direzione
            direction = 0;
        else
            direction = 1;

        ok2enter[from][direction].wait(); //mi fermo in attesa che arrivi l'ascensore
        ok2enter[from][direction].signal(); //quando arriva l'ascensore do il via a quello in attesa dopo di me
        ok2exit[to].wait(); //mi fermo dentro all'ascensore in attesa di uscire
    }

    procedure entry: void exit(int from, int to)
    {
        ok2exit[to].signal(); //do il via ad un altro che deve uscire a questo piano come me
    }

}


Esame 21/02/2014

2014.02.21.tot.pdf

Esercizio c.1 (da controllare)

monitor bbwl
{
    #define MAXELEM n

    condition ok2read;
    condition ok2write;
    condition ok2log;

    queue q1;
    queue q2;

    procedure entry: void write(eltype elem)
    {
        if (q1.size() >= MAXELEM)
            ok2write.wait();
        q1.enqueue(elem);
        ok2log.signal();
    }

    procedure entry: eltype read()
    {
        if (q2.size == 0)
            ok2read.wait();
        eltype elem = q2.dequeue();
        ok2write.signal();
        return elem;
    }

    procedure entry: eltype log()
    {
        if (q1.size() == 0)
            ok2log.wait();
        eltype elem = q1.dequeue();
        q2.enqueue(elem);
        ok2read.signal()
        return elem;
    }
}