Istruzioni
Scrivere solo sui fogli distribuiti. Non separare questi fogli.
È vietato portare all’esame libri, eserciziari, appunti, calcolatrici e telefoni cellulari. Chiunque fosse trovato in
possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte
– vedrà annullata la propria prova.
Non è possibile lasciare l’aula conservando il tema della prova in corso.
Tempo a disposizione: 1h:30m (una parte) 3h:00m (completo).
punteggio
approssimativo I parte II parte completo
esercizio 1 6
esercizio 2 6
esercizio 3 4
esercizio 4 5
esercizio 5 5
esercizio 6 6
voto finale
/∗ funzione flip ∗/
int flip (int ∗ i) {
/∗ variabili locali ∗/
int count, temp
/∗ parte esecutiva ∗/
for (count = 1; count <= DIM; count++) {
temp = vect [count – 1]
vect [DIM – count] = temp
if (temp == val) break /∗ for loop truncation ∗/
} /∗ end for ∗/
return count
} /∗ flip ∗/
contenuto spiazzamento
indirizzo
simbolico rispetto a gp
indirizzi alti
spiazz. rispetto
contenuto simbolico
a stack pointer
indirizzi alti
indirizzi bassi
Qual è il valore dell’argomento della funzione FLIP al momento della chiamata in MAIN ?
punto 4 – codice MIPS di FLIP - solo blocco nel riquadro (num. righe non signif.)
.data .data
VETT: .space 40 X: .word 5
BYTE: .space 4 .text
COPY: .space 4 .globl SUBMOD
.text SUBMOD: lw $t3, COPY
.globl MAIN lw $t4, VETT
MAIN: j SUBMOD LOOP: sub $t4, $t4, $t3
lw $t1, VETT bne $t4, $0, LOOP
sb $t1, BYTE sw $t4, X
li $t0, VETT SMEND: beq $0, $0, MAIN
sw $t0, COPY
addi $t0, $0, 1
MEND: syscall
Si noti che “li” è una pseudo-istruzione, da espandere in istruzioni macchina native, come noto.
testo testo
dati dati
contenuto
indirizzo codice assemblatore registro
iniziale
0x 0000 0880 beq $t2, $t1, 64 $t0 0x000F C422
sw $t2, 0x0080($t1) $t1 0x0C04 08C0
lw $t1, 0xAAA0($t2) $t2 0x0C04 50CA
add $t2, $t2, $t1
memoria dati
indirizzo parola
0x001F C4CC 0xAAAA 2001
0x0040 08A0 0xFFFF AAAA
0x0C04 0940 0xFEEE CCCC
0x0C04 FB6A 0x0000 A000
0x0C04 FE0C 0x3333 CCCC
A. Calcolare il valore del registro $t2, mostrando i valori utilizzati per il calcolo, al termine dell’esecuzione
della sequenza di istruzioni sopra riportata nel caso di esecuzione su processore:
B. Si faccia riferimento a un processore pipeline senza gestione dei conflitti di dato e di con-
trollo e allo schema “processore pipeline e formato dei registri interstadio”
Si consideri il ciclo di clock in cui l’esecuzione delle istruzioni nei vari stadi è la seguente:
*****************
.WB.RegWrite .WB.RegWrite .WB.RegWrite
*****************
.M.MemWrite .M.MemWrite
.M.MemRead .M.MemRead
.M.Branch .M.Branch
****************
.istruzione .(Rs)
.(Rt) .(Rt)
.Rt .R .R
*****************
.Rd
**************** *****************
.EX.ALUSrc .Zero .DatoLetto
*****************
.EX.RegDest
segnali relativi al RF (subito prima del fronte di DISCESA interno al ciclo di clock)
RF.RegLettura1 RF.RegScrittura RF.DatoLetto1
****************** ****************** ******************
RF.RegLettura2 RF.DatodaScrivere RF.DatoLetto2
****************** ****************** ******************
segnali di altre unità funzionali (subito prima del fronte di SALITA del clock)
Mem.indirizzo RegWrite
MemWrite RegDest
MemtoReg
1. sw $t2, 0x0080($t1)
2. lw $t1, 0xAAA0($t2)
3. add $t2, $t2, $t1
ciclo di clock
1 2 3 4 5 6 7 8 9 10 11 12 13
Si risponda alle domande seguenti, facendo l’ipotesi che la pipeline abbia esclusivamente dei cammini di
propagazione EX/EX e MEM/EX:
a) si riportino in tabella 1 – prime tre colonne – le dipendenze di dato che risultano essere conflitti
b) si disegni in Tabella 2 il diagramma temporale della pipeline, mettendo in evidenza gli eventuali cam-
mini di propagazione che possono essere attivati per risolvere i conflitti, e gli stalli eventualmente da in-
serire affinché la propagazione sia efficace
c) si indichino in Tabella 1 – ultima colonna – i cammini di propagazione effettivamente attivati e gli
stalli associati
Tabella 1 (numero di righe non significativo)
istruzione registro cammino di propagazione
istruzione
da cui dipende coinvolto e stalli
Tabella 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1
2
3
Sia dato il circuito sequenziale composto da due bistabili master-slave di tipo D (D1, Q1 e D2, Q2 dove D è
l’ingresso del bistabile e Q è lo stato / uscita del bistabile), con un ingresso I, e una uscita U, descritto
dalle equazioni logiche seguenti:
D1 = I !Q1 + I Q2 U = Q1 Q2
D2 = I Q1 + I Q2
Si chiede di completare il diagramma temporale riportato qui sotto. Si noti che:
• si devono trascurare completamente i ritardi di propagazione delle porte logiche AND, OR e NOT, e i ri-
tardi di commutazione dei bistabili
• il bistabile è il tipo master-slave la cui struttura è stata trattata a lezione, con uscita che commuta sul
fronte di discesa del clock
I 0
D1
Q1 0
D2
Q2 0
U
CLK
Dimostrare coi teoremi della logica, che avremmo anche potuto definire D2 in questo altro modo equivalente:
(il numero delle righe non è significativo.)
void main ( ) {
pthread_t th_0, th_1, th_2
sem_init (&old, 0, 0)
pthread_create (&th_1, NULL, ten, NULL)
sem_post (&old)
pthread_create (&th_0, NULL, zero, NULL)
pthread_create (&th_2, NULL, ten, NULL)
pthread_join (th_0, NULL)
pthread_join (th_1, NULL) /∗ statement D ∗/
pthread_join (th_2, NULL)
return
} /∗ end main ∗/
variabile locale
condizione
finish in th_0 finish in th_1
Si completi la tabella qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante
di tempo specificato da ciascuna condizione. Il valore della variabile va indicato così:
• intero, carattere, stringa, quando la variabile ha un valore definito; X quando è indefinita
• se la variabile può avere due o più valori, li si riporti tutti quanti
• il semaforo può avere valore positivo o nullo (non valore negativo)
Si badi bene alla colonna “condizione”: con “subito dopo statement X” si chiede il valore (o i valori) che la
variabile ha tra lo statement X e lo statement immediatamente successivo del thread indicato.
variabili globali
condizione
old global
Questo sistema NON PUÒ ANDARE IN STALLO. Nel riquadro sotto, si spieghi brevemente il motivo:
0 1 2 3
4 5 6 7
swap file
liste LRU
attivazioni active inactive
finale
0 1 2 3
4 5 6 7
swap file
0 1 2 3
4 5 6 7
swap file
liste LRU
attivazioni active inactive
dopo
domanda 2
dopo
domanda 3
0 1 2 3
4 5 6 7
swap file
// programma prog_x.c
pthread_mutex_t GATE = PTHREAD_MUTEX_INITIALIZER
sem_t GO
void ∗ ONE (void ∗ arg) { void ∗ TWO (void ∗ arg) {
sem_wait (&GO) pthread_mutex_lock (&GATE)
pthread_mutex_lock (&GATE) sem_post (&GO)
sem_post (&GO) pthread_mutex_unlock (&GATE)
pthread_mutex_unlock (&GATE) sem_wait (&GO)
sem_wait (&GO) sem_post (&GO)
return NULL return NULL
} /∗ FIRST ∗/ } /∗ LAST ∗/
main ( ) { // codice eseguito da S e Q
pthread_t TH_1, TH_2
sem_init (&GO, 0, 0)
pthread_create (&TH_1, NULL, ONE, NULL)
pthread_create (&TH_2, NULL, TWO, NULL)
pthread_join (TH_2, NULL)
pthread_join (TH_1, NULL)
exit (1)
} /∗ main ∗/
evento/processo-chiamata TGID 1 2 3
10
interrupt da RT_clock,
scadenza quanto di 20
tempo
40
50
25 interrupt da stdout,
60
scritti solo 25 caratteri
70
80
90
100
W piena
piena
ubase_Q piena
uStack_Q
sbase_Q
sStack_Q
W piena
piena
ubase_Q piena
uStack_Q
sbase_Q
sStack_Q