You are on page 1of 4

Universidad Nacional de San Antonio Abad del Cusco

Departamento Acadmico de Informtica


Programacin Concurrente y Distribuida

Prctica N 3
Semforos
Ing. Ivn Medrano Valencia

1. OBJETIVO.
En la Prctica N 2 se pudo comprobar que cmo dos proceso cooperantes sin hacer
ninguna consideracin de concurrencia lleva a un comportamiento anmalo. Esto llev a la
conclusin de que es necesario algn mecanismo de exclusin mutua: mientras un
proceso est accediendo al recurso compartido hay que impedir que otros procesos
puedan acceder al mismo. El objetivo de esta prctica es lograr la exclusin mutua
utilizando el mecanismo semforo.
2. BASE TEORICA COMPLEMENTARIA
Semforo.
Es una de las primeras herramientas utilizadas para proteger la seccin crtica y lograr la
exclusin mutua, adems sirve para disear protocolos de sincronizacin entre procesos.
Consta de dos operaciones primitivas: P y V
V seala la ocurrencia de un evento (signal)
P se usa para demorar un proceso hasta que ocurra un evento (wait)

P(s): mientras s > 0 s := s - 1


V(s): s := s + 1
Los semforos pueden estar disponibles en un lenguaje de programacin, como
construccin del lenguaje, o como servicio del sistema operativo invocado mediante
llamadas al sistema. Cuando son proporcionados por el sistema operativo, las variables
semforo no son declaradas ni manipuladas en el lenguaje, sino que se manipulan a travs
de llamadas al sistema tales como CREAR_SEMAFORO, ASOCIAR _A_SEMAFORO,
ESPERA, SEAL, CERRAR_SEMAFORO.
En la presente prctica utilizaremos el lenguaje JAVA para implementar semforos.
Implementacin.
class Semaforo
{ protected long a_permisos;
public Semaforo()
{
a_permisos=0;
}
public Semaforo(long p_permisos)
{
a_permisos=p_permisos;
}
public synchronized void V()
{
++a_permisos;

Programacin Concurrente y Distribuida

Semforos

notify();
}
public void P() throws InterruptedException
{
if(Thread.interrupted()) throw new InterruptedException();
synchronized (this)
{
try
{
while (a_permisos <=0)
wait();
--a_permisos;
}
catch (InterruptedException ie)
{
notifyAll();
throw ie;
}
}
}
}

Aqu es necesario aclarar algunos conceptos.


La palabra clave synchronized permite la sincronizacin de mtodos. Una declaracin:
synchronized void f()
{
/* cuerpo del mtodo */
}

es equivalente a:
void f()
{
synchronized (this)
{
/* cuerpo del mtodo */
}
}

3. DESARROLLO DE LA PRACTICA.
Seguiremos tomando como problema a resolver el de la Prctica N 2.
Paso 1.- Compilar y ejecutar los siguientes programas.
public class Movimiento extends Thread
{ float a_monto;
CuentaBanco a_cta;
Semaforo a_mutex;
int a_tiempo;
public Movimiento(CuentaBanco p_cta, float p_monto, int p_tiempo,
Semaforo p_mutex)
{
a_cta=p_cta;
a_monto=p_monto;
a_tiempo=p_tiempo;
a_mutex=p_mutex;
}

Programacin Concurrente y Distribuida

Semforos

public void run()


{
try
{
a_mutex.P(); //--protege la seccin crtica
//--INICIO SECCION CRITICA
float saldo= a_cta.obtenerSaldo();//---obtiene saldo anterior
sleep(a_tiempo); //--la cajera cuenta el dinero
saldo=saldo+a_monto; //--obtiene nuevo saldo
a_cta.actualizarSaldo(saldo);
//-- FIN SECCION CRITICA
a_mutex.V(); //--libera la seccin crtica
}
catch(InterruptedException e)
{
}
}
}
//--aplicacin
class AppBanco
{
public static void main(String[] arg)
{ Semaforo mutex = new Semaforo(1);
CuentaBanco cuenta= new CuentaBanco();
Movimiento abono = new Movimiento(cuenta, 500,400, mutex);
Movimiento cargo = new Movimiento(cuenta, -300,300,mutex);
abono.start();
cargo.start();
try
{
abono.join();
cargo.join();
}
catch(InterruptedException e)
{
}
System.out.println("Saldo Final= "+cuenta.obtenerSaldo());
}
}

Pregunta 1.- Es ahora correcta la ejecucin del programa, explique por qu?.
Pregunta 2.- Cree varios hilos que abonan y varios que retiran dinero de la cuenta y
verifique si hay consistencia en los datos.
TRABAJO:
Suponer que estamos en una discoteca y resulta que est estropeado el servicio de chicas y
todos tienen que compartir el de chicos. Se pretende establecer un protocolo de entrada al
servicio usando semforos en el que se cumplan las siguientes restricciones:

chicas slo puede haber una a la vez en el servicio.


chicos puede haber ms de uno, pero con un mximo de cinco.

Programacin Concurrente y Distribuida

4. BIBLIOGRAFA.
Doug Lea

Semforos

Programacin Concurrente en Java


2da. Edicin.
Addison Wesley 2001.
JAVA How to Program 3ra. Edicin Prentice Hall
1999.
El Lenguaje de Programacin JAVA. 3ra. Edicin.
Addison Wesley 2001

Deitel y Deitel

Ken Arnold
James Goslin
David Holmes
Milenkovic

http://www.oup-usa.org/docs

http://java.sun.com/

Sistemas Operativos Conceptos y Diseo 2da. Edicin.


McGraw Hill 1994.
Oxford University Press

Sun MycroSystems.

You might also like