WAIT(&STATUS);
}
Tabella degli i-node
# I-Node Tipo Blocco
2 DIR 150
3 DIR 151
4 FILE 152
Blocco 150
# I-Node Tipo
3 ETC
7 DEVICE
14 LIB
Blocco 151
# I-Node Tipo
4 PASSWD
5 SHADOW
Blocco 12
ROOT:: ………
L’esercizio chiede di completare - File Table di P
- File Table di Q
- Tabella Globale dei aperti
File Table di P
FID File
0 Stdin
1 Stdout
2 Stderr
3 2
File Table di Q
FID File
Global File Table
I-Node Table (RAM) UID Type Block
2 DIR 150
3 DIR 151
4 FILE 152
Facciamo ora la fork: copio la tabella di P in Q. Il figlio legge tre caratteri dal buffer.
FID POSIT #PROC #INODE
0 / / /
1 / / /
2 0 -> 6 1 4
0 Stdin
1 Stdout
2 Stderr
3 2
Global File Table
I-Node Table (RAM) UID Type Block
2 DIR 150
3 DIR 151
4 FILE 152
Eseguo la seconda OPEN.
FID POSIT #PROC #INODE
0 / / /
1 / / /
2 9 2 4
File Table di P
FID File
0 Stdin
1 Stdout
2 Stderr
3 2
File Table di Q
FID File
0 Stdin
1 Stdout
2 Stderr
3 2
4 3
Global File Table
I-Node Table (RAM) UID Type Block
2 DIR 150
3 DIR 151
4 FILE 152
Con la Exit viene cancellata la tabella di Q
Al termine del programma P viene cancellata la tabella di P FID POSIT #PROC #INODE
0 / / /
1 / / /
2 9 2 4
3 0 1 4
Block 20
Block 80
Block 90
Main () {
FD_1 = OPEN (“/CAT1/ALFA”,ORDNR), READ (FD_1,BUF,5);
PID=FORK();
IF (PID = = 0) {
FD_2=OPEN(“/CAT1/CAT2/BETA”,O_RDWR);
READ(FD2,BUF,5);
PID = = FORK ();
IF (PID = = 0) {
FD_1 = OPEN (“/CAT1/GAMMA”,O_RDWR);
READ (FD_1,BUF,5) WRITE(FD_1,”GOOD”,4), EXIT (0),
}
WRITE (FD_2,”BD”,3), EXIT(42),
} EXIT(0);
}
T1 T2 T3
# INODE NAME
50 BETA
60 GAMMA
WEARE….
SHEIS…
Percorso di Gamma e contenuto a T1 /CAT1/Gamma
“She is good”.
Percorso di Beta e contenuto a T2 /CAT1/CAT2/Beta
“We are bad”.
Alfa e Beta sono lo stesso file, condividono l’i-node Alpha a T3
“We are good”
File Tables all’istante T2
Indicare con L righe liberate e NE celle che non esistono più.
File Table di P FID ref
0 Stdin 1 Stdout 2 Stderr
3 10
File Table di Q FID ref
0 Stdin 1 Stdout 2 Stderr
3 10
4 11
5 12
File Table di R FID ref
0 Stdin 1 Stdout 2 Stderr
3 10
4 11
Global File Table
FID POSIT #PROC #INODE
10 5 2 50
11 0 -> 8 1 50
12 9 -> L 1 -> 0 -> L 60 -> L
blocco è da 512)
La write deve caricare 10 blocchi del file da 512 kb l’uno.
Es 4
MAIN () {
FD = OPEN (“/MIOCAT/F”,O_RDWR), PID = FORK ();
IF (PID = = 0) {
L SEEK (FD1,1022L,1), WRITE (FD1,V2,100), EXIT (0)
}
WAITPID(PID,NULL), READ(FD1,V2,100), LSEEK(FD1,-200L,1), WRITE(FD1,V3,1024);
CLOSE(FD1);
EXIT(0) }
Numero di blocchi
12, 17, 24, 13, 11 -> 5 K per blocco quindi 2,5 K massimo.
Completare tabella Dma. Non si conta il nodo della radice.
Syscall Cur Read Blocks
Written Blocks
#INT DMA
Open 0 X X 4
Lseek 1022 X X 0
Write 1122 17, 24 24 3
Read 1222 X X 0
Lseek 1022 X X 0
Write 2046 17,24,13 24,17,24 6
Close X X 13 1
N.B. IND dma deve essere la somma di read e written per read e write.
Seconda Write 24 W -> in disco 17 W <- da disco 17 -> al disco 24 <- da disco 24 W -> al disco 13 W <- da disco 6 operazioni su DMA
La close rimanda a disco il blocco aperto.