Apellidos: Nombre: Sistemas Operativos Ingenierı́a Informática de Sistemas Examen Junio 2010 1. Juego de Pelota con procesos [3 puntos] Implementar una función void ball game(int num players). que use procesos para simular jugadores. La función a implementar por cada proceso es: Esperar hasta recibir la pelota. No deben existir races entre los procesos. Una vez recibida la pelota escribirá "Player <pid>gets ball" y a continuación "Player <pid>send ball to player <pid>". Pueden usarse las funciones, que son atómicas. pid t fork(); int printf(const char ∗format, . . . ) ; pid t getpid(void); pid t ball who(void); pid t ball next(void); void ball send(pid t next); 2. Rename en mfs[2 puntos] Implemente la función int mfs rename(const char *oldpath, const char *newpath) sin subdirectorios. Para ello puede usar las siguientes funciones: #define ENTRYSIZE . . . struct entry { char name[ENTRYSIZE] ; short inode; }; struct file system { struct disk inode root; ... }; #define BLOCKSIZE . . . int data read(struct file system ∗fs , void ∗buffer , int block num); int data write(struct file system ∗fs , void ∗buffer , int block num); 3. Inodos [2 punto] Dado un sistema de ficheros en el que: El tamaño de bloque es 8KB. El tamaño de puntero a bloque es 8bytes. En el inodo existen: • • • • 10 punteros directos a bloques. 1 puntero indirecto. 1 puntero doblemento indirecto. 1 puntero triplemente indirecto. Calcular: Número de bloques usado por un fichero de 450MB. En que bloque esta la posicion: 6543216541. 4. Función file write() con extents [3 puntos] Defina la función int file write(struct file system *fs, struct disk inode *ino, void *buffer, int block num)) que dado un inodo y un bloque dentro del fichero, escribe el bloque correspondiente del sistema de ficheros. Si es necesario asignará espacio. La función get next free() devuelve el siguiente bloque libre a partir del pasado como argumento (y lo marca como ocupado). Si no existe un bloque libre devuelve -1. struct file system { int blocksize ; ... }; struct extent { int start ; int size ; }; #define EXTENTS . . . struct disk inode { int num blocks; struct extent e[EXTENTS] ; ... }; int data read(struct file system ∗fs , void ∗buffer , int block num); int data write(struct file system ∗fs , void ∗buffer , int block num); int get next free(int block num);