Apellidos: Nombre: Sistemas Operativos Ingenierı́a Informática de Sistemas Examen Septiembre 2007 1. Dispositivo de bloques con buffer [2.5 puntos] Implementar la función int buffer block read(struct buffer dev ∗dev, void ∗buffer, int block number), usando la función int block read(struct device *dev, void *buffer, int block number. La función se diferencia de block read() en que guarda un buffer circular de tamaño NUM BUFFERS con las últimos bloques leı́dos. El próximo buffer a usar es el que tenga un menor valor en el campo uses. En caso de varios buffers tengan el mismo valor uses, se usara el que tenga un valor de ı́ndice más alto. Antes de hacer una lectura, hay que mirar si ya esta en el buffer, y si esta en el buffer, se copia de ahı́ en vez de leer del device, y se incrementa el valor de uses para ese buffer Si no está en el buffer, se lee del device, y uses se inicializa a uno y se copia al buffer de usuario. #define BLOCK_SIZE ... #define BUFFER_SIZE ... struct buffer { int num; int uses; char block[BLOCK_SIZE]; }; struct buffer_dev { struct device *dev; struct buffer buf[BUFFER_SIZE]; } 2. Algoritmo de segunda oportunidad [2.5 puntos] Dada la siguiente secuencia de acceso a páginas: P1, P2w, P3, P1, P3, P5w (donde los accessos marcados con una w son de escritura y el resto de lectura), simular que páginas estarı́an en memoria considerando: hay 4 frames. existe un bit de accesso (A) y un bit de modificación (M). No existe refresco periodico del bit de acceso, solo se modifica según la tabla. La tabla de modificaciones de los bits es: A viejo M viejo A nuevo M nuevo 0 0 1 w 0 1 0 0 1 0 0 1 1 0 El estado inicial de las frames Frame Página Siguiente 0 P0 1 P1 * 2 P3 3 P4 0 1 es: A 1 0 0 1 M 0 1 0 1 aclaración se usa esta entrada para la nueva página. Se inicia la escritura de la página. La escritura termina dos accesos más tarde Se marca la página como no accedido. Se marca la página como no accedida. 3. Función namei dir() de un sistema de ficheros [2.5 puntos] Defina la función int namei dir(struct file system *fs, int parent, char *path component), para el sistema de ficheros mfs. Dado un componente del nombre del fichero, y el numero de inodo de su directorio padre, busca el inodo correspondiente a ese fichero. La función: comprueba que parent es un directorio, en caso contrario devuelve -ENOTDIR. comprueba que el componente no sea NULL, en caso contrario devuelve -EINVAL. si existe el componente, devuelve su número de inodo, en caso contrario devuelve -ENOENT. 4. Función namei() en un sistema de ficheros con subdirectorios [2.5 puntos] Defina la función int namei(struct file system *fs, char *pathname), que a partir de un nombre de fichero con path absoluto, devuelve el número de inodo que contiene ese fichero, en caso de que no exista la entrada, devuelve -ENOENT. Para definir esta función, usese la función definida en el ejercicio anterior. puede usarse la función char *get component(char *pathname, int level), que dado un path y un indice, devuelve un puntero al componente level del pathname, o NULL, en caso de que la cadena no contenga ese componente. Para los dos ejercicios anteriores pueden suponerse definidos las siguientes funciones y estructuras: struct super_block { int block_size; int num_inodes; int num_bitmap; int num_data_blocks; int root_inode; }; struct extent { int start; int size; } struct inode { int size; struct extent e; }; #define ENTRY_SIZE ... struct entry { char name[ENTRY_SIZE]; short inode; }; struct file { int num; int pos; struct inode ino; }; #define NUM_FILES ... struct file_system { struct device *dev; struct super_block sb; struct inode root; struct file file[NUM_FILES]; ... } *fs = NULL; int inode_read(struct device *dev, struct inode *ino, int num); int inode_write(struct device *dev, struct inode *ino, int num); int data_read(struct device *dev, struct inode *ino, int num); int data_write(struct device *dev, struct inode *ino, int num); Asumase que la variable fs esta inicializada correctamente.