Esercizio. Dato un file la cui corrispondenza tra blocchi logici e fisici sia espressa dalla seguente tabella:
blocco logico 0 1 2 19 20 21 22 23 24 25 26 27
blocco fisico 77 78 80 60 61 109 110 111 112 113 114 115
dire il contenuto del record MFT nel file system NTFS che lo descrive.
A parte le informazioni iniziali dell’MFT record:
record header, stardard info header, standard
info, file name header, file name
i blocchi del file sono descritti nel modo seguente:
(0,3),(77,2),(80,1),(19,9),(60,2),(109,7)
Esercizio . Determinare il numero di accessi al disco necessari in un sistema unix per accedere al terzo blocco dei seguenti files:
a)../../etc/passwd
b)/././home/pippo
c)../pippo/vecchi/foto.jpg
nell'ipotesi che la directory attuale sia /home/caio, che ogni directory occupi al massimo un blocco, e che nessuna directory né i-node sia caricato in memoria. Motivare la risposta.
Soluzione
Siccome nessun i-node né directory è caricato in memoria occorre caricare l’i-node e la directory attuale, quindi servono 6 accessi (nell’ipotesi che l’i.node della root sia noto) per accedere al contenuto di /home/caio.
1) Per ogni cambio di directory è necessario leggere l’i-nodo e il contenuto, siccomegli i-node e il contenuto della root, di home e di caio sono già caricati in memoria, bisogna solo caricare l’i-node e il contenuto di etc e quindi leggere direttamente il 3’ blocco di passwd. Quindi in totale per accedere a ../../etc/passwd servono 10 accessi al disco.
2) in questo caso accedere alla directory caio è inutile dato che si tratta di un path assoluto, inoltre accedere alla directory . non necessita di ulteriori accessi dato che si tratta della directory corrente che è già caricata. Quindi il numero di accessi è 6.
3) Come per il caso 1) il numero di accessi è 10
Esercizio. Si consideri la seguente soluzione del problema dei filosofi a cena:
#define N 5
semaphore mutex=1;
semaphore fork[N] = {1,...,1};
void philosopher(int i)
{
while(TRUE) {
think();
down(mutex);
down(fork[i]);
down(fork[(i+1)%N]);
up(mutex);
eat();
down(mutex);
up(fork[i]);
up(fork[(i+1)%N];
up(mutex);
}
}
La soluzione proposta è corretta? In caso affermativo discuterne l‘efficienza, in caso negativo spiegare il motivo.
Soluzione :
La soluzione è sbagliata, infatti può provocare deadlock. Infatti, nel caso il filosofo i trovi il bastoncino i o il bastoncino (i+1)%N occupati si sospende all’interno della mutua esclusione. In questo modo impedirà ad altri filosofi di entrare in mutua esclusione per acquisire o cedere i bastoncini, bloccando così tutti gli altri filosofi.