You are on page 1of 28

Prcticas JBACI

Javier Garca Garca

Prctica 1
1. Escribe el p r o g r a m a e n u n fichero, q u e l l a m a r s E j e m p l o 1 . c m . A c o n t i n u a c i o n , edita el fichero y elimina l a construccion c o b e g i n . Salva el directorio c o n el n o m b r e Ejemplo_serie.cm. Compila a m b o s ejemplos. [Ejemplo1.cm] int n=0; void ContadorEventos(char evento) { int i; for(i=0;i<5;i++) { n = n++; cout << "Evento" << evento << endl; cout << "Cuenta actual:" << n << endl; } } void main() { cobegin { ContadorEventos('a'); ContadorEventos('b'); ContadorEventos('c'); } }

Prcticas JBACI

Javier Garca Garca

[Ejemplo_serie.cm] int n = 0 ; void ContadorEventos(char evento) { int i; for(i=0;i<5;i++) { n = n++; cout < < "Evento" < < evento < < endl; cout < < "Cuenta actual:" < < n < < endl; } } void main() { ContadorEventos('a'); ContadorEventos('b'); ContadorEventos('c');

2.

Ejecuta cinco

veces

cada

uno

de

los

dos

ejemplos

usando

el

interprete

(bainterp Ejemplo1_serie o bainterp Ejemplo1) y almacena la salida obtenida en los ficheros salida_serie y salida, respectivamente. C o m e n t a los resultados obtenidos. [salida_serie.txt] Eventoa Cuenta actual:1 Eventoc Cuenta actual:2 Eventob Cuenta actual:Evento4 a Cuenta actual:4 Eventoc 2

Prcticas JBACI Eventoc Cuenta actual:6 EventoaEventob Cuenta actual: Cuenta actual:7 7 Eventoc Cuenta actual:Evento9 b Eventoa Cuenta actual:10 Cuenta actual:Eventoa Cuenta actual:12 Eventoc12 Cuenta actual:12 Eventob Eventoc Cuenta actual:13 Cuenta actual:13 Eventob Cuenta actual:14 EventoEventoa bCuenta actual:2 Eventoc Cuenta actual:2 Cuenta actual:Eventoc Cuenta actual:3 3Evento c Cuenta actual:4 EventoEventob Cuenta actual:a Cuenta actual:55 Eventoc Cuenta actual:Eventoa Cuenta actual:7 7 Eventoc Cuenta actual:9 Eventoa Cuenta actual:10 3

Javier Garca Garca

Prcticas JBACI Eventob Cuenta actual:9 EventoaEventob Cuenta actual: Cuenta actual:11 11 Eventob Cuenta actual:12 Eventoc Eventoa Cuenta actual:Cuenta actual:2 2 Eventob Cuenta actual:2EventoEventoa Cuenta actual:c Cuenta actual:4 4 Eventoa Cuenta actual:6 Eventoc Cuenta actual:6 EventobEventoc Cuenta actual:8 Cuenta actual:8 Eventoc Cuenta actual:Eventob10 Cuenta actual:11Eventoa Cuenta actual: 11 Eventob Cuenta actual:13 Eventoa Cuenta actual:13 Eventob Cuenta actual:14 Eventoc Cuenta actual:1 EventoEventoc a Cuenta actual:2 Eventob 4

Javier Garca Garca

Prcticas JBACI Eventob Cuenta actual:2 Cuenta actual:Eventoc Cuenta actual:23 Eventoa Cuenta actual:4 Eventob Cuenta actual:6 EventoEventoc Cuenta actual:7 a Cuenta actual:7 Eventob Cuenta actual:8 Eventoa Cuenta actual:9 EventoEventoc b Cuenta actual:11 EventoCuenta actual:a Cuenta actual:12 12 Eventob Cuenta actual:13 EventobEvento a Cuenta actual:2 Cuenta actual:Eventoc Cuenta actual:2 2 Eventoa Cuenta actual:3 Eventoc Cuenta actual:5Evento a Cuenta actual:5 EventoEventoc b Cuenta actual:7Cuenta actual:8 Eventoa Cuenta actual:8 Eventob Cuenta actual:9 5

Javier Garca Garca

Prcticas JBACI Cuenta actual:9 Eventoc Cuenta actual:10 Eventoa Cuenta actual:11 Eventoc Cuenta actual:12 Eventob Cuenta actual:13 Eventob Cuenta actual:14

Javier Garca Garca

[salida.txt] Eventoc Cuenta actual:1 Eventoa Cuenta actual:2 Eventob Cuenta actual:2 Eventoa Cuenta actual:3 EventoEventoa Cuenta actual:5 c Cuenta actual:5 Eventob Cuenta actual:6 Eventoc Cuenta actual:7 EventoEventoa Cuenta actual:c Cuenta actual:9 9 Eventob Cuenta actual:10 EventoEventoa Cuenta actual:c Cuenta actual:11 11 Eventob Cuenta actual:12 Eventob Cuenta actual:13 6

Prcticas JBACI Cuenta actual:13 Eventoa Cuenta actual:1 Eventoa Cuenta actual:3 Eventob Cuenta actual:Eventoc EventoaCuenta actual:4 Cuenta actual:5 5 EventocEventob Cuenta actual:Eventoa Cuenta actual:8 8 Cuenta actual:8 EventoEventoab Cuenta actual:9 Cuenta actual: 9Eventoc Cuenta actual: 10 Eventob Cuenta actual:Eventoc Cuenta actual:12 12 Eventoc Cuenta actual:13 Eventob Cuenta actual:14 Eventoc Cuenta actual:Evento1 a Cuenta actual:2 Eventob Cuenta actual:3 EventoEventoa c Cuenta actual:4 Cuenta actual:4 EventoEventoc Cuenta actual:6 Eventob 7

Javier Garca Garca

Prcticas JBACI Eventob Cuenta actual:a Cuenta actual:77 Eventoc Cuenta actual:8 Eventoc Cuenta actual:9 EventoEventoa Cuenta actual:10 b Cuenta actual:10 Eventoa Cuenta actual:11 Eventob Cuenta actual:12 Eventob Cuenta actual:13 Eventob Cuenta actual:Eventoa Cuenta actual:11 Evento c Cuenta actual:2 EventoEventoc Cuenta actual:a Cuenta actual:44 Eventob Cuenta actual:4 Eventoc Cuenta actual:5 Eventob Eventoa Cuenta actual:7 Eventoc Cuenta actual:7 Cuenta actual:7 Eventoa Cuenta actual:8 EventoEventoc Cuenta actual:a Cuenta actual:1010

Javier Garca Garca

Prcticas JBACI Eventob Cuenta actual:11 Eventob Cuenta actual:12 Eventoa Cuenta actual:Eventoc Cuenta actual:22 Evento EventoEventoc Cuenta actual:3 b Cuenta actual:a Cuenta actual:3 3 EventoEventoc Cuenta actual:5 a Cuenta actual:5 Eventob Cuenta actual:6 EventoEventoa Cuenta actual:7 c Cuenta actual:7 Eventoa Cuenta actual:8 Eventob Cuenta actual:8 EventoEventob c Cuenta actual:Cuenta actual:10 10 Eventob Cuenta actual:11 3. Utiliza la construccion

Javier Garca Garca

para conseguir que la funcion ContadorEventos

sea u n a construccion atomica. Repite los pasos realizados en los ejemplos anteriores. C o m e n t a los resultados. [ContadorEventos.cm] int n = 0 ; atomic void ContadorEventos(char evento) { 9

Prcticas JBACI { int i; for(i=0;i<5;i++) { n = n++; cout < < "Evento" < < evento < < endl; cout < < "Cuenta actual:" < < n < < endl; } } void main() { cobegin { ContadorEventos('a'); ContadorEventos('b'); ContadorEventos('c'); } }

Javier Garca Garca

[salida_Atomic.txt] Eventoc Cuenta actual:1 Eventoc Cuenta actual:2 Eventoc Cuenta actual:3 Eventoc Cuenta actual:4 Eventoc Cuenta actual:5 Eventob Cuenta actual:6 Eventob Cuenta actual:7 Eventob Cuenta actual:8 Eventob Cuenta actual:9 Eventob Cuenta actual:10 10

Prcticas JBACI Cuenta actual:10 Eventoa Cuenta actual:11 Eventoa Cuenta actual:12 Eventoa Cuenta actual:13 Eventoa Cuenta actual:14 Eventoa Cuenta actual:15 Eventoc Cuenta actual:1 Eventoc Cuenta actual:2 Eventoc Cuenta actual:3 Eventoc Cuenta actual:4 Eventoc Cuenta actual:5 Eventob Cuenta actual:6 Eventob Cuenta actual:7 Eventob Cuenta actual:8 Eventob Cuenta actual:9 Eventob Cuenta actual:10 Eventoa Cuenta actual:11 Eventoa Cuenta actual:12 Eventoa Cuenta actual:13 Eventoa Cuenta actual:14 Eventoa Cuenta actual:15 Eventoc Cuenta actual:1 11

Javier Garca Garca

Prcticas JBACI Eventoc Cuenta actual:2 Eventoc Cuenta actual:3 Eventoc Cuenta actual:4 Eventoc Cuenta actual:5 Eventob Cuenta actual:6 Eventob Cuenta actual:7 Eventob Cuenta actual:8 Eventob Cuenta actual:9 Eventob Cuenta actual:10 Eventoa Cuenta actual:11 Eventoa Cuenta actual:12 Eventoa Cuenta actual:13 Eventoa Cuenta actual:14 Eventoa Cuenta actual:15 Eventoc Cuenta actual:1 Eventoc Cuenta actual:2 Eventoc Cuenta actual:3 Eventoc Cuenta actual:4 Eventoc Cuenta actual:5 Eventoa Cuenta actual:6 Eventoa Cuenta actual:7 Eventoa Cuenta actual:8 Eventoa 12

Javier Garca Garca

Prcticas JBACI Eventoa Cuenta actual:9 Eventoa Cuenta actual:10 Eventob Cuenta actual:11 Eventob Cuenta actual:12 Eventob Cuenta actual:13 Eventob Cuenta actual:14 Eventob Cuenta actual:15 Eventoc Cuenta actual:1 Eventoc Cuenta actual:2 Eventoc Cuenta actual:3 Eventoc Cuenta actual:4 Eventoc Cuenta actual:5 Eventoa Cuenta actual:6 Eventoa Cuenta actual:7 Eventoa Cuenta actual:8 Eventoa Cuenta actual:9 Eventoa Cuenta actual:10 Eventob Cuenta actual:11 Eventob Cuenta actual:12 Eventob Cuenta actual:13 Eventob Cuenta actual:14 Eventob Cuenta actual:15

Javier Garca Garca

Prctica 2

13

Prcticas JBACI

Javier Garca Garca

Prctica 2
1. Implemente u n a l g o r i t m o q u e intente resolver el p r o b l e m a d e l a exclusin m u t u a utilizando la solucin errnea 1, estudiada en la exposicin del tema (utilizando d o s variables l g i c a s C E A D e n t r o y C E B D e n t r o y verificando el v a l o r d e estas variables antes d e entrar e n l a seccin crtica). Ejecute el c d i g o o b t e n d i d o c i n c o veces y c o m e n t e el resultado obtenido. {Pract2_1.cm} int P 1 D e n t r o , P 2 D e n t r o ; int n ; void ContEventoA() { int i; for (i=0; i<5; i++) { while (P2Dentro==1); / / Inicio d e la seccin crtica P1Dentro=1; n = n++; cout < < "Evento A" < < endl; cout << "Cuenta actual " << n << endl; P1Dentro=0; / / Fin d e la seccin crtica } } void ContEventoB() { int i; for (i=0; i<5; i++) { while(P1Dentro==1); / / Inicio d e la seccin crtica P2Dentro=1; 14

Prcticas JBACI n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout << "Cuenta actual " << n << endl; P2Dentro=0; / / Fin d e la seccin crtica } } void main() { P1Dentro=0; P2Dentro=0; cobegin { ContEventoA(); ContEventoB(); } }

Javier Garca Garca

2.

H a g a l o m i s m o utilizando la s o l u c i n errnea 2, es decir, utilizando d o s variables

l g i c a s C E A Q u i e r e E n t r a r y CEBQuiereEntrar y verificando el v a l o r d e estas variables d e s p u s d e actualizar el v a l o r d e l a variable p r o p i a . C o m e n t e los resultados d e s p u s de cinco ejecuciones. [Pract2_2.cm] int P 1 Q u i e r e E n t r a r , P 2 Q u i e r e E n t r a r ; int n ; void ContEventoA() { int i; for (i=0; i<5; i++) { P1QuiereEntrar=1; while (P2QuiereEntrar==1); / / Inicio d e la seccin crtica

n = n++; cout < < "Evento A" < < endl; cout << "Cuenta actual " << n << endl; 15

Prcticas JBACI cout << "Cuenta actual " << n << endl; P1QuiereEntrar=0; / / Fin d e la seccin crtica } } void ContEventoB() { int i; for (i=0; i<5; i++) { P2QuiereEntrar=1; while(P1QuiereEntrar==1); / / Inicio d e la seccin crtica n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout << "Cuenta actual " << n << endl; P2QuiereEntrar=0; / / Fin d e la seccin crtica } } void main() { P1QuiereEntrar=0; P2QuiereEntrar=0; cobegin { ContEventoA(); ContEventoB(); } }

Javier Garca Garca

16

Prcticas JBACI 3.

Javier Garca Garca

Implemente a h o r a el a l g o r i t m o d e D e k k e r p a r a resolver el p r o b l e m a . Ejecute el

c d i g o cinco veces y comente los resultados.

int t u r n o ; / / { 1 , 2 } int n ;

{ PRIMERO, SEGUNDO}

int P 1 Q u i e r e E n t r a r , P 2 Q u i e r e E n t r a r ;

void ContEventoA() { int i; for (i=0; i<5; i++) { P1QuiereEntrar=1; while (P2QuiereEntrar==1) { if ( t u r n o = = 2 ) { P1QuiereEntrar=0; while (turno = = 2); P1QuiereEntrar=1; } } / / Inicio seccion critica n = n++; cout < < "Evento A" < < endl; cout << "Cuenta actual " << n << endl; P1QuiereEntrar=0; turno=2; / / Fin seccion critica } } void ContEventoB() { int i; for (i=0; i<5; i++) { P2QuiereEntrar=1; while(P1QuiereEntrar==1) 17

Prcticas JBACI { if ( t u r n o = = 1 ) { P2QuiereEntrar=0; while (turno = = 1); P2QuiereEntrar=1; } } / / Inicio seccion critica n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout << "Cuenta actual " << n << endl; P2QuiereEntrar=0; turno=1; / / Fin seccion critica } } void main() { P1QuiereEntrar=0; P2QuiereEntrar=0; turno=1; cobegin { ContEventoA(); ContEventoB(); } }

Javier Garca Garca

P a r a terminar, i m p l e m e n t e el a l g o r i t m o d e Peterson, ejecute el c d i g o c i n c o 18 veces y comente los resultados

4.

Prcticas JBACI 4.

Javier Garca Garca

P a r a terminar, i m p l e m e n t e el a l g o r i t m o d e Peterson, ejecute el c d i g o c i n c o

veces y comente los resultados

[Peterson.cm] int t u r n o ; / / { 1 , 2 } int P 1 Q u i e r e E n t r a r , P 2 Q u i e r e E n t r a r ; int n ; void ContEventoA() { int i; for (i=0; i<5; i++) { P1QuiereEntrar=1; turno=2; while ( (P2QuiereEntrar==1) & & (turno==2) ) ; / / Inicio seccion critica n = n++; cout < < "Evento A" < < endl; cout << "Cuenta actual " << n << endl; P1QuiereEntrar=0; / / Fin seccion critica } } void ContEventoB() { int i; for (i=0; i<5; i++) { P2QuiereEntrar=1; turno=1; while( (P1QuiereEntrar==1) & & (turno==1) ); / / Inicio seccion critica n = n++; c o u t < < " E v e n t o B" < < e n d l ; cout << "Cuenta actual " << n << endl; P2QuiereEntrar=0; 19

Prcticas JBACI

Javier Garca Garca

/ / Fin seccion critica } } void main() { P1QuiereEntrar=0; P2QuiereEntrar=0; turno=1; cobegin { ContEventoA(); ContEventoB(); } }

20

Prcticas JBACI

Javier Garca Garca

Prctica 3
1. El proceso productor generar n m e r o s d e 100 en 100. Estos n m e r o s tienen q u e colocarse en u n array d e enteros (recurso c o m p a r t i d o ) d e t a m a o 10 (es decir, p u e d e h a b e r u n m x i m o d e 10 n u m e r o s distintos e n el buffer). El p r o c e s o c o n s u m i d o r t o m a r los nmeros del buffer y los mostrar en pantalla. Implemente mediante semforos u n a solucin al problema presentado. {Productor_Consumidor.cm} int pos; semaphore lleno=10; binarysem s=1; semaphore vacio=0; int vector[10]; void insertar(int i) { vector[pos]=i; pos++; } int coger() { pos--; return vector[pos]; } void Productor() { int i,numero; while(1) { for(i=0;i<100;i++) { wait(lleno); numero=random(100); wait(s); insertar(numero); signal(s); signal(vacio); } 21 //Salida de la seccin crtica //Al insertar un elemento enviamos seal //Espera a poder entrar al vector //Espera si est lleno //Funcin Productor() //Funcin que recoge un elemento de vector //Variable posicin //Semaforo lleno, max 10 elementos. //Semaforo binario //Semaforo vacio //Buffer mximo de 10 //Funcion que inserta un elemento el vector

Prcticas JBACI

Javier Garca Garca

} } void Consumidor() { while(1) { wait(vacio); wait(s); cout<< coger()<< endl; signal(s); signal(lleno); } } void main() { cobegin { Productor(); Consumidor(); } } //Salida de la seccin crtica //Espera a que no est vaco //Espera a poder entrar al vector //Funcin Consumidor()

22

Prcticas JBACI

Javier Garca Garca

Prctica 4
1. Implemente, u s a n d o la construccin atomic, la instruccin TSL. Utilcela p a r a resolver el p r o b l e m a d e exclusin m u t u a q u e se p l a n t e o p a r a resolver el p r o b l e m a d e exclusin m u t u a d e la prctica 1. A continuacin, implemente las funciones wait() y signal() d e los semaforos, c o n n o m b r e s espera() y sigue() utilizando la instruccin TSL. R e h a g a l a p r c t i c a tres u s a n d o las construcciones anteriormente implementadas, c o m p r o b a n d o que funcionan correctamente. /* Variables globales*/

t y p e d e f int s e m a f o r o [ 2 ] ; / / L a estructura S e m a f o r o es u n tipo d e d a t o c o m p u e s t o d e d o s c a m p o s // // C o n t a d o r de procesos [0] Identificador de proceso [1]

int v e c t o r [ 1 0 ] ; int p o s ; semaforo lleno; semaforo vacio; s e m a f o r o s; int c e r r o j o ;

/ * Estructura TSL * / a t o m i c int T S L ( i n t & i) { if ( i = = 0 ) { i=1; return 1; } else { return 0; } } /* Funcion Espera */ v o i d e s p e r a ( s e m a f o r o & s) { int m _ c o n t p r o c ; estructura / / U s a m o s u n a variable t e m p o r a l p u e s t o q u e el a c c e s o a l a 23

Pr c t im ca so JB C int _c nA tp r Io c ; estructura

av e reG rc a rc a / / U s a m o s u n a v a r i a b l e t e m p o r a l p u e s t oJ q u ie l ac c e sG oa a l a

//semaforo n o funciona correctamente while(!TSL(cerrojo)); m_contproc=s[0]; m_contproc--; s[0]=m_contproc; cerrojo=0; //... Fin Seccion critica / / D e c r e m e n t a m o s el c o n t a d o r //Espera i m p r o d u c t i v a hasta q u e se a b r a //... Seccion critica

c o u t < < " \ n E s p e r a n d o . . . [ " m _ c o n t p r o c < < "]" < < e n d l ; if(m_contproc<0) { s[1]=which_proc(); suspend(); } / / A l m a c e n a r el p r o c e s o //Suspenderlo c o u t < < " \ n S u s p e n d i d o . . . [ " s [ 1 ] < < "]" < < e n d l ; //Si el c o n t a d o r es m e n o r d e 0

/* Funcion Sigue*/ v o i d s i g u e ( s e m a f o r o & s) { int m _ c o n t p r o c ; while(!TSL(cerrojo)); m_contproc=s[0]; m_contproc++; s[0]=m_contproc; cerrojo=0; if(m_contproc>=0) { cout < < "/n Proceso revivido..." < < m _ c o n t p r o c < < endl; revive(s[1]); } } //Revivimos //... Fin Seccion critica //Si el c o n t a d o r es m a y o r q u e 0 / / I n c r e m e n t a m o s el c o n t a d o r //Espera improductiva hasta que entremos //... Seccion critica

24

Prcticas JBACI v o i d i n s e r t a r ( i n t i) { vector[pos]=i; pos++; } int c o g e r ( ) { int a u x ; pos--; aux = vector[pos]; vector[pos]=0; return aux; } void Productor() { int i , n u m e r o ; while(1) { for(i=0;i<100;i++) { espera(lleno); espera(s); insertar(numero); sigue(s); sigue(vacio); } } } void Consumidor() { while(1) { espera(vacio); espera(s); sigue(s); / / E s p e r a m o s si e s v a c i o / / E n t r a d a a la z o n a critica //Salida d e z o n a critica 25 //Salida z o n a critica //Seal de que ya no_vacio / / E s p e r a m o s si e s t a l l e n o //Generamos un numero / / E n t r a d a e n la z o n a critica numero=random(100); / / R e c o g e m o s u n elemento e n el vector //Insertamos u n elemento e n el vector

Javier Garca Garca

/ / A l recoger el v a l o r del vector l o d e j a m o s a 0

cout<< coger()<< endl;

Prcticas JBACI sigue(lleno); } } void main() { //Inicializamos las variables lleno[0] = 10; vacio[0] = 0; s[0] = 1; cerrojo=0; pos=0; cobegin { Productor(); Consumidor(); } } //Esta vacio //No hay nadie accediendo / / C e r r o j o esta libre / / P o s actual del vector

Javier Garca Garca

Prctica 5

26

Prcticas JBACI

Javier Garca Garca

Prctica 5
1. Repita la prctica 3 utilizando monitores en lugar de semforos. //Declaracin del monitor //Tamao del buffer

monitor buffer_limitado { const int N=10; int buffer[N]; int sigent,sigsal; int contador;

condition no_lleno,no_vacio;

void poner(int x) { if (contador==N) { waitc(no_lleno); } buffer[sigent]=x; sigent=(sigent+1)%N; contador++; signalc(no_vacio); } int coger() { int x; if (contador==0) { waitc(no_vacio); } x=buffer[sigsal]; sigsal=(sigsal+1)%N; contador--; signalc(no_lleno); return x; } init { sigent=0;

//Funcion que coloca x en el buffer

//Funcion que recoge del buffer un elemento

//Devolvemos el valor

//Funcion de inicializacin

27

Prcticas JBACI sigsal=0; contador=0; } }

Javier Garca Garca

void Productor() { int i,numero; while(1) { for(i=0;i<100;i++) { numero=random(100); poner(numero); } } } //Generamos un numero aleatorio //Usamos el monitor

void Consumidor() { int numero; while(1) { numero=coger(); cout<< numero<< endl; } } void main() { cobegin { Productor(); Consumidor(); } } //Usamos la propiedad del monitor

28

You might also like