Академический Документы
Профессиональный Документы
Культура Документы
ndice
Tipo de procesos
El problema de los jardines (Exclusin Mutua)
El problema del productor consumidor (Condiciones de
sincronizacin)
Solucin al problema del productor consumidor con espera activa
Solucin al problema de la exclusin mutua con espera activa para
dos procesos
El problema de la panadera
Correccin de un programa concurrente
Justicia
El problema de los lectores/escritores
El problema de los filsofos
Procesos vs Recursos
En un programa concurrente intervienen tres
tipos de entidades:
Entidades activas: modeladas como procesos
(hebras, tareas,)
Entidades pasivas: son recursos que necesitan los
procesos para realizar su trabajo
Con control de acceso: para acceder a algunos recursos
es necesario que se satisfagan ciertas condiciones de
seguridad, como por ejemplo la exclusin mutua.
Sin control de acceso: recursos a los que se puede
acceder en cualquier momento.
3
Visitantes
Puerta1
Puerta2
Visitantes
Puerta1
Puerta2
5
Cual es el
comportamiento?
Es correcto?
inc()
p1
void incVisitantes(){
load cont
cont++
inc 1
se compila en
}
store cont
inc()
p2
inc()
inc()
p2
CPU
?
9
inc()
inc()
p2
CPU
0
10
inc()
inc()
p2
CPU
0
11
inc()
inc()
CPU
1
12
inc()
inc()
CPU
1
13
inc()
inc()
p2
p2:
p1:
p2:
p1:
load cont
inc 1
inc 1
store cont
CPU
1
14
visitantes
inc()
p1
inc()
p2
se compila en
inc 1
store cont
p1:
p2:
p1:
p2:
p1:
p2:
load cont
load cont
inc 1
inc 1
store cont
store cont
cont = 1
CPU
1
15
16
hebras
productor
consumidor
variable compartida
17
Productor/consumidor: principal
int main () {
pthread_t th1,th2,th3,th4;
pthread_attr_t attr;
long veces=1000000;
pthread_attr_init(&attr);
printf("Creamos th1 con 1000000 producciones\n");
pthread_create(&th1,&attr,HebraProductora,&veces);
printf("Creamos th2 con 1000000 consumiciones\n");
pthread_create(&th2,&attr,HebraConsumidora,&veces);
pthread_join (th1,NULL);
pthread_join(th2,NULL);
return 0;
}
Productor/consumidor: Hebras
void *HebraProductora(void *argg ){
long i=0;
long *NumVeces,num;
NumVeces= (long *) argg;
for (i=0;i<*NumVeces;i++) {
num=random();
Set(num);
printf("Productor=%ld\n",i);
}
}
#include <pthread.h>
#include <stdio.h>
//Variable global que contiene el dato
long Dato=0;
19
20
21
22
Hebra p2
run(){
while (1){
preProtocolo1
SC1
postProtocolo1
SNC1
}
}
run(){
while (1){
preProtocolo2
SC2
postProtocolo2
SNC2
}
}
Requisito 1:
En cada momento, hay, a lo sumo, una hebra
ejecutando su seccin crtica
23
pthread_t th1,th2;
pthread_attr_t attr;
int id1, id2;
pthread_attr_init(&attr);
while (1) {
f[miId]=1;
pthread_create(&th1,&attr,Hebra,&id1);
while (f[otra]);
pthread_create(&th2,&attr,Hebra,&id2);
..
SC
f[miId]=0;
PosProt
SNC
PreProt
}
}
25
Requisito2:
Ausencia de livelock. Si las dos hebras quieren entrar
en sus SC simultneamente, en algn momento,
alguna de ellas, debera poder hacerlo
26
SC
PreProt
Ejemplo:
f[miId]=0;
SNC
}
}
}
ERROR!!
27
SC
pthread_create(&th1,&attr,Hebra,&id1);
turno = otra;
pthread_create(&th2,&attr,Hebra,&id2);
.
}
SNC
}
}
}
Requisito 3:
Si slo una de las hebras quiere entrar en su SC,
en algn momento debera poder hacerlo
28
SC
SNC
}
}
}
29
unsigned f[2]={0,0};
int turno=0;
void *Hebra(void *argg ){
//int *arg=(int *)argg; Otra forma de hacer el
casting
//int miId=*arg;
int miId=*((int *)argg);
int otra=(miId+1)%2;
while (1) {
f[miId] = 1;
turno = otra;
while (f[otra] && turno==otra) ;
printf("SECCION CRITICA id=%d \n",miId);
f[miId] = 0;
printf("SECCION NO CRITICA id=%d\n",miId);
}
}
30
P1
while (1){
f[0] = 1;
turno = 1;
while (f[1] && turno == 1)
;
SC0
f[0] := 0;
SNC0
}
while (1){
f[1] = 1;
turno = 0;
while (f[0] && turno == 0)
;
SC1
f[1] := 0;
SNC1
}
31
P1
while (1){
f[0] = 1;
turno = 1;
while (f[1] && turno == 1)
;
SC0
f[0] := 0;
SNC0
}
while (1){
f[1] = 1;
turno = 0;
while (f[0] && turno == 0)
;
SC1
f[1] := 0;
SNC1
}
32
P1
while (1){
f[0] = 1;
turno = 1;
while (f[1] && turno == 1)
;
SC0
f[0] := 0;
SNC0
}
while (1){
f[1] = 1;
turno = 0;
while (f[0] && turno == 0)
;
SC1
f[1] := 0;
SNC1
}
P1
while (1){
f[0] = 1;
turno = 1;
while (f[1] && turno == 1)
;
SC0
f[0] := 0;
SNC0
}
while (1){
f[1] = 1;
turno = 0;
while (f[0] && turno == 0)
;
SC1
f[1] := 0;
SNC1
}
35
dependiente
4
3
clientes
36
clientes
/*Preprotocolo*/
// el cliente id es atendido por el dependiente
/*Posprotocolo*/
// el cliente id sale de la panadera
37
dependiente
4
3
cul es mi turno?
38
39
..
int siguiente(){
int i,max = 0;
for ( i = 0; i<N; i++){
if (max<turno[i]) max=turno[i];
}
return max+1;
}
40
dependiente
siguiente
1
2
1
1
41
dependiente
siguiente
2
4
2
1
42
me toca
no
4
Antes de ser atendido, cada proceso
debe ver si es su turno
Para ello, comprueba si va antes o
despus que el resto de los procesos
uno a uno.
0
1
43
}
}
44
siguiente
1
4
Es posible que siguiente de el
mismo turno a dos procesos
distintos, puesto que no se
ejecuta en EXCLUSIN MUTUA
45
siguiente
1
3
1
Es posible que siguiente de el
mismo turno a dos procesos
distintos, puesto que no se
ejecuta en EXCLUSIN MUTUA
46
47
Instruccin
turno
Inicialmente
0 0 0
c[0] llama a
siguiente y
ejecuta hasta **
0 0 0
c[2] llama a
siguiente y
ejecuta hasta (2)
1 0 0
c[2] llama a
meToca(2,0),
meToca(2,4)
y entra en su SC
1 0 0
C[0] termina
instruccin 1,
almacena 1 en
turno[0]
1 0 0
c[0] llama a
meToca(0,0),
meToca(0,1),
meToca(0,2)
y entra en su SC
1 0 0
Accin
c[2] en
SC2
c[0] en
SC0
ERROR
48
49
#define MAXT 15
int turno[MAXT];
int pidiendoTurno[MAXT];
int cont=0;
int siguiente(){
int max = 0, i;
for (i =0; i<MAXT; i++)
if (max<turno[i])
max=turno[i];
return max+1;
}
}
}
51
Exclusin mutua
Condiciones de sincronizacin para el productor/consumidor
Ausencia de bloqueo (deadlock)
Deadlock es el estado del sistema en el que todos los procesos estn
bloqueados esperando algn evento.
52
Justicia (fairness)
La justicia del planificador afecta algunas
propiedades del sistema (las de viveza)
Planificador justo: aqul que asegura que
cualquier proceso que est en estado listo es
alguna vez seleccionado para continuar con su
ejecucin.
int fin1, fin2;
fin1 = 1;
while (!fin1) ;
while (!fin2) ;
fin2 = 1;
}
}
}
53
Justicia
Planificador dbilmente justo: aqul que asegura que si un
proceso hace una peticin de forma continua, en algn
momento ser atendida.
Planificador fuertemente justo: aqul que asegura que si un
proceso hace una peticin con infinita frecuencia, en algn
momento ser atendida.
hebra1
hebra2
while (!fin2) {
while (!fin1) ;
fin1 = 1;
fin2 = 1;
fin1 = 0;
}
}
}
}
}
.
54
Lectores/Escritores
El problema de los lectores/escritores
representa un modelo de sincronizacin entre
dos tipos de procesos (los lectores y los
escritores) que acceden a un recurso
compartido, tpicamente una base de datos
(BD).
Los procesos escritores acceden a la BD para
actualizarla.
Los procesos lectores leen los registros de la
BD.
55
Lectores/Escritores
Condicin de
sincronizacin para los
escritores:
Acceden a la BD en
exclusin mutua con
cualquier otro proceso
de tipo lector o escritor
l0 l1
l2
l3
l4
BD
e2
e1
e0
56
Lectores/Escritores
Condicin de
sincronizacin para los
lectores:
Cualquier nmero de
lectores puede acceder
simultneamente a la
BD.
l1
l2
BD
l0
e1
l3
e0
l4
e2
57
Lectores/Escritores: PseudoCdigo
Lector {
Escritor {
int id;
int id;
while (1){
entraLector(id);
//lector id en la BD
saleLector(id);
}
while (1){
entraEscritor(id);
//escritor id en la BD
saleEscritor(id);
}
}
}
void main(){
pthread_t Lectores[MAXL];
pthread_t Escritores [MAXE];
for (int i = 0; i<MAXL; i++)
Creo hebras Lectoras;
for (int i = 0; i<MAXE; i++)
Creo hebras Escritoras
}
58
while (1){
//pensar
//comer
}
}
59
Platn
Descartes
60
61
62
Referencias
Concurrency: State Models & Java Programs
Jeff Magee, Jeff Kramer, Ed. Willey
Concurrent Programming
Alan Burns, Geoff Davies, Ed. Addison Wesley
63