# SOA: Ejercicios UD3 ## ¿Por qué se les llama discos y que son los sectores? ![disco](https://hackmd.io/_uploads/rk4CDFslWe.png) ## Punteros indirectos y cantidad de almacenamiento ![imagen](https://hackmd.io/_uploads/rJaqWrzlbx.png) ## ¿Cuál es el tamaño máximo de los archivos en un sistema FAT32? FAT32 utiliza un campo de 4 bytes en su tabla de directorios para registrar el tamaño de cada archivo. Por ello el tamaño es máximo que se puede definir es de 4Gb. Esto no tiene nada que ver ver con la capacidad real del disco que puede ser mayor. ## Ejercicio de examen Sea un sistema de archivos basado en FAT-16 en el que los bloques son de 4KiB y solo hay un bloque por clúster. Las entradas en la FAT con los siguientes valores tienen un significado especial: * 0xFFFF: Bloque no utilizable o reservado. * 0x0000: Bloque libre. * 0xFFFE: Último bloque del archivo. En este momento, la FAT de este sistema de archivos tiene el siguiente contenido: ![imagen](https://hackmd.io/_uploads/HJd9TbvfWl.png) Para mejorar la legibilidad de la tabla anterior, las entradas en blanco deben interpretarse como bloques libres, es decir, con un valor 0x0000. Los números escritos sin la notación 0x deben considerarse en decimal. El bloque 1 es para directorio raíz que solo contiene una entrada para el archivo FILE0001.TXT, cuyo primer bloque es 3. El tamaño del archivo es de 24000 bytes. 1. ¿Cuál sería el resultado del comando copy FILE0001.TXT FILE0002.TXT? Indique cuál será el estado final de la FAT, así como las modificaciones que habría que realizar en el directorio actual. Si necesitara utilizar bloques libres, utilice siempre los que tengan la numeración más baja posible entre todos los bloques libres disponibles. Rellene la siguiente tabla: ![imagen](https://hackmd.io/_uploads/SkVz0bwzbg.png) :::spoiler ![imagen](https://hackmd.io/_uploads/SkNqlMDzZx.png) ::: 2. El dispositivo subyacente del sistema de ficheros proporciona una primitiva para leer una secuencia de bloques: ```read_sequence(int starting_block, int block_count, void* buffer)```. El primer parámetro, ```starting_block```, es el número del primer bloque, y a partir de ese bloque se leerán también los siguientes ```block_count``` bloques. El parámetro ```buffer``` es la posición de memoria donde se colocarán los bloques leídos del disco. Debido a la naturaleza de este dispositivo, la lectura de bloques contiguos es más eficiente que la lectura de un solo bloque. El contenido de la FAT en este momento y las entradas de directorio actuales son las que se muestran en la siguiente tabla: ![imagen](https://hackmd.io/_uploads/Hk3rCZvfbg.png) Para mejorar el rendimiento del sistema de archivos, los ingenieros deciden construir una herramienta que desfragmente el disco y ordene todos los bloques de un mismo archivo de forma contigua en el disco. El algoritmo será el siguiente: --- ``` Para cada archivo del disco * obtener el número de bloques del fichero * encontrar un lugar en el disco con suficientes bloques contiguos libres para copiar los bloques del archivo * copiar los bloques del fichero original a esta nueva ubicación de forma contigua * actualizar las estructuras del sistema de archivos según sea necesario ``` --- Junto con la función ```read_sequence(int starting_block, int block_count, void* buffer)``` hay otra de nombre ```write_sequence(int starting_block, int block_count, void* buffer)``` que se usa para escribir desde la posición de memoria especificada con el parámetro ```buffer``` al disco, empezando por el ```starting_block``` y contiguamente hasta la cantidad de bloques especificados en ```block_count```. ¿Cuáles serán la FAT y las entradas de directorio después de ejecutar esta herramienta para FILE0001.TXT y FILE0002.TXT? Suponiendo que haya memoria ilimitada para el búfer, rellene la tabla con todas las operaciones de lectura y escritura necesarias para realizar la desfragmentación del disco de los dos archivos. Si necesitara utilizar bloques libres, utilice siempre los que tengan la numeración más baja posible entre todos los bloques libres disponibles. Rellene las siguientes tablas con el contenido de la FAT y las entradas de directorio. En la tabla de la derecha, rellene cada fila con los parámetros de las correspondientes operaciones read_sequence o write_sequence necesarias (olvídese del parámetro buffer). Para simplificar, utilice la letra R en la columna de operaciones para indicar una operación de lectura, y la letra W para la escritura. ![imagen](https://hackmd.io/_uploads/ryIO1GwMWx.png) :::spoiler ![imagen](https://hackmd.io/_uploads/rkYtF4-Q-l.png) ::: 3. Suponga que ahora el sistema de archivos es de tipo i-node. La siguiente tabla muestra el estado actual de dicha tabla. Para este ejercicio solo se muestran las primeras entradas y solo alguno de los campos relevantes. ![imagen](https://hackmd.io/_uploads/HyLYJGDfbl.png) Para la contabilidad de bloques libres/ocupados el sistema utiliza un bitmap, donde los bits a 1 indican que el bloque correspondiente está ocupado, y 0 que está disponible. El estado actual de las primeras entradas de este bitmap es el siguiente: ![imagen](https://hackmd.io/_uploads/rkRs1fwMZg.png) De la misma forma, para la contabilidad de los i-node libres y ocupados existe otro bitmap en el que el sentido de los bits es el mismo que en el caso del bitmap anterior, es decir, un bit a 1 indica que el i-node es válido y a 0 que no lo es. El valor de ese bitmap es el siguiente: ![imagen](https://hackmd.io/_uploads/Bk0hyzwMZe.png) Siempre que se necesite asignar un nuevo bloque o un nombre i-node se utilizará el primero que este libre con la numeración más baja. En este sistema de archivos cada entrada de directorio es de tamaño variable, pero todas ellas empiezan por un número de 16 bits para indicar el i-node, seguido de una cadena de caracteres de longitud arbitraria terminada en un byte a cero (null) para el nombre del archivo. Por ejemplo, para indicar que el directorio actual (.) es el directorio raíz habría una entrada con los valores 00 02 2e 00 (Nota: el ASCII 2e es el del punto “.”). Por otro lado, los bloques de punteros contienen punteros de 16 bits a otros bloques (tantos como sean necesarios en función del tamaño del archivo). Se dispone también del volcado parcial en este momento del tiempo de algunos de los bloques de datos del sistema de archivos: ![imagen](https://hackmd.io/_uploads/HJaygGDGWl.png) Con esta información, y sabiendo que el directorio de trabajo es el directorio raíz, ¿cuál sería el resultado del comando cp file0001.TXT file0002.TXT? Indique en las siguientes tablas ***solo las modificaciones*** derivadas de la ejecución de la orden anterior. En particular, en el caso de los bloques datos, si un bloque de datos es igual a otro ya existente, simplemente indique “igual al bloque X”. Tampoco hace falta que exprese ningún valor en hexadecimal, simplemente indique cual sería el contenido y en qué posición iría. ![imagen](https://hackmd.io/_uploads/ryXfgMPGWe.png) Indique a continuación que modificaciones sufrirían los bloques de datos (describa de forma textual los cambios que se producirían en los bloques de datos. Si son bloques nuevos describa brevemente su contenido) :::spoiler La orden mencionada haría una copia del archivo file0001.txt en el archivo file0002.txt. Inspeccionando el i-node 2 (root) vemos que ocupa un únicamente el bloque 5 (tamaño 4096). Analizando el bloque 5 encontramos las entradas “.”, “..” y también una para el archivo “file0001.txt” asociada al inode-3. Este i-node indica que el objeto es un archivo, que tiene un tamaño de 24000 bytes (6 bloques) y que los dos primeros son el 4 y el 7. Los 4 bloques restantes los encontramos en el bloque 9, que contiene punteros a otros bloques. Inspeccionando el bloque 9 encontramos que los 4 bloques restantes son: 10, 12, 11 y 13. Creamos el archivo de destino file0002.txt. Encontramos el primer i-node libre en el bitmap, que resulta ser el i-node 4. Marcamos ese i-node como ocupado modificando el bitmap: ![imagen](https://hackmd.io/_uploads/SkSzbfwMZl.png) Añadimos una nueva entrada en el directorio para el nuevo archivo file0002.txt asociada al nuevo i-node 4. ![imagen](https://hackmd.io/_uploads/r1l7-fvf-e.png) El archivo tendrá 6 bloques, por lo que necesitamos reservar 7, 6 para datos y uno para el bloque con punteros indirectos. Comenzamos por los de numeración más baja. ![imagen](https://hackmd.io/_uploads/B1qm-GvMbe.png) Modificamos la entrada 4 de la tabla de i-nodes: ![imagen](https://hackmd.io/_uploads/SyBEbfwM-g.png) El bloque 2 contendrá los punteros a los bloques 3, 6, 8 y 14 ![imagen](https://hackmd.io/_uploads/BkbBWfwfZe.png) Finalmente, el contenido de los nuevos bloques 0, 1, 3, 6, 8 y 14 será el mismo que el de los bloques 4, 7, 10, 12, 11 y 13 :::