Sistemas Operativos

Anuncio
Apellidos:
Nombre:
Sistemas Operativos
Ingenierı́a Informática de Sistemas
Examen Junio 2007
1. Dispositivo de bloques con buffer [1.75 puntos]
Implementar la función int buffer_block_read(struct buffer_dev *dev, void *buffer, int block_num
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 leidos. El próximo buffer a usar esta apuntado por next. Notese que el buffer se usa ciclicamente. 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. Si
no esta en el buffer, se lee del del device, se copia en el buffer apuntado por next, se avanza
next, y se copia al buffer de usuario.
#define BLOCK_SIZE ...
#define BUFFER_SIZE ...
struct buffer {
int num;
char block[BLOCK_SIZE];
};
struct buffer_dev {
struct device *dev;
struct buffer buf[BUFFER_SIZE];
int next; /* próximo buffer que se usará */
}
2. Algoritmo get block() con extents [0.75 puntos]
Definir la función int get block(struct extent e[], int size, int pos), que devuelve el
número de bloque que contiene la posición del fichero pos (en bytes). size indica el número
de extents que contiene el array e. En caso de que el fichero no contenga un bloque en esa
posición se devolverá -1.
#define BLOCK_SIZE ...
struct extent {
int start;
int size;
}
3. Algoritmo get block() con estructura de árbol tipo Unix [1.75 puntos]
Definir la función int get block(struct inode *ino, int pos), que devuelve el número
de bloque que contiene la posición del fichero pos (en bytes). En caso de que el fichero no
contenga un bloque en esa posición se devolverá -1. Se puede usar la función block read()
para acceder a los bloques de indices necesarios.
#define BLOCK_SIZE ...
struct inode {
struct device *dev;
int size;
int direct[10];
int indirect;
int double;
...
}
int block_read(struct device *dev, void *buff, int num);
4. Algoritmo de segunda oportunidad [1.75 puntos]
Dada la siguiente secuencia de accesso a páginas:
P0, P1, P2w, P3, P4, P1, P5w, P2, P6w, P1, P2w ....
(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
1
0
1
0
0
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.
5. Función mfs open() de un sistema de ficheros [4 puntos]
Defina la función int mfs_open(char *name, int flags), para el sistema de ficheros mfs.
Dado un nombre de fichero, busca el nombre del fichero en el directorio raı́z
La función dado en nombre de fichero, busca el nombre del fichero en el directorio apuntado
por el inodo que se le pasa como segundo argumento. Considerese:
O CREAT para crear ficheros. Hay que añadir también la entrada en el directorio
raı́z.
La función devuelve el ı́ndice en el array de ficheros abiertos en que se leı́do el inodo
del fichero o -1 en caso de error.
Pueden suponerse definidos las siguientes funciones y structuras:
struct super_block {
int block_size;
int num_inodes;
int num_bitmap;
int num_data_blocks;
int root_inode;
};
struct extent {
...
};
struct disk_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 disk_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);
int get_free_inode(struct file_system *fs);
Asumase que la variable fs esta inicializada correctamente.
La función get free inode() devuelve un número de inodo correctamente inicializado
para un fichero vacı́o.
Descargar