Esercitazione di ripasso
Es 1
Float matrix [2][2];
Float avg_value Sem_t sum_finished
Pthread_mutex_initializer sum_mutex Void * compute_avg(void * arg){
Int row = int Arg;
Int Col;
For (Col=0;col<5;col++) { Mutex_lock
Avg_val = Avg_val + matrix [Row][Col];
Mutex_uno();
}
Return NULL;
Compute_AVG { Int Row;
For (Row=0; Row<Rows,Row++) Wait (Sum mutex);
Avg_value = Avg_value / (Rows * cols), Return NULL;
} Main {
Init semaphores
For (Row = 0; Row < Rows; Row ++) {
Pthread_create ( ... & compute_sum, (Void *) Row), }
Pthread create (……….. & compute_avg, NULL);
For (…..)
Pthread_Join (Threads compute_sum) Pthread_join (compute_avg)
Es 2 (TDE 8/5/08)
Main () {
Fd=open (……… ,O_RDWR);
Pid1=fork();
If (pid1= =0) {
Write(FD,C,5000);
Exit(1);
} Else {
Pid2=Fork();
If (Pid2==0) { execl(________);
exit(2);
} Else {
Pid = Waitpid (Pid1,&status);
Seek(FD,OL,0);
Read(FD,C,2000);
Exit (0);
} } }
// Processo eseguito da exec: read(0,&temp,1); exit(3);
R > Q > P > IDLE DMA Block = 512
Evento Info Kernel Modules Contesto Stato P Stato Q Stato R
P: OPEN DMA INIT G_SVC_1 P Wait (E1) X X
OPEN P
SLEEP_ON_(E1)_1 P CHANGE P -> IDLE
G_SVC_2/3 IDLE
IDLE: 4 INT DMA RINT(DMA_IN)_1 IDLE Exec U X X
WAKE_UP (E1) IDLE CHANGE IDLE -> P SLEEP_ON_(E1)_2 P
OPEN P
G_SVC_2/3 P
P: FORK Fine
quanto P
G_SVC_1 P Ready Exec X
FORK P
G_SVC_2 P
PREEMPT_1 P
CHANGE P->Q
G_SVC_2/3 Q
Q: WRITE INIT DMA G_SVC_1 Q Exec (U) Wait (E1) X
WRITE Q
SLEEP_ON(E2)_1 Q CHANGE Q -> P
PREEMPT_2 P
G_SVC_3 P
P: FORK P NON HA FINITO IL QUANTO
G_SVC_1 P Exec Wait (E2) Ready
FORK P
G_SVC_2/3 P
P: 10 INT DMA R_INT(DMA)_1 P Exec Ready Ready
WAKE_UP(E2) P
R_INT(DMA)_2/3 P
P: CLOCK INT R_INT(CK)_1 P Ready Ready Exec
PREEMPT_1 P
CHANGE P -> R
G_SVC_2/3 R
SLEEP_ON(E2) Q
WRITE Q
G_SVC_2/3 Q
Q CLK R_INT(CLK)_1 Q Exec Ready X
PREEMPT_1 Q
CHANGE Q -> P
PREEMPT_2 P
R_INT(CLK)_2 P
P WAITPID G_SVC_1 P Wait (E3) Exec X
WAITPID P
SLEEP_ON(E3) P
CHANGE P->Q
PREEMPT_2 Q
R_INT(CLK)_2 Q
Q: EXIT G_SVC_1 Q Exec X X
EXIT_1 Q
WAKE_UP(E3) Q
EXIT_2 Q->P
SLEEP_ON(E3) P
G_SVC_2/3 P
Es 3 (tde 17/11/09)
Phy = 32 K 15 bit Log = 32 k 15 bit Page size = 4k 12 bit
Phy: NP 3, Offset 12 Vrt: NP 3, Offset 12
X Y
0 Cx0 Cy0 1 Cx1 Cy1 2 Dx0 Cy2
3 Dy0
4 Dy1
5 6
7 Px0 Py0
Phy
Address Content 0
1 2 3 4 5 6 7
MMU
Address NPV NPF Val
0 1 2 3 4 5 6
Entry point X –> 0x1122
1 1 2 2
Page
Siamo in pagina 1 (2° pagina) In pagina 1 si va da 0x000 a 0x7FFF Phy
Address Content
0 CP1
1 PP0
2 DP0
3 PQ0
4 5 6 7
MMU
Proc NPV NPF Val
P 1 / CP1 0 1
P 7 / PP0 1 1
P 2 / DP0 2 1
Q 7 / PQ0 3 1
Q 1 / CQ1 0 1
Q 2 / DQ0 2 1
Data codice 0x4BBB, devo espandere la zona dati.
X Y
0 Cx0 Cy0 1 Cx1 Cy1 2 Dx0 Cy2 3 Dp1 Dy0 4 Dp2 Dy1 5
6
7 Px0 Py0
Address Content
0 CP1
1 PP0
2 DP0
3 PQ0
4 DP1
5 DP2
6 7
Proc NPV NPF Val
P 1 / CP1 0 1
P 7 / PP0 1 1
P DP2 / 4 5 1
Q 7 / PQ0 3 1
Q 1 / CQ1 0 1
Q 2 / DQ0 2 1
P 3 / DP1 4 1
Address Content 0 CP1 = (CQ1)
1 PP0
2 DP0
3 (PQ0) / CQ(Y)0
4 DP1
5 DP2
6 PQ(Y)0
7
Proc NPV NPF Val
P 1 / CP1 0 1
P 7 / PP0 1 1
P DP2 / 4 5 1
Q 0 / CQ(Y) 3 0
Q 7 / PQ(Y) 6 1
Q 2 / DQ0 2 1
P 3 / DP1 4 1