PRACTICA
DE SISTEMAS OPERATIVOS
El objetivo de esta práctica
es dar solución al siguiente problema:
Parque Jurásico, está
formado por un museo de dinosaurios y un parque para excursiones de safari.
Hay 4 pasajeros y 2 coches monoplaza. Los pasajeros dan vueltas por el
museo durante un tiempo y después se ponen en fila para dar un paseo
en un coche de safari. Cuando el coche está libre, carga un pasajero
y recorre el parque durante un tiempo aleatorio. Si los 2 coches están
todos dando vueltas a los pasajeros, los que quieren subir deben esperar
; si un coche está listo para recoger pasajeros, pero no hay ninguno
esperando, el coche debe esperar.
Usar semáforos para sincronizar
los procesos de los 4 pasajeros con los de los 2 coches.
SOLUCION:
La solución de este problema
se basa en implementar un algoritmo eficiente en el manejo de semáforos
.Para ello, creamos 3 semáforos:
- Museo : inicializado a 0
- Coche : inicializado a 2
- Finvuelta : inicializado a 1
Para el manejo de los semáforos
se utilizan las siguientes funciones:
- semWait( )
- semSignal( )
- semOpen( )
- semClose( )
Estas funciones se encuentran en
semaph.c
Este programa crea 6 procesos, 4
para los pasajeros y 2 para los coches de safari.
Se usa TP (retardo aleatorio que
alarga el tiempo de los cálculos) , para simular la vuelta de los
pasajeros por el museo y para simular la vuelta del coche. Para el manejo
del TP incluimos rshmem.c
volver
al principio
IMPLEMENTACION:
- #include "rshmem.h"
- #include <sys/sem.h>
- /* FUNCION PRINCIPAL */
- main() {
- key_t claveCoche; /* cualificador de semaforo */
- key_t claveMuseo; /* cualificador de semaforo */
- key_t claveFinvuelta; /* cualificador de semaforo */
- int Coche, Museo, Finvuelta; /* semaforos */
- /* obtener una clave cualquiera para el recurso ipc */
- if ((key_t) -1 == (claveCoche = ftok("ejemplo",
's')) ||
- (key_t) -1 == (claveMuseo = ftok("ejemplo",
'w')) ||
- (key_t) -1 == (claveFinvuelta = ftok("ejemplo",
'j'))) {
- fprintf(stderr,"main: Error al crear la clave con
ftok(3)\n");
- exit(1);
- }
- /* creamos los semaforos, asignando los valores iniciales
*/
- if (-1 ==(Coche = semCreate(claveCoche,2))){
- fprintf(stderr,"main: No puede crear el semaforo\n");
- exit(1);
- }
- if (-1 ==(Museo = semCreate(claveMuseo,0))){
- fprintf(stderr,"main: No puede crear el semaforo\n");
- semClose(Coche);
- exit(1);
- }
- if (-1 ==(Finvuelta = semCreate(claveFinvuelta,1))){
- fprintf(stderr,"main: No puede crear el semaforo\n");
- semClose(Coche);
- semClose(Museo);
- exit(1);
- }
- /* PROCESO 1 */
- if (0!=fork()) {
- int i ;
- for (i=0; i< 1000; i++){
- TP
- semSignal(Museo);
- semWait(Coche);
- }
- semClose(Museo);
- semClose(Coche);
- exit(0);
- /* PROCESO 2 */
- }else if (0!=fork()){
- int i ;
- if(-1==(Coche=semOpen(claveCoche)))
- fprintf(stderr,"No tengo el cualificador de Coche\n");
- if(-1==(Museo=semOpen(claveMuseo)))
- fprintf(stderr,"No tengo cualificador de Museo\n");
- for (i=0; i< 1000; i++){
- TP
- semSignal(Museo);
- semWait(Coche);
- }
- semClose(Museo);
- semClose(Coche);
- exit(0);
- /* PROCESO 3 */
- }else if (0!=fork()){
- int i ;
- if(-1==(Coche=semOpen(claveCoche)))
- fprintf(stderr,"No tengo el cualificador de Coche\n");
- if(-1==(Museo=semOpen(claveMuseo)))
- fprintf(stderr,"No tengo cualificador de Museo\n");
- for (i=0; i< 1000; i++){
- TP
- semSignal(Museo);
- semWait(Coche);
- }
- semClose(Museo);
- semClose(Coche);
- exit(0);
- /* PROCESO 4 */
- }else if (0!=fork()){
- int i ;
- if(-1==(Coche=semOpen(claveCoche)))
- fprintf(stderr,"No tengo el cualificador de Coche\n");
- if(-1==(Museo=semOpen(claveMuseo)))
- fprintf(stderr,"No tengo cualificador de Museo\n");
- for (i=0; i< 1000; i++){
- TP
- semSignal(Museo);
- semWait(Coche);
- }
- semClose(Museo);
- semClose(Coche);
- exit(0);
- /* PROCESO 5 */
- }else if (0!=fork()){
- int i ;
- if(-1==(Coche=semOpen(claveCoche)))
- fprintf(stderr,"No tengo el cualificador de Coche\n");
- if(-1==(Museo=semOpen(claveMuseo)))
- fprintf(stderr,"No tengo cualificador de Museo\n");
- if(-1==(Finvuelta=semOpen(claveFinvuelta)))
- fprintf(stderr,"No tengo el cualificador de Finvuelta\n");
- for (i=0; i< 1000; i++){
- semWait(Museo);
- semWait(Finvuelta);
- semSignal(Coche);
- TP
- semSignal(Finvuelta);
- }
- semClose(Museo);
- semClose(Coche);
- semClose(Finvuelta);
- exit(0);
- /* PROCESO 6 */
- }else {
- int i;
- if(-1==(Coche=semOpen(claveCoche)))
- fprintf(stderr,"No tengo el cualificador de Coche\n");
- if(-1==(Museo=semOpen(claveMuseo)))
- fprintf(stderr,"No tengo cualificador de Museo\n");
- if(-1==(Finvuelta=semOpen(claveFinvuelta)))
- fprintf(stderr,"No tengo el cualificador de Finvuelta\n");
- for (i=0; i< 1000; i++){
- semWait(Museo);
- semWait(Finvuelta);
- semSignal(Coche);
- TP
- semSignal(Finvuelta);
- }
- semClose(Museo);
- semClose(Coche);
- semClose(Finvuelta);
- exit(0);
- }
- }
volver al principio
Autora: