Sistemas Operativos

Preview only show first 6 pages with water mark for full document please download

Transcript

Apellidos: Nombre: Sistemas Operativos Ingenier´ıa Inform´atica de Sistemas Examen Septiembre 2010 1. Dispositivo de bloques con buffer [4 puntos] Implementar las funciones buffer block read() y buffer block write(). Las funciones se diferencian de block read/write() en que guardan un buffer indexado por la funci´on int hash(int block number) de tama˜ no NUMCHAINS con las u ´ltimos bloques usados. Cada entrada es un array de CHAINSIZE bloques. Existe un campo dirty, para indicar si el contenido es distinto del buffer en disco. La estructura buffer dev esta protegida por el mutex lock, cada una de los cadenas individuales esta protegida por lock chain[i]. Hay que minimizar el tiempo usado con cada uno de los locks adquiridos. La lecturas/escrituras (tanto de disco como a memoria) hay que realizarlas con el lock chain correspondiente adquirido.   #define BLOCKSIZE . . . #define NUMCHAINS . . . #define CHAINSIZE . . . struct chain { char block[BLOCKSIZE] [CHAINSIZE] ; int dirty [CHAINSIZE] ; int block num[CHAINSIZE] ; }; struct buffer dev { mutex lock ; struct device ∗dev; mutex lock chain[NUMCHAINS] ; struct chain chain[NUMCHAINS] ; }; int block read(struct device ∗dev, void ∗buffer , int block number)} int block write(struct device ∗dev, void ∗buffer , int block number)}   2. O APPEND en mfs[2.5 puntos] El flag O APPEND al abrir un fichero hace que el fichero se abra para escribir al final del fichero. Como implementar´ıa esa funcionalidad en mfs open()? Puede suponer que la variable fd apunta a una entrada v´ alida del fichero ya abierto, y que el campo ino contiene los datos leidos del fichero en cuesti´ on.   #define EXTENTS . . . struct disk inode { int size ; struct extent e[EXTENTS] ; ... }; struct f i l e { int pos; struct disk inode ino; ... };   3. Funci´ on file read() con extents [3.5 puntos] Defina la funci´ on int file read(struct file system *fs, struct disk inode *ino, void *buffer, int block num)) que dado un inodo y un bloque dentro del fichero, lee el bloque correspondiente del sistema de ficheros. Un extent esta sin asignar si el bloque de comienzo es -1. En ese casa, el sistema debe rellenar la funci´on con ceros.   struct file system { int blocksize ; ... } int data read(struct file system ∗fs , void ∗buffer , int block num); void ∗memset(void ∗s , int c, size t n);