File system: system call e strutture dati a run-time.
-
Upload
ippolito-russo -
Category
Documents
-
view
231 -
download
1
Transcript of File system: system call e strutture dati a run-time.
![Page 1: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/1.jpg)
File system: system call e
strutture dati a run-time
![Page 2: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/2.jpg)
Indice
1. Accesso ai file: system call e strutture dati di base
2. Redirezione dell’input/output
3. Pipelines
4. Altre strutture dati
![Page 3: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/3.jpg)
1. Accesso ai file: system call e strutture dati di
base
![Page 4: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/4.jpg)
Gestione dei file: filosofia
• opencarica in memoria l’i-node del file
• read / writeaccedono al file tramite il suo i-node
• closerilascia le strutture dati di memoria del file
![Page 5: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/5.jpg)
Gestione dei file: strutture dati del kernel
Ø
1
2
NON RESIDENTE (U-AREA)
RESIDENTE
File descriptor Table File Table I-node Table
(Processo 1)
Ø
1
2
File descriptor Table
(Processo 2)
. . .
n
(Globale)
1 m read
1 p write
2 n write
(Globale)
2
1
Una entry per ogni file aperto da ogni processo Una entry per ogni
modalità di apertura di ogni file aperto
Una entry per ogni file aperto
ref count
offset di ultimo byte letto/scritto
modalità di apertura
. . .
. . .
. . .
. . .
. . .
. . .
. . .
• i-number • logical device number • flag di modificato
in-core i-node (copia dell'i-node statico)
ref count
in-core i-node table
![Page 6: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/6.jpg)
La system call open
fd=open(pathname, mode)
1. tramite il pathname del file cerca il suo i-node nella i-list su disco2. se il file non esiste o non è accessibile nella modalità richiesta
restituisce un codice di errore3. altrimenti: copia il suo i-node nella in-core i-node table e la completa4. crea una entry nella File Table, e inizializza modalità di apertura,
reference count e offset5. crea una entry nella File Descriptor Table del processo utilizzando la
prima entry libera6. restituisce al chiamante l’indice di tale entry (fd)7. (se l’i-node esiste già nella in-core i-node table, inizia da 4)
File Descriptor
Table
File table
in-core i-node table
5
![Page 7: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/7.jpg)
Ricerca nel file system tramite pathname
23
4a 567
b 458
c 234
a
b
c
56
7
45
8
i-list data blockssuperblock
/a/b/c
![Page 8: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/8.jpg)
Esempioint fd;…fd=open (pathname, …);if (fd=-1) /* gestione errore */….read (fd, …);….close(fd);
NB: Un file può essere aperto più volte, e quindi avere più file descriptor associati contemporaneamente
![Page 9: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/9.jpg)
La system call close
i=close(fd);
• dealloca la entry nella File Descriptor Table• se il reference count nella File Table è >1, lo decrementa e conclude • altrimenti
– dealloca la File Table entry– se il reference count nell’in-core i-node è >1 lo decrementa e conclude– altrimenti: dealloca l’in-core i-node
• restituisce l’esito dell’operazione (0 o 1)
File Descriptor
Table
File table in-core i-node table
5
![Page 10: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/10.jpg)
Esempio
012
User File descriptor Table File Table I-node Table
(Processo A)
(Processo B)
345
012345
count 1
Read
count 1
Rd-Wrt
count 1
Read
count 1
Write
count 1
Read
count 3
(/etc/passwd)
count 1
(local)
count 1
(private)
Processo A
fd1=open("/etc/passwd",O_RDONLY);
fd2=open("local",O_RDWR);
fd3=open("/etc/passwd",O_WRONLY);
Processo B
fd1=open("/etc/passwd",O_RDONLY);
fd2=open("private",O_RDONLY);
![Page 11: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/11.jpg)
La system call read
n=read(fd, buffer, nbytes)• accede alla File Table entry a partire da fd e controlla la
modalità di apertura• accede all’in-core i-node; lock l’in-core i-node• trasforma l’offset nella File Table entry in un indirizzo fisico
(indirizzo blocco + offset all’interno del blocco), attraverso la tabella di indirizzamento nell’in-core i-node
• legge il blocco/i richiesto/i nella buffer cache e copia gli nbytes richiesti in *buffer
• aggiorna l’i-node; unlock i-node• aggiorna l’offset in File Table entry• restituisce al chiamante il numero di byte letti
File Descriptor Table
File table
in-core i-node table
![Page 12: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/12.jpg)
La buffer cache: lettura
kernel processo disco
buffer cachebuffer
read(fd, buffer, n)
![Page 13: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/13.jpg)
La system call writesize=write(fd, buffer, nbytes)
• accede alla File Table entry a partire da fd e controlla la modalità di apertura
• accede all’in-core i-node; lock l’in-core i-node• trasforma l’offset nella File Table entry in un indirizzo fisico
(indirizzo blocco + offset all’interno del blocco), attraverso la tabella di indirizzamento nell’in-core i-node
• scrive gli nbytes di buffer nella buffer cache• aggiorna l’i-node; unlock i-node• aggiorna l’offset in File Table entry• restituisce al chiamante il numero di byte scritti
File Descriptor Table
File table
in-core i-node table
![Page 14: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/14.jpg)
La buffer cache: scrittura
kernel processo disco
buffer cachebuffer
write(fd, buffer, n)
![Page 15: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/15.jpg)
La system call lseek
currpos=lseek (fd, offset, dadove)
• sposta la posizione corrente del file fd di offset bytes a partire dalla posizione specificata nel terzo parametro
• restituisce la posizione corrente dopo la operazione, o –1 se errore
NB: Non effettua alcuna operazione di I/O
File Descriptor Table
File table
in-core i-node table
![Page 16: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/16.jpg)
Altre system call• creat (pathname, permissions)
crea un file vuoto e lo apre in scrittura• link (pathname1, pathname2)
creazione di un (hard) link a un file• unlink (pathname)
distrugge il link indicato (se è l’ultimo, rimuove il file)• rename (oldname, newname)
cambia nome a un file• chmod (pathname, mode)
cambia i permessi di un file• chown (pathname, uid, gid)
cambia l’owner di un file• stat (pathname, buffer)
fornisce informazioni di stato sul file• ecc.
![Page 17: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/17.jpg)
Directories: system call• mkdir (pathname, mode)
creazione di una directory• rmdir (pathname)
distruzione di una directory• chdir (pathname)
cambia la working directory• opendir (pathname)
apre una directory• readdir (dp)
legge da una directory entry• closedir (dp)
chiude una directory• ecc.
![Page 18: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/18.jpg)
Introduzione al linguaggio Java 6
...
Processo 2
Testo
Dati
Stack
Processo n
Testo
Dati
Stack
U-Area
Processo 1
Testo
Dati
Stack
U-Area
Ready queue
Ker
nel
Buffer pool
File table i-node table
SwitcherSwitcher
System calls Interrupt Handlers I/O drivers
Process Table
Visione d’insieme
File descriptor table
![Page 19: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/19.jpg)
2. Redirezione dell’input/output
![Page 20: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/20.jpg)
La system call dup
i= dup (fd);
• duplica il file descriptor fd nella prima posizione libera della File Descriptor Table
• restituisce il nuovo file descriptor o –1 se errore
File Descriptor Table
File table
in-core i-node table
![Page 21: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/21.jpg)
dup: esempio
0
1
2
3
4
5
6
File descriptor table
0
1
2
3
4
5
6
File table
0
1
2
3
4
5
6
in-core i-node table
dup (5)
![Page 22: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/22.jpg)
dup: esempio
0
1
2
3
4
5
6
File descriptor table
0
1
2
3
4
5
6
File table
0
1
2
3
4
5
6
in-core i-node table
dup (5)
![Page 23: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/23.jpg)
Standard files
0
1
2
3
4
5
6
File Descriptor Table
0
1
2
3
4
5
6
File Table
0
1
2
3
4
5
6
in-core i-node table
stdin
stdout
stderrstan
dar
d f
iles
![Page 24: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/24.jpg)
Redirezione dell’input
0
1
2
3
4
5
6
File descriptor table
0
1
2
3
4
5
6
File table
0
1
2
3
4
5
6
in-core i-node table
close (0)
![Page 25: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/25.jpg)
Redirezione dell’input
0
1
2
3
4
5
6
File descriptor table
0
1
2
3
4
5
6
File table
0
1
2
3
4
5
6
in-core i-node table
dup (5)close (0)
![Page 26: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/26.jpg)
Redirezione dell’input
0
1
2
3
4
5
6
File descriptor table
0
1
2
3
4
5
6
File table
0
1
2
3
4
5
6
in-core i-node table
dup (5)close (0) close (5)
![Page 27: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/27.jpg)
Redirezione dell’input
0
1
2
3
4
5
6
File descriptor table
0
1
2
3
4
5
6
File table
0
1
2
3
4
5
6
in-core i-node table
dup (5)close (0) close (5)
![Page 28: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/28.jpg)
Struttura generale della shell
write (1, PROMPT);while ((n=read(0,buffer,80)=!0) {
riconosci nome file e args;If ( (pid=fork()) ==0) { /* I/O redirection */
if (exec(file, args)==-1) exit (1) }
procid=wait(status);If (status !=0) write (2, error);write(1,PROMPT)
}
FIGLIO
PADRE
Se il comando è eseguito in background, non viene eseguita la wait
$file args<><output>$
![Page 29: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/29.jpg)
Shell: redirezione dell’input
If ((pid=fork())==0 {/* processo figlio */if (input redirection) {
fd=open(“f1”, …);close (0);dup (fd);close (fd);
}exec (…);
}
$cmd < f1
![Page 30: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/30.jpg)
Shell: redirezione dell’output
If ((pid=fork())==0 {/* processo figlio */if (output redirection) {
fd=creat(“f1”, …);close (1);dup (fd);close (fd);
}exec (…);
}
$cmd > f1
![Page 31: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/31.jpg)
3. Pipelines
![Page 32: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/32.jpg)
Pipelines
L’operatore di pipe richiede alla shell di connettere fra loro due (o più) comandi:
comando1 comando2 …redirigendo lo standard output del primo nello standard input del successivo, e così via
![Page 33: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/33.jpg)
Pipeline: come funzionanoPer eseguire AB la shell:
• crea un file temporaneo di tipo speciale, chiamato pipe (invisibile all’utente)
• redirige lo stdout di A sulla pipe, e crea un processo che esegue A (produttore)
• redirige lo stdin di B sulla pipe, e crea un processo che esegue B (consumatore)
• Il produttore A e il consumatore B si sincronizzano automaticamente
• quando A e B terminano, la pipe viene distrutta
A
"pipe"
B
![Page 34: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/34.jpg)
Pipe
Una pipe è un file di dimensione limitata gestita come una coda FIFO:– un processo produttore deposita dati (e resta in
attesa se la pipe è piena)– un processo consumatore legge dati (e resta in
attesa se la pipe è vuota)
Produttore Consumatore
![Page 35: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/35.jpg)
Tipi di pipe
• Pipe con nomecreate da mknod (devono essere aperte con open)
• Pipe senza nomecreate e aperte da pipe su un “pipe device” definito al momento della configurazione
![Page 36: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/36.jpg)
Creazione di una pipe senza nome: pipe
i = pipe ( fd[2] )
• crea una “pipe” senza nome, e la apre in lettura e scrittura
• restituisce l’esito dell’operazione (0 o –1)
• assegna a fd[0] il file descriptor del lato aperto in lettura, e a fd[1] quello del lato aperto in scrittura
![Page 37: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/37.jpg)
Pipe e file ordinari
Creazione e uso di un file ordinario:int fd;If ((fd=creat(filename,…) <0 ) err();write(fd,…);…Creazione e uso di una pipe (senza nome):int fd[2];If ( pipe(fd) < 0 ) err();write(fd[1],…);read(fd[0],…);…
![Page 38: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/38.jpg)
File descriptor table
2
1
0
.....
n
.....
.....
m
read e write offset (stanno qui e non nella file table, perché devono essere visti da entrambi i processi)
1
1
2read
write
File table I-node table
fd_pipe n m
10pipe ( )
![Page 39: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/39.jpg)
Pipe: uso tipico
![Page 40: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/40.jpg)
figlio
pipe (fd);
close (fd[0]); write (fd[1],...);
fork ( );
close (fd[1]); read (fd[0],...);
padre
....
0
1
2
3
4u
-are
a
fd 3 4
0 1dat
i/sta
ckstrutture dati
che rappresentano
la pipe....
0
1
2
3
4
fd 3 4
0 1
![Page 41: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/41.jpg)
Realizzazione di una pipelineshell
fork ( )(wait or proceed)
pipe (fd); fork ( );
close (1); dup (fd[1]); close (fd[0]); close (fd[1]);
exec (cmd1,...);
close (0); dup (fd[0]); close (fd[0]); close (fd[1]);
exec (cmd2,...);
produttore
consumatore
$cmd1 cmd2
![Page 42: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/42.jpg)
Realizzazione di una pipeline (segue)• if ((pid=fork()) == 0) {• /* processo figlio */• if (pipeline) {• pipe (fd_pipe);• if (fork()==0) { /* produttore */• close(1);• dup(fd_pipe[1]);• close(fd_pipe[0]);• close(fd_pipe[1]);• exec (cmd1, ...);• } /* consumatore */• close (0);• dup (fd_pipe[0]);• close (fd_pipe[0]);• close(fd_pipe[1]);• exec (cmd2, ...);• }• ...• }
![Page 43: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/43.jpg)
4. Altre strutture dati
![Page 44: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/44.jpg)
Mount table
Tabella sempre residente, aggiornata da mount e umount, che contiene, per ogni file system montato:– major e minor number del device– puntatore al superblocco del file system– puntatore alla root del file system a cui è
montato– puntatore alla directory su cui è montato
![Page 45: File system: system call e strutture dati a run-time.](https://reader036.fdocuments.net/reader036/viewer/2022062512/5542eb4a497959361e8b5c68/html5/thumbnails/45.jpg)
Introduzione al linguaggio Java 6
...
Processo 2
Testo
Dati
Stack
Processo n
Testo
Dati
Stack
U-Area
Processo 1
Testo
Dati
Stack
U-Area
Ready queue
Ker
nel
Buffer pool
File table i-node tableMount Table
SwitcherSwitcher
System calls Interrupt Handlers I/O drivers
Process Table
Visione d’insieme