470 likes | 615 Views
Sistema de Ficheros. ARISO 2 Escola Tècnica Superior d’Enginyeria de Telecomunicació de Barcelona ( Universitat Politècnica de Catalunya). Licencia Creative Commons.
E N D
Sistema de Ficheros ARISO 2 EscolaTècnica Superior d’Enginyeria de Telecomunicació de Barcelona (UniversitatPolitècnica de Catalunya)
Licencia CreativeCommons Esta obra está bajo una licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 2.5 España de CreativeCommons. Para ver una copia de esta licencia, visite: http://creativecommons.org/licenses/by-nc-sa/2.5/es/ o envíe una carta a: CreativeCommons, 559 NathanAbbottWay, Stanford, California 94305, USA.
Licencia CreativeCommons Eres libre de: • copiar, distribuir y comunicar públicamente la obra • hacer obras derivadas Bajo las condiciones siguientes: • Atribución. Debes reconocer la autoría de la obra en los términos especificados por el propio autor o licenciante. • No comercial. No puedes utilizar esta obra para fines comerciales. • Licenciamiento Recíproco. Si alteras, transformas o creas una obra a partir de esta obra, solo podrás distribuir la obra resultante bajo una licencia igual a ésta. • Al reutilizar o distribuir la obra, tienes que dejar bien claro los términos de la licencia de esta obra. • Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor Advertencia: • Los derechos derivados de usos legítimos u otras limitaciones reconocidas por ley no se ven • afectados por lo anterior. • Esto es un resumen legible por humanos del texto legal (la licencia completa)
Sistema de Ficheros Introducción
Dispositivos I/O • Hardware • Dispositivo • Controlador • Software • Driver (parte del SO) • Métodos espera • Busywaiting • Interrupts • DMA (DirectMemoryAcces) Dispositivo Controlador Dispositivo Bus
Sistema de Ficheros • Organización virtual de la información almacenada
Ficheros • Tira de bytes identificados por un nombre • Tipos: • Regular Files • Ficheros con datos de usuario • Directories • CharacterSpecial Files • Dispositivos E/S en serie (terminales, impresoras)
Ficheros • Información organizada en bloques: • Sector: unidad de transferencia • Definida por el HW • #sector disco, cara, pista, … • Bloque: unidad de asignación • Definido por el SO • Que tamaño definimos?
Ficheros • Estructura Árbol Secuencia de bytes Secuencia de bloques
Ficheros • Acceso a ficheros • Secuencial • Para leer el elemento n hay que leer los n-1 anteriores • “Aleatorio” (RandomAcces Files) • Puedes escoger que elemento leer en cada momento
Ficheros • Atributos de un fichero • Metadatos • Información del SO • Ejemplos de atributos • Creador • Dueño • Flags (Read-only, oculto, sistema) • Fechas (creación, modificación, último acceso) • Tamaño • Protección
Ficheros • Operaciones • Crear • Eliminar • Abrir • Cerrar • Leer • Escribir • Posicionar • Obtener atributos • Establecer atributos
Sistema de Ficheros Llamadas a sistema UNIX/Linux
Llamadas a sistema: open • Crea las estructuras de datos en SO para usar un fichero • int open (char *path, intflags, [intrights]) • path: ruta del fichero que se va a abrir • flags: modo de apertura • rights: permisos RWX (en caso de creación) • Devuelve: el id de la TC que se ha asignado -1 en caso de error
Llamadas a sistema: open • Flags : • Modo apertura (obligatorio) • O_RDONLY • O_WRONLY • O_RDWR • Modo de creación (opcional) • O_CREAT : ∄, lo crea ∃, lo abre • O_EXCL+O_CREAT : ∄, lo crea ∃, error • O_APPEND: posiciona elpunteroen EOF • O_TRUNC: borra el contenido del fichero previamente
Llamadas a sistema: open • Ejemplos • fd=open(“hola1.txt”, O_WRONLY|O_CREAT, 660); • fd=open(“hola2.txt”, O_CREAT|O_WRONLY|O_TRUNC); • fd=open(“hola3.txt”, O_RDONLY); • Que hace el SO; • Buscar posición en la tabla de canales (TDVA) • Nueva entrada en la TFA • TC[n] TFA
Llamadas a sistema: close • Libera las estructuras de datos del SO de un fichero • intclose (intfile_descriptor) • file_descriptor : posición de la TC • Devuelve: 0 OK -1 en caso de error
Llamadas a sistema: close • Ejemplos • fd=open(“hola.txt”, O_WRONLY|O_CREAT, 660); • close(fd); • close(1); • Que hace el SO; • Libera la posición en la tabla de canales (TDVA) • Decrementa o libera TFA • Si el proceso finaliza, se liberan todos las entradas de la TC
Llamadas a sistema: dup • Duplica una entrada de la tabla de canales • intdup (intfile_descriptor) • file_descriptor : posición de la TC • Devuelve: el id de la TC que se ha asignado -1 en caso de error
Llamadas a sistema: dup • Ejemplos • fd=dup(1); • Que hace el SO; • Busca la primera posición libre de la TC • La nueva posición de la TC apunta al mismo punto de la TFA que la pasada por parámetro • Incrementa en #referencias en la TFA
Llamadas a sistema: dup2 • Igual que dup, pero especificando el FD destino • int dup2 (intfd_origen, intfd_destino) • fd_origen: posición de la TC a duplicar • fd_destino: posición de la TC donde duplicar • Devuelve: el id de la TC que se ha asignado -1 en caso de error
Llamadas a sistema: read • Leer datos de un dispositivo virtual • intread (intfd, void *buffer, intnbytes) • fd: posición de la TC • buffer: donde se guardaran los datos leídos • nbytes: numero de bytes que queremos leer • Devuelve: • -1: en caso de error • 0: Fin de fichero (no hay mas datos) • >0: #bytes leídos
Llamadas a sistema: read • Ejemplos • n = read(fd, &c, sizeof(char)); • n = read(fd, &vect, 16); • Que hace el SO: • Lee los bytes correspondientes • Avanza el puntero (*r/w) de la TFA
Llamadas a sistema: write • Escribe datos en un dispositivo virtual • intwrite(intfd, void *buffer, intnbytes) • fd: posición de la TC • buffer: datos a escribir • nbytes: numero de bytes que queremos escribir • Devuelve: • -1: en caso de error • >0: #bytes escritos • Ejemplos • n = write(fd, &c, sizeof(char));
Llamadas a sistema: lseek • Modifica *r/w (puntero de lectura/escritura) • intlseek(intfd, longoffset, intwhence) • fd: posición de la TC • offset: desplazamiento en bytes de *r/w • whence: punto inicial del *r/w • SEEK_SET: inicio fichero • SEEK_CUR: posición actual • SEEK_END: final fichero • Devuelve: • -1: en caso de error • ≥0: nueva posición de *r/w (desde el inicio)
Sistema de Ficheros Ejercicios solucionados
Ejercicio: MiCat intmain(void) { char c; while (read(0,&c,sizeof(char)) > 0 ) { write(1,&c,sizeof(char)); } } intmain(void) { char buffer[64]; intsize; size=read(0,buffer,sizeof(buffer)); while (size > 0 ) { write(1,buffer,size); size=read(0,buffer,sizeof(buffer)); } }
Ejercicio: MiCP intmain(intargc, char **argv) { intfo,fd,size; char buffer[128]; fo=open(argv[1],O_RDONLY); fd=open(argv[2],O_WRONLY|O_CREAT|O_EXCL,0600); size=read(fo,buffer,sizeof(buffer)); while (size > 0 ) { write(fd,buffer,size); size=read(fo,buffer,sizeof(buffer)); } close(fo); close(fd); }
Ejercicio: MiAppend intmain(intargc, char **argv) { intfo,fd,size; char buffer[128]; fo=open(argv[1],O_RDONLY); fd=open(argv[2],O_WRONLY|O_CREAT,0600); lseek(fd,0,SEEK_END); size=read(fo,buffer,sizeof(buffer)); while (size > 0 ) { write(fd,buffer,size); size=read(fo,buffer,sizeof(buffer)); } close(fo); close(fd); }
Ejercicio: MiSearch intmain(intargc, char** argv) {char c; intfo,i,j=0,fin,size,x,actual; fo=open(argv[1],O_RDONLY); fin=lseek(fo,0,SEEK_END); lseek(fo,0,SEEK_SET); size=strlen(argv[2]); for(i=0;i<fin;i++) { read(fo,&c,sizeof(char)); if(c==argv[2][0]) {x=1; j=0; actual=lseek(fo,0,SEEK_CUR); while(c==argv[2][j] && j<size && x>0) { x=read(fo,&c,sizeof(char)); j++;} if(j==size) printf("%d\n",actual-1); lseek(fo,actual,SEEK_SET); } } }
Ejercicio: Stock typedefstruct {char id[20]; intcantidad; } registro; int main() { intfic; registro r1,r2,r3; r1.cantidad=10; sprintf(r1.id,"Panrico"); r2.cantidad=20; sprintf(r2.id,"Bimbo"); fic=open("stock.db",O_RDWR|O_CREAT,0600); write(fic,&r1,sizeof(registro)); write(fic,&r2,sizeof(registro)); lseek(fic,0,SEEK_SET); read(fic,&r3,sizeof(registro)); printf("%s, %d\n",r3.id,r3.cantidad); close(fic); }
Sistema de Ficheros Ejemplos de FileSystem
CD-ROM FileSystem (iso 9660) • Asignación de ficheros “contigua” • Todos los bloques del archivo están contiguos • Se necesita una única entrada por archivo: • Bloque inicial • Longitud del archivo • Ventajas: • Acceso eficiente al disco • Localización del bloque n sencilla • Desventajas: • Asignación previa, no flexible Archivo
CD-ROM FileSystem (iso 9660) • Directoryentry • Location of file: #sector inicio fichero 1 1 8 8 7 1 2 4 1 4-15 Flags Extended attribute record lenght Interleave Directoryentrylength BaseName.Ext;Ver RootDirectory
FileAllocationTable (FAT) • Asignación de ficheros “encadenada” • Cada bloque de datos reserva espacio para un puntero que indica cual es el siguiente bloque del archivo • Se necesita una única entrada por archivo: • Bloque inicial • Ventajas: • Asignación previa o dinámica • Desventajas: • Para acceder al bloque n, hay que acceder a todos los anteriores Archivo
FileAllocationTable (FAT) • Asignación “encadenada” en tabla • Los punteros a bloques se guardan juntos en una tabla, no en los propios bloques • Se necesita una única entrada por archivo: • Bloque inicial • Ventajas sobre la anterior: • Para acceder al bloque n, hay que acceder a la tabla • Se puedereplicar la tabla Archivo
FileAllocationTable (FAT) • Directoryentry • FAT-12, FAT-16, FAT-32 • 12, 16 y 32: #bits @disco 8 3 1 10 2 2 2 4
UNIX v7 FileSystem • Asignación “indexada” • Existe un bloque índice por fichero • El bloque índice contiene: • Punteros a bloques que forman el fichero • Acaba con un puntero a NULL • Ventajas: • Buen acceso secuencial y directo • Desventajas: • Perdida de espacio (bloques de índices grandes) • Muchos accesos en ficheros grandes (bloques de índices pequeños) Archivo
UNIX v7 FileSystem • Asignación “indexada” multinivel • Existe un bloque índice por fichero • El bloque índice contiene: • Punteros a bloques que forman el fichero • Punteros a bloques con más índices • Acaba con un puntero a NULL • Se crea una estructura jerárquica de índices • Ventajas: • Muy pocos accesos incluso en ficheros grandes • Poca perdida de espacio en ficheros pequeños
UNIX v7 FileSystem i-node Bloque 1 indirección Bloque 2 indirección Bloque 3 indirección
UNIX v7 FileSystem • Directoryentry • i-Nodo 64 bytes 2 14
UNIX v7 FileSystem Accesos para buscar /usr/rubenb/fich.txt Bloque 406 datos de /usr/rubenb i-nodo 6 de /usr Bloque 132 datos de/usr i-nodo 19 de /usr/rubenb Rootdirectory
Sistema de Ficheros Virtual FileSystem
Estructura Llamadas a sistema (open, read, …) VirutalFileSystem (VFS) EXT2 EXT3 NTFS FAT32 I/O Buffer Cache Device Driver Device Driver Device Driver
Virtual FileSystem • Los sistemas operativos soportan diferentes sistemas de ficheros • Linux: Ext2, Ext3, FAT, ISO9660, XFS, RaiserFS, NTFS… • Estructura en dos niveles: • Estructuras independientes del SF (VFS) • Estructuras dependientes del SF (Ext2, Ext3…)
Virtual FileSystem • VFS • Contiene descripciones de los sistemas soportados • file_operations, inode_operations, superblock_operations • virtual i-nodes y virtual files • Las llamadas de sistema interaccionan con estas estructuras independientes • vfs_create, vfs_unlink, ... • Estructuras dependientes del SF • accedidas a través de las operaciones descritas en el VFS • i-nodes, FAT, ...
Virtual FileSystem Tabla de canales Tabla de ficheros abiertos Tabla de i-nodos virtuales Tabla de canales Acceso compartido Acceso concurrente