Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouMaria das Neves Costa Valgueiro Alterado mais de 8 anos atrás
1
ProgramaçãoConcorrente Glêdson Elias gledson@di.ufpb.br
2
Programação Concorrente Seção Crítica Introdução Processos ou threads que compartilham dados devem sincronizar o acesso aos dados Evita que atualizações sejam perdidas em função do acesso concorrente i := i + 1 i = 0 P: LD reg, i P: INC R Q: LD reg, i Q: INC R P: ST i, reg Q: ST i, reg LD reg, i INC reg ST i, reg P: LD reg, i P: INC R P: ST i,reg Q: LD reg, i Q: INC R Q: ST i, reg i = 2i = 1
3
Glêdson Elias Programação Concorrente Seção Crítica Definição Trecho de código que precisa ser executado de forma atômica A seção crítica contém as instruções que acessam recursos compartilhados Também denominada região crítica Para assegurar que uma seção crítica é executada atomicamente deve-se adotar técnicas de exclusão mútua
4
Glêdson Elias Programação Concorrente Exclusão Mútua Definição Técnica que assegura que apenas um único processo ou thread pode executar a seção crítica Se um processo está executando sua seção crítica, outros processos não podem entrar em suas próprias seções críticas Um processo não pode entrar em sua seção crítica se qualquer outro processo estiver em sua própria seção crítica
5
Glêdson Elias Programação Concorrente Exclusão Mútua Execução Concorrente... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Processo A Processo B Processo C
6
Glêdson Elias Programação Concorrente Exclusão Mútua Execução Concorrente Processos podem executar concorrentemente, exceto nas seções críticas... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Processo A Processo B Processo C
7
Glêdson Elias Programação Concorrente Exclusão Mútua Execução Concorrente Um único processo entra na seção crítica Demais processos devem ser bloqueados quando alcançam suas seções críticas... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Código não crítico... RequisitaExclusão... Seção crítica... LiberaExclusão... Código não crítico... Processo A Processo B Processo C
8
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Como garantir a exclusão mútua? O que devemos fazer antes que um processo entre em sua seção crítica? O que devemos fazer quando um processo termina sua seção crítica?
9
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Entrada na Sessão Crítica (RequisitaExclusão) Verificar se outro processo está em sua própria seção crítica Caso afirmativo, bloquear o processo até que o outro processo saia da seção crítica Senão, passar à execução da seção crítica Saída da Sessão Crítica (LiberaExclusão) Informar os outros processos que a sessão crítica foi concluída
10
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Primitivas do tipo RequisitaExclusão e LiberaExclusão garantem a exclusão mútua Mas... Como implementar tais primitivas? É possível implementá-las? São de fácil implementação? Existem várias formas de implementá-las?
11
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável Booleana Compartilhada Verdadeira Um dos processos está na região crítica Falsa Nenhum dos processos está na região crítica
12
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável Booleana Compartilhada Begin {RequisitaExclusão} If Ocupado then Wait; Ocupado = True; End {RequisitaExclusão}... Seção crítica... Begin {LiberaExclusão} Ocupado = False; If P2 esperando then reative-o; End {LiberaExclusão} Begin {RequisitaExclusão} If Ocupado then Wait; Ocupado = True; End {RequisitaExclusão}... Seção crítica... Begin {LiberaExclusão} Ocupado = False; If P1 esperando then reative-o; End {LiberaExclusão} Variável Global Ocupado: Boolean; Processo P1 Processo P2
13
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável Booleana Compartilhada public interface Lock { public void requestCS(); public void releaseCS(); } public class LockImpl implements Lock { boolean busy = false; public void requestCS() { while (busy); busy = true; } public void releaseCS() { busy = false; }
14
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável Booleana Compartilhada public class MyLock extends Thread { Lock lock; public MyLock(Lock lock) { this.lock = lock; } public void run() { while (true) { lock.requestCS(); // Seção crítica lock.releaseCS(); } public static void main (String[] args) { Lock lock = new LockImpl(); MyLock t1 = new MyLock(lock); MyLock t2 = new MyLock(lock); t1.start(); t2.start(); }
15
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável Booleana Compartilhada Não garante a exclusão mútua public class LockImpl implements Lock { boolean busy = false; public void requestCS() { while (busy); busy = true; } public void releaseCS() { busy = false; }
16
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável de Seleção Compartilhada Indica qual processo tem a permissão de entrar na seção crítica Begin {RequisitaExclusão} If QualProc = 2 then Wait; End {RequisitaExclusão}... Seção crítica... Begin {LiberaExclusão} QualProc = 2; If P2 esperando then reative-o; End {LiberaExclusão} Begin {RequisitaExclusão} If QualProc = 1 then Wait; End {RequisitaExclusão}... Seção crítica... Begin {LiberaExclusão} QualProc = 1; If P1 esperando then reative-o; End {LiberaExclusão} Variável Global QualProc: Integer; Processo P1 Processo P2
17
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável de Seleção Compartilhada public interface Lock { public void requestCS(int id); public void releaseCS(int id); } public class LockImpl implements Lock { int turn = 0; public void requestCS(int id) { while (turn == 1 - id); } public void releaseCS(ind id) { turn = 1 - id; }
18
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável de Seleção Compartilhada public class MyLock extends Thread { Lock lock; int id; public MyLock(Lock lock, int id) { this.lock = lock; this.id = id; } public void run() { while (true) { lock.requestCS(id); // Seção crítica lock.releaseCS(id); } public static void main (String[] args) { Lock lock = new LockImpl(); MyLock t1 = new MyLock(lock, 0); MyLock t2 = new MyLock(lock, 1); t1.start(); t2.start(); }
19
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Variável de Seleção Compartilhada Garante a exclusão mútua Processos não são independentes Alternam a execução das suas seções críticas Um processo pode bloquear ou atrasar o outro public class LockImpl implements Lock { int turn = 0; public void requestCS(int id) { while (turn == 1 - id); } public void releaseCS(ind id) { turn = 1 - id; }
20
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Duas Variáveis Booleanas Compartilhadas Cada variável está associada ao estado de um determinado processo específico Verdadeira Processo associado está na região crítica Falsa Processo associado não está na região crítica Cada processo solicita a entrada na seção crítica e em seguida verifica se o outro processo também solicita
21
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Duas Variáveis Booleanas Compartilhadas Begin {RequisitaExclusão} Ocupado1 = True; If Ocupado2 then Wait; End {RequisitaExclusão}... Seção crítica... Begin {LiberaExclusão} Ocupado1 = False; If P2 esperando then reative-o; End {LiberaExclusão} Begin {RequisitaExclusão} Ocupado2 = True; If Ocupado1 then Wait; End {RequisitaExclusão}... Seção crítica... Begin {LiberaExclusão} Ocupado2 = False; If P1 esperando then reative-o; End {LiberaExclusão} Variável Global Ocupado1: Boolean; Ocupado2: Boolean; Processo P1 Processo P2
22
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Duas Variáveis Booleanas Compartilhadas public interface Lock { public void requestCS(int id); public void releaseCS(int id); } public class LockImpl implements Lock { boolean wantCS[] = {false, false}; public void requestCS(int id) { wantCS[id] = true; while (wantCS[1 – id]); } public void releaseCS(int id) { wantCS[id] = false; }
23
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Duas Variáveis Booleanas Compartilhadas public class MyLock extends Thread { Lock lock; int id; public MyLock(Lock lock, int id) { this.lock = lock; this.id = id; } public void run() { while (true) { lock.requestCS(id); // Seção crítica lock.releaseCS(id); } public static void main (String[] args) { Lock lock = new LockImpl(); MyLock t1 = new MyLock(lock, 0); MyLock t2 = new MyLock(lock, 1); t1.start(); t2.start(); }
24
Glêdson Elias Programação Concorrente Exclusão Mútua Implementando Exclusão Mútua Duas Variáveis Booleanas Compartilhadas Garante a exclusão mútua Processos são independentes Não alternam a execução das seções críticas Processos podem ficar bloqueados (deadlock) public class LockImpl implements Lock { boolean wantCS[] = {false, false}; public void requestCS(int id) { wantCS[id] = true; while (wantCS[1 – id]); } public void releaseCS(int id) { wantCS[id] = false; }
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.