Expressão da Concorrência. Autoria 4 Alunos de turma de SOII 4 C. Geyer 4 Versão –V24.4, 2014-2.

Slides:



Advertisements
Apresentações semelhantes
Sistemas Operacionais
Advertisements

Sistemas Operacionais
Sistemas Distribuídos
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Programação em Java Prof. Maurício Braga
INTRODUÇÃO À COMPUTAÇÃO Sistemas Operacionais
Sistemas Operacionais
Especificação de Concorrência Professora: Lúcia Drummond.
Sistemas Operacionais
gerador de código intermediário
1.3.2 – Linguagem Assembly Um programa em linguagem de máquina sofre de total falta de clareza O programa é uma sequência de linhas numeradas Cada linha.
OpenMP.
O Essencial sobre Linguagens de Programação Luís Caires Maio 2005.
Programação Concorrente
Processos no Unix e Linux
Introdução à Compilação Prof. Leandro Magno Slides adaptados a partir do material cedido pelos professores Heloise Manica Paris Teixeira, Yandre M. G.
Prof. Heloise Manica Paris Teixeira
Chapter 4: Threads.
Introdução a Informática
INTRODUÇÃO À PROGRAMAÇÃO
Programação Concorrente
Softwares.
Análise Léxica Supondo o trecho de programa abaixo:
Concorrência Aula X.
Linguagens de Programação
Threads.
Professor Fernando Luís
Paradigmas de programação
JAVA: Conceitos Iniciais
II Sistemas Operacionais Professor Cláudio Geyer
PROGRAMAÇÃO I UNIDADE 1.
Unidade 3 Controle de Concorrência
Expressão da Concorrência
Aula prática 13 Orientação a Objetos – C++ Parte 1
Aula prática 6 Vetores e Matrizes
Linguagem de Programação II Parte IX
Linguagem de Programação IV
Sistemas Distribuídos
PROGRAMAÇÃO ESTRUTURADA (MODULARIZAÇÃO/SUBPROGRAMAÇÃO)
Paradigmas de Linguagens de Programação Linguagem Imperativa 2
Alexandre Mota/Augusto Sampaio {acm,
Paradigmas de Linguagens de Programação Linguagem Imperativa 1
Java Bytecode Software Básico Mitsuo Takaki.
Computação L1: Infra-Estrutura Básica
Capítulo VIII Ambientes de Execução
SISTEMAS OPERACIONAIS I
Sistemas Operacionais
Processadores de Linguagens
Algumas notas sobre a linguagem de programação C
Aula 1 – Profª Danielle Costa
Sistemas Operacionais
Conceitos de thread Faculdade PITÁGORAS – Outubro de 2012
Back-End Compilação aula-11-back-end.pdf.
Prof. Werley T. Reinaldo 26/05/  Sistemas Operacionais:  Visão geral  As diferentes imagens do SO:  Visão Usuários;  Visão Projeto.  Multiprogramação;
Professor Esp. Diego André Sant’Ana Disciplina: Sistemas Operacionais II Sistemas de Arquivos- Tipo de arquivos – Cap
Capítulo 4: Processos.
Fundamentos de linguagens de programação
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Introdução à Programação
Paradigmas de Linguagens de Programação Conceitos da Linguagem Imperativa 1 Augusto Sampaio e Paulo Borba Centro de Informática Universidade Federal de.
Linguagens de Programação
Capítulo 2 Processos e Threads 2.1 Processos 2.2 Threads
Sistemas Operacionais IV – Gerenciamento de E/S
Ponteiros. Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1.
Computadores vs. Programas / Algoritmos Computadores vs. Programas -> Algoritmos O tratamento de problemas através do computador geralmente envolve uma.
Sistemas Operacionais II Professor Cláudio Geyer Instituto de Informática - UFRGS.
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
COMPILADORES 02 Prof. Marcos. COMPILADORES Do Programa à Execução Computadores das mais variadas arquiteturas têm funcionamento:
Capítulo 4 Estrutura do Sistema Operacional
Expressão da Concorrência
Transcrição da apresentação:

Expressão da Concorrência

Autoria 4 Alunos de turma de SOII 4 C. Geyer 4 Versão –V24.4,

Índice 4 Visão Visão geral do Assunto 4 Grafo Grafo de Precedência 4 Fork/join Fork/join 4 Parbegin/end Parbegin/end 4 Vetor Vetor de processos

Resumo geral dos slides 4 Apresentação das principais formas (mecanismos) de criação e gerência da concorrência 4 Tipos 4 Propriedades 4 Prós e contras 4 Exemplos

Representação de uma tarefa 4 Forma abstrata –Independentemente de modelo e linguagem de programação 4 Processo –conceito ou construção de SO e bibliotecas –freqüentemente (↓) associado a uma tarefa 4 Thread –conceito ou construção de SO, bibliotecas e de linguagens –freqüentemente (↑) associado a uma tarefa

Processo x thread 4 Processo –Mais antigo –Mais lento (criação,...) –Maior consumo de memória –Oferece mecanismos de proteção entre processos –Não oferece variáveis (memória) compartilhada entre processos Via bibliotecas Consideradas menos eficientes e “inseguras” –Mais usado em PC com memória distribuída (redes,...)

Processo x thread 4 Thread –Em geral o inverso de processo P.ex.: mais rápido –Mais usado em PC com memória compartilhada (1 computador)

Tipos de criação 4 Inicialmente, convém considerar as formas pelas quais a concorrência da execução pode ser especificada. 4 Tipos em função de “quando” –Estática –Dinâmica

Tipos de criação 4 Tipos em função de “quando” –estática o programa contém a declaração de um conjunto fixo de processos os quais são ativados simultaneamente, no início da execução do programa mais simples para o programador eventualmente gerência de tarefas mais simples -> mais eficiente

Tipos de criação 4 Tipos em função de “quando” –dinâmica pois os processos são criados e terminados dinamicamente, durante a execução mais flexibilidade, pois os processos são criados e terminados conforme as necessidades da aplicação quantidade variável conforme necessidade em cada execução e momento

Tipos de criação 4 Em função de “quem” –Implícita e explícita –Implícita sistema cria automaticamente –Compilador –Máquina virtual (JVM,...) mais simples para o programador freqüentemente menos flexível nem sempre o “sistema” sabe quando, o que,...

Tipos de criação 4 Em função de “quem” –explícita programador deve usar uma primitiva ou construção específica mais flexível trabalho extra para o programador

Tipos de criação 4 Freqüentemente –estática-implícita MPI (biblioteca para programação paralela) Versão 1: estática em tempo de carga do programa N instâncias do mesmo código onde N é quantidade de cpus –dinâmica-explícita fork (Unix) Comando ou procedimento que cria novo processo

Tipos de criação 4 Outros casos –dinâmica-implícita paralelização automática (via compilação) de linguagens –Prolog, Lisp –Fortran, C Paralelização semi automática via diretivas de linguagens –OpenMP

Tipos de criação 4 Outros casos –estática-explícita SR (linguagem proposta por [Andrews 1991] declaração de processos por palavra reservada e begin/end ativados no início da execução quantidade fixa em todas as execuções obs: processos são encapsulados em um “resource” o qual é dinâmico –Vários outros casos: combinando tipos acima

Tipos de criação 4 Outros casos –Exercício Considere uma linguagem onde se possa criar uma tarefa via marcação de um trecho de código com uma palavra reservada... Task: x := y +1; z := fibonacci(x);... É modo implícito ou explícito? Dinâmico ou estático?

4 Grafo de Precedência –grafo (usualmente) acíclico dirigido, no qual cada nó representa a execução de um processo –pode ser interpretado como um grafo de fluxo de processos –normalmente usado em projeto, especificação, análises,... editor convencional editores para PC –pouco usado em linguagens e bibliotecas de programação motivos: –alto consumo de espaço em telas e impressões –necessidade de ser completado com texto Conceito

4 Cada nodo representa um processo; 4 Cada arco indica a precedência de execução e restrição na ordem dos processos; 4 Exemplo: Grafo de Precedência Pi Pj – Pj só pode ser executado após Pi, ou seja, Pj depende de Pi

I1 :: A := X + Y; I2 :: B := Z + 1; I3 :: C := A - B; I4 :: W := C + 1; Grafo de Precedência - Exemplo 1 Programa: 4 Suponha que queremos executar algumas dessas instruções concorrentemente. 4 Claramente, é possível perceber que a instrução I3 não pode ser executada antes de I1 e I2, pois I3 necessita dos novos valores de A e B. 4 E o mesmo acontece com I4, que não pode ser executado antes que o valor de C seja atualizado por I3.

Grafo de Precedência - Exemplo 1 I3I4Fim I2 I1 Grafo de Precedência correspondente ao programa apresentado Início

4 Considere um grafo de precedência com as seguintes relações de precedência: –C2 e C3 podem ser executados depois da execução de C1; –C4 pode ser executado depois da execução de C2; –C5 e C6 podem ser executados depois da execução de C4; –C7 só pode ser executado depois da execução de C5, C6 e C3; Grafo de Precedência - Exemplo 2

C1 C2 C3 C4 C5 C6 C7

Grafo de Precedência 4 Limitações –não representa comunicação contínua (repetida) entre dois processos –não representa comunicação realizada durante a execução (subcaso) –não representa repetições de processos –na literatura: inúmeros extensões, ou ainda outras propostas, para contornar essas e outras limitações

Usos 4 Em projeto e especificação de programas concorrentes 4 Em análise da complexidade de PCs 4 Em programação de programas paralelos –em geral, modelos mais restritos –por exemplo, a comunicação entre processos é somente por arquivos 4 No controle da execução de um Sistema Distribuído –Sistema composto de vários programas sequenciais –Meta programação ou programação em 2 níveis –Ferramentas de workflow

4 Fork/Join –As instruções fork e join foram introduzidas por Conway [1963] e Dennis e Van Horn [1966]; –Foram a primeira notação de linguagem para especificação de concorrência; Conceito

Fork 4 A instrução fork L produz duas execuções concorrentes (fluxo, tarefa) num programa. –Uma execução começa na instrução rotulada L, –enquanto a outra é a continuação da execução na instrução seguinte à instrução fork –Processo (tarefa) filho: Usualmente a nova execução concorrente –Processo pai: Usualmente a que executou o fork

Fork 4 Para ilustrar este conceito, considere o seguinte segmento de programa: –Ci é um comando qualquer (inclusive composto) C1; fork L;// L é um rótulo C2; L: C3;

Fork 4 Parte do grafo de precedência do programa é apresentado na figura ao lado. 4 Quando a instrução fork L é executada, uma nova computação é iniciada em C3. Esta nova computação executa concorrentemente com a antiga computação, a qual continua em C2. C1 Fork C3C2

Join 4 A instrução join agrupa duas computações concorrentes em uma. –Cada uma das computações deve requisitar para ser agrupada com a outra. –Já que as computações podem ter tempos de execução diferentes, uma pode executar o join antes da outra e sua execução é terminada. 4 A instrução join deve ser executada de forma atômica. –Sem interrupções na visão de terceiros

Join - Exemplo 1 count := 2; fork L1;... C1; goto L2; L1: C2; L2: join count; Join C2C1 C3 Parte do grafo de precedência para a programa ao lado

Fork/Join - Exemplo C1; count := 3; fork L1; C2; C4; fork L2; C5; goto L3; L2: C6; goto L3; L1: C3; L3: join count; C7; Ver grafo de precedência correspondente

Fork/Join 4 É importante notar que a execução de uma instrução fork divide uma única computação em duas computações independentes. 4 Também é importante salientar que a execução de uma instrução join agrupa diversas execuções concorrentes.

Fork- Características 4 criação dinâmica de processos, o que dificulta a correção do programa; 4 quantidade de processos variável em cada execução; –Através do uso de comandos ifs, whiles,... 4 código do novo processo é o mesmo do processo pai; –existem variações como por exemplo nas threads ou em OO

Fork- Características 4 variáveis: 2 alternativas em geral; –A: compartilhamento de variáveis; –B: duplicação das variáveis, como ocorre no Unix; Valor inicial na cópia é idêntico mas depois são independentes 4 estruturas do tipo goto dão pouca legibilidade ao programa;

Fork - exemplos 4 SO Unix, Linux –Formato: process_id fork(); –process_id: se pai recebe id do filho Se filho, recebe zero –Ambos os processos continuam a execução na instrução seguinte ao fork –Duplicação de variáveis

Fork - exemplos 4 SO Unix, Linux –Uso comum int pid; pid = fork(); if pid == -1 { “código de erro” } else if pid == 0 { “código do filho” } else { “código do pai” }

Join - Variações 4 Forma geral: agrupamento de 2 processos concorrentes 4 Join “n” –n: número de processos a sincronizar ou terminar no join 4 Join Pk –espera pelo término do processo Pk; –Pk é normalmente um processo filho; –é necessário que os processos estejam nomeados para sua identificação; 4 Join-filho –espera pelo término de algum filho

4 Join usando exit –o processo que executa join espera pelo término de um filho; –processo filho termina por exit; –Exemplo:... I1; fork LI3; I2; join; I4; GOTO LI5; LI3: I3; exit; Join - Variações

Exemplos de Implementações 4 SOs Unix, Linux 4 Biblioteca de programação paralela MPI

Thread 4 Variação do fork/join 4 Modelo mais usado atualmente para PC –Devido vantagens básicas: Mais eficiente Variáveis compartilhadas 4 Inúmeras implementações –SOs: Unix, Linux, Windows, SOs de dispositivos móveis (PDAs, celulares), embarcados, sensores,... –Bibliotecas –Linguagens: Java, C#, Python,...

Thread 4 Modelo processo + thread usual –Um processo pode conter várias threads –O código main (procedure, método) é uma thread –Uma thread tem escopo limitado ao de seu processo Processo B não tem acesso a threads de processo A –Usualmente o escopo de um processo é limitado por um computador Escopo: hw (cpu, ram,...) mais o SO Logo também o de uma thread

Thread 4 Criação –Primitiva (procedure, método) “create_thread” –Argumentos Procedure que contém o código da thread Argumento da procedure –Retorno Identificador da thread –Semântica Similar à do fork Thread atual continua execução concorrentemente à nova

Thread 4 Morte –Final da procedure (ou método) –Exit

Thread 4 Modelo usual de variáveis –Variáveis estáticas Compartilhadas entre as threads de um mesmo processo –Variáveis locais Uma cópia por thread –Argumentos Uma cópia por thread

Thread 4 Exemplos –Posix threads Biblioteca padronizada SO Unix, Linux e outros –Java threads –C# threads

4 Parbegin/end –comando de alto nível para especificação da concorrência; comando estruturado –especifica explicitamente um conjunto de blocos (sequenciais internamente) de programa que serão executados concorrentemente; –normalmente encontrado em algumas linguagens nunca (?) usado em bibliotecas exige compilação Conceito

Parbegin/End 4 Todos os comandos são encapsulados entre o parbegin e parend e devem ser executados concorrentemente; 4 Quantidade fixa de processos (tarefas); 4 Sintaxe do comando: Parbegin C1;C2;…;Cn Parend 4 Semântica do comando: –Cada Ci é um bloco de código autônomo sequencial –Os Ci são executados concorrentemente.

Parbegin/End 4 grafo de precedência que corresponde à sintaxe dada anteriormente 4 C0 e Cn+1 são os comandos que aparecem logo antes e após da/a instrução parbegin/parend, respectivamente. 4 o comando Cn+1 pode ser executado somente após todos Ci i= 1,2…n, tiverem sido executados C n+1 C2Cn... Co C1

Parbegin/End - Exemplo 1 C1; parbegin C3; begin C2; C4; parbegin C5; C6; parend; end; parend; C7; Ver grafo de precedência correspondente

Parbegin/End - Vantagens e Desvantagens 4 Vantagens: –Mais legível; –Maior facilidade na verificação de erros; 4 Desvantagens: –Todo o grafo de precedências pode ser expresso por fork/join, mas nem todo o grafo de precedências pode ser representado por parbegin/parend. Com fork/join é possível entrar e sair de um subgrafo –Dependendo da sofisticação da linguagem, pode-se proibir o uso de goto para dentro ou para fora do parbegin/end

4 Vetor de Processos –necessita a criação de um vetor de tarefas de n posições também pode trabalhar com matrizes; –cada processo (tarefa) executa o mesmo código código é declarado dentro de um laço cujas instruções são executadas concorrentemente; obs: concorrência entre tarefas! Conceito

4 Vetor de Processos –cada processo (tarefa) executa o mesmo código Para ser útil => sobre dados diferentes Solução implícita (simples) –Cada tarefa tem um ID distinto correspondendo a índice de vetor (ou array, matriz) –Se vetor: entre 1 (ou 0) e n (ou n-1) –Com esses índices se acessa arrays de dados »=> dados distintos por tarefa Conceito

Vetor de processos - Exemplo 1 4 Declaração do vetor: var a[1:n]: real;// sintaxe SR 4 Código: process inicializa (i: 1 to n) a[i] := 0 4 Código de cada processo: a[i] := 0 4 Função geral: inicializar o vetor “a” de forma concorrente

Vetor de processos - Exemplo 1 4 Equivale a fa i := 1 to n  a[i] := 0 af// sintaxe SR ou for (i := 1 to n) {a[i] := 0}

Vetor de processos - Exemplo 2 4 Declaração das matrizes: (sintaxe SR) var a[1:n,1:n], b[1:n,1:n]: real; var c[1:n, 1:n]: real := ( [n], ([n] 0.0)) 4 Inicialização das matrizes: fa i:= 1 to n, j:= 1 to n  read(filea, a[i,j]); read(fileb, b[i,j]) af

Vetor de processos - Exemplo 2 (cont.) 4 Laço de execução: process compute (i := 1 to n, j := 1 to n) fa k:= 1 to n  c[i,j]) := c[i,j] + a[i,k]*b[k,j] af 4 Comentários: –criação de n 2 processos (2 laços de ordem n) –matrizes são inicializadas seqüencialmente –produtos são computados em paralelo

Vetor de processos - caso 4 Biblioteca OpenMP –Padronizada –Para programação paralela –Para certos tipos de programas Ou melhor, para certos tipos de padrões de código (estruturas) Em particular: loops –Uso de diretivas Algo entre implícito e explícito –Exige compilador especial –Adicionada às linguagens C, Fortran,...

Considerações Finais 4 Vários modelos para criação da concorrência –Modelos de programa concorrente –APIs para criação e gerência (join,...) das tarefas –Variações na semântica das APIs –Variações na sintaxe das APIs (menos importante) 4 Diferentes modelos afetam os outros aspectos da PC –Sincronização e comunicação

Considerações Finais 4 Existem outros modelos –Nas linguagens OO E com APIs distintas,... –Na paralelização de linguagens seqüenciais (Fortran, Lisp, Prolog,...) Normalmente usando os modelos acima na implementação

Resumo 4 Tarefa, processo e thread 4 Tipos: estático x dinâmico, implícito x explícito 4 Modelos –Grafo de precedências (ou de comunicação) –Fork/join –Thread –Parbegin/parend –Array de processos

Exercício 1 4 Reescreva o seguinte programa usando instruções parbegin/parend. Certifique-se de que será explorado o máximo de paralelismo e que o resultado produzido será sempre o mesmo da execução seqüencial. W := X1 * X2; V := X3 * X4; Y := V * X5; Z := V * X6; Y := W * Y ; ANS := Y + Z;

Exercício 1-a 4 Reescreva o seguinte programa usando instruções parbegin/parend. Certifique-se de que será explorado o máximo de paralelismo e que o resultado produzido será sempre o mesmo da execução seqüencial. W := X1 * X2; V := X3 * X4; T := Y1 + Y2; Y := V * T; Z := V * X6; W := W * Y ; ANS := Y + Z;

Exercício 1 - Resposta parbegin W := X1 * X2; begin V := X3 * X4; parbegin Y := V * X5; Z := V * X6; parend; end; parend; Y := W * Y ; ANS := Y + Z;

Exercício 2 4 Transforme o grafo de precedência abaixo em um programa usando fork/join: C1 C2 C3 C4 C6 C5

Exercício 2-a 4 Transforme o grafo de precedência abaixo em um programa usando fork/join: C1 C2 C3 C4 C8 C5 C6 C7

Exercício 2 - Resposta C1; fork LC3; fork LC4; C2; LJ3: join; C5; LJ4: join; C6; LC3: C3; goto LJ3; LC4: C4; goto LJ4; Transformação do grafo de precedência em um programa utilizando instruções fork/join

Exercício 3 4 Transforme o grafo de prcedência abaixo em um programa fork/join e em parbegin/parend. Se o grafo não puder ser representado por parbegin/parend, explique porquê. C1 C2 C3 C4 C5 C6FIM

Exercício 3 - Resposta C1; fork LI3; C2; fork LI5; C4; LJ5: join; LJ3: join; C6; LC3: C3; goto LJ3; LI5: C5; goto LJ5; Transformação do grafo de precedência em um programa utilizando instruções fork/join

Exercício 3 - Resposta C1; parbegin C3; begin C2; parbegin C4; C5; parend; end; parend; C6; Transformação do grafo de precedência em um programa utilizando instruções parbegin/parend

Exercício 4 4 Implemente o grafo de precedência abaixo utilizando fork/join. Explique a semântica do fork e do join: início do processo, quantidade de processos

Exercício 4 - Resposta 1; Fork L3; 2; Fork L5; 4; 8; J2: Join J3: Join; 10; exit; L3: 3; Fork L7; 6; J1: Join; goto J3; L7: 7; goto J1; L5: 5; 9; goto J2; O início do processo se dá com o processo pai (1). O comando fork cria processos filhos. A quantidade de processos criados é variável. Já a semântica do processo join é esperar o término de 2 processos (join padrão) para somente depois disso passar para a próxima instrução. O código com fork/join não fica legível, mas a criação dos processos é feita de forma dinâmica. Exemplo: Fork L3 cria ó processo 3. O join de rótulo J1 espera o término da execução de 6 e 7.

Exercício 5 4 A partir do programa abaixo que utiliza fork/join, implemente o grafo de precedência correspondente. 1; Fork L3; Fork L4; 2; goto J1; L3: 3; Fork L6; 5; J1: Join; 7; Fork L9; 8; J2: Join; J3: Join; 11; exit; L4: 4; goto J4; L6: 6; J4: Join; 10; goto J3; L9: 9; goto J2;

Exercício 5 - Resposta

Revisão 4 Tipos quanto a “quando”? 4 Tipos quanto a “quem”? 4 Combinações usuais? 4 Tipos mais simples para programador? 4 Tipos mais eficientes? 4 Tipos mais flexíveis?

Revisão 4 Conceito de grafo de precedência –nó? –arco? –2 nós ligados por 1 arco? –1 nó com 2 ou mais arcos de saída? –1 nó com 2 ou mais arcos de entrada?

Revisão 4 Conceito de fork clássico –função básica? –código? –variáveis? –início? 4 Variações no fork Unix? –sobre acima? –retorna? 4 Problemas de eng. de sw

Revisão 4 Conceito de join clássico –versão 2 processos –versão n (2 ou mais) processos 4 Variações no Unix –nome –tipo 1 (anônimo) –tipo 2 (com identificador)

Revisão 4 Parbegin/parend –estático ou dinâmico? –implícito ou estático? –quais funções do modelo fork/join? –qual o modelo de código? –qual o modelo de dados? –o que pode ser proibido no parbegin/parend? –quais as vantagens?

Revisão 4 Vetor de processos –estático ou dinâmico? –implícito ou explícito? –qual o código? –qual o modelo de dados? –qual a similaridade com o parbegin/parend? –qual a diferença com …?

Revisão 4 Outras primitivas Unix –sobre identificadores –término –código

Bibliografia 4 Andrews, G.R.; The SR Programming Language - Benjamin/Cummings, 1993, 1 ed., Redwood City, 344p 4 Bic, L.; Shaw, A.C.; The Logical Design of Operating Systems - Prentice Hall, 1988, 2 ed., New Jersey, 370p. 4 Peterson, J.L.; Silberschatz,A.; Operating System Concepts - Addison-Wesley, 1985, 2 ed., 584p. 4 Toscani,S.S.; Introdução aos Sistemas Operacionais - Apostila, Instituto de Informática, 1996, Porto Alegre, 184p.

Especificações Autores Ingrid de Vargas Mito Maíra Colling Wenzel Local Instituto de Informática UFRGS Disciplina: Sistemas Operacionais II Ano: 1998/2 Revisão: (C. Geyer)