Difference between revisions of "ProvaTeorica 2013.05.30"
(9 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<h1>[http://www.cs.unibo.it/~renzo/so/compiti/2013.05.30.tot.pdf Testo del compito]</h1> | <h1>[http://www.cs.unibo.it/~renzo/so/compiti/2013.05.30.tot.pdf Testo del compito]</h1> | ||
− | + | <h2> Esercizio c.1</h2> | |
− | <h2>Esercizio c.1</h2> | ||
− | |||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
+ | monitor eventp { | ||
+ | typedef struct EP { | ||
+ | unsigned int value; | ||
+ | condition okNotNull; | ||
+ | condition okToaAdd; | ||
+ | intqueue q; | ||
+ | } EP; | ||
+ | procedure entry EP* create (unsigned value){ | ||
+ | if (d.value+value > MAXINT || !d.queue.isEmpty()) { | ||
+ | d.q.enqueue(value); | ||
+ | d.okToAdd.wait(); | ||
+ | d.q.dequeue(); | ||
+ | } | ||
+ | d.value = d.value + value; | ||
+ | if (d.q.top() + value <= d.value.size()) //se il suo valore proposto non causa l’overflow del counter, sblocco lo scrittore successivo | ||
+ | d.okToAdd.signal(); | ||
+ | else | ||
+ | d.okNotNull.signal(); | ||
+ | } | ||
− | + | procedure entry unsigned int read (EP* ep){ | |
− | procedure entry EP * | + | if (!ep.value) |
+ | ep.okNotNull.wait(); | ||
+ | unsigned int toReturn = ep.value; | ||
+ | ep.value = 0; | ||
+ | ep.okToAdd.signal(); | ||
+ | return toReturn; | ||
+ | } | ||
− | + | procedure entry close(EP * ep){ | |
+ | free(ep); | ||
+ | } | ||
− | + | } | |
− | + | </syntaxhighlight> | |
− | + | <h2> Esercizio g.1</h2> | |
− | + | <p> <b>PUNTO A:</b> (7+256+(256^2)+(256^3))*1kb =16.843.015kb quindi approssimativamente 16MB</p> | |
− | + | <p> <b> PUNTO B:</B> blocco indiretto triplo -> primo livello di idirizzamento 256 esimo blocco -> secondo livello di indirizzamento 256 esimo blocco -> terzo livello di indirizzamento al blocco 100000. Qundi in totale 4 blocchi </p> | |
− | + | <h2> Esercizio g.2 </h2> | |
− | + | [[File:Holt.png]] | |
− | monitor eventp{ | + | <syntaxhighlight lang="C"> |
− | + | monitor eventp | |
− | + | { | |
− | + | typedef struct EP | |
− | + | { | |
− | + | unsigned int value; | |
− | + | condition okNotNull; | |
− | struct EP { | + | condition okToAdd; |
− | unsigned int | + | intqueue q; |
− | + | } | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | procedure entry EP* create(unsigned value) | ||
+ | { | ||
+ | EP *ep = new EP(value); | ||
+ | eps.enqueu(ep); | ||
+ | return ep; | ||
} | } | ||
− | + | procedure entry write(EP *d,unsigned value) | |
− | + | { | |
− | procedure entry | + | if(d.value+value > d.value.size()|| !d.q.empty()) { |
− | + | d.q.enqueue(value); | |
− | if(d. | + | d.okToAdd.wait(); |
− | + | d.q.dequeue(); | |
− | + | } | |
− | + | d.value = d.value + value; | |
− | + | if (d.q.top()+value <= d.value.size()) | |
+ | d.okToAdd.signal(); | ||
else | else | ||
− | + | d.okNotNull.signal(); | |
− | |||
} | } | ||
− | + | // MAXINT - currentvalue < value | |
− | + | procedure entry unsigned int read(EP *ep) | |
− | procedure entry unsigned read (EP * | + | { |
− | + | if(!ep.value) | |
− | + | ep.okNotNull.wait(); | |
− | + | unsigned int toReturn = ep.value; | |
− | + | ep.value = 0; | |
− | + | ep.okToAdd.signal(); | |
− | + | return toReturn; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | + | <syntaxhighlight> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | < |
Latest revision as of 17:00, 19 May 2014
Testo del compito
Esercizio c.1
monitor eventp {
typedef struct EP {
unsigned int value;
condition okNotNull;
condition okToaAdd;
intqueue q;
} EP;
procedure entry EP* create (unsigned value){
if (d.value+value > MAXINT || !d.queue.isEmpty()) {
d.q.enqueue(value);
d.okToAdd.wait();
d.q.dequeue();
}
d.value = d.value + value;
if (d.q.top() + value <= d.value.size()) //se il suo valore proposto non causa l’overflow del counter, sblocco lo scrittore successivo
d.okToAdd.signal();
else
d.okNotNull.signal();
}
procedure entry unsigned int read (EP* ep){
if (!ep.value)
ep.okNotNull.wait();
unsigned int toReturn = ep.value;
ep.value = 0;
ep.okToAdd.signal();
return toReturn;
}
procedure entry close(EP * ep){
free(ep);
}
}
Esercizio g.1
PUNTO A: (7+256+(256^2)+(256^3))*1kb =16.843.015kb quindi approssimativamente 16MB
PUNTO B: blocco indiretto triplo -> primo livello di idirizzamento 256 esimo blocco -> secondo livello di indirizzamento 256 esimo blocco -> terzo livello di indirizzamento al blocco 100000. Qundi in totale 4 blocchi
Esercizio g.2
<syntaxhighlight lang="C">
monitor eventp
{
typedef struct EP
{
unsigned int value;
condition okNotNull;
condition okToAdd;
intqueue q;
}
}
procedure entry EP* create(unsigned value) { EP *ep = new EP(value); eps.enqueu(ep); return ep; }
procedure entry write(EP *d,unsigned value) { if(d.value+value > d.value.size()|| !d.q.empty()) { d.q.enqueue(value); d.okToAdd.wait(); d.q.dequeue(); } d.value = d.value + value; if (d.q.top()+value <= d.value.size()) d.okToAdd.signal(); else d.okNotNull.signal(); }
// MAXINT - currentvalue < value procedure entry unsigned int read(EP *ep) { if(!ep.value) ep.okNotNull.wait(); unsigned int toReturn = ep.value; ep.value = 0; ep.okToAdd.signal(); return toReturn; } <syntaxhighlight>