Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoIppolito Russo Modificato 11 anni fa
1
File system: system call e strutture dati a run-time
2
Indice 1. Accesso ai file: system call e strutture dati di base 2. Redirezione dellinput/output 3. Pipelines 4. Altre strutture dati
3
1. Accesso ai file: system call e strutture dati di base
4
Gestione dei file: filosofia open carica in memoria li-node del file read / write accedono al file tramite il suo i-node close rilascia le strutture dati di memoria del file
5
Gestione dei file: strutture dati del kernel in-core i-node table
6
La system call open fd=open(pathname, mode) 1. tramite il pathname del file cerca il suo i-node nella i-list su disco 2. se il file non esiste o non è accessibile nella modalità richiesta restituisce un codice di errore 3. altrimenti: copia il suo i-node nella in-core i-node table e la completa 4. crea una entry nella File Table, e inizializza modalità di apertura, reference count e offset 5. crea una entry nella File Descriptor Table del processo utilizzando la prima entry libera 6. restituisce al chiamante lindice di tale entry (fd) 7. (se li-node esiste già nella in-core i-node table, inizia da 4) File Descriptor Table File table in-core i-node table 5
7
Ricerca nel file system tramite pathname 234 a 567 b 458 c 234 a b c 567458 i-listdata blockssuperblock /a/b/c
8
Esempio int 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
9
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 nellin-core i-node è >1 lo decrementa e conclude –altrimenti: dealloca lin-core i-node restituisce lesito delloperazione (0 o 1) File Descriptor Table File table in-core i-node table 5
10
Esempio Processo A fd1=open("/etc/passwd",O_RD ONLY); fd2=open("local",O_RDWR); fd3=open("/etc/passwd",O_WR ONLY); Processo B fd1=open("/etc/passwd",O_RD ONLY); fd2=open("private",O_RDONLY );
11
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 allin-core i-node; lock lin-core i-node trasforma loffset nella File Table entry in un indirizzo fisico (indirizzo blocco + offset allinterno del blocco), attraverso la tabella di indirizzamento nellin-core i- node legge il blocco/i richiesto/i nella buffer cache e copia gli nbytes richiesti in *buffer aggiorna li-node; unlock i-node aggiorna loffset in File Table entry restituisce al chiamante il numero di byte letti File Descript or Table File table in-core i-node table
12
La buffer cache: lettura kernelprocessodisco buffer cachebuffer read(fd, buffer, n)
13
La system call write size=write(fd, buffer, nbytes) accede alla File Table entry a partire da fd e controlla la modalità di apertura accede allin-core i-node; lock lin-core i-node trasforma loffset nella File Table entry in un indirizzo fisico (indirizzo blocco + offset allinterno del blocco), attraverso la tabella di indirizzamento nellin-core i-node scrive gli nbytes di buffer nella buffer cache aggiorna li-node; unlock i-node aggiorna loffset in File Table entry restituisce al chiamante il numero di byte scritti File Descript or Table File table in-core i-node table
14
La buffer cache: scrittura kernelprocessodisco buffer cachebuffer write(fd, buffer, n)
15
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 Descript or Table File table in-core i-node table
16
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 è lultimo, 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 lowner di un file stat (pathname, buffer) fornisce informazioni di stato sul file ecc.
17
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.
18
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 Kernel Buffer pool File table i-node table Switcher System calls Interrupt Handlers I/O drivers Process Table Visione dinsieme File descriptor table
19
2. Redirezione dellinput/output
20
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 Descript or Table File table in-core i-node table
21
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)
22
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)
23
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 stderr standard files
24
Redirezione dellinput 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)
25
Redirezione dellinput 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)
26
Redirezione dellinput 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)
27
Redirezione dellinput 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)
28
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<> $
29
Shell: redirezione dellinput If ((pid=fork())==0 { /* processo figlio */ if (input redirection) { fd=open(f1, …); close (0); dup (fd); close (fd); } exec (…); } $cmd < f1
30
Shell: redirezione delloutput If ((pid=fork())==0 { /* processo figlio */ if (output redirection) { fd=creat(f1, …); close (1); dup (fd); close (fd); } exec (…); } $cmd > f1
31
3. Pipelines
32
Pipelines Loperatore 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
33
Pipeline: come funzionano Per eseguire A B la shell: crea un file temporaneo di tipo speciale, chiamato pipe (invisibile allutente) 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
34
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)
35
Tipi di pipe Pipe con nome create da mknod (devono essere aperte con open) Pipe senza nome create e aperte da pipe su un pipe device definito al momento della configurazione
36
Creazione di una pipe senza nome: pipe i = pipe ( fd[2] ) crea una pipe senza nome, e la apre in lettura e scrittura restituisce lesito delloperazione (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
37
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],…); …
38
pipe ()
39
Pipe: uso tipico
41
Realizzazione di una pipeline $cmd1 cmd2
42
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,...); }... }
43
4. Altre strutture dati
44
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
45
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 Kernel Buffer pool File table i-node table Mount Table Switcher System calls Interrupt Handlers I/O drivers Process Table Visione dinsieme
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.