Você está na página 1de 9

Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 1 2004-2013 Volnys Bernal 2

Tpicos

 Excluso Mtua (Mutex)


 Objetivo, utilidade, requisitos e primitivas
Excluso Mtua  Alternativas para implementao de Excluso Mtua
(mutex)  Implementao em software
 Alternncia obrigatria
 Soluo de Peterson
Volnys Borges Bernal  Implementao utilizando recursos de baixo nvel
volnys@lsi.usp.br  Desabilitar interrupo
http://www.lsi.usp.br/~volnys  Instruo Test-And-Set (TST)
 Interface de mutex em Pthreads
 Problema de inverso de prioridade

2004-2013 Volnys Bernal 3 2004-2013 Volnys Bernal 4

Excluso Mtua (Mutex)


 Objetivo:
 Tcnica de sincronizao que possibilita assegurar o acesso
exclusivo (leitura e escrita) a um recurso compartilhado por
Excluso Mtua duas ou mais entidades

(mutex)  Utilidade
 Preveno de problema de condio de disputa em regies
crticas
 Requisitos para a implementao de excluso mtua
1- Nunca duas entidades podem estar simultaneamente em suas
regies crticas
2- Deve ser independente da quantidade e desempenho dos
processadores
3- Nenhuma entidade fora da regio crtica pode ter a
exclusividade desta
4- Nenhuma entidade deve esperar eternamente para entrar em
sua regio crtica

2004-2013 Volnys Bernal 5 2004-2013 Volnys Bernal 6

Excluso Mtua (Mutex) Excluso Mtua (Mutex)


 Exemplo de uso:
 Pode ser implementada com duas primitivas bsicas:  lock( ) - para obter a excluso mtua sobre a RC
 unlock( ) - para liberar a excluso mtua sobre a RC

 lock() [ ou enter_region() ]
 Garante a exclusividade da regio crtica no ponto de entrada da ... ...
regio lock() lock()

 unlock() [ ou leave_region() ] <manipula recurso <manipula recurso


 Libera a exclusividade da regio crtica no ponto de sada da comparilhado> comparilhado>
regio
unlock() unlock()
... ...

Regio Crtica com


excluso mtua

2004-2013 Volnys Bernal 1


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 7 2004-2013 Volnys Bernal 8

Excluso Mtua (Mutex) Excluso Mtua (Mutex)


 Exemplo:  Exemplo:
 Soluo do problema do contador  t1 Thread 1 entra na regio crtica
 t2 Thread 2 tenta entrar na regio crtica
 t3 Thread 1 A sai da regio crtica;
Thread 2 entra na regio crtica
Thread1: Thread2:
 t4 Thread 2 sai da regio critica
... ...
Thread 1
while (1) while (1)
<Realiza tarefa> <Realiza tarefa>
lock() lock() aguardando
c = c + 1 c = c + 1 Thread 2
unlock() unlock()
... ...
t1 t2 t3 t4 t

2004-2013 Volnys Bernal 9 2004-2013 Volnys Bernal 10

Interface de mutex em Pthreads


 Primitivas pthreads

Uso de mutex: // Iniciao esttica


pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

// Iniciao dinmica
Interface de mutex em Pthreads pthread_mutex_t mymutex;
int pthread_mutex_init (pthread_mutex_t *mymutex,
pthread_mutexattr_t *attr);

// Primitivas
int pthread_mutex_init (pthread_mutex_t *mutex,
pthread_mutexattr_t *attr)
int pthread_mutex_lock (pthread_mutex_t *mymutex)
int pthread_mutex_unlock (pthread_mutex_t *mymutex)
int pthread_mutex_trylock (pthread_mutex_t *mymutex)

2004-2013 Volnys Bernal 11 2004-2013 Volnys Bernal 12

Exercicio
(1) Modifique o programa mythread.c para proteger a
varivel i contra condio de disputa utilizando
primitivas mutex pthreads.
Exerccio
(2) Compile o programa mythread.c utilizando a
biblioteca libpthread:
cc -o mythread mythread.c lpthread

(3) Execute o programa mythread e verifique o resultado


da execuo:
./mythread

2004-2013 Volnys Bernal 2


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 13 2004-2013 Volnys Bernal 14

Exerccio
#include <pthread.h>
pthread_mutex_t mutex;
int i=0;
imprimir_msg(char *nome)
{
while (i<10)
{

Implementao de Mutex
pthread_mutex_lock(&mutex);
i++;
printf("Thread %s - %d\n", nome, i);
pthread_mutex_unlock(&mutex);
sleep(2);
}
printf("Thread %s terminado \n", nome);
}
int main()
{
pthread_t thread1;
pthread_t thread2;
pthread_mutex_init(&mutex,NULL);
printf("Programa de teste de pthreads \n");
printf("Disparando primeiro thread\n");
pthread_create(&thread1, NULL, (void*) imprimir_msg,"thread_1");
printf("Disparando segundo thread\n");
pthread_create(&thread2, NULL, (void*) imprimir_msg,"thread_2");
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
printf("Terminando processo");
}

2004-2013 Volnys Bernal 15 2004-2013 Volnys Bernal 16

Implementao de Mutex

 Alternativas para implementao de Excluso Mtua


Mutex implementado em software:
 Implementao em software
Alternncia Obrigatria
 Alternncia obrigatria
 Soluo de Peterson

 Implementao utilizando recursos de hardware


 Desabilitar interrupo
 Instruo Test-And-Set (TST)

2004-2013 Volnys Bernal 17 2004-2013 Volnys Bernal 18

Alternncia Obrigatria Alternncia Obrigatria


 Objetivo
 Implementao de excluso mtua Entidade 0: Entidade 1:

... ...
 Descrio while (TRUE) while (TRUE)
 Alterna o acesso regio crtica entre duas entidades { {
realiza outras atividades realiza outras atividades
 Totalmente em software
 Utiliza espera ociosa // lock() // lock()
while (turn!=0); while (turn!=1);
... ...
 Desvantagem: regio_critica regio_critica
 Viola requisito #3 (Nenhuma entidade fora da regio crtica ... ...
pode ter a exclusividade desta) // unlock() // unlock()
turn=1; turn=0;
 Vlida para somente duas entidades (processos/threads)
} }
 Utiliza espera ociosa

2004-2013 Volnys Bernal 3


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 19 2004-2013 Volnys Bernal 20

Soluo de Peterson
 Objetivo
 Implementao de excluso mtua

Mutex implementado em software:


 Autoria
Soluo de Peterson  Publicada por G. L. Peterson em 1981
 Baseada em uma soluo do matemtico holands T. Dekker

 Descrio
 Totalmente em software
 Utiliza espera ociosa

 Desvantagem
 Exemplo mostrado a seguir vlido somente para 2 entidades

2004-2013 Volnys Bernal 21 2004-2013 Volnys Bernal 22

Soluo de Peterson
int turn; // Duas entidades:
int interested[2]; // Entidade 0
// Entidade 1

Mutex usando recursos de hardware:


void lock(int me)
{
int me;
int other; Desabilitar Interrupo
other = (me + 1) mod 2;
interested[me] = TRUE;
turn = me;
while (turn != me && interested[other] == TRUE);
}

void unlock(int me)


{
interested[me] = FALSE;
}

2004-2013 Volnys Bernal 23 2004-2013 Volnys Bernal 24

Desabilitar Interrupo Desabilitar interrupo


 Objetivo
 Implementao de excluso mtua para evitar condio de disputa decorrente
de:  Exemplo:
 Caso 1: concorrncia entre threads ou processos
 Caso 2: concorrncia relacionada s rotinas de tratamento de interrupo
 Mtodo  lock()
 Caso 1: Desabilitar interrupo de relgio (impede da troca de contexto)
{
 Caso 2: Desabilitar a ocorrncia da interrupo especfica
 Problemas desabilita_interrupo_relogio;
 No aplicvel para modo usurio }
 Possibilita que um erro do cdigo (ex, loop) faa com que o sistema fique
inoperante.
 Para o caso 1, NO resolve o problema em sistemas multiprocessadores  unlock()
 Utilidade {
 Mtodo utilizado em pores de software executados em modo supervisor,
tipicamente no ncleo do sistema operacional, para implementao de habilita_interrupo_relogio;
excluso mtua em: }
1. Threads internos ao ncleo do sistema operacional
2. Drivers de dispositivos que utilizam interrupo

2004-2013 Volnys Bernal 4


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 25 2004-2013 Volnys Bernal 26

Instruo Test-And-Set-Lock
 Objetivo
 Primitiva de baixo nvel para implementao de sincronizao

Descrio
Mutex usando recursos de hardware: 
 Instruo especial da CPU
Instruo Test-And-Set-Lock  Operao
 (varivel_memria)  registrador (leitura)
 1  (varivel_memria) (escrita)
 Instruo atmica (indivisvel)
 As operaes de leitura da varivel e alterao (escrita) do valor
ocorrem em uma nica instruo. No existe possibilidade de ocorrer
interrupo entre estas operaes.
 Acesso atmico memria
 Em sistemas multirprocessadores garantido que o acesso memria
(leitura/escrita) seja atmico, ou seja, no seja interrompido entre as
operaes de leitura e escrita

 Primitiva bsica para construo de primitivas de excluso mtua

2004-2013 Volnys Bernal 27 2004-2013 Volnys Bernal 28

Instruo Test-And-Set-Lock
 Exemplo:
Implementao de excluso mtua utilizando TST
var uma varivel alocada na memria
Problema da
Inverso de Prioridade
lock: TST register,(var) # register var; var 1
CMP register,#0 # register == 0?
JNE lock # se register != 0, loop
RET # retorna

unlock: MOV (var),#0 # var 0 (libera lock)


RET # retorna

2004-2013 Volnys Bernal 29 2004-2013 Volnys Bernal 30

Problema de Inverso de Prioridade Problema de Inverso de Prioridade


 Descrio do problema  Exemplo com possibilidade de deadlock
 Ambiente
 Ambiente monoprocessador
Thread1: Alta prioridade e Thread2: Baixa prioridade e
 Sistema com 2 threads: no preemptvel preemptvel
o Thread H Thread de alta prioridade, no preemptivo

o Thread L Thread de baixa prioridade, preemptivo repetir repetir


 Utilizao de primitivas de excluso mtua com espera ociosa ... ...
 Escalonamento: lock() lock()
... ...
o H sempre executado quando est no estado pronto (ou
seja, H tem preferncia sobre L) RC RC
 Situao na qual ocorre o problema ... ...
unlock() unlock()
 Thread L ganha a regio crtica e thread H torna-se pronto
... ...
 Thread H escalonado e tenta ganhar a regio crtica
 Resultado
Regio Crtica com
 Deadlock excluso mtua

2004-2013 Volnys Bernal 5


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 31 2004-2013 Volnys Bernal 32

Exerccio
(4) Em relao ao problema do produtor-consumidor, faa
um esboo de soluo do problema sem levar em
considerao as condies de disputa.
Exerccios
Produtor
1 Consumidor
1

Produtor
2
Fila Consumidor
Produtor 2
3

2004-2013 Volnys Bernal 33 2004-2013 Volnys Bernal 34

Exerccio Exerccio
 Primeiro esboo de soluo sem levar em considerao as (b) Em relao ao problema do produtor-consumidor,
condies de disputa analise o cdigo, identifique as condies de disputa e
defina as regies crticas.
Produtor:
Repetir Dica: Inicie pela identificao dos recursos que so compartilhados entre as
Produzir(E); entidades.
InserirFila(F,E);

Consumidor:
Repetir
E = RetirarFila(F);
Processar(E);

2004-2013 Volnys Bernal 35 2004-2013 Volnys Bernal 36

Exerccio Exerccio
 Identificao das condies de disputa: (c) Em relao ao problema do produtor-consumidor,
identifique necessidades de sincronizao de espera
Condio de disputa
por recursos.
Produtor:
Quais so os recursos que podem eventualmente no
Repetir
estar disponvel exigindo sua espera pela entidade?
Produzir(E);
InserirFila(F,E);
Dica:
 Identifique em quais situaes a entidade deve aguardar por recursos estarem
Condio de disputa disponveis. Estes recursos provavelmente so disputados pelas entidades!
Consumidor:
 Neste caso especfico, existem 2 recursos: um importante para os produtores e
Repetir outro importante para os consumidores
E = RetirarFila(F); Fila:
Processar(E); recurso compartilhado
pode ser acessado de
forma concorrente

2004-2013 Volnys Bernal 6


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 37 2004-2013 Volnys Bernal 38

Exerccio Exerccio
 Identificao das necessidades de sincronizao de (d) Altere o esboo do programa a fim de
espera por recursos: contornar o problema de espera por recursos
(no se preocupe com condio de disputa, por
enquanto).
Produtor  slots livres
problema: quando no existem slots livres na fila

Consumidor  itens produzidos


problema: quando no existem itens produzidos na fila

2004-2013 Volnys Bernal 39 2004-2013 Volnys Bernal 40

Exerccio Exerccio
 Identificao dos pontos de  Alterao do programa (sem levar em considerao eventuais
esperar por recursos condies de disputa)

Produtor: (1) Fila cheia: o recurso Fila


Repetir limitado, ou seja, a fila pode Produtor:
tornar-se cheia. Nesta Repetir
Produzir(E); situao (de fila cheia) os
Produzir(E);
InserirFila(F,E); produtores devem aguardar a
existncia de slots livres. Enquanto FilaCheia(F)
Aguardar;
Consumidor: (2) Os consumidores podem ser InserirFila(F,E);
Repetir mais rpidos que os
produtores permitindo que em Consumidor:
E = RetirarFila(F);
determinados momentos a fila Repetir
Processar(E); fique vazia. Nesta situao
(fila vazia), os consumidores Enquanto FilaVazia(F)
dem aguardar a chegada de aguardar;
itens. E = RetirarFila(F);
Processar(E);

2004-2013 Volnys Bernal 41 2004-2013 Volnys Bernal 42

Exerccio Exerccio
(e) Em relao ao problema do produtor-consumidor,  Alterao do programa (sem levar em considerao eventuais
condies de disputa)
apresente uma soluo para o problema utilizando
primitivas de excluso mtua.
Produtor:
Repetir
Produzir(E); Condio de disputa
Enquanto FilaCheia(F)
Aguardar;
InserirFila(F,E);

Consumidor:
Repetir Condio de disputa
Enquanto FilaVazia(F)
aguardar;
E = RetirarFila(F);
Processar(E);

2004-2013 Volnys Bernal 7


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 43 2004-2013 Volnys Bernal 44

Exerccio Exerccio
 Primeiro esboo: proteo das regies crticas (f) Em relao ao problema do produtor-consumidor,
Produtor: baseado no esboo da soluo apresentada responda:
Repetir
Produzir(E);
lock(); (a) O produtor, quando possui um item produzido e a fila est
Enquanto FilaCheia(F) cheia o que ocorre?
Aguardar;
InserirFila(F,E);
unlock();
(b) O consumidor, quando deseja retirar um item da fila e a fila
est vazia o que ocorre?
Consumidor:
Repetir
(c) Qual o problema que ocorre nestas situaes no qual no
lock();
Enquanto FilaVazia(F)
existem recursos disponveis?
aguardar;
E = RetirarFila(F);
unlock();
Processar(E);

2004-2013 Volnys Bernal 45 2004-2013 Volnys Bernal 46

Exerccio Exerccio
 Primeiro esboo: proteo das regies crticas  Segundo esboo:

Produtor:
Repetir Produtor() Consumidor()
Produzir(E); { {
lock();  Problemas: repetir repetir
Enquanto FilaCheia(F) { {
Aguardar; (1) Deadlock quando produtor Produzir(E); lock();
InserirFila(F,E); encontra fila cheia lock(); enquanto FilaVazia(F)
unlock(); enquanto FilaCheia(F) {
(2) Deadlock quando consumidor { unlock();
encontra fila vazia
Consumidor: unlock(); lock();
Repetir lock(); }
lock(); } E = RetirarFila(F);
Enquanto FilaVazia(F) InserirFila(F,E); unlock();
aguardar; unlock(); Processar(E);
E = RetirarFila(F); } }
unlock(); } }
Processar(E);

2004-2013 Volnys Bernal 47 2004-2013 Volnys Bernal 48

Exerccio Exerccio
(g) Em relao ao problema do produtor-consumidor, (5) O problema do produtor-consumidor pode ser
analise sua soluo e responda: implementado utilizando-se um nico buffer
sincronizado por primitivas de excluso mtua.
(a) A implementao funciona com mltiplos produtores e
mltiplos consumidores?
Produtor
1
(b) Suponha que o sistema seja monoprocessador. Qual tipo de Consumidor
primitiva a mais recomendada: espera ociosa ou 1
bloqueante? Porque?
Produtor
2
(c) Suponha que o sistema seja multiprocessador. Qual tipo de
primitiva a mais recomendada: espera ociosa ou Consumidor
bloqueante? Porque? 2
Produtor
3

2004-2013 Volnys Bernal 8


Sincronizao e comunicao entre entidades de processamento Mutex

2004-2013 Volnys Bernal 49

Exerccio
O programa prodcons_buffer.c mostra uma implementao da
soluo do problema do produtor-consumidor utilizando-se um
nico buffer sincronizado por primitivas de excluso mtua.

Compile e execute este programa


cc o prodcons_buffer prodcons_buffer.c -lpthread
./prodcons_buffer

Analise o programa e responda:


(a) A soluo apresentada resolve o problema de condio de disputa?
(b) Qual a condio de trmino dos produtores?
(c) Qual a condio de trmino dos consumidores?
(d) Proponha uma condio de trmino para os consumidores.

2004-2013 Volnys Bernal 9

Você também pode gostar