Enunciado y solución

Anuncio
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”.
Descargar