Práctica 2: Sincronización. Implementar semáforos generales a partir de semáforos binarios según la implementación de Hemmendinger y utilizarlos para solucionar el problema de los filósofos comensales. Comprobar el funcionamiento ejecutando varios filósofos desde distintas ventanas.
Comentarios:
Hay que hacer DOS programas
Cada filósofo, en lugar de un bucle infinito, se ejecuta n veces (n predeterminado a 50).
Es decir, sería algo así:
Dado que no se ha visto la compartición de memoria, las variables compartidas por los procesos
se simularán en fichero utilizando para ello las llamadas al sistema open, read, write, lseek y
close según sea necesario.
Las funciones piensa() y come() dejan al filósofo en espera un tiempo aleatorio e imprimen la
hora a la que empieza y termina de comer o pensar el filósofo en cuestión. LA UNICA salida que
realiza por pantalla cada filósofo es la de las funciones piensa y comE, y además, dicha
salida la hará con la llamada al sistema write, como en el código que se muestra
a continuación:
Deben implementarse semáforos generales a partir de semáforos binarios según la implementacion
de Hemmendinger. Los semáforos binarios se implementarán haciendo uso de que en UNIX la llamada
open cuando intenta crear un fichero en modo exclusivo lo hace de manera atómica. Así, las
operaciones binarias Pb y Vb quedarían:
La implementación de los semáforos generales debe incluir:
IMPORTANTE
Debe además tenerse en cuenta que:
FORMA DE ENTREGA
Como en la práctica anterior.
FECHA DE ENTREGA: SEMANA 19 AL 23 DICIEMBRE 2005
filosofo (int i)
{
int veces=N;
while (--veces){
toma_cubiertos (i);
come(i);
deja_cubiertos(i);
piensa(i);
}
}
void piensa(int i)
{
char mensaje [MAXCADENA];
time_t t;
pid_t p;
p=getpid();
t=time(NULL);
sprintf (mensaje,"filosofo %d (%u): Comienzo a pensar a las %s",i,p,ctime(&t));
write (STDOUT_FILENO,mensaje,strlen(mensaje));
/*esperar tiempo aleatorio entre 0 y 5 segundos*/
sprintf (mensaje,"filosofo %d (%u): termino de pensar a las %s",i,p,ctime(&t));
write (STDOUT_FILENO,mensaje,strlen(mensaje));
}
Pb (char * s)
{
int df
while ((df=open(s,O_CREAT | O_EXCL))==-1);
close (df);
}
Vb(char * s)
{
unlink (s);
}