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 *