Logo Passei Direto
Buscar

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Capítulo 13
Concorrência
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tópicos do Capítulo 13
Introdução
Introdução à concorrência no nível de subprograma
Semáforos
Monitores
Passagem de mensagens
Suporte de Ada para concorrência
Linhas de execução em Java
Linhas de execução em C# 
Concorrência no nível de sentença
Conceitos de Linguagens de Programação – Robert W. Sebesta
Introdução
A concorrência na execução de software pode ocorrer em quatro níveis:
no de instrução
no de sentença
no de unidade
no de programa
Como nenhuma questão de projeto de linguagem está envolvida com elas, a concorrência no nível de instrução e no nível de programa não são discutidas aqui
Conceitos de Linguagens de Programação – Robert W. Sebesta
Arquiteturas multiprocessadas
Final dos anos 1950 - um processador de propósito geral e um ou mais processadores, chamados de processadores periféricos, usados apenas para operações de entrada e saída
Início dos anos 1960 – processadores múltiplos completos, usados para concorrência no nível de programa
Meio dos anos 1960 – múltiplos processadores parciais, usados para concorrência no nível de instrução
Computadores SIMD – Single-Instruction Multiple Data (Única Instrução Múltiplos Dados) 
Computadores MIMD – Multiple-Instruction Multiple-Data (Multiplas Instruções Múltiplos Dados)
Processadores independentes que podem ser sincronizados (concorrência em nível de unidade)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Categorias de concorrência
Uma linha de execução de controle em um programa é a sequência de pontos no programa alcançada à medida que o controle flui pelo programa
Categorias de concorrência:
Concorrência física – Processadores múltiplos independentes (múltiplas linhas de execução de controle)
Concorrência lógica - Similar à ilusão de execução simultânea que é fornecida para diferentes usuários de um sistema de computação de multiprogramação de tempo compartilhado 
Corrotinas (quasi-concorrentes) têm uma única linha de execução de controle
Conceitos de Linguagens de Programação – Robert W. Sebesta
Motivações para o uso de concorrência
Envolve uma maneira diferente de projetar software que pode ser bastante útil — muitas situações reais envolvem concorrência
Computadores com multiprocessores capazes de concorrência física são agora amplamente usados
Conceitos de Linguagens de Programação – Robert W. Sebesta
Introdução à concorrência no nível 
de subprograma
Uma tarefa ou processo é uma unidade de um programa que pode estar em execução concorrente com outras unidades no mesmo programa
Tarefas se diferem dos subprogramas em três características:
Uma tarefa pode ser implicitamente iniciada
Quando uma unidade de programa invoca uma tarefa, ela não precisa esperar que esta complete sua execução antes de continuar sua própria
Quando a execução de uma tarefa estiver completa, o controle pode ou não retornar à unidade que iniciou sua execução
Tarefas geralmente trabalham juntas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Duas categorias gerais de tarefas
Tarefas pesadas (heavyweight ) executa em seu próprio espaço de endereçamento
Tarefas leves (lightweight) rodam todas no mesmo espaço de endereçamento
Uma tarefa é disjunta se não se comunica com ou não afeta a execução de qualquer outra tarefa no programa de qualquer maneira
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de tarefas
Um mecanismo que controla a ordem na qual as tarefas são executadas 
Dois tipos de sincronização
Sincronização de cooperação
Sincronização de competição
Uma tarefa pode se comunicar com outras tarefas por:
Variáveis não locais compartilhadas
Parâmetros
Passagem de mensagens
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tipos de sincronização
Cooperação: necessária entre a tarefa A e a tarefa B quando a tarefa A deve esperar que a tarefa B complete alguma tarefa específica antes que A possa começar ou continuar sua execução
Competição: necessária entre duas tarefas quando ambas requerem o uso de algum recurso que não pode ser simultaneamente usado
Para fornecer sincronização de competição, o acesso mutuamente exclusivo aos dados compartilhados deve ser garantido 
Conceitos de Linguagens de Programação – Robert W. Sebesta
Necessidade por sincronização 
de competição
Conceitos de Linguagens de Programação – Robert W. Sebesta
Escalonador
Fornecer sincronização requer um mecanismo para adiar a execução da tarefa
A tarefa de controle de execução é mantida por um programa chamado escalonador, que mapeia a execução de tarefas em processadores disponíveis
Conceitos de Linguagens de Programação – Robert W. Sebesta
Estados de execução das tarefas
Nova – criada, mas ainda não iniciada
Pronta – pronta para ser executada, mas não atualmente executada
Executando – que está sendo executada 
Bloqueada – que estava rodando, mas foi interrompida por um entre diversos eventos
Morta - não está mais ativa em nenhum sentido
Conceitos de Linguagens de Programação – Robert W. Sebesta
Vivacidade e impasse
Vivacidade é uma característica que uma unidade de programa pode ou não ter 
No código sequencial, significa que a unidade irá finalmente completar sua execução
Em um ambiente concorrente, uma tarefa que pode facilmente perder a sua vivacidade
Se todas as tarefas em um ambiente concorrente perderem sua vivacidade, ocorre um impasse
Conceitos de Linguagens de Programação – Robert W. Sebesta
Questões de projeto
Sincronização de competição e de cooperação
Como controlar o escalonamento de tarefas
Como e quando as tarefas iniciam e terminam suas execuções
Como e quando as tarefas são criadas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Métodos para fornecer sincronização
Semáforos
Monitores
Passagem de mensagens
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semáforos
Dijkstra - 1965
Um semáforo é uma estrutura de dados que consiste em um inteiro e em uma fila que armazena descritores de tarefas
Semáforos podem ser usados para implementar guardas no código que acessa estruturas de dados compartilhadas
Semáforos têm apenas duas operações, passar (wait) e liberar (release) (originalmente chamadas P e V por Dijkstra)
Semáforos podem ser usados para fornecer sincronização tanto de competição quanto de cooperação
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de cooperação 
com semáforos
Exemplo: um buffer compartilhado
O buffer é implementado como um tipo de dados abstrato com as operações DEPOSIT e FETCH
Usa dois semáforos para cooperação: emptyspots e fullspots
Os contadores de semáforo são usados para armazenar os números de emptyspots e fullspots no buffer
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de cooperação com semáforos (continuação)
O subprograma DEPOSIT precisa apenas verificar o semáforo emptyspots para ver se existe alguma posição vazia
Se existir ao menos uma, ele pode continuar com DEPOSIT, que deve incluir o decremento do contador de emptyspots
Se o buffer estiver cheio, o chamador de DEPOSIT deve esperar na fila de emptyspots 
Quando DEPOSIT terminar, ele incrementa o contador do semáforo fullspots 
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de cooperação com semáforos (continuação)
FETCH deve primeiro checar fullspots para ver se o buffer contém ao menos um item
Se contém, um item é removido e o semáforo fullspots tem seu contador incrementado em 1
Se o buffer estiver vazio, o processo chamador é colocado na fila de fullspots para esperar até que um item apareça
Quando FETCH terminar, ele precisa incrementar o contador de emptyspots
As operações em tipos semáforos frequentemente não são diretas – elas são feitas por meio dos subprogramas wait e release
Conceitos
de Linguagens de Programação – Robert W. Sebesta
Semáforos: operação wait
wait(umSemaforo)
if contador de umSemaforo > 0 then 
 decrementar o contador de umSemaforo
else 
 colocar o chamador na fila de umSemaforo
 tentar transferir o controle para alguma outra tarefa 
 (se a fila de tarefas prontas estiver vazia, ocorre um impasse) 
end if
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semáforos: operação release
release(umaSemaforo)
if uma fila de umSemaforo estiver vazia then
 incrementa o contador de umSemaforo
else
 coloca a tarefa chamadora na fila de tarefas prontas
 transfere o controle para uma tarefa da fila de umSemaforo
end
Conceitos de Linguagens de Programação – Robert W. Sebesta
Código producer
semaphore fullspots, emptyspots;
fullstops.count = 0;
emptyspots.count = BUFLEN;
task producer;
	loop
	-- produz VALUE –-
	wait (emptyspots); {espera por um espaço}
	DEPOSIT(VALUE);
	release(fullspots); {aumenta os espaços preenchidos}
	end loop;
end producer;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Código consumer
task consumer;
	loop
	wait (fullspots);{certifica-se de que não está vazio}}
FETCH(VALUE);
	release(emptyspots); {aumenta os espalos vazios}
	-- consome VALUE –-
	end loop;
end consumer;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de competição com semáforos
Um terceiro semáforo, chamado access, é usado para controlar acesso (sincronização de competição)
O contador de access tem apenas os valores 0 e 1
Um semáforo que requer apenas um contador de valor binário é chamado de semáforo binário
Conceitos de Linguagens de Programação – Robert W. Sebesta
Código producer
semaphore access, fullspots, emptyspots;
access.count = 1;
fullstops.count = 0;
emptyspots.count = BUFLEN;
task producer;
	loop
	-- produzir VALUE –-
	wait(emptyspots); {esperar por espaço}
	wait(access); {esperar por acesso}
	DEPOSIT(VALUE);
	release(access); {liberar acesso}
	release(fullspots); {aumentar espaços preenchidos}
	end loop;
end producer;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Código consumer
task consumer;
	loop
	wait(fullspots);{garantir que não esteja vazio}
	wait(access); {esperar por acesso}
	FETCH(VALUE);
	release(access); {liberar acesso}
	release(emptyspots); {aumentar espaços vagos}
	-- consumir VALUE –-
	end loop;
end consumer;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação
Desvio de semáforos pode causar falhas na sincronização de cooperação. Por exemplo, deixar a sentença wait (emptyspots) de fora da tarefa producer resultaria em um transbordamento do buffer
Desvio de semáforos pode causar falhas na sincronização de competição. Por exemplo, deixar de fora a sentença release (access) em qualquer das tarefas resultaria em um impasse
Conceitos de Linguagens de Programação – Robert W. Sebesta
Monitores
Ada, Java, C#
A ideia: encapsular as estruturas de dados compartilhadas com suas operações e ocultar suas representações
Um monitor é um tipo de dados abstratos para dados compartilhados
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de competição
Dados compartilhados são residentes no monitor, em vez de em uma das unidades clientes
Mecanismos de acesso fazem parte do monitor
A implementação de um monitor pode ser feita de forma a garantir acesso sincronizado, permitindo apenas um acesso de cada vez
Chamadas a procedimentos do monitor são implicitamente enfileiradas se o monitor estiver ocupado no momento da chamada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de cooperação
A cooperação entre processos ainda é tarefa do programador
O programador deve garantir que um buffer compartilhado não sofra de transbordamentos positivos ou negativos
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de monitores
Uma forma melhor de fornecer sincronização de competição do que os semáforos
Semáforos podem ser usados para implementar monitores
Monitores podem ser usados para implementar semáforos
O suporte para sincronização de cooperação é similar ao com semáforos, com os mesmos problemas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Passagem de mensagens
Passagem de mensagens é um modelo básico para suportar concorrência
Ela pode ser usada para semáforos e monitores
Não é apenas para sincronização de competição
Ideia central: a comunicação de tarefas é como ir ao médico – na maior parte do tempo, vocês espera por ela e ela espera por você, mas quando os dois estão prontos, vocês se encontram, ou ocorre o rendezvous
Conceitos de Linguagens de Programação – Robert W. Sebesta
Rendezvous
Para suportar concorrência com passagem de mensagens, uma linguagem precisa de:
Um mecanismo para permitir que uma tarefa indique quando ela está disposta a aceitar mensagens
Uma maneira de lembrar quem está esperando para ter sua mensagem aceita e alguma forma "justa" de escolher a próxima mensagem
Quando a mensagem de uma tarefa remetente é aceita por uma tarefa destinatária, a transmissão real da mensagem é chamada de rendezvous 
Conceitos de Linguagens de Programação – Robert W. Sebesta
Suporte de Ada para concorrência
O modelo de passagem de mensagens de Ada 83
Tarefas Ada têm uma parte de especificação e uma de corpo, como os pacotes; a especificação tem a interface, que é a coleção de pontos de entrada:
	
	task Task_Example is
		 entry ENTRY_1 (Item : in Integer);
	end Task_Example;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Corpo da tarefa
O corpo da tarefa descreve a ação quando o rendezvous ocorre
Uma tarefa que envia uma mensagem é suspensa enquanto aguarda a mensagem a ser aceita e durante o rendezvous
Pontos de entrada na especificação são descritos com cláusulas accept no corpo
accept nome_entrada (parâmetros) do
	…
end nome_entrada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Exemplo de corpo de tarefa
task body Task_Example is
 begin
 loop
 accept Entry_1 (Item: in Float) do
 ...
 end Entry_1;
 end loop;
 end Task_Example;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica da passagem de mensagens 
em Ada
A tarefa executa para o início da cláusula accept e espera por uma mensagem
Durante a execução da cláusula accept, a tarefa enviadora? é suspensa
Parâmetros accept podem transmitir informações em qualquer uma ou nas duas direções
Cada cláusula accept tem uma fila associada a ela que armazena uma lista de outras tarefas que tentaram se comunicar com ela
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linhas do tempo de rendezvous
Conceitos de Linguagens de Programação – Robert W. Sebesta
Tarefas atrizes e servidoras
Uma tarefa que tem cláusulas accept, mas nenhum outro código é chamada de tarefa servidora (o exemplo anterior é uma tarefa servidora)
Uma tarefa sem cláusulas accept é chamada de tarefa atriz
Uma tarefa atriz pode mandar mensagens para outras tarefas
Uma tarefa Ada que envia uma mensagem para outra deve conhecer o nome de entrada na tarefa, mas o contrário não é necessário (assimetria)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Representação gráfica de um rendezvous
Conceitos de Linguagens de Programação – Robert W. Sebesta
Múltiplos pontos de entrada
Tarefas podem ter mais de um ponto de entrada
O corpo de uma tarefa deve incluir alguma forma sintática dos pontos de entrada que correspondem às cláusulas entry na parte de especificação da tarefa
Os pontos de entrada no corpo de tarefas são especificados por cláusulas accept, as quais são introduzidas pela palavra reservada accept
Conceitos de Linguagens de Programação – Robert W. Sebesta
Uma tarefa com múltiplas entradas
task body Teller is
 loop
select 
 accept Drive_Up(formal params) do
 ...
 end Drive_Up;
 ...
 or
 accept Walk_Up(formal params) do
 ...
 end Walk_Up;
 ...
 end select;
 end loop;
 end Teller;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica de tarefas com múltiplas cláusulas accept
Se exatamente uma fila entry não está vazia, escolha uma mensagem dela
Se mais de uma fila entry é não vazia, uma é escolhida não deterministicamente, a partir do qual a aceitar uma mensagem
Se todas estão vazias, espera
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de cooperação com passagem de mensagens
Cada cláusula accept pode ter uma guarda anexada, na forma de uma cláusula when
	when not Full(Buffer) =>
 	accept Deposit (New_Value) do
 ...
 end
Uma cláusula accept com uma cláusula when está aberta ou fechada
Se a expressão booleana da cláusula when é verdadeira, a cláusula accept é aberta (open)
Se a expressão é falsa, a cláusula é fechada (closed)
Uma cláusula sem guarda é sempre aberta
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica de select com cláusulas accept guardadas:
select examina as guardas em todas as cláusulas
Se exatamente uma das cláusulas abertas possuir uma fila não vazia, uma mensagem dessa fila é retirada e um rendezvous ocorre
Se mais de uma das cláusulas accept possuir filas não vazias, uma das filas é escolhida não deterministicamente, uma mensagem é retirada dessa fila, e um rendezvous ocorre
Se todas estiverem fechadas, ocorre um erro em tempo de execução
Uma cláusula select pode incluir uma cláusula else para solucionar o erro
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica de select com cláusulas accept guardadas:
Nota: O posto pode estar sem gasolina e pode ou ou não ter uma vaga disponível na garagem
	task Gas_Station_Attendant is
 	entry Service_Island (Car : Car_Type);
 	entry Garage (Car : Car_Type);
	end Gas_Station_Attendant;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semântica de select com cláusulas accept guardadas:
task body Gas_Station_Attendant is
 begin
 loop
 select
 when Gas_Available =>
	 	 accept Service_Island (Car : Car_Type) do
	 Fill_With_Gas (Car);
	 end Service_Island;
 or
	 when Garage_Available =>
	 accept Garage (Car : Car_Type) do
	 Fix (Car);
	 end Garage;
 else
	 Sleep;
 end select;
 end loop;
 end Gas_Station_Attendant;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de competição com passagem de mensagens
Modelagem de acesso mutuamente exclusivo aos dados compartilhados 
Exemplo - um buffer compartilhado
Encapsular o buffer e as suas operações em uma tarefa
Sincronização de competição é implícita na semântica das cláusulas accept
Apenas uma cláusula accept em uma tarefa pode ser ativa em um determinado momento
Conceitos de Linguagens de Programação – Robert W. Sebesta
Término de tarefas
A execução de uma tarefa está completa se o controle alcançou o final de seu corpo de código
Se uma tarefa não criou outras tarefas, chamadas de dependentes, ela é terminada quando sua execução estiver completa 
Uma tarefa que criou tarefas dependentes é terminada quando a execução de seu código estiver completa e todas as suas dependentes estiverem terminadas
Conceitos de Linguagens de Programação – Robert W. Sebesta
A cláusula terminate
Uma cláusula terminate em uma cláusula select é uma sentença terminate 
Uma cláusula terminate é selecionada quando nenhuma cláusula accept está aberta
Uma cláusula terminate quando selecionada, significa que o trabalho da tarefa está finalizado, mas ainda não terminado
Conceitos de Linguagens de Programação – Robert W. Sebesta
Prioridades
A prioridade de qualquer tarefa pode ser definida por pragma priority
pragma Priority (expression);
A prioridade de uma tarefa é aplicada apenas quando ela está na fila de tarefas prontas
Conceitos de Linguagens de Programação – Robert W. Sebesta
Semáforos binários
Para situações em que o acesso à estrutura de dados deve ser controlado e esta não é encapsulada em uma tarefa task Binary_Semaphore is entry Wait; entry release; end Binary_Semaphore; task body Binary_Semaphore is begin loop accept Wait; accept Release; end loop; end Binary_Semaphore;
Conceitos de Linguagens de Programação – Robert W. Sebesta
Concorrência em Ada 95
Ada 95 incluiu características de Ada 83 para concorrência, mais dois
Objetos protegidos: fornecem um método alternativo de fornecer sincronização de competição que não envolve o mecanismo de rendezvous
Comunicação assíncrona
Conceitos de Linguagens de Programação – Robert W. Sebesta
Ada 95: objetos protegidos
Um objeto protegido é semelhante a um tipo de dado abstrato
O acesso a um objeto protegido ocorre por meio de mensagens transmitidas para as entradas, como aconteceu com uma tarefa, ou por meio de subprogramas protegidos
Um procedimento protegido fornece acesso de leitura e escrita mutuamente exclusivo para dados do objeto protegido
Uma função protegida fornece acesso concorrente somente leitura para esses dados
Conceitos de Linguagens de Programação – Robert W. Sebesta
Comunicação assíncrona
Fornecida por meio de estruturas select assíncronas
Um select assíncrono tem duas alternativas de disparo, uma chamada de entrada ou uma sentença delay
A cláusula de entrada é disparada quando envia uma mensagem
A sentença delay é disparada quando o tempo limite é atingido
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação de Ada
Modelo de passagem de mensagens de concorrência é poderoso e geral
Objetos protegidos são uma maneira melhor de fornecer dados compartilhados sincronizados
Na ausência de processadores distribuídos com memórias independentes, a escolha entre monitores e tarefas com passagem de mensagens é uma questão de gosto
Para sistemas distribuídos, a passagem de mensagens é um modelo melhor para a concorrência
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linhas de execução em Java
As unidades concorrentes em Java são métodos chamados run
Seu código pode estar em execução concorrente com outros métodos run
O processo no qual o método run executa é chamado de linha de execução (thread)
Class myThread extends Thread
	public void run () {…}
}
…
Thread myTh = new MyThread ();
myTh.start();
Conceitos de Linguagens de Programação – Robert W. Sebesta
Controlando a execução
A classe Thread tem diversos métodos para controlar a execução de linhas de execução
yield é uma requisição da linha de execução que está rodando para voluntariamente desistir do processador
sleep pode ser usado pelo chamador para bloquear uma linha de execução
join é usado para forçar um método a postergar sua execução até que o método run de outra linha de execução tenha completado sua execução 
Conceitos de Linguagens de Programação – Robert W. Sebesta
Prioridades das linhas de execução
A prioridade padrão de uma linha de execução inicialmente é a mesma da linha de execução que a criou
Se main cria uma linha de execução, sua prioridade padrão é NORM_PRIORITY
Thread define duas outras constantes de prioridade, MAX_PRIORITY e MIN_PRIORITY
A prioridade de uma linha de execução pode ser modificada com o método setPriority
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de competição com linhas 
de execução Java
Um método sincronizado impede que outros métodos sejam executados no objeto enquanto ele está em execução
…
public synchronized void deposit( int i) {…}
public synchronized int fetch() {…}
…
Os métodos acima são sincronizados que previnem que um interfira no outro
Se apenas parte de um método
deve ser executada sem interferência, é possível usar uma sentença sincronizada synchronized statement
synchronized (expressão) 
 sentenças
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronização de cooperação com linhas 
de execução Java
A sincronização de cooperação em Java é realizada com o uso dos métodos wait, notify e notifyAll
Todos são definidos em Object, a classe raiz de todas as classes Java
wait deve ser chamada em um laço
notify é chamado para informar uma linha de execução que está em espera que o evento que ela estava esperando já ocorreu
notifyAll acorda todas as linhas de execução da lista de espera do objeto, iniciando sua execução logo após sua chamada a wait
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação das linhas de execução em Java
O suporte de Java para concorrência é simples, mas efetivo
Não é tão poderoso quanto as tarefas de Ada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Linhas de execução em C#
Apesar de as linhas de execução em C# serem levemente baseadas nas de Java, existem diferenças significativas
Operações básicas de linhas de execução
Qualquer método pode rodar em sua própria linha de execução
Uma linha de execução é criada por meio da criação do objeto Thread
Criar uma linha de execução não inicia sua execução concorrente; a execução deve ser solicitada por meio de um método Start
Uma linha de execução pode ser feita para esperar o fim de outra linha de execução com o método Join
Uma linha de execução pode ser suspensa com Sleep
Uma linha de execução pode ser finalizada com Abort
Conceitos de Linguagens de Programação – Robert W. Sebesta
Sincronizando linhas de execução
Há três maneiras de sincronizar linhas de execução C#
A classe Interlocked
Usada quando as únicas operações que precisam ser sincronizadas são o incremento e decremento de um inteiro
A sentença lock
Usada para marcar uma seção crítica de código em uma linha de execução
A classe Monitor
Define cinco métodos, Enter, Wait, Pulse, PulseAll e Exit, que podem ser usados para fornecer uma sincronização mais sofisticada de linhas de execução
Conceitos de Linguagens de Programação – Robert W. Sebesta
Avaliação da concorrência em C#
Um avanço em relação às linhas de execução em Java. Por exemplo, qualquer método pode ser executado em sua própria linha de execução
O término das linhas de execução também é mais limpo em C#
A sincronização é mais sofisticada
Conceitos de Linguagens de Programação – Robert W. Sebesta
Concorrência no nível da sentença
Objetivo: Fornecer um mecanismo para o que o programador possa informar o compilador de maneiras pelas quais ele possa mapear o programa em uma arquitetura multiprocessada
Minimizar a comunicação entre os processadores e as memórias dos outros processadores
Conceitos de Linguagens de Programação – Robert W. Sebesta
Fortran de alto desempenho
Uma coleção de extensões que permitem ao programador especificar informações ao compilador para ajudá-lo a otimizar a execução de programas em computadores multiprocessados
Especificar o número de processadores, a distribuição dos dados nas memórias desses processadores e o alinhamento dos dados com outros dados
Conceitos de Linguagens de Programação – Robert W. Sebesta
Especificações do Fortran de Alto Desempenho
Número de processadores
	!HPF$ PROCESSORS procs (n)
Distribuição de dados
 	!HPF$ DISTRIBUTE (tipo) ONTO procs :: 		lista_de_identificadores
Nessa sentença, o tipo pode ser ou bloco (BLOCK) ou cíclica (CYCLIC)
Relação de distribuição de uma matriz com a de outra
	ALIGN elemento_matriz1 WITH elemento_matriz2
Conceitos de Linguagens de Programação – Robert W. Sebesta
Exemplo de concorrência no nível da sentença
REAL list_1(1000), list_2(1000)
 INTEGER list_3(500), list_4(501)
!HPF$ PROCESSORS proc (10)
!HPF$ DISTRIBUTE (BLOCK) ONTO procs ::
 list_1, list_2
!HPF$ ALIGN list_1(index) WITH 
 list_4 (index+1)
 …
 list_1 (index) = list_2(index)
 list_3(index) = list_4(index+1)
Conceitos de Linguagens de Programação – Robert W. Sebesta
Concorrência no nível da sentença (continuação)
A sentença FORALL especifica uma coleção de sentenças que pode ser executadas concorrentemente. Por exemplo,
		FORALL (index = 1:1000) 
 	 	list_1(index) = list_2(index)
Conceitualmente, ela especifica que o lado direito de todas as 1.000 atribuições podem ser avaliados primeiro, antes de quaisquer atribuições ocorrerem
Conceitos de Linguagens de Programação – Robert W. Sebesta
Resumo
A execução concorrente pode ser nos níveis de instrução, sentença ou subprograma
Concorrência física: quando múltiplos processadores são usados para executar unidades concorrentes
Concorrência lógica: unidades concorrentes são executadas em apenas um processador
Duas das facilidades das linguagens que suportam concorrência de subprogramas: sincronização de competição e sincronização de cooperação
Mecanismos: semáforos, monitores, rendezvous, threads
O Fortran de Alto Desempenho (HPF) inclui sentenças para especificar como os dados serão distribuídos nas unidades de memória conectadas a múltiplos processadores
*

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?