<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Risposte_a_studenti_giugno_2016</id>
	<title>Risposte a studenti giugno 2016 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Risposte_a_studenti_giugno_2016"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Risposte_a_studenti_giugno_2016&amp;action=history"/>
	<updated>2026-05-05T00:13:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Risposte_a_studenti_giugno_2016&amp;diff=1368&amp;oldid=prev</id>
		<title>Renzo: Created page with &quot;&lt;pre&gt; - Come mostrare che un algoritmo soffre dell'anomalia di Belady Creando una stringa di riferimenti tale che l'algoritmo generi piu' page fault aumentando il numero di fr...&quot;</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Risposte_a_studenti_giugno_2016&amp;diff=1368&amp;oldid=prev"/>
		<updated>2016-06-14T10:00:28Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt; - Come mostrare che un algoritmo soffre dell&amp;#039;anomalia di Belady Creando una stringa di riferimenti tale che l&amp;#039;algoritmo generi piu&amp;#039; page fault aumentando il numero di fr...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
- Come mostrare che un algoritmo soffre dell'anomalia di Belady&lt;br /&gt;
Creando una stringa di riferimenti tale che l'algoritmo generi piu' page&lt;br /&gt;
fault aumentando il numero di frame.&lt;br /&gt;
&lt;br /&gt;
- Come capire, in generale, se un algoritmo sia o no a stack; =&lt;br /&gt;
risoluzione dell'esercizio &amp;quot;Dato t=3Dtimetick() il numero di tick dalla =&lt;br /&gt;
accensione della macchina sia detto f=3Dt%NF (NF numero di frame =&lt;br /&gt;
disponibili). Qualora sia necessario liberare un frame, si decide di =&lt;br /&gt;
eliminare la pagina nel frame f. =C8 un algoritmo a stack?&amp;quot;&lt;br /&gt;
---------&lt;br /&gt;
Questo algoritmo non e' a stack. &lt;br /&gt;
t:       01234&lt;br /&gt;
stringa: 12334&lt;br /&gt;
Con 2 frame:&lt;br /&gt;
frame 0: 11334&lt;br /&gt;
frame 1:  2222&lt;br /&gt;
Con 3 frame:&lt;br /&gt;
frame 0: 11111&lt;br /&gt;
frame 1:  2224&lt;br /&gt;
frame 2:   333&lt;br /&gt;
come vede la pagina 2 e' presente nella memoria a 2 frame e non a 3.&lt;br /&gt;
Per mostrare che un algoritmo *non* e' a stack occorre trovare un esempio&lt;br /&gt;
che faccia divergere il comportamento aumentando il numero di frame.&lt;br /&gt;
&lt;br /&gt;
- Esiste un qualche metodo per risolvere esercizi del tipo &amp;quot;Mostrare un =&lt;br /&gt;
semplice caso nel quale gli algoritmi LRU e MIN abbiano lo stesso numero =&lt;br /&gt;
di page fault&amp;quot; o ancora &amp;quot;Mostrare un esempio nel quale MRU compia meno =&lt;br /&gt;
page fault di LRU&amp;quot;, o devo andare a tentativi?&lt;br /&gt;
--------&lt;br /&gt;
No. Non sono tentativi. Occorre analizzare come funzionano gli algoritmi&lt;br /&gt;
in questione e trovare il modo di &amp;quot;pilotarli&amp;quot; alla soluzione voluta.&lt;br /&gt;
Esempi, non tentativi, possono aiutare a capire il funzionamento.&lt;br /&gt;
&lt;br /&gt;
- Nello scheduling per CPU a time slice a priorit=E0, nel caso la =&lt;br /&gt;
priorit=E0 sia la stessa, il processo lo scelgo random o scelgo quello =&lt;br /&gt;
&amp;quot;a indice minore&amp;quot; (ex.fra P1 e P2 scegliere P1)&lt;br /&gt;
--------&lt;br /&gt;
Comunque il comportamento di uno scheduler (o di un qualsiasi altro&lt;br /&gt;
algritmo) non sia determinato, occorre fare scelte plausibili, coerenti&lt;br /&gt;
per tutto lo svolgimento dell'esercizio. Possibilmente occorre esplicitare&lt;br /&gt;
la scelta fatta, per rendere piu' semplice la correzione.&lt;br /&gt;
&lt;br /&gt;
-Non ho chiaro cosa sia il &amp;quot;consetto di localit=E0&amp;quot;&lt;br /&gt;
--------&lt;br /&gt;
Assomiglia in Informatica del concetto Fisico dell'inerzia.&lt;br /&gt;
Un algoritmo molto probailmente nel prox futuro si comportera' come nel&lt;br /&gt;
prossimo passato. Quindi tendera' (molto probabilemnte) ad accedere a&lt;br /&gt;
locazioni di memoria prossime a quelle usate in precedenza.&lt;br /&gt;
Non e' un dogma, ma nell'uso generale e' una proprieta' che statisticamente&lt;br /&gt;
e' spesso verificata.&lt;br /&gt;
Quindi operare per rendere efficiente il caso piu' frequente crea sistemi&lt;br /&gt;
piu' performanti.&lt;br /&gt;
Il principio di localita' rende possibile l'uso di cache o di memoria&lt;br /&gt;
virtuale.&lt;br /&gt;
&lt;br /&gt;
- Avrei bisogno dello svolgimento dell'esercizio &amp;quot;Sia dato uno scheduler =&lt;br /&gt;
preemptive di tipo Shortest Remaining Time First con valore alfa=3D1/2 e =&lt;br /&gt;
valore iniziale T0=3D0 per ogni processo. Sia data la storia esecutiva =&lt;br /&gt;
dei processi: [ P1: 2ms CPU, 5ms IO un 2, 2ms CPU, 5ms IO un 1, 3ms CPU =&lt;br /&gt;
] [ P2: 4ms CPU, 5ms IO un 1, 4ms CPU, 5ms IO un 2, 3ms CPU ] [ P3: 5ms =&lt;br /&gt;
CPU, 5ms IO un 1, 6ms CPU, 5ms IO un 2, 3ms CPU ] [ P4: 3ms CPU, 5ms IO =&lt;br /&gt;
un 2, 3ms CPU, 5ms IO un 1, 4ms CPU ]; Mostrare diagramma di Gannt e =&lt;br /&gt;
calcolare il tempo totale di esecuzione &amp;quot;.&lt;br /&gt;
----------&lt;br /&gt;
Lo scheduler deve ad ogni esecuzione stimare tramite la media&lt;br /&gt;
esponenziale la lunghezza del prossimo CPU burst.&lt;br /&gt;
Questo consentira' di determinare lo &amp;quot;shortest time&amp;quot;.&lt;br /&gt;
In piu' questo esercizio chiede di applicare l'algoritmo in modo&lt;br /&gt;
pre-emptive: cioe' se il processo corrente viene interrotto da &lt;br /&gt;
un interrupt che rende ready un nuovo processo occorre confrontare il&lt;br /&gt;
tempo rimasto (lunghezza del burst calcolata - tempo usato dal processo&lt;br /&gt;
interrotto prima dell'interrupt) e la lunghezza del CPU burst del processo&lt;br /&gt;
diventato ready. CHi ha il burst piu' breve, vince.&lt;br /&gt;
&lt;br /&gt;
- Avrei bisogno dello svolgimento dell'esercizio &amp;quot;Sia dato l'algoritmo =&lt;br /&gt;
di rimpiazzamento MINNUM. Come pagina da rimpiazzare MINNUM sceglie =&lt;br /&gt;
sempre quella con=20&lt;br /&gt;
l'indirizzo logico piu' basso (numero di pagina minore).&lt;br /&gt;
a. mostrare una stringa di riferimenti di lunghezza infinita e che =&lt;br /&gt;
generi infiniti page fault tale che MIN e MINNUM si comportino=20&lt;br /&gt;
esattamente nello stesso modo&lt;br /&gt;
b. mostrare una stringa di riferimenti di lunghezza infinita tale che =&lt;br /&gt;
MINNUM generi un page fault ad ogni accesso in memoria mentre=20&lt;br /&gt;
MIN generi un numero finito di page fault&lt;br /&gt;
(in entrambi i punti l'insieme delle pagine utilizzate nelle stringhe di =&lt;br /&gt;
riferimenti deve essere finito&amp;quot;&lt;br /&gt;
-----------&lt;br /&gt;
Vale quanto detto sopra per gli algoritmi di rimpiazzamento.&lt;br /&gt;
Per il punto a. occorre trovare il modo per farli convergere, per fare in&lt;br /&gt;
modo che si comportino nello stesso modo. QUindi quando avviene il&lt;br /&gt;
page-fault MIN e MINNUM devono individuare la stessa pagina.&lt;br /&gt;
mi pare per esempio che la stringa 341342341341 (per sempre) con 3 frame,&lt;br /&gt;
generi il caso voluto (1 e 2 si scambiano nell'uso del terzo frame&lt;br /&gt;
perche' sono minori di 3 e 4 (MINNUM) e perche' vengono sempre acceduti&lt;br /&gt;
prima di 1 o 2 (MIN).&lt;br /&gt;
Per il secondo caso: 34(12), cioe' 34121212121212 per sempre, con 3 frame&lt;br /&gt;
fa infiniti page fault con MINNUM e soli 3 page fault con MIN.&lt;br /&gt;
&lt;br /&gt;
- Avrei bisogno dello svolgimento dell'esercizio &amp;quot; Si consideri un =&lt;br /&gt;
i-node che contenga 7 indici diretti, 1 indice indiretto, uno a =&lt;br /&gt;
indirezione doppia e uno a=20&lt;br /&gt;
indirezione tripla.=20&lt;br /&gt;
Se la dimensione dei blocchi =E8 1KB e gli indirizzi di blocco sono a 32 =&lt;br /&gt;
bit,=20&lt;br /&gt;
a) qual =E8 la dimensione massima di un file?=20&lt;br /&gt;
b) Oltre all'inode, quanti blocchi devono essere acceduti per leggere un =&lt;br /&gt;
byte nel blocco 100000?=20&lt;br /&gt;
In entrambi i casi, la risposta non deve essere limitata al valore =&lt;br /&gt;
numerico, ma deve illustrare il ragionamento &amp;quot;&lt;br /&gt;
------&lt;br /&gt;
Questo ricordo bene di averlo svolto a lezione.&lt;br /&gt;
Occorre calcolare quanti indici stanno in un blocco. Se l'indice e' 32 bit&lt;br /&gt;
i.e. 4 byte, ci stanno 256 indici per blocco.&lt;br /&gt;
Al massimo un file sara' foramto da 7 blocchi dati acceduti direttamente +&lt;br /&gt;
256 acceduti con il blocco indiretto, 256* 256 con quello doppiamente&lt;br /&gt;
indiretto etc).&lt;br /&gt;
Dato il numero di blocchi, la lunghezza in byte si ottiene moltiplicando&lt;br /&gt;
per la lunghezza del blocco.&lt;br /&gt;
per b occorre far vedere di aver compreso l'allocazione indiretta.&lt;br /&gt;
(100000 / 1024 e' un numero &amp;gt; 7 ma non di 256. 256 * 1024 e' piu' di&lt;br /&gt;
256000. Basta un solo blocco indiretto? a voi l'ardua sentenza).&lt;br /&gt;
&lt;br /&gt;
- Avrei bisogno dello svolgimento dell'esercizio &amp;quot; Si considerino le =&lt;br /&gt;
seguenti funzioni atomiche foo e bar e si verifichi se e' possibile =&lt;br /&gt;
usarle (o meno) al&lt;br /&gt;
posto della test&amp;amp;set per il supporto di sezioni critiche (i parametri =&lt;br /&gt;
sono passati per indirizzo):&lt;br /&gt;
2a) foo(x,y) =3D &amp;lt;x1=3Dx*2, y1=3Dy/2, x=3Dy1, y=3Dx1&amp;gt; (con x, y interi)&lt;br /&gt;
2b) bar(x,y) =3D &amp;lt;x =3D y&lt;br /&gt;
x&lt;br /&gt;
, y=3Dabs(floatrand())+1&amp;gt; (con x,y reali, floatrand genera un numero =&lt;br /&gt;
random in tutto il dominio&lt;br /&gt;
dei reali, abs e' la funzione valore assoluto&amp;quot;&lt;br /&gt;
-------------&lt;br /&gt;
Qui la tecnica e' vedere di creare un protocollo di entrata che consenta:&lt;br /&gt;
* di accedere a variabili condivise *solo* tramite la funzione atomica&lt;br /&gt;
fornita.&lt;br /&gt;
* di modificare le variabili condivise in modo che assumanoo valori che&lt;br /&gt;
indichino la critical section &amp;quot;occupata&amp;quot; &lt;br /&gt;
* esaminando solo variabili locali si possa stabilire se la CS fosse&lt;br /&gt;
libera o occupata prima della chiamata della funzione atomica.&lt;br /&gt;
&lt;br /&gt;
la foo, dati i valori di x e y prima della chiamata di foo, assegna a&lt;br /&gt;
y il doppio del vecchio valore di x e a y la meta' del vecchio valore di x.&lt;br /&gt;
Questo ha l'aria di rendere possibile la creazione di critical section.&lt;br /&gt;
&lt;br /&gt;
Se assegniamo alla variabile locale L il valore 1 e chiamiamo&lt;br /&gt;
foo(G,L) G varra' 0.5 (o 0 se i numeri sono interi), mentre ad L sara'&lt;br /&gt;
assegnato il doppio del valore di G (prima della foo).&lt;br /&gt;
&lt;br /&gt;
QUindi se G valeva 0.5 o 0 sara' sempre un valore &amp;lt; 2.&lt;br /&gt;
&lt;br /&gt;
Allora poniamo G=1 per indicare la CS &amp;quot;libera&amp;quot;.&lt;br /&gt;
Il primo che chiama la foo riceve L == 2, tutti gli altri &amp;lt; 2&lt;br /&gt;
&lt;br /&gt;
quindi il protocollo e':&lt;br /&gt;
&lt;br /&gt;
CSIN:&lt;br /&gt;
        do {&lt;br /&gt;
                L=1;&lt;br /&gt;
                foo(G,L)&lt;br /&gt;
        while (L&amp;lt;2);&lt;br /&gt;
&lt;br /&gt;
CSOUT:&lt;br /&gt;
        G=1&lt;br /&gt;
&lt;br /&gt;
Per il secondo 2b:&lt;br /&gt;
abs(floatrand()) genera un numero NON NEGATIVO.&lt;br /&gt;
basta scegliere un valore negativo per indicare la CS libera, solo il primo&lt;br /&gt;
che chiama la bar otterra' un valore negativo.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Renzo</name></author>
	</entry>
</feed>