Sistemas operativos Tema 10: Sistemas de ficheros

Sistemas de ficheros ► El

sistema de ficheros suele ser el aspecto más visible de un SO para los usuarios. ► Objetivos: ƒ Ofrecer una visión uniforme del almacenamiento de información en memoria secundaria. ► El

SO oculta las propiedades físicas de los discos, y define una unidad lógica de almacenamiento: el fichero.

ƒ Gestionar el espacio de almacenamiento y el acceso a la información.

Sistemas de ficheros ► Los

primeros SO soportaban tipos de ficheros, incorporando código para interpretar su estructura y contenido. ► Actualmente, se tiende a ver los ficheros como secuencias no interpretadas de bytes. ƒ Máxima flexibilidad, pero mínimo soporte: queda todo en manos de las aplicaciones. ƒ Todo lo más, el SO distingue ficheros ejecutables, y tipos de documentos según el programa con que se crean o editan.

Métodos de acceso a ficheros ►

Acceso secuencial: se accede a las distintas partes de un fichero una tras otra, en un orden predeterminado. ƒ Al abrir un fichero, el puntero de L/E se sitúa al principio del mismo. ƒ Cada operación de L/E accede a la posición apuntada y hace que el puntero avance a la posición siguiente.



Acceso directo: se puede acceder a las distintas partes de un fichero en cualquier orden. ƒ Los ficheros se ven como secuencias de bloques de longitud fija. ƒ Las operaciones de L/E indican un número de bloque relativo al comienzo del fichero.



Se puede simular de manera eficiente el acceso secuencial sobre dispositivos de acceso directo, pero no viceversa.

Estructura física y lógica

Estructuras de sistemas de ficheros ► Muchos

sistemas de ficheros combinan dos estructuras distintas: ƒ Directorio de dispositivo. ► Contiene

información sobre las propiedades físicas de cada fichero: localización en el dispositivo de almacenamiento, tamaño, etc.

ƒ Directorio de ficheros. ► Contiene

información sobre las propiedades lógicas de cada fichero: nombre, tipo, propietario, permisos, etc.

► La

vinculación entre ambas estructuras se hace a través de un identificador unívoco de fichero.

Directorio de nivel único ►

Todas las entradas en el mismo nivel. directorio

ficheros

► ►

Solución adoptada en los directorios de dispositivo. No se utiliza en directorios de ficheros, por dos motivos principales:

ƒ Falta de organización lógica. ƒ Limitaciones al nombramiento: no podría haber dos ficheros con el mismo nombre, aunque pertenecieran a distintos usuarios.

Directorio de dos niveles ►

Un directorio por cada usuario. so1

p1.c

p2.c

func.h func.c

so2

directorio raíz

so3

p1.tgz notas

p1.c

p1b.c

core

directorios de usuario ficheros

► ►

Sólo se requiere unicidad de nombres dentro de cada directorio. Un usuario puede acceder a los ficheros de otro indicando caminos de búsqueda.

Estructura de árbol ► Generalización

del directorio de dos niveles.

ƒ Los usuarios pueden crear subdirectorios. home

so1

p1.pdf

prac1.c p1.pdf func.h func.c

so2

bin

opt

bash

gcc

p1.tgz p1b.tgz p1.c

info

share

texinfo web2c

Estructura de árbol ► Dos

tipos de caminos:

ƒ Absolutos: desde el directorio raíz. ƒ Relativos: desde el directorio actual. ► Existe

un único camino para cada fichero o subdirectorio desde el directorio raíz.

Estructura de grafo acíclico ►

Ficheros y subdirectorios pueden tener varios caminos desde el directorio raíz (y, por extensión, varios nombres). dict

list

all

w

spell

count

list

count words

radc

w7

list

Estructura de grafo acíclico ►

El grafo acíclico facilita la compartición de ficheros y subdirectorios entre usuarios. ƒ Sin embargo, complica los mecanismos de generación de estadísticas de disco, copia de seguridad, etc.



Implementaciones: ƒ Información replicada. ► Al

modificar un fichero, por consistencia, hay que modificar igualmente todas sus réplicas.

ƒ Una única copia, y enlaces a los ficheros o subdirectorios compartidos. ► Al

borrar un fichero o subdirectorio, se elimina un enlace. ► El fichero o subdirectorio se borra cuando no quedan enlaces a él (se necesita un contador de referencias).

Estructura de grafo general ►

Se permite la aparición de ciclos, enlazando subdirectorios de nivel superior. dict

list

spell

count words

old

list

radc

ipc

w7

list

Estructura de grafo general ► ►

La existencia de bucles complica la generación de estadísticas y los mecanismos de copia de seguridad. Problemas con el borrado: pueden existir subdirectorios con el contador de referencias a un valor distinto de cero, y que sin embargo no son alcanzables desde el directorio raíz. ƒ Información inaccesible. ƒ Se necesita un recolector de basura.



Pocas ventajas con respecto al grafo acíclico Æ la estructura de grafo general apenas se utiliza.

Asignación de espacio

Asignación de espacio ► Objetivos

principal:

análogos a la gestión de memoria

ƒ Aprovechamiento de espacio. ƒ Acceso eficiente a los ficheros.

► Compromiso

asignación:

común a todas las formas de

ƒ Como el almacenamiento se realiza por bloques, aparece una fragmentación interna media de ½ bloque por fichero. ► ¿Mejor

bloques pequeños?

► ¿Mejor

bloques grandes?

ƒ Para reducir los accesos a disco, debería maximizarse la cantidad de información leída en cada operación de E/S.

Asignación contigua ►

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

A cada fichero se le asigna un conjunto de bloques contiguos en disco. ƒ Estrategias first-fit, best-fit o worst-fit. ƒ El directorio de dispositivo almacena la dirección del primer bloque y el número de bloques que le siguen.

Soporte eficiente para acceso secuencial y para acceso directo. ► Fragmentación externa. ►

ƒ Se requieren mecanismos de compactación.



Otras cuestiones:

ƒ ¿Cómo saber cuánto espacio necesitará un fichero? ƒ ¿Qué hacer si un fichero crece y no hay bloques libres después del último?

Asignación enlazada ►

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Se ve cada fichero como una lista enlazada de bloques. ƒ El directorio de dispositivo almacena la dirección del primer bloque. ƒ Cada bloque almacena un puntero al siguiente.



No hay fragmentación externa.

ƒ Aún así, la compactación puede mejorar el rendimiento de la E/S.

Soporte eficiente sólo para acceso secuencial. ► El espacio ocupado en punteros se hace notorio con bloques pequeños. ► La pérdida de un puntero hace inaccesible el resto del fichero. ►

Asignación indexada ►

BI

1

2

3

4

5

6

7

8

9

10

BI

12

13

14

15

16

17

18

19

20

Cada fichero tiene un bloque índice (BI), con punteros a los bloques que almacenan sus datos.

ƒ El directorio de dispositivo almacena la dirección del BI.

► ► ►

Soporte eficiente para acceso secuencial y para acceso directo. No hay fragmentación externa. Ficheros pequeños desaprovechan gran parte de su BI Æ despilfarro de espacio. ƒ ¿Bloques pequeños?



En el BI caben un determinado número de punteros Æ tamaño máximo de los ficheros limitado. ƒ ¿Bloques grandes?

Bloques índice enlazados BI

1

2

3

BI

5

6

7

8

9

10

11

BI

13

14

15

16

17

18

19

20



El último puntero de un bloque índice puede apuntar a otro bloque índice. ƒ No hay limitación de tamaño.



Acceso más lento al final de los ficheros.

Bloques índice multinivel BI1

BI2

BI2

BI2

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20





Los bloques índice de primer apuntan a bloques índice de segundo nivel, y así sucesivamente. Sólo apuntan a bloques de datos los bloques índice de nivel más bajo. ƒ Sigue habiendo limitación de tamaño.



Se accede por igual a cualquier parte de los ficheros.

Gestión del espacio libre

Gestión de espacio libre ►

La gestión del espacio libre implica: ƒ Buscar y asignar espacio libre cuando se crea un fichero. ƒ Registrar como libre el espacio que ocupaba un fichero que se borra. ƒ Actualizar el mapa del espacio libre cuando un fichero crece o se trunca.



Consideraciones importantes: ƒ Espacio en disco necesario para almacenar el propio mapa de espacio libre. ƒ Facilidad para encontrar 1 bloque libre o n bloques libres contiguos. ƒ Facilidad para actualizar el mapa de espacio libre.

Vector de bits 0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

► Un

bit por cada bloque de disco.

ƒ 0 Æ bloque libre ƒ 1 Æ bloque asignado 101000011101001100000 ► Por

cuestiones de eficiencia, el vector se suele cargar en memoria.

Vector de bits ►

Ventajas: ƒ Fácil de implementar y usar con cualquier método de asignación. ƒ Facilidad para encontrar un bloque libre o un conjunto de bloques contiguos libres. ƒ Actualización sencilla.

101000011101001100000 ►

Inconveniente: tamaño excesivo con discos grandes.

ƒ Ejemplo: disco de 16 GB y bloques de 512 bytes Æ vector de 8MB. ► Reservar

8 MB de memoria, o recorrer hasta 16384 bloques de disco.

ƒ Solución: usar bloques libres para gestionar el espacio libre.

Lista enlazada de bloques libres ►

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20





Mínimo desperdicio de espacio: sólo se necesita almacenar la dirección del primer bloque libre. Con asignación no contigua, para buscar n bloques libres hay que leer n-1 bloques. Con asignación contigua, por lo general, hay que leer muchos más.

Lista enlazada de secciones libres 0

0

1

2

3

4

5

6

7

8

3

0

9

10

11

12

13

14

15

16

17

18

19

20

1

4

► Cada

bloque de la lista enlazada indica cuántos bloques libres le siguen. ƒ Mayor eficiencia para la asignación contigua.

Lista enlazada de bloques índice 0

BI

2

3

4

5

BI

7

8

9

10

11

12

13

14

15

BI

17

18

19

BI



Un bloque índice contiene un cierto número de punteros a bloques libres, más un puntero a otro bloques índice. ƒ Se pueden localizar rápidamente un gran número de bloques libres.



Alternativa más eficiente para asignación contigua: apuntar a secciones de bloques libres contiguos.

Fin