Sistemas Operativos

Anuncio
Apellidos:
Nombre:
Sistemas Operativos
Ingenierı́a Informática de Sistemas
Examen Septiembre 2009
1. Dispositivo de bloques con buffer [2.5 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 NUMBUFFERS con las últimos bloques usados. 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 uno de los buffers individuales esta
protegido por lock buffer[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 buffer correspondiente adquirido.
#define BLOCKSIZE . . .
#define NUMBUFFERS . . .
struct buffer {
char block[BLOCKSIZE] ;
};
struct buffer dev {
mutex lock ;
struct device ∗dev;
int block num[NUMBUFFERS] ;
int dirty [NUMBUFFERS] ;
mutex lock buffer [NUMBUFFERS] ;
struct buffer buf[NUMBUFFERS] ;
};
int block read(struct device ∗dev, void ∗buffer , int block number)}
int block write(struct device ∗dev, void ∗buffer , int block number)}
2. namei() en mfs[2.5 puntos]
Implemente la función int namei(struct file system *fs, struct disk inode *d, const
char *pathname) con subdirectorios. Pueden usarse las siguientes funciones: siguientes funciones:
#define ENTRYSIZE . . .
struct entry {
char name[ENTRYSIZE] ;
short inode;
};
struct file system {
struct disk inode root;
...
};
int walk directory(struct file system ∗fs ,
struct disk inode ∗d,
int (∗update)(struct entry ∗e fs , struct entry ∗e arg) ,
struct entry ∗arg);
3. file read/write() en mfs[2.5 puntos]
Implemente las función int file read/write(struct file system *fs, struct disk inode
*ino, void *buf, int block) con extents (solo existen los extents apuntados por el inodo).
Tiene que detectar que el numbero de bloque que se pasa es correcto. Pueden usarse las siguientes funciones: siguientes funciones y definiciones:
#define NUMEXTENTS . . .
struct extent {
int start ; /∗ extent start block ∗/
int size ; /∗ extent size in blocks ∗/
};
struct disk inode {
int block size ; /∗ file size in blocks ∗/
struct extent e[NUMEXTENTS] ;
};
int data read(struct file system ∗fs , void ∗buffer , int block num);
int add one block(struct file system ∗fs , struct indoe ∗ino);
/∗ Add one block to the end of one inode. 0 −> error, 1−> success ∗/
4. Algoritmo de segunda oportunidad [2.5 puntos]
Implemente en C el algoritmo de segunda oportunidad: int second chance(struct frames
*frames, int page, int write) teniendo en cuenta:
Si el mutex está ocupado, pasar a la siguiente página.
El mutex se bloquea antes de comenzar una escritura de una página. La función
page write devuelve el control despues de iniciar la escritura. Cuando la escritura
termina, el controlador desbloquea el lock.
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
0
1
1
0
1
#define NUMFRAMES
struct frame {
int num page;
bool access ;
bool modify;
mutex busy;
};
aclaración
se usa esta entrada para la nueva página.
Se inicia la escritura de la página.
Se marca la página como no accedido.
Se marca la página como no accedida.
/∗ Num of page stored here ∗/
/∗ Acces bit ∗/
/∗ Modify bit ∗/
/∗ La pagina se esta ocupada ∗/
struct frames {
int next;
struct frame[NUMFRAMES] ;
};
int page read(int page, int frame);
int page write(int page, int frame);
void mutex lock(mutex ∗m);
void mutex unlock(mutex ∗m);
int mutex trylock(mutex ∗m);
Descargar