Sistemas Operativos. Apuntos
Omar MendozaApuntes16 de Diciembre de 2015
352 Palabras (2 Páginas)120 Visitas
Omar Francisco Cajtic Mendoza[pic 1]
2007-14554
Sistemas Operativos 2
Corto 1
Explique un sistema operativo como una maquina jerárquica.
Es una organización del software, donde una parte del sistema contiene subpartes y esto organizado en forma de niveles. El sistema operativo se divide en pequeñas partes, de tal forma que cada una de ellas está perfectamente definida y con una clara interface con el resto de elementos.
[pic 2]
Dado un puente donde solo puede pasar un carro a la vez. Desarrolle una solución con semáforos tal que una vez un auto de un lado entre al puente, todos los de ese lado pasaran y los del otro lado esperaran hasta que esté libre el puente.
Interacción entre autos lado A | Interacción entre autos lado B |
Puente.EntradaA | Puente.EntradaB |
Delay(x) | Delay(y) |
Puente.SalidaA | Puente.salidaB |
La prioridad de paso se otorga al lado A.
El procedimiento cierra_puente() bloquea el puente para que solo circule en una dirección.
Implementando 5 puntos de entrada
Task Puente is
Entry LlegadaLadoA;
Entry LlegadaLadoB
Entry SalidaLadoA;
Entry SalidaLadoB;
Task Body Puente is
autosA, autosB: integer
Direccion: (norte, sur)
PuenteCerrado: Boolean
begin
autosA := 0;
autosB := 0;
direccion := SUR; // preferencia al azar
PuenteCerrado, carros_esperando : false;
cierra_puente(false);
loop
begin
select
accept llegada_carro;
or
when autosB = 0 and autosA < 2 =>
accept entrada_carro do
if not puente_cerrado then
cerrar_puente(true);
end
puente_cerrado := true;
carros_esperando = true;
or
when carrosA = 0 and carross_esperando = 0 and
llegada_barco'count = 0 and (autosB = 0 or
direccion = SUR) =>
accept LlegadaLadoA do
if puente_cerrado then
cerrar_puente(false);
end
puente_cerado = false;
direccion := SUR;
or
when autosA = 0 and autos_esperando = 0 and
llegada_carros'count = 0 and (autos = 0 or
direccion = NORTE) =>
accept LlegadaLadoB do
if puente_cerrado then
cerrar_puente(false);
end
puente_cerrado = false;
direccion := NORTE;
or
accept salida;
if autosA > 0 then // sale un carro en lado Z
carros_ladoB.wait
else // sale un auto
end // select
end // loop
end Puente
...