CAPITOLO 2 Soluzioni agli esercizi del libro: 2) 6 3) Utilizzando i simboli 0, 1 e 2 e considerando che sono necessarie 2 cifre per rappresentare 9 possibilità, è possibile ad esempio la codifica (00-lunedì), (01-martedì), (02-mercoledì), (10- giovedì), (11-venerdì), (12-sabato), (20-domenica) 4) 10001011, 1000.01 5) 12011, 22112 6) 00010011, 11011010 7) 10101 + 1101 = 100010; 100011 10010 = 10001; 10000001 + 10000011 = 00000100 con overflow 11) Si consideri che 2^10 = 1024 e 2^20 = (2^10)^2 = 1024^2 = 1048576 e che 2^4 = 16 < 20 < 2^5 =32. Per rappresentare in binario 20 milioni di valori è quindi sufficiente utilizzare 5 + 20 = 25 bit. Poiché ad ogni cifra esadecimale corrispondono 4 bit (2^4 = 16) ne consegue che sono sufficienti sequenze di 7 cifre esadecimali (25 / 4 = 6.25 da arrotondare a 7) 12) 73; 1001001; 16781313 13) 00100011 + 00010010 = 00110101; 00100011-00010010 = 00010001; 01100101 + 00110011 = 10011000 con overflow; 01100101-00110011 = 00110010 15) Complemento a 2 binario (a) 0 1011 1111, 10 0111 1101; (b) 0000 0000 1011 1111, 1111 1110 0111 1101. Complemento a 2 ottale: (a) 277, 7175; (b) 000277, 777175. Complemento a 2 esadecimale (a) 0BF, E7D; (b) 00BF, FE7D
CAPITOLO 3 Soluzioni agli esercizi del libro: 4) Una soluzione possibile è basata sull utilizzo della notazione unaria per i numeri, che prevede di rappresentare un numero con una sequenza di simboli uguali (ad esempio il simbolo 1) lunga quanto il numero. I due addendi siano scritti di seguito sul nastro, separati da una loczione vuota (denotata dal simbolo 0). La macchina, a partire dalla prima locazione del nastro che verrà cancellata, scorrerà il nastro fino alla locazione vuota di separazione, che sarà sovrascritta con un 1. A questo punto la macchina tornerà indietro sul nastro fino alla prima locazione vuota per poi arrestarsi sulla locazione precedente alla prima locazione che contiene il risultato (anche esso rappresentato nella stessa notazione). Stato Letto Vai a Scrivi Sposta S0 1 S1 * Destra S1 1 S1 1 Destra S1 * S2 1 Sinistra S2 1 S2 1 Sinistra 12) a) c) leggi N leggi Dividendo leggi Divisore Risultato <- 0 Resto <- 0 i <- 1 i < n Resto <- Resto + i-esima cifra del dividendo i > numero cifre dividendo leggi v[i] Resto >= Divisore i <- i+1 j <- 1 stampa Risultato stampa Resto b) Resto >= j*divisore j <- j + 1 leggi N Risultato <- Risultato*10 + j carica N valori in v[ ] usando a) Resto <- Resto j*divisore
d) m: lunghezza nota del vettore v[ ] f) n, m: dimensioni note della matrice M[ ][ ] Somma <- 0 Cont <- 0 j <- 0 Cont <- 0 i < m j < n scrivi Cont scrivi Somma scrivi Cont v[i] 2*[v[i]/2] = 0 applica d) alla j-esima riga di M[ ][ ] Cont <- Cont + 1 Somma <- Somma + v[i] Cont <- Cont + risultato del passo precedente j <- j + 1 e) n, m: dimensioni note della matrice M[ ][ ] g) n, m: dimensioni note della matrice M[ ][ ] Cont <- 0 leggi C1 leggi C2 i < n scrivi Cont i < n j <- 0 temp <- M[i][C1] M[i][C1] <- M[i][C2] M[i][C2] <- Temp j < m j <- j + 1 j < m Cont <- Cont + 1
13) Le due espressioni sono equivalenti: si può partire dalla seconda espressione e considerare che!a c!a!b c +!a b c. Si ottiene!a c +!a!b!c + a b c!a!b c +!a b c +!a!b!c + a b c. Si può raccogliere il primo con il terzo termine e il secondo con il quarto. Si ottiene!a!b c +!a!b!c +!a b c + a b c!a!b (c +!c) + b c (!a + a)!a!b + b c. In alternativa, ragionando in forma tabellare si ha: a b c!a!b bc!a!b+bc!ac!a!b!c abc!ac+!a!b!c+abc F F F T F T F T F T F F T T F T T F F T F T F F F F F F F F F T T F T T T F F T T F F F F F F F F F T F T F F F F F F F T T F F F F F F F F T T T F T T F F T T 14, 15, 16 e 17) 14) Si ipotizzi per semplicità almeno un valore valido 15) Si ipotizzi per semplicità almeno un valore valido leggi Min leggi N leggi N Somma <- N Max <- N Min <- N i <- 1 N <= 0 leggi N stampa Min N < Min N <= 0 stampa Min stampa Max stampa Somma/i Min <- N N > Max Max <- N N < Min Min <- N Somma <- Somma + N
16) Si ipotizzi per semplicità N >= 1 leggi N i < N stampa Min stampa Max stampa Somma/N leggi x i = 0 Somma = x Min = x Max = x Somma <- Somma + x x > Max Max <- x x < Min Min <- x
17) leggi Giorno Giorno <= 0 stampa errore leggi Mese Mese = 1 Prec <- 0 Ultimo <- 31 Mese <= 0 Mese = 2 Prec <- 31 Ultimo <- 28 + Bisestile Mese > 12 Mese = 3 Prec <- 59 Ultimo <- 31 Giorno > Ultimo leggi Anno Anno <= 0 Mese = 4 Mese = 5 Prec <- 90 Ultimo <- 30 Prec <- 120 Ultimo <- 31 stampa Prec + Giorno Anno divisibile per 400 Mese = 6 Prec <- 151 Ultimo <- 30 Anno divisibile per 4 Mese = 7 Prec <- 181 Ultimo <- 31 Anno divisibile per 100 Mese = 8 Prec <- 212 Ultimo <- 31 Bisestile <- 1 Bisestile <- 0 Mese = 9 Prec <- 243 Ultimo <- 30 Mese = 10 Prec <- 273 Ultimo <- 31 Mese = 11 Prec <- 304 Ultimo <- 30 Prec <- 334 Ultimo <- 30 Una soluzione migliore si ottiene impiegando un vettore che per ogni mese memorizza le informazioni relative (Prec e Ultimo): in tal caso la parte destra del diagramma (in cui si valuta il mese e si impostano Prec e Ultimo) si riduce a un solo blocco azione che lavora sul vettore.
18) E sufficiente mettere in OR i termini AND della tabella a cui corrisponde un valore V:!a!b!c +!a!bc + ab!c + abc. Si noti che i quattro termini differiscono a coppie per una variabile (presente in forma negata e affermata): pertanto tale variabile non influisce sul risultato e l espressione si semplifica in!a!b + ab.
CAPITOLO 4 srl Soluzioni agli esercizi del libro: 8) Problema 1.1 Dati x, y, d interi Risoluzione leggi a e b d <- a b se d > 0 allora scrivi max è x altrimenti scrivi max è y se Problema 1.3 Dati a, b, m interi Risoluzione leggi a e b m <- max(a,b) finchè ci sono altri numeri da esaminare ripeti leggi a m <- max(a, m) ciclo scrivi max è m Esempio 2 Dati n, ris, i interi positivi Risoluzione leggi n ris <- 0 i <-0 finchè i < n ripeti ris <- ris + i ciclo scrivi ris Problema 5.1 Dati
i, temp, v[n] interi Risoluzione finchè i < n/2 temp <- v[i] v[i] <- v[n-i-1] v[n-i-1] <- temp i <- i ciclo srl Problema 5.2 Dati s[m], v[n] simboli j, i interi Risoluzione finchè m < n- i ripeti j <- 0 finchè v[i+j] = s ripeti se j=m allora scrivi si altrimenti j <- j + 1 se ciclo ciclo scrivi no Problema 5.3 Dati l, i, temp, v[n] interi Risoluzione l <- n finchè l > 1 ripeti finchè i < l-1 ripeti se v[i] > v[i+1] allora temp <- v[i] v[i] <- v [i+1] v[i+1] <- temp se i <- i+1 ciclo l <- l - 1
ciclo srl
CAPITOLO 5 srl Soluzioni agli esercizi del libro: 8) Per ogni simbolo devono essere trasmessi 8 bit. La banda del canale permette 10kbit/secondo, quindi la sorgente può emettere simboli a una velocità massima di 10/8=1,25ksimboli/secondo. 9) Da quanto detto riguardo gli errori sul canale è sufficiente rilevare errori su un solo bit per simbolo per rilevare la maggior parte degli errori di trasmissione, risultato ottenibile con l uso di un bit di parità. Per ogni simbolo di sorgente servono quindi 9 bit (8+1) e quindi il flusso di sorgente espresso in bit che il canale deve poter sostenere è di 10 ksimboli/secondo * 9 bit/simbolo = 90 kbit/secondo. 10) Il flusso deve arrivare integro, quindi è necessario innanzi tutto rilevare gli errori e poi ritrasmettere i blocchi errati in tempo. Semplificando, assumiamo che i pacchetti ritrasmessi non siano ulteriormente affetti da errore (0,02 * 0,02 = 0,004): è necessario considerare che la sorgente deve generare il flusso più il 2% che viene ritrasmesso, mentre il canale deve trasportare il flusso, i bit di parità e il 2% di blocchi ritrasmessi comprensivi di bit di parità. Quindi la sorgente deve generare 100 kbit/secondo * 1.02 = 102 kbit/secondo e il canale deve poter trasportare (100 kbit/secondo + 100 kbit/secondo / 100 bit/blocco * 1 bit/blocco) * 1.02 = 101 kbit/secondo * 1.02 = 103.02 kbit/secondo.
CAPITOLO 6 srl Soluzioni agli esercizi del libro: 5) IR = MI[PC], PC = PC + 1; BR[SRC1] = R02, BR[SRC2] = R03, BR[DEST] = R01; ALU.OR(BR[R02], BR[R03]); BR[R01] = ALU. 6) ERRATUM: La percentuale di istruzioni del tipo A è 78%. Si consideri una sequenza di N istruzioni. Il tempo medio di esecuzione di una istruzione senza pipeline è 0.8*30 ns + 0.1*40 ns + 0.1*35 ns = 24 ns+ 4 ns + 3.5 ns = 31.5 ns; il tempo complessivo speso senza pipeline per una sequenza di N istruzioni è 31.5N. Il tempo complessivo speso per una sequenza di N istruzioni con pipeline è dato dal tempo speso per la prima istruzione più il tempo speso per le rimanenti N-1 istruzioni nel primo stadio, e quindi è 50 ns + 10*(N 1) ns = (40 + 10N) ns. Il miglioramento è dato dal tempo speso senza pipeline meno il tempo speso con la pipeline normalizzato al tempo speso senza pipeline: (31.5N 40 10N) ns / 31.5N ns = 21.5/31.5 40/31.5N = 43/63 80/63N. Il valore limite del miglioramento (N ) è 43/63 = 68.25%, quindi il miglioramento richiesto è possibile e si ottiene quando 31.5N > 3*(40 + 10N) -> 31.5N > 120 + 30N -> 1.5N > 120 -> N > 80. 8) Nel primo caso si ha TA = 0.9 * 2 + 0.1 * 20 = 1.8 + 2.0 = 3.8; nel secondo caso si ha TA = 0.8 * 2 + 0.2 * (0.8 * 4 + 0.2 * 20) = 1.6 + 0.2 * (3.2 + 4.0) = 1.6 + 1.44 = 3.04; nel terzo caso si ha TA = 0.8 * 2 + 0.2 * (x * 5 + (1 x)* 20) = 1.6 + 0.2 * (20 15x) = 5.6 3x. La seconda soluzione è migliore della prima. La terza soluzione è migliore della seconda quando 5.6 3x < 3.04, cioè 3x > 2.56, da cui x > 0.8533 (85.33%). 9) Nel primo caso si ha TA = 0.9 * 2 + 0.1 * 8 = 1.8 + 0.8 = 2.6; nel secondo caso si ha TA = 0.8 * 2 + 0.2 * (0.8 * 4 + 0.2 * 8) = 1.6 + 0.2 * (3.2 + 1.6) = 1.6 + 0.96 = 2.56; nel terzo caso si ha TA = 0.8 * 2 + 0.2 * (x * 5 + (1 x)* 8) = 1.6 + 0.2 * (8 3x) = 3.2 0.6x. La seconda soluzione è migliore della prima. La terza soluzione non può essere mai migliore della seconda perché al massimo arriva a 2.6 (quindi pari alla prima). In pratica la disequazione 3.2 0.6x < 2.56 impone che x > (3.2 2.56)/0.6 = 0.64/0.6 = 1.06, ma x non può essere maggiore di 1 (la frequenza di successo non può superare il 100%), quindi non c è nessuna possibilità che la terza soluzione sia migliore della seconda e potrà al limite (!!) essere uguale alla prima.
CAPITOLO 7 srl Soluzioni agli esercizi del libro: 5) Rimangono: 01: start (processo inizia in stato pronto) 03: termina esecuzione (modo kernel) 09: è il primo in coda e tocca a lui (contemporanea a 03 o 10 oppure 17) 10: preempt (quanto di tempo scaduto) 11: è arrivato l evento atteso (vedi 17) 13: interrupt o SVC (supervisor call) 14: RTI (ritorno da Interrupt/SVC) 17: serve qualcosa dall esterno (aspetta un evento) Eliminate: 02 04 05 06 07 08 12 15 16 18 19 20 6) P1 è stato deschedulato perché ha richiesto una operazione che richiede una risorsa esterna e quindi ha seguito il percorso (5,7); P2 era pronto e ha preso il posto di P1 in esecuzione seguendo il percorso (2,4); P3 è stato sbloccato dall arrivo dell evento esterno che attendeva ed è passato tra i processi pronti (8) 8) E necessario procedere al calcolo della dimensione degli indirizzi: le pagine sono di 512 kbyte ciascuna, quindi sono necessari 19 bit di offset; la memoria fisica è di 2 GByte, quindi sono necessari 31 bit di indirizzo fisico (di cui 12 vanno ad indicare il numero di pagina fisica e 19 l offset). Nel caso di una memoria virtuale di 1/2/4 GByte, sono necessari 30/31/32 bit di indirizzo virtuale (ovvero 11/12/13 per il numero di pagina e 19 per l offset). Le dimensioni della tabella delle pagine sono date dal numero di celle (2^bit necessari per il numero di pagine) per il numero di bit necessario a memorizzare il numero della pagina fisica corrispondente, cioè 1. per una memoria virtuale di 1 GByte: 2^11 celle 12 bit/cella = 2048 12 bit = 24576 bit 2. per una memoria virtuale di 2 GByte: 2^12 celle 12 bit/cella = 4096 12 bit = 49152 bit 3. per una memoria virtuale di 4 GByte: 2^13 celle 12 bit/cella = 8192 12 bit = 98304 bit