Sunteți pe pagina 1din 3

Ejercicios IPC

1. Se desea desea implementar una biblioteca de sem´aforos contadores para un sistema


operativo que SOLO ´ dispone de un compilador de C y de sem´aforos binarios, que s´olo
pueden adoptar los valores cero y uno, con el siguiente interfaz:

BSemaph BSemaph_Create(char nombre[], int valor_inicial);


void BSemaph_Destroy(char nombre[], BSemaph bs);
void BSemaph_Down(BSemaph bs);
void BSemaph_Up(Bsemap bs);

Se pide:
Apartado a .- Declarar los campos necesarios para el nuevo tipo de datos llamado Semaph.
¿Cu´antos sem´aforos binarios necesita y por qu´e?
Apartado b .- Escribir el c´odigo C que implemente una funci´on constructora que dado un
nombre y un valor, cree un nuevo sem´aforo contador con dicho nombre y dicho valor
inicial.
Apartado c .- Escribir dos funciones C para implementar las operaciones Up y Down.

2. Suponga que los siguientes 2 procesos, Foo y Bar, son ejecutados concurrentemente en un
S.O. preemptive y comparten los contadores generales de los semáforos A y B (ambos
inicializados en 1) y la variable entero count (inicializada en 0):

1. ¿Puede ocurrir deadlock en la ejecución concurrente de los procesos, Foo y Bar?. En caso
afirmativo indicar una secuencia de ejecución que resulte en deadlock, en caso negativo,
explique
porque no.
2. ¿Puede la ejecución de los dos procesos resultar en starvation de alguno de los dos
procesos? En
caso afirmativo, indicar una secuencia de ejecución que justifique su respuesta, en caso
negativo, explique porque no.
3. ¿Considera que el acceso a los recursos críticos se encuentra correctamente
sincronizado?
3. Cuatro alumnos están jugando en clase un juego de cartas que implica coordinación (no
saltearse los turnos) y exclusión mutua (mientras uno toma una carta o la cambia con el
compañero el resto debe esperar a que finalice para no quitarse la carta de la mano). Se
plantea tomar como base esta experiencia para implementar una arquitectura de
comunicación entre procesos que permita realizar una práctica de inteligencia artificial en
la que cada alumno codificara su estrategia dentro de las siguientes funciones aisladas:

Todos los procesos serán hijos de un proceso principal denominado partida, y por lo tanto
heredarán a través de la función fork() y exec() correspondiente una serie de semáforos
inicializados de la siguiente manera:
#define NUMERO_DE_JUGADORES 4
#define NUMERO_DE_CARTAS 40
#define SIGUIENTE (IDENTIFICACIÓN_DE_JUGADOR) ((IDENTIFICACIÓN_DE_JUGADOR + 1)
% NUMERO DE JUGADORES)
Semáforo esperar [NUMERO_DE_JUGADORES]
User_ID cartas [NUMERO_DE_CARTAS

Se pide:
a) Intercalar en el código propuesto para proceso_jugador() las funciones wait y signal
necesarias sobre los semáforos esperar[IDENTIFICADOR_DE_JUGADOR] y
esperar[SIGUIENTE (IDENTIFICADOR_DE_JUGADOR)] para asegurar el correcto
funcionamiento del mismo, es decir, que cada jugador deba esperar su turno antes de poder
ejecutar jugar().
b) ¿Cómo debe estar inicializado el array de semáforos para que funcione, es decir, empiece
el primer jugador y ceda el turno al siguiente y así sucesivamente, quedando bloqueado
cada cual hasta que le toque el turno?
c) En el caso que jugar() no se ejecute de forma atómica, ya que tendrá que modificar al
menos dos entradas de la tabla carta. ¿Habría que incorporar algo para garantizar la
exclusión mutua en la ejecución de jugar()? De ser necesario, escribir el código. De no serlo,
explicar por que.

4. En una aeropuerto que se utiliza como base de operaciones de una flota de aviones,
tenemos por un lado los aviones, las 10 pistas de aterrizaje / despegue y dos controladores
aéreos encargados de gestionar todos los pedidos de los aviones. Uno de ellos se encarga
de los pedidos de pistas para aterrizaje o despegue y otro de la liberación de las pistas
cuando los aviones han finalizado dichas maniobras. Las pistas se pueden utilizar para
despegar o aterrizar según se desee. Para poder utilizar una pista, los aviones deben
solicitarla previamente al controlador de entrada y, una vez que hayan aterrizado o
despegado, avisar al controlador de salida devolviéndole la pista al conjunto de pistas libres.
Cada avión, en principio, se encuentra en el hangar realizando tareas de mantenimiento,
para más tarde pasar a solicitar una pista a la torre de control. El avión entonces usa la pista
para despegar y avisa al controlador que dejo la pista libre. Cuando un avión decide
aterrizar, realizará idénticas acciones a las que se acaban de describir. Teniendo en cuenta
el siguiente código, se pide que lo sincronice convenientemente utilizando semáforos para
que no se produzca ni deadlock, ni starvation, indicando el tipo y los valores iniciales de los
mismos.

S-ar putea să vă placă și