Sistemas Operativos I (I.T.I.S.) Resolución de problemas (1) SM23 curso académico 2006-2007 Solución 1. Esta sería una solución con espera activa. #include <sys/stat.h> #include <fcntl.h> main () { int fd; fd = -1; if (fork()!=0) { /* P1*/ while (fd == -1) fd = open ("f", O_RDWR | O_CREAT | O_EXCL, S_IRWXU); /* REGION CRITICA */ close (fd); unlink ("f"); } else { /* P2 */ while (fd == -1) fd = open ("f", O_RDWR | O_CREAT | O_EXCL, S_IRWXU); /* REGION CRITICA */ close (fd); unlink ("f"); } } 2. La espera pasiva se puede implementar con señales. #include <sys/stat.h> #include <fcntl.h> #include <signal.h> void trata () {} main () { struct sigaction tratamiento_senial; int fd, pid; tratamiento_senial.sa_handler = trata; sigaction (SIGUSR1, &tratamiento_senial, 0); 1 Sistemas Operativos I (I.T.I.S.) Resolución de problemas (1) SM23 curso académico 2006-2007 fd = -1; pid = fork(); if (pid !=0) { /* P1*/ while (fd == -1) { fd = open ("f", O_RDWR | O_CREAT | O_EXCL, S_IRWXU); if (fd == -1) pause(); } /* REGION CRITICA */ close (fd); unlink (“f”); kill (pid, SIGUSR1); } else { /* P2 */ while (fd == -1) { fd = open ("f", O_RDWR | O_CREAT | O_EXCL, S_IRWXU); if (fd == -1) pause(); } /* REGION CRITICA */ close (fd); unlink (“f”); kill (getppid(), SIGUSR1); } } El problema es que un proceso puede enviar la señal antes de que el otro entre en el pause(), con lo que éste último se quedaría bloqueado indefinidamente. 3. La solución con pipes sería: main () { int fd[2]; char c; c= 'a'; pipe (fd); write (fd[1], &c, 1); if (fork()!=0) { /* P1*/ read (fd[0], &c, 1); /* REGION CRITICA */ write (fd[1], &c, 1); } else { /* P2 */ read (fd[0], &c, 1); /* REGION CRITICA */ write (fd[1], &c, 1); } } 2 Sistemas Operativos I (I.T.I.S.) Resolución de problemas (1) SM23 curso académico 2006-2007 4. Glosario Proceso: Un programa en ejecución. Paralelismo: Ejecución simultanea en el tiempo de varios procesos. Región crítica: Zona de código que debe ejecutarse en exclusión mutua. Exclusión mutua: Condición que impone que la existencia de un proceso en un tiempo y un espacio impide la existencia en el mismo espacio y tiempo de otros procesos. Llamada al sistema: Una instrucción de la máquina virtual implementada por un sistema operativo. Espera activa: Estado en el que un proceso se está ejecutando pero no avanza debido a que está esperando a que se cumpla una condición. Espera pasiva: Estado en el que un proceso está suspendido esperando a que se cumpla una cierta condición. Pipe: Un pseudofichero que puede utilizarse para comunicar procesos. Señal: Interrupción software utilizada para indicar la ocurrencia de un evento. Mapa conceptual 3