Preguntas cortas. (1 punto) Justifica todas las respuestas. Una pregunta sin justificar se considerará incorrecta. 1. Es posible que dos canales de dos procesos distintos compartan la misma entrada de la tabla de ficheros abiertos? En caso afirmativo, indica qué llamada (s) pueden provocar esta situación. 2. En un sistema de asignación de bloques de disco basado en una FAT. Qué tamaño (número de entradas) tendrá la FAT si la partición que tenemos tiene un tamaño de 1GB y el tamaño de bloque es de 1KB? Qué información se guarda en la tabla? 3. Cómo se asocia un dispositivo físico con un dispositivo lógico? 4. Con qué llamada(s) a sistema se asocia un dispositivo virtual (o canal) con un dispositivo lógico? 1
2
Nombre y apellidos: Problema 1 (5 puntos) Si tenemos el siguiente esquema de directorios y ficheros: / sources src src.c.c Tenemos, además, la siguiente información: Los ficheros y que hay en el directorio / son hard links a los que hay en sus respectivas carpetas /sources/// y /sources///. Sabemos que el tamaño de bloque son 4KB Los tamaño de los ficheros son (respectivamente).c (4KB),.c (6KB), /sources/ /// (8KB), /sources/// (8KB), // (8KB) y // (8KB) a) Asigna un i-nodo a cada elemento del esquema de directorios y anótalo junto a su nombre en la siguiente figura. Utiliza el i-nodo 0 como el i-nodo raíz. / sources src src.c.c Num i-nodo Num. refs Bloques datos tipo b) Asigna bloques de datos a cada elemento del esquema de directorio y rellena los i-nodos de la figura siguiente. Para el tipo de fichero utiliza las siguientes etiquetas: dat=fichero normal, dir=directorio, link=soft link. Indica también el contenido de los bloques de datos en caso de los directorios. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3
Num. Bloque 0 1 2 3 4 5 6 7 8 9 Num. Bloque 10 11 12 13 14 15 16 17 18 19 c) Usando el esquema de directorios anterior, indica qué accesos supone hacer cada llamada a sistema de las siguientes secuencias sabiendo que: o El sistema no dispone de buffer cache y el superbloque ya está en memoria. Además asumiremos que 1 inodo ocupa 1 bloque de disco. o Los ficheros no se han accedido previamente o Cada secuencia es independiente de la anterior. Es decir, cuando hagas los cálculos de la secuencia 2 la secuencia 1 no se ha ejecutado. Secuencia 1 fd=open( /source///,o_rdonly); eek(fd,4096,seek_set); read(fd,buffer,256); 4
Secuencia 2 fd=open( //,O_RDONLY); dup2(fd,0); eek(0,4096,seek_set); read(0,buffer,256); 5
6
Problema 2 (4 puntos) Volem fer e següents programes: El programa ping i ha de rebre com a argument un nombre enter. Aquest programa ha de crear dos nous processos, connectant circularment les seves respectives entrades i sortides estàndard a través de dos pipes sense nom, i cada procés executarà el programa pong. A continuació, el procés pare escriurà el nombre enter (en format int) al primer fill i a partir d aquí, cada segon, enviarà alternadament un signal de tipus SIGUSR1 a un fill diferent. El procés pare acabarà quan e dos fil aca. El programa pong i consistirà d un bucle el qual mentre no EOF ha d esperar un signal de tipus SIGUSR1, llegir un valor enter per l entrada estàndard, escriure l per la sortida d error, incrementarlo en 1, i escriure el nou valor per la sortida estàndard. Quan ha enviat 100 nombres, el programa acaba amb exit. A continuació teniu una proposta (incorrecta) de codi tant per al programa ping com per al programa pong (no s inclou el codi de tractament d errors per a facilitar la llegibilitat del codi). /* PING */ 1. int pids[2]; 2. int turno = 0; 3. f_alarma(int signum){ 4. kill(pids[turno],sigusr1); 5. turno=(turno+1)%2; 6. alarm(1); 7. } 8. f_sigusr1 (int signum){ 9. llegir = 1; 10. } 11. main (int argc, char *argv[]){ 12. int fd_h1_h2[2]; 13. int fd_h2_h1[2]; 14. int i=0; 15. signal(sigalrm,f_alarma); 16. signal(sigusr1, f_sigusr1); 17. pids[0]=fork(); 18. if (pids[0]==0){ 19. pipe(fd_h1_h2); 20. execlp( pong, pong,(char *)NULL); 21. exit(1); 22. } 23. pids[1]=fork(); 24. if (pids[1]==0){ 25. pipe(fd_h2_h1); 26. execlp( pong, pong,(char *)NULL); 27. exit(1); 28. } 29. close (fd_h2_h1[1]); close (fd_h2_h1[0]); 30. close (fd_h1_h2[0]); close (fd_h1_h2[1]); 31. write (1, argv[1], sizeof(int)); 32. alarm(1); 33. while(waitpid(-1,null,0)>0); 34. 35. } /* PONG */ 1. int llegir = 0; 2. f_sigusr1 (int signum){ 3. llegir = 1; 4. } 5. main (){ 6. int count = 0; 7. while (count < 100){ 8. while (llegir == 0) ; 9. read(0,&valor, sizeof(valor); 10. write (2, &valor, sizeof(valor); 11. valor ++; 12. write(1,&valor,sizeof(valor)); 13. count ++; 14. } 15. } 7
Us demanem que contesteu raonadament a les següents preguntes sobre la funcionalitat d aquests codis, per tal de enumerar i solucionar e seus errors. Per a casos en el que la funcionalitat no és l especificada a requeriments, indiqueu a més a més com modificaríeu aquest codi per a solucionar-ho: quines línies de codi esborraríeu o modificaríeu, i quines línies de codi afegiríeu indicant la seva posició. a) Es crea el número de processos demanat pe requeriments? I es crea el número de pipes demanat? Representa la jerarquia de processos que es crea. b) A La següent figura teniu representat l estat de la taula de cana del procés pare i de la taula de fitxers oberts i de la taula d inodes just al començament de l execució del procés pare. Completeu aquesta figura afegint totes les taules de cana necessàries i representeu l estat de la taula de fitxers oberts, de la taula d inodes i de la taula de cana de tots e processos, suposant que el procés pare es troba just abans d executar les sentències de la línia 29 i e processos fil just abans de mutar per a executar el programa pong. 8
T.Cana pare T.Fitxers Oberts Taula I-nodes Canal 0 Entrada TFO Pos. mode #refs punt. Entrada lect/escr t.inode 0 rw 9 -- 0 Pos #refs Inode 0 1 I_tty 1 2 3 4 5 6 c) La creació de las pipes sense nom es fa en el punt adequat del codi per tal de que e dos processos pong les puguin utilitzar per a intercanviar e valors? d) La configuració de cana estàndard de procesos pong és l adequada segons e requeriments? 9
e) El programa ping accedeix a la pipe sense nom de forma correcta per a enviar el valor al primer fill? Aquest valor s envia en el format adequat? f) El programa ping gestiona de manera correcta l enviament cada segon d un signal SIGUSR1 a fil de manera alternada? g) E processos que executen el programa pong gestionen de manera adequada el signal SIGUSR1? h) El procés ping detecta de manera adequada el moment en el que ha d acabar l execució? 10
11