Sistemas Operativos

Anuncio
Apellidos:
Nombre:
Sistemas Operativos
Ingenierı́a Informática 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ón int
hash(int block number) de tamaño NUMCHAINS con las ú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álida del fichero ya abierto, y que el campo ino contiene los datos
leidos del fichero en cuestión.
#define EXTENTS . . .
struct disk inode {
int size ;
struct extent e[EXTENTS] ;
...
};
struct f i l e {
int pos;
struct disk inode ino;
...
};
3. Función file read() con extents [3.5 puntos]
Defina la función 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ón 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);
Descargar