Difference between revisions of "Prova Teorica 2013.02.14"
Jump to navigation
Jump to search
(Created page with "==Esercizio 1== <source lang="text"> Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza BUFSIZE) che consenta a uno scrittore di sc...") |
(Aggiunte soluzioni che si trovavano alla pagina ProvaTeorica 2013.02.15) |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | ==Esercizio 1== | + | <h1>[http://www.cs.unibo.it/~renzo/so/compiti/2013.02.15.tot.pdf Testo del compito]</h1> |
+ | ==Esercizio C.1== | ||
+ | ===Soluzione di MV=== | ||
<source lang="text"> | <source lang="text"> | ||
Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza BUFSIZE) che consenta a uno scrittore di scrivere contemporaneamente due elementi che andranno rispettivamente nel primo e nel secondo buffer. Le letture : | Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza BUFSIZE) che consenta a uno scrittore di scrivere contemporaneamente due elementi che andranno rispettivamente nel primo e nel secondo buffer. Le letture : | ||
Line 47: | Line 49: | ||
notempty1.wait(); | notempty1.wait(); | ||
− | el = buf1[next_r1+ | + | el = buf1[next_r1]; |
+ | next_r1 = (next_r1+1)%BUFSIZE; | ||
n1--; | n1--; | ||
Line 62: | Line 65: | ||
notempty1.wait(); | notempty1.wait(); | ||
− | el = buf2[next_r2+ | + | el = buf2[next_r2]; |
+ | next_r1 = (next_r1+1)%BUFSIZE; | ||
n2--; | n2--; | ||
Line 70: | Line 74: | ||
} | } | ||
</source> | </source> | ||
+ | ===Soluzione di stefano92=== | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | /* | ||
+ | Esercizio c.1: (a) Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza | ||
+ | BUFSIZE) che consenta a uno scrittore di scrivere contemporaneamente due elementi che andranno rispettivamente | ||
+ | nel primo e nel secondo buffer. Le letture : | ||
+ | procedure entry void write(type1 e1, type2 e2); | ||
+ | procedure entry type1 read1(); | ||
+ | procedure entry type2 read2(); | ||
+ | La funzione write deve attendere che ci sia spazio in entrambi i buffer. | ||
+ | La funzione read attende che vi sia almeno un elemento nel buffer indicato | ||
+ | */ | ||
+ | monitor dualwriter | ||
+ | { | ||
+ | type1* buffer1; | ||
+ | type2* buffer2; | ||
+ | condition oktowrite,oktoread1, oktoread2 | ||
+ | procedure entry void write (type1 e1, type2 e2) | ||
+ | { | ||
+ | if (sizeof(type1)>=BUFSIZE || sizeof(type2)>=BUFSIZE) | ||
+ | oktowrite.wait(); | ||
+ | buffer1.push(e1); | ||
+ | buffer2.push(e2); | ||
+ | oktoread1.signal(); | ||
+ | oktoread2.signal(); | ||
+ | } | ||
+ | |||
+ | procedure entry type1 read1() | ||
+ | { | ||
+ | if (sizeof(buffer1)==0) | ||
+ | oktoread1.wait(); | ||
+ | buffer1.pop(); | ||
+ | if (sizeof(buffer2)<BUFSIZE) | ||
+ | oktowrite.signal(); | ||
+ | } | ||
+ | |||
+ | procedure entry type2 read2() | ||
+ | { | ||
+ | if (sizeof(buffer2)==0) | ||
+ | oktoread2.wait(); | ||
+ | buffer2.pop(); | ||
+ | if (sizeof(buffer1)<BUFSIZE) | ||
+ | oktowrite.signal(); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | -stefano92 | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | monitor dualwriter{ | ||
+ | queue buffer1; | ||
+ | queue buffer2; | ||
+ | condition oktowrite; | ||
+ | condition oktoread1; | ||
+ | condition oktoread2; | ||
+ | |||
+ | procedure entry void write(type1 e1, type2 e2){ | ||
+ | if((buffer1.len() == BUFSIZE) || (buffer2.len() == BUFSIZE)) /*se uno dei due buffer è pieno non puoi inserire*/ | ||
+ | oktowrite.wait(); | ||
+ | |||
+ | buffer1.enqueue(e1); | ||
+ | buffer2.enqueue(e2); | ||
+ | |||
+ | oktoread1.signal(); | ||
+ | oktoread2.signal(); | ||
+ | } | ||
+ | |||
+ | procedure entry type1 read1(){ | ||
+ | if(buffer1.len() == 0) /*buffer vuoto*/ | ||
+ | oktoread1.wait(); | ||
+ | |||
+ | buffer1.dequeue; | ||
+ | oktowrite.signal(); | ||
+ | } | ||
+ | |||
+ | procedure entry type2 read2(){ | ||
+ | if(buffer2.len() == 0) /*buffer vuoto*/ | ||
+ | oktoread2.wait(); | ||
+ | |||
+ | buffer2.dequeue; | ||
+ | oktowrite.signal(); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Giulia | ||
+ | <h2> Esercizio c.2 </h2> | ||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | // foo(x,y) <x=2+y , y=2+x> | ||
+ | |||
+ | int g = 0; | ||
+ | |||
+ | csenter: | ||
+ | |||
+ | do | ||
+ | int l; | ||
+ | foo(l, g); | ||
+ | while(l!=2) | ||
+ | |||
+ | csexit: | ||
+ | |||
+ | g = 0; | ||
+ | |||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | // bar (z,t) <z= z xor t, t= t xor z, z = z xor t> | ||
+ | |||
+ | z t z t z | ||
+ | 0 0 0 0 0 | ||
+ | 0 1 1 0 1 | ||
+ | 1 0 1 1 0 | ||
+ | 1 1 0 1 1 | ||
+ | |||
+ | void Swap(bool z, bool t){ | ||
+ | bool tmp; | ||
+ | z=t; | ||
+ | t=tmp; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | <h2> Esercizio g.1 </h2> | ||
+ | [[File:RoundRobin2cpu.png]] | ||
+ | |||
+ | |||
+ | {| border="1" | ||
+ | |- | ||
+ | |TEMPO | ||
+ | |1 | ||
+ | |2 | ||
+ | |3 | ||
+ | |4 | ||
+ | |5 | ||
+ | |6 | ||
+ | |7 | ||
+ | |8 | ||
+ | |9 | ||
+ | |10 | ||
+ | |11 | ||
+ | |12 | ||
+ | |13 | ||
+ | |14 | ||
+ | |15 | ||
+ | |16 | ||
+ | |17 | ||
+ | |18 | ||
+ | |19 | ||
+ | |20 | ||
+ | |21 | ||
+ | |22 | ||
+ | |23 | ||
+ | |24 | ||
+ | |25 | ||
+ | |- | ||
+ | |CPU 1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P4 | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |P4 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |- | ||
+ | |CPU 2 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |P1 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |<br> | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |<br> | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |<br> | ||
+ | |<br> | ||
+ | |<br> | ||
+ | |<br> | ||
+ | |<br> | ||
+ | |- | ||
+ | |I/O | ||
+ | |<br> | ||
+ | |<br> | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |P2 | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |P3 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P2 | ||
+ | |P3 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P1 | ||
+ | |P4 | ||
+ | |<br> | ||
+ | |<br> | ||
+ | |<br> | ||
+ | |- | ||
+ | |} | ||
+ | Domanda: una soluzione del genere sarebbe corretta? | ||
+ | -Stefano 92 |
Latest revision as of 14:22, 6 May 2017
Testo del compito
Esercizio C.1
Soluzione di MV
Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza BUFSIZE) che consenta a uno scrittore di scrivere contemporaneamente due elementi che andranno rispettivamente nel primo e nel secondo buffer. Le letture :
procedure entry void write(type1 e1, type2 e2);
procedure entry type1 read1();
procedure entry type2 read2();
La funzione write deve attendere che ci sia spazio in entrambi i buffer.
La funzione read attende che vi sia almeno un elemento nel buffer indicato.
// ------------------------- SOLUZIONE DI MV -------------------------
monitor dualwriter
{
type1 buf1[BUFSIZE];
type2 buf2[BUFSIZE];
int next_r1, next_r2, n1, n2;
// si ricorda che: next_w = (next_r+n)%BUFSIZE
condition notempty1, notempty2; // blocca in lettura se n=0
condition canwrite; // blocca in scrittura se n1=BUFSIZE || n2=BUFSIZE
dualwriter() // costruttore
{
n1 = n2 = next_r1 = next_r2 = 0;
}
procedure entry void write(type1 e1, type2 e2)
{
if(n1==BUFSIZE || n2==BUFSIZE)
canwrite.wait();
buf1[(next_r1+n1)%BUFSIZE] = e1;
n1++;
buf2[(next_r2+n2)%BUFSIZE] = e2;
n2++;
notempty1.signal();
notempty2.signal();
}
procedure entry type1 read1()
{
type1 el;
if(n1==0)
notempty1.wait();
el = buf1[next_r1];
next_r1 = (next_r1+1)%BUFSIZE;
n1--;
// libera un processo sse è possibile scrivere in entrambi i buffer
if(n1<BUFSIZE && n2<BUFSIZE)
canwrite.signal();
}
procedure entry type2 read2()
{
type2 el;
if(n2==0)
notempty1.wait();
el = buf2[next_r2];
next_r1 = (next_r1+1)%BUFSIZE;
n2--;
if(n1<BUFSIZE && n2<BUFSIZE)
canwrite.signal();
}
}
Soluzione di stefano92
/*
Esercizio c.1: (a) Scrivere un monitor dualwriter che realizzi un doppio buffer limitato (ogni buffer ha ampiezza
BUFSIZE) che consenta a uno scrittore di scrivere contemporaneamente due elementi che andranno rispettivamente
nel primo e nel secondo buffer. Le letture :
procedure entry void write(type1 e1, type2 e2);
procedure entry type1 read1();
procedure entry type2 read2();
La funzione write deve attendere che ci sia spazio in entrambi i buffer.
La funzione read attende che vi sia almeno un elemento nel buffer indicato
*/
monitor dualwriter
{
type1* buffer1;
type2* buffer2;
condition oktowrite,oktoread1, oktoread2
procedure entry void write (type1 e1, type2 e2)
{
if (sizeof(type1)>=BUFSIZE || sizeof(type2)>=BUFSIZE)
oktowrite.wait();
buffer1.push(e1);
buffer2.push(e2);
oktoread1.signal();
oktoread2.signal();
}
procedure entry type1 read1()
{
if (sizeof(buffer1)==0)
oktoread1.wait();
buffer1.pop();
if (sizeof(buffer2)<BUFSIZE)
oktowrite.signal();
}
procedure entry type2 read2()
{
if (sizeof(buffer2)==0)
oktoread2.wait();
buffer2.pop();
if (sizeof(buffer1)<BUFSIZE)
oktowrite.signal();
}
}
-stefano92
monitor dualwriter{
queue buffer1;
queue buffer2;
condition oktowrite;
condition oktoread1;
condition oktoread2;
procedure entry void write(type1 e1, type2 e2){
if((buffer1.len() == BUFSIZE) || (buffer2.len() == BUFSIZE)) /*se uno dei due buffer è pieno non puoi inserire*/
oktowrite.wait();
buffer1.enqueue(e1);
buffer2.enqueue(e2);
oktoread1.signal();
oktoread2.signal();
}
procedure entry type1 read1(){
if(buffer1.len() == 0) /*buffer vuoto*/
oktoread1.wait();
buffer1.dequeue;
oktowrite.signal();
}
procedure entry type2 read2(){
if(buffer2.len() == 0) /*buffer vuoto*/
oktoread2.wait();
buffer2.dequeue;
oktowrite.signal();
}
}
Giulia
Esercizio c.2
// foo(x,y) <x=2+y , y=2+x>
int g = 0;
csenter:
do
int l;
foo(l, g);
while(l!=2)
csexit:
g = 0;
// bar (z,t) <z= z xor t, t= t xor z, z = z xor t>
z t z t z
0 0 0 0 0
0 1 1 0 1
1 0 1 1 0
1 1 0 1 1
void Swap(bool z, bool t){
bool tmp;
z=t;
t=tmp;
}
Esercizio g.1
TEMPO | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
CPU 1 | P1 | P1 | P1 | P1 | P4 | P4 | P4 | P4 | P4 | P4 | P4 | P4 | P4 | P4 | P4 | P4 | P3 | P3 | P3 | P4 | P1 | P1 | P1 | P1 | P1 |
CPU 2 | P2 | P2 | P3 | P3 | P3 | P1 | P2 | P2 | P3 | P3 | P3 | P1 | P1 | P2 | P2 | P2 | P2 | P2 | |||||||
I/O | P2 | P2 | P2 | P2 | P3 | P3 | P3 | P1 | P1 | P1 | P1 | P2 | P3 | P1 | P1 | P1 | P1 | P1 | P4 |
Domanda: una soluzione del genere sarebbe corretta? -Stefano 92