0% encontró este documento útil (0 votos)
26 vistas4 páginas

Práctica IPC y Sincronización SO

Este documento presenta el código para simular el problema del transporte de animales en un bote. Se definen variables globales para contar la cantidad de cabras y lobos, y variables de sincronización como locks y semáforos para controlar el acceso al bote. Se implementan funciones para que los animales intenten subir al bote de forma segura y coordinada, y funciones para remar el bote y avisar cuando llega a la otra orilla.

Cargado por

Galileo Cappella
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
26 vistas4 páginas

Práctica IPC y Sincronización SO

Este documento presenta el código para simular el problema del transporte de animales en un bote. Se definen variables globales para contar la cantidad de cabras y lobos, y variables de sincronización como locks y semáforos para controlar el acceso al bote. Se implementan funciones para que los animales intenten subir al bote de forma segura y coordinada, y funciones para remar el bote y avisar cuando llega a la otra orilla.

Cargado por

Galileo Cappella
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Práctica Primer Parcial SO

Galileo Cappella
2c 2022

Contents
1 Práctica 2

1
1 Práctica
1. IPC

hijeGane()
1: printf(”Gané %i\n”, hijeIdx);
2: exit(0);

2
juegoIPC()
1: int cantHijes = 10; ▷ U: Cantidad de hijes
2: global int hijeIdx = cantHijes; ▷ U: Índice como hije; NOTA: La defino como una
variable global
3: int hijes[cantHijes][2]; ▷ U: Pipes para cada hije, y luego el padre va a tener en [i][1] el
pid de cada hije, o -1 si perdió
4:
5: while – –hijeIdx > -1 do ▷ A: Creo a les hijes
6: if pipe(hijes[hijeIdx]) == -1 then ▷ A: Pipes para este hije
7: perror(”hpipe\n”);
8: exit(1);
9: end if
10: pid t pid = fork();
11: if pid == -1 then ▷ A: Hubo un error
12: perror(”fork\n”);
13: exit(1);
14: else
15: if pid == 0 then ▷ A: Soy le hije, cierro los pipes que no uso, y dejo de forkear
16: for int i = hijeIdx; i < cantHijes; i++ do
17: close(hijes[i][0]);
18: end for
19: break;
20: else ▷ A: Soy el padre
21: close(hijes[hijeIdx][1]);
22: hijes[hijeIdx][1] = pid; ▷ A: Reutilizo este espacio para el pid
23: end if
24: end if
25: end while
26:
27: if hijeIdx == -1 then ▷ A: Soy el padre
28: int numero = rand() * 50; ▷ A: Asumo que rand devuelve un número entre 0 y 1
29: int sobreviven = cantHijes; ▷ U: Cantidad de hijes que sobreviven
30: while sobreviven > 1 do ▷ A: Juego hasta que gane algune hije
31: for int i = 0; i < cantHijes; i++ do ▷ A: Leo sus números
32: if hijes[i][1] != -1 then ▷ A: Sigue jugando
33: int numeroHije;
34: read(hijes[i][0], *numeroHije, sizeof(numeroHije));
35: if numeroHije > numero then ▷ A: Perdió
36: kill(hijes[i][1], SIGKILL);
37: close(hijes[i][0]);
38: hijes[i][1] = -1;
39: sobreviven– –;
40: end if
41: end if
42: end for
43: end while
44: for int i = 0; i < cantHijes; i++ do 3▷ A: Busco a le hije que haya ganado (si hay)
45: if hijes[i][1] != -1 then ▷ A: Le encontré
46: kill(hijes[i][1], SIGTERM);
2. Mem
3. Sync

Globals
1:#define CABRA 0
2:#define LOBO 1
3:int animales[2] = {0, 0};
4:TTASLock bote = false;
5:Mutex remando = false;
6:semáforo llego;

animal(int especie)
1: ▷ NOTA: Asumo que cada animal sabe si es lobo o cabra, lo tomo como parámetro,
especie == CABRA || especie == LOBO
2: while 1 do ▷ A: Intento subirme hasta poder
3: bote.lock();
4: if !remando.get() && ((animales[CABRA] + animales[LOBO]) < 4) && ((especie
== CABRA && animales[LOBO] != 3) || (especie == LOBO && animales[CABRA]
!= 3)) then ▷ A: No está en viaje y hay espacio para mı́
5: animales[especie]++; ▷ A: Me subo
6: bote.unlock();
7: abordar();
8: break; ▷ A: Dejo de esperar
9: else
10: bote.unlock();
11: end if
12: end while
13:
14: if remando.testAndSet() then ▷ A: Ya hay alguien remando
15: llego.wait();
16: else ▷ A: Tengo que remar yo
17: remar();
18: llego.signal();
19: end if
20: bote.lock();
21: animales[especie]– –;
22: if (animales[CABRA] + animales[LOBO]) == 0 then ▷ A: Soy el último
23: remando.set(false);
24: ▷ NOTA: Asumo que el bote vuelve instantáneamente cuando me bajo
25: end if
26: bote.unlock();
27: return ;

También podría gustarte