ejercicios de especificación recursos...

Post on 09-Jul-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Ejercicios de Especificacion Recursos Compartidos

Guillermo Roman

guillermo.roman@upm.es

ConcurrenciaGRADO EN INGENIERIA INFORMATICA/ GRADO EN MATEMATICAS E INFORMATICA/

DOBLE GRADO EN ING. INFORMATICA Y ADE

Universidad Politecnica de Madrid

http://babel.upm.es/teaching/concurrencia

Abril 2020

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 1 / 17

Ejemplo: lectores/escritores

Con acceso explıcito a los elementos del tipo

C-TAD GestorLEOPERACIONESACCION IL, FL, IE, FE:

SEMANTICADOMINIO:TIPO: GestorLE = (l : N× e : N)INICIAL: self.l = 0 ∧ self.e = 0INVARIANTE: (self.l > 0⇒ self.e = 0) ∧ (self.e > 0⇒ self.e = 1 ∧ self.l = 0)CPRE: self.e = 0IL

POST: self.e = selfpre .e ∧ self.l = selfpre .l + 1CPRE: CiertoFL

POST: self = selfpre \ self.l = selfpre .l − 1CPRE: self.e = 0 ∧ self.l = 0IE

POST: self.l = 0 ∧ self.e = 1

CPRE: CiertoFE

POST: self.l = 0 ∧ self.e = 0Guillermo Roman (UPM) Especificacion Recursos Abril 2020 2 / 17

Ejemplo: lectores/escritores

Usando pattern-matching para acceder al tipoC-TAD GestorLEOPERACIONESACCION IL, FL, IE, FE:

SEMANTICADOMINIO:TIPO: GestorLE = (l : N× e : N)INICIAL: self = (0, 0)INVARIANTE: (self.l > 0⇒ self.e = 0) ∧ (self.e > 0⇒ self.e = 1 ∧ self.l = 0)CPRE: self.e = 0IL

POST: selfpre = (lec , esc) ∧ self = (lec + 1, esc)CPRE: CiertoFL

POST: selfpre = (lec , esc) ∧ self = (lec − 1, esc)CPRE: self.e = 0 ∧ self.l = 0IE

POST: self = (0, 1)

CPRE: CiertoFE

POST: self = (0, 0)Guillermo Roman (UPM) Especificacion Recursos Abril 2020 3 / 17

Ejercicio: Los nomadas que cantan

Se esta desarrollando una IA para competir en el campeonato del mundo del popular

juego de mesa Los nomadas que cantan. Los desarrolladores han ideado un recursocompartido para representar las materias primas que tiene el jugador, siendo estas

materias primas cereal, agua y madera.

Hay una operacion no bloqueante por cada materia prima para que el jugador coja esa

materia prima: cargarCereal, cargarAgua y cargarMadera. El jugador puede llevar a losumo una unidad de cada materia prima pero no puede llevar cereal y madera a la vez, si

carga una pierde la otra.

Por otro lado, hay dos operaciones que consumen materias primas: avanzar (consumecereal y agua) y reparar (consume agua y madera). Estas operaciones son bloqueanteshasta que se disponga de las materias primas necesarias.

Se pide: especificar el recurso compartido teniendo en cuenta que bastarıa un booleanopor cada materia prima para indicar que el jugador tiene dicha materia (porque la ha

cargado) o no tiene dicha materia (porque acaba de empezar el juego o la ha consumido

avanzando o reparando).

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 4 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas =INICIAL:INVARIANTE:CPRE:cargarCereal

POST:CPRE:cargarAgua

POST:CPRE:cargarMadera

POST:CPRE:avanzar

POST:CPRE:reparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL:INVARIANTE:CPRE:cargarCereal

POST:CPRE:cargarAgua

POST:CPRE:cargarMadera

POST:CPRE:avanzar

POST:CPRE:reparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE:CPRE:cargarCereal

POST:CPRE:cargarAgua

POST:CPRE:cargarMadera

POST:CPRE:avanzar

POST:CPRE:reparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE:CPRE: CiertocargarCereal

POST:CPRE: CiertocargarAgua

POST:CPRE: CiertocargarMadera

POST:CPRE:avanzar

POST:CPRE:reparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE:CPRE: CiertocargarCereal

POST:CPRE: CiertocargarAgua

POST:CPRE: CiertocargarMadera

POST:CPRE: self.cereal ∧ self.aguaavanzar

POST:CPRE: self.madera ∧ self.aguareparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE:CPRE: CiertocargarCereal

POST: self = (Cierto, selfpre .agua ,Falso)CPRE: CiertocargarAgua

POST:CPRE: CiertocargarMadera

POST:CPRE: self.cereal ∧ self.aguaavanzar

POST:CPRE: self.madera ∧ self.aguareparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE:CPRE: CiertocargarCereal

POST: self = (Cierto, selfpre .agua ,Falso)CPRE: CiertocargarAgua

POST: self = (selfpre .cereal ,Cierto, selfpre .madera)CPRE: CiertocargarMadera

POST:CPRE: self.cereal ∧ self.aguaavanzar

POST:CPRE: self.madera ∧ self.aguareparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE:CPRE: CiertocargarCereal

POST: self = (Cierto, selfpre .agua ,Falso)CPRE: CiertocargarAgua

POST: self = (selfpre .cereal ,Cierto, selfpre .madera)CPRE: CiertocargarMadera

POST: self = (Falso, selfpre .agua ,Cierto)CPRE: self.cereal ∧ self.aguaavanzar

POST:CPRE: self.madera ∧ self.aguareparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE: ¬self.cereal ∨ ¬self.maderaCPRE: CiertocargarCereal

POST: self = (Cierto, selfpre .agua ,Falso)CPRE: CiertocargarAgua

POST: self = (selfpre .cereal ,Cierto, selfpre .madera)CPRE: CiertocargarMadera

POST: self = (Falso, selfpre .agua ,Cierto)CPRE: self.cereal ∧ self.aguaavanzar

POST: self = (Falso,Falso, selfpre .madera)CPRE: self.madera ∧ self.aguareparar

POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Los nomadas que cantan

C-TADMateriasPrimasOPERACIONESACCION cargarCereal, cargarAgua, cargarMadera, avanzar, reparar:

SEMANTICADOMINIO:TIPO:MateriasPrimas = (cereal : B× agua : B×madera : B)INICIAL: self = (Falso,Falso,Falso)INVARIANTE: ¬self.cereal ∨ ¬self.maderaCPRE: CiertocargarCereal

POST: self = (Cierto, selfpre .agua ,Falso)CPRE: CiertocargarAgua

POST: self = (selfpre .cereal ,Cierto, selfpre .madera)CPRE: CiertocargarMadera

POST: self = (Falso, selfpre .agua ,Cierto)CPRE: self.cereal ∧ self.aguaavanzar

POST: self = (Falso,Falso, selfpre .madera)CPRE: self.madera ∧ self.aguareparar

POST: self = (selfpre .cereal ,Falso,Falso)

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 5 / 17

Ejercicio: Dining Philisophers

Lo que veis a continuacion es la descripcion original de Edsger W. Dijkstra del problema de los

Dining Philosophers:La vida de un filosofo consiste en alternar pensar y comer en una especie de

bucle infinito. N filosofos, numerados del 0 al N−1, viven en una casa con una mesaen la que cada filosofo tiene su sitio asignado:

Su unico problema, al margen de los filosoficos, es que su menu consiste en un tipocomplicado de espagueti que es necesario comer con dos tenedores. Hay un unicotenedor a cada lado de cada plato. Eso no es un problema. Sin embargo, comoconsecuencia, no puede haber dos filosofos comiendo a la vez uno al lado del otro.

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 6 / 17

Ejercicio: Dining Philisophers

Hemos decidido representar el problema en forma de un recurso compartidoMesa con:dos operaciones: mesa .cogerTenedores(i ) ymesa .soltarTenedores(i )Esas seran las operaciones que el filosofo i ejecutara antes y despues de comer:

I de forma que tendra que bloquear enmesa .cogerTenedores(i ) cuando alguno de lostenedores a los lados de su plato esten siendo usados (por el filosofo (i + 1) mod N o por elfilosofo (i − 1) mod N )

La operacionmesa .soltarTenedores(i ) no es bloqueanteNOTA: se sugiere que el dominio del recurso incluya una funcion parcial que hable de los

tenedores libres. Las funciones parciales formalizan las tablas

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 7 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa =TIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE:

INICIAL:

CPRE:cogerTenedores(i)POST:

CPRE:soltarTenedores(i)POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = tenedores : TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE:

INICIAL:

CPRE:cogerTenedores(i)POST:

CPRE:soltarTenedores(i)POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = tenedores : TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE:

INICIAL: ∀ i ∈ TipoFilosofo • ¬self.tenedores(i )CPRE:cogerTenedores(i)POST:

CPRE:soltarTenedores(i)POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = tenedores : TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE:

INICIAL: ∀ i ∈ TipoFilosofo • ¬self.tenedores(i )CPRE: ¬self.tenedores(i ) ∧ ¬self.tenedores(i +N 1)cogerTenedores(i)POST:

CPRE:soltarTenedores(i)POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = tenedores : TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE:

INICIAL: ∀ i ∈ TipoFilosofo • ¬self.tenedores(i )CPRE: ¬self.tenedores(i ) ∧ ¬self.tenedores(i +N 1)cogerTenedores(i)POST:

CPRE: CiertosoltarTenedores(i)POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = tenedores : TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE:

INICIAL: ∀ i ∈ TipoFilosofo • ¬self.tenedores(i )CPRE: ¬self.tenedores(i ) ∧ ¬self.tenedores(i +N 1)cogerTenedores(i)POST: self.tenedores = selfpre .tenedores ⊕ {i 7→ Cierto, i +N 1 7→ Cierto}

CPRE: CiertosoltarTenedores(i)POST:

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = tenedores : TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE:

INICIAL: ∀ i ∈ TipoFilosofo • ¬self.tenedores(i )CPRE: ¬self.tenedores(i ) ∧ ¬self.tenedores(i +N 1)cogerTenedores(i)POST: self.tenedores = selfpre .tenedores ⊕ {i 7→ Cierto, i +N 1 7→ Cierto}

CPRE: CiertosoltarTenedores(i)POST: self.tenedores = selfpre .tenedores ⊕ {i 7→ Falso, i +N 1 7→ Falso}

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = tenedores : TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE: | {i ∈ TipoFilosofo • self .tenedores(i )} | mod2 = 0INICIAL: ∀ i ∈ TipoFilosofo • ¬self.tenedores(i )CPRE: ¬self.tenedores(i ) ∧ ¬self.tenedores(i +N 1)cogerTenedores(i)POST: self.tenedores = selfpre .tenedores ⊕ {i 7→ Cierto, i +N 1 7→ Cierto}

CPRE: CiertosoltarTenedores(i)POST: self.tenedores = selfpre .tenedores ⊕ {i 7→ Falso, i +N 1 7→ Falso}

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 8 / 17

Ejercicio: Dining Philisophers

C-TADMesaOPERACIONESACCION cogerTenedores: N[e]ACCION soltarTenedores: N[e]SEMANTICADOMINIO:TIPO:Mesa = TipoFilosofo 7→ BTIPO: TipoFilosofo = {0, ..,N − 1}INVARIANTE: | {i ∈ TipoFilosofo • self (i )} | mod2 = 0INICIAL: ∀ i ∈ TipoFilosofo • ¬self(i )CPRE: ¬self(i ) ∧ ¬self(i +N 1)cogerTenedores(i)POST: self = selfpre ⊕ {i 7→ Cierto, i +N 1 7→ Cierto}

CPRE: CiertosoltarTenedores(i)POST: self = selfpre ⊕ {i 7→ Falso, i +N 1 7→ Falso}

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 9 / 17

Ejercicios: Examen 18/19 Mayo

Dado el siguiente CTAD:

C-TADMiCTADTIPO:MiCTAD = Indice → BTIPO: Indice = {0, 1}INICIAL: ∀ i ∈ Indice • ¬self(i )INVARIANTE: ¬self(0) ∨ self(1)CPRE: ¬self(0) ∧ ¬self(1)uno()

POST: self = selfpre ⊕ {1 7→ Cierto}CPRE: ¬self(0) ∧ self(1)dos()

POST: self = selfpre ⊕ {0 7→ Cierto}CPRE: self(1)tres()

POST: self = selfpre ⊕ {0 7→ Falso} ⊕ {1 7→ Falso}

Asumiendo que tenemos tres procesos que invocan repetidamente las operaciones uno(),dos() y tres() del recurso compartido. Se pide marcar la afirmacion correcta:(a) El sistema podrıa quedarse bloqueado

(b) El sistema nunca quedara bloqueado y siempre se cumplira la invariante

(c) Podrıa llegar a violarse la invariante

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 10 / 17

Ejercicios: Examen 18/19 Mayo

C-TADMiCTADTIPO:MiCTAD = Indice → BTIPO: Indice = {0, 1}INICIAL: ∀ i ∈ Indice • ¬self(i )INVARIANTE:¬self(0) ∨ self(1)

CPRE: ¬self(0) ∧ ¬self(1)uno()

POST: self = selfpre ⊕ {1 7→ Cierto}CPRE: ¬self(0) ∧ self(1)dos()

POST: self = selfpre ⊕ {0 7→ Cierto}CPRE: self(1)tres()

POST: self = selfpre ⊕ {0 7→ Falso} ⊕ {1 7→ Falso}

(F,F)

(T,T)

(T,F)

(F,T)

(a) El sistema podrıa quedarse bloqueado

(b) El sistema nunca quedara bloqueado y siempre se cumplira la invariante

(c) Podrıa llegar a violarse la invariante

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 11 / 17

Ejercicios: Examen 18/19 Mayo

C-TADMiCTADTIPO:MiCTAD = Indice → BTIPO: Indice = {0, 1}INICIAL: ∀ i ∈ Indice • ¬self(i )INVARIANTE:¬self(0) ∨ self(1)

CPRE: ¬self(0) ∧ ¬self(1)uno()

POST: self = selfpre ⊕ {1 7→ Cierto}CPRE: ¬self(0) ∧ self(1)dos()

POST: self = selfpre ⊕ {0 7→ Cierto}CPRE: self(1)tres()

POST: self = selfpre ⊕ {0 7→ Falso} ⊕ {1 7→ Falso}

(F,F)

(T,T)

(T,F)

(F,T)

uno

(a) El sistema podrıa quedarse bloqueado

(b) El sistema nunca quedara bloqueado y siempre se cumplira la invariante

(c) Podrıa llegar a violarse la invariante

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 11 / 17

Ejercicios: Examen 18/19 Mayo

C-TADMiCTADTIPO:MiCTAD = Indice → BTIPO: Indice = {0, 1}INICIAL: ∀ i ∈ Indice • ¬self(i )INVARIANTE:¬self(0) ∨ self(1)

CPRE: ¬self(0) ∧ ¬self(1)uno()

POST: self = selfpre ⊕ {1 7→ Cierto}CPRE: ¬self(0) ∧ self(1)dos()

POST: self = selfpre ⊕ {0 7→ Cierto}CPRE: self(1)tres()

POST: self = selfpre ⊕ {0 7→ Falso} ⊕ {1 7→ Falso}

(F,F)

(T,T)

(T,F)

(F,T)

uno

dos

(a) El sistema podrıa quedarse bloqueado

(b) El sistema nunca quedara bloqueado y siempre se cumplira la invariante

(c) Podrıa llegar a violarse la invariante

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 11 / 17

Ejercicios: Examen 18/19 Mayo

C-TADMiCTADTIPO:MiCTAD = Indice → BTIPO: Indice = {0, 1}INICIAL: ∀ i ∈ Indice • ¬self(i )INVARIANTE:¬self(0) ∨ self(1)

CPRE: ¬self(0) ∧ ¬self(1)uno()

POST: self = selfpre ⊕ {1 7→ Cierto}CPRE: ¬self(0) ∧ self(1)dos()

POST: self = selfpre ⊕ {0 7→ Cierto}CPRE: self(1)tres()

POST: self = selfpre ⊕ {0 7→ Falso} ⊕ {1 7→ Falso}

(F,F)

(T,T)

(T,F)

(F,T)

uno

dos

tres

(a) El sistema podrıa quedarse bloqueado

(b) El sistema nunca quedara bloqueado y siempre se cumplira la invariante

(c) Podrıa llegar a violarse la invariante

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 11 / 17

Ejercicios: Examen 18/19 Mayo

C-TADMiCTADTIPO:MiCTAD = Indice → BTIPO: Indice = {0, 1}INICIAL: ∀ i ∈ Indice • ¬self(i )INVARIANTE:¬self(0) ∨ self(1)

CPRE: ¬self(0) ∧ ¬self(1)uno()

POST: self = selfpre ⊕ {1 7→ Cierto}CPRE: ¬self(0) ∧ self(1)dos()

POST: self = selfpre ⊕ {0 7→ Cierto}CPRE: self(1)tres()

POST: self = selfpre ⊕ {0 7→ Falso} ⊕ {1 7→ Falso}

(F,F)

(T,T)

(T,F)

(F,T)

uno

dos

tres tres

(a) El sistema podrıa quedarse bloqueado

(b) El sistema nunca quedara bloqueado y siempre se cumplira la invariante

(c) Podrıa llegar a violarse la invariante

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 11 / 17

Ejercicios: Examen 18/19 Mayo

Dado el siguiente programa

c l a s s Hi los {s t a t i c c l a s s MiHilo extends Thread {i n t n ;publ i c void run ( ) {for ( i n t i =0; i<100; i ++) {n ++;

}}}

publ i c void main ( S t r i ng [ ] args ) {Thread t = new MiHilo ( ) ;

t . s t a r t ( ) ;

t . run ( ) ;

hacerAlgo ( ) ; / / hace algo . . .t r y { t . j o i n ( ) ;}catch ( InterruptedExcept ion e ){}System . out . p r i n t l n ( t . n ) ;

}

¿Cual sera la salida por consola al ejecutar el main? Se pidemarcar la afirmacion correcta.

(a) 200

(b) No se puede saber porque podrıa haber condiciones de carrera.

(c) 100

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 12 / 17

Ejercicios: Examen 18/19 Mayo

Dado el siguiente programa

c l a s s Hi los {s t a t i c c l a s s MiHilo extends Thread {i n t n ;publ i c void run ( ) {for ( i n t i =0; i<100; i ++) {n ++;

}}}

publ i c void main ( S t r i ng [ ] args ) {Thread t = new MiHilo ( ) ;

t . s t a r t ( ) ;

t . run ( ) ;

hacerAlgo ( ) ; / / hace algo . . .t r y { t . j o i n ( ) ;}catch ( InterruptedExcept ion e ){}System . out . p r i n t l n ( t . n ) ;

}

¿Cual sera la salida por consola al ejecutar el main? Se pidemarcar la afirmacion correcta.

(a) El numero maximo de procesos ejecutando a la vez sera 2 y el metodo main podraterminar antes que el thread t

(b) El numero maximo de procesos ejecutando a la vez sera 3 y el metodo main terminarasiempre despues que el thread t

(c) El numero maximo de procesos ejecutando a la vez sera 2 y el metodo main terminarasiempre despues que el thread t

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 13 / 17

Ejercicios: Examen 18/19 Mayo

Dado un programa concurrente en la que tres threads instancias de las clases A, B y Ccomparten una variable n:

s t a t i c v o l a t i l e i n t n = 0 ;s t a t i c Semaphore s1 = new Semaphore ( 1 ) ;s t a t i c Semaphore s2 = new Semaphore ( 0 ) ;

c l a s s A extends Thread {publ i c void run ( ) {s2 . await ( ) ;

n = 2 ∗ n ;s1 . s i gna l ( ) ;

}}

c l a s s B extends Thread {publ i c void run ( ) {s1 . await ( ) ;

n = n ∗ n ;s2 . s i gna l ( ) ;

}}

c l a s s C extends Thread {publ i c void run ( ) {s1 . await ( ) ;

n = n + 2 ;

s2 . s i gna l ( ) ;

}}

¿Cual es el valor de n tras terminar los tres threads?

(a) 4

(b) 4 o 16

(c) 2 o 16

Si en el codigo anterior los semaforos s1 y s2 se inicializan a 1.

(a) No esta garantizada la exclusion mutua en el acceso a n(b) No esta garantizada la terminacion de las tres tareas

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 14 / 17

Ejercicios: Examen 18/19 Mayo

Dada la siguiente implementacion de una solucion al problema de la exclusion mutua con

espera activa :s t a t i c v o l a t i l e boolean i nc qu iere = f a l s e ;s t a t i c v o l a t i l e boolean dec quiere = f a l s e ;s t a t i c v o l a t i l e i n t cont = 0 ;

c l a s s Incrementador extends Thread {publ i c void run ( ) {for ( i n t i = 0 ; i < N OPS ; i ++) {i nc qu iere = true ;while ( dec quiere ) {}cont ++; / / SCi nc qu iere = f a l s e ;

}}}

c l a s s Decrementador extends Thread {publ i c void run ( ) {for ( i n t i = 0 ; i < N OPS ; i ++) {dec quiere = true ;while ( i nc qu iere ) {}cont−−; / / SCdec quiere = f a l s e ;

}}}

Suponiendo que tenemos un proceso de tipo Incrementador y otro proceso Decrementador,se pidemarcar la afirmacion correcta.(a) El programa no garantiza la exclusion mutua en el acceso a la seccion crıtica (cont++ y

cont--)(b) El programa no garantiza la propiedad de ausencia de interbloqueo

(c) El programa no garantiza la ausencia de esperas innecesarias

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 15 / 17

Ejercicio: Secuencias ordenadas de enteros

El recurso compartido OrdMezclamezcla dos secuencias ordenadas de numeros enteros paraformar una unica secuencia ordenada.

En este recurso interactuan tres procesos: dos productores que van pasando numeros de

sus secuencias de uno en uno y un consumidor que va extrayendo los numeros en orden

El recurso sera capaz de almacenar, como mucho, un dato de la secuencia que

llamaremos “izquierda” y un dato de la secuencia “derecha”

Cuando hay datos de ambas secuencias la operacion extraerMenor tomara el menor deambos y permitira que se anada un nuevo dato de la secuencia correspondiente

La operacion insertarIzda(d) inserta el dato d como parte de la secuencia izquierda ybloquea hasta que el hueco para el dato izquierdo esta disponible

La operacion insertarDcha es analoga por lo que no es necesario implementarla

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 16 / 17

Ejercicio: Secuencias Ordenadas de enteros

C-TAD OrdMezclaOPERACIONESACCION insertarIzda: Z[e]ACCION insertarDcha: Z[e]ACCION extraerMenor: Z[s]

SEMANTICADOMINIO:TIPO: OrdMezcla = 〈hayDato : Lado → B× dato : Lado → Z〉TIPO: Lado = Izda | DchaINICIAL: ∀ i ∈ Lado • ¬self .hayDato(i )CPRE: ¬self.hayDato(Izda)insertarIzda(d)

POST: self.hayDato = selfpre .hayDato ⊕ {Izda 7→ Cierto} ∧self.dato = selfpre .dato ⊕ {Izda 7→ d}

CPRE: self .hayDato(Izda) ∧ self .hayDato(Dcha)extraerMenor(min)

POST: (selfpre .dato(Izda) ≤ selfpre .dato(Dcha) ∧self.hayDato = selfpre .hayDato ⊕{Izda 7→ Falso} ∧ min = self pre .dato(Izda)) ∨(selfpre .dato(Dcha) ≤ selfpre .dato(Izda) ∧self.hayDato = selfpre .hayDato ⊕ {Dcha 7→ Falso} ∧ min = self pre .dato(Dcha))

Guillermo Roman (UPM) Especificacion Recursos Abril 2020 17 / 17

top related