Se tiene un disco de 4 Gbytes, cuyo tamaño de bloque es de 1Kbytes. Se utiliza un sistema de ficheros tipo UNIX, que representa el fichero mediante nodos-i con 10 direcciones directas a bloque, un indirecto simple, un indirecto doble y un indirecto triple y direcciones de bloque de 4 bytes. El sistema utiliza un mapa de bits para gestionar el espacio vacío y otro para los nodos-i. Responder razonadamente a las siguientes preguntas: 1. Calcular el tamaño que ocupa el mapa de bits para gestionar los bloques del dispositivo. 2. Suponiendo que aproximadamente hay 8 bloques de datos por cada nodo-i, calcular el tamaño que ocupa el mapa de bits para nodos-i. 3. Tamaño máximo de un fichero en este sistema. 4. Si se lleva a cabo la siguiente secuencia de código: int fd; char c; fd=open(“/usr/fich.txt”,O_RDWR); lseek(fd,SEEK_SET,61440200); read(fd,&c,1); y teniendo en cuenta que 61440200 es igual a 15000*4096+200, ¿cuál será el número de accesos a disco para realizar dichas sentencias suponiendo que las operaciones se llevan a cabo de forma correcta? 5. Si a continuación del anterior código, se lleva a cabo la siguiente secuencia: fd2 = dup(fd); lseek(fd2,SEEK_CUR,61440000); write(fd2,&c,1); ¿cuál sera el número de accesos a disco para realizar dichas sentencias suponiendo que las operaciones se llevan a cabo de forma correcta? 6. ¿Qué estructuras del sistema operativo están implicadas en la ejecución de las sentencias del apartado 4 y 5? Indicar cómo se modifican durante la ejecución de las mismas. SOLUCIÓN 1. Para el cálculo de los mapas de bits vamos a despreciar el espacio ocupado por la metainformación (superbloque, los propios mapas de bits, etc. ) El mapa de bits incluye 1 bit por cada recurso existente, es decir, un bit por cada bloque de disco o nodo-i. En total se tienen que controlar 4 Mega bloques por lo que son necesarios 512 bloques para el mapa de bits, es decir 512 Kbytes (4 Mbloques*1 bit/8 bits/byte= 512 Kbytes). 2. El número de nodos-i es igual a 4 Mbloques/8 bloques/nodo-i= 219 nodos-i. Por tanto, el mapa de bits ocupa 64 Kbytes (219 nodos-i*1 bit/8 bits/byte = 64 Kbytes). 3. 10 bloques directos a bloque 1024/4 bloques con indirección simple (1024/4)^2 bloques con indirección doble (1024/4)^3 bloques con indirección triple Tamaño máximo de fichero: (10 + 256 + 256^2 + 256^3)bloques * 1024Bytes/bloque = 16Gbytes La máxima longitud de fichero que podría ser alcanzada con este esquema es de aproximadamente 16 Gbytes. Al ser el disco de 4 Gbytes, el fichero estaría limitado por este tamaño. 4. Para poder acceder al fichero y realizar la operación de lectura se necesitan los siguientes accesos a disco: El bloque / se encuentra en memoria ya. Buscar directamente allí la entrada /usr. Traer el nodo-i de /usr a memoria. Traer un bloque de /usr a memoria y buscar la entrada de fich.txt Traer el nodo-i de fich.txt a memoria Por tanto para acceder al fichero necesitamos 3 accesos a disco. Para leer el dato hay que acceder al bloque 15000 * 4 = 60000 Para direccionar estos bloques necesitamos los punteros de doble indirección del nodo-i (con los punteros de doble indirección se llega al bloque: 10+256+256*256= 65802). Accesos requeridos: 2 para acceder a los 2 niveles de indirección 1 para acceder al bloque donde se encuentra el byte Número total de accesos: 6 accesos. 5. Suponiendo que el nodo-i de fich.txt ya se encuentra en memoria, sólo hemos de contabilizar los accesos a disco para escribir en el bloque correspondiente. Debido a que fd2 comparte puntero con fd1, para escribir el dato hay que acceder al bloque 30000*4 = 120000 (61440200+61440000= 30000*4096+200). Necesitamos los punteros de triple indirección del nodo-i. Accesos requeridos: 3 para acceder a los 3 niveles de indirección 1 para acceder al bloque donde se va a escribir el byte Número total de accesos: 4 accesos. 6. Las estructuras que se utilizan son: La tabla de archivos abiertos por el proceso en el BCP, que contienen los descriptores fd y fd2, una vez realizadas las operaciones open() y dup(). La tabla intermedia que almacena las posiciones de los archivos (tabla filp). Dichas posiciones son modificadas por las llamadas lseek(), read() y write(). La tabla de nodos-i, que contiene información sobre el fichero “/usr/fich.txt”.