A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Expressão da Concorrência

Apresentações semelhantes


Apresentação em tema: "Expressão da Concorrência"— Transcrição da apresentação:

1 Expressão da Concorrência

2 Autoria Alunos de turma de SOII C. Geyer Versão V24.8,

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

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

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

6 Processo x thread 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, ...)

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

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

9 Tipos de criação 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

10 Tipos de criação 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

11 Tipos de criação 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, ...

12 Tipos de criação 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

13 Tipos de criação 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

14 Tipos de criação 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

15 Tipos de criação 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

16 Tipos de criação 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?

17 Modelo 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

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

19 Grafo de Precedência - Exemplo 1
Programa: I1 :: A := X + Y; I2 :: B := Z + 1; I3 :: C := A - B; I4 :: W := C + 1; Suponha que queremos executar algumas dessas instruções concorrentemente. 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. E o mesmo acontece com I4, que não pode ser executado antes que o valor de C seja atualizado por I3.

20 Grafo de Precedência - Exemplo 1
Início I3 I4 Fim I2 Grafo de Precedência correspondente ao programa apresentado

21 Grafo de Precedência - Exemplo 2
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;

22 Grafo de Precedência - Exemplo 2

23 Grafo de Precedência 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

24 Grafo de Precedência Usos
Em projeto e especificação de programas concorrentes Em análise da complexidade de PCs Em programação de programas paralelos em geral, modelos mais restritos por exemplo, a comunicação entre processos é somente por arquivos 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

25 Modelo Fork / Join 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;

26 Fork 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

27 Fork 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;

28 Fork Parte do grafo de precedência do programa é apresentado na figura ao lado. 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 C2 C3

29 Join 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. A instrução join deve ser executada de forma atômica. Sem interrupções na visão de terceiros

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

31 Ver grafo de precedência
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

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

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

34 Fork- Características
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 estruturas do tipo goto dão pouca legibilidade ao programa;

35 Fork - exemplos 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

36 Fork - exemplos 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” }

37 Join - Variações Forma geral: agrupamento de 2 processos concorrentes
Join “n” n: número de processos a sincronizar ou terminar no join 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; Join-filho espera pelo término de algum filho filho não precisa ser identificado (nomeado)

38 Join - Variações 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;

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

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

41 Thread 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

42 Thread 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

43 Thread Morte Final da procedure (ou método) Exit Kill
comando (de linguagem ou de biblioteca – método, procedimento, função) que solicita o fim da execução de uma thread Executado por outra thread; frequentemente a thread mãe Thread a ser encerrada deve ter nome ou identificador (ID)

44 Thread 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

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

46 Modelo Parbegin / Parend

47 Modelo Parbegin / Parend
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 puras exige compilação

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

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

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

51 Parbegin/End - Vantagens e Desvantagens
Mais legível; Maior facilidade na verificação de erros; 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

52 Vetor de Processos

53 Conceito necessita a criação de um vetor de tarefas de n posições
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!

54 Modelo 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 (sub) arrays de dados => dados distintos por tarefa

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

56 Vetor de processos - Exemplo 1
Equivale a fa i := 1 to n  a[i] := 0 af // sintaxe SR ou for (i := 1 to n) {a[i] := 0} Cada tarefa de índice i inicializa uma posição i do vetor

57 Vetor de processos - Exemplo 2
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)) Inicialização das matrizes: fa i:= 1 to n, j:= 1 to n  read(filea, a[i,j]); read(fileb, b[i,j]) af

58 Vetor de processos - Exemplo 2 (cont.)
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 Comentários: criação de n2 processos (2 laços de ordem n) matrizes são inicializadas seqüencialmente produtos são computados em paralelo

59 Vetor de processos - caso
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, ...

60 Vetor de processos - caso
Biblioteca OpenMP As tarefas (threads) são criadas de forma implícita Quantas tarefas para um loop? Depende de: Tamanho do loop (=> tamanho do array) Quantidade de cores Algum parâmetro de sistema: valor padrão ou programador ou usuário

61 APIs – Gerência de Tarefas
Todas as plataformas oferecem uma API para gerência de tarefas Todas: explícitas Inclui obrigatoriamente Codificação da tarefa Criação da tarefa Inclui usualmente Morte da tarefa Espera pelo fim (“suicídio”) da tarefa Consulta e alteração de atributos básicos

62 APIs – Gerência de Tarefas
Atributos usuais Prioridade da tarefa Nome da tarefa (opcional quando existe) Usada na impressão de traços APIs mais sofisticadas Variações no escalonamento Pool de tarefas Grupos de tarefas

63 Modelos de Programas Questões de projeto de programas concorrentes
Quais os tipos (lógica interna) de tarefas? Quantas instâncias de cada tipo? Quando devem ser criadas? Quando devem ser encerradas?

64 Modelos de Programas Metodologia de projeto
Frequentemente via reuso de padrões clássicos, bem conhecidos Exemplos Produtor / consumidor Leitores / escravos Mestre / escravos “Filósofos” Pipeline (linha de produção)

65 Modelos de Programas Metodologia de projeto
Modelos de Sistemas Distribuídos Cliente / Servidor P2P Grid Cluster

66 Modelos de Programas Metodologia de projeto
Exemplos de Algoritmos Distribuídos Difusão de dados Coleta de dados Eleição de líder

67 Modelos de Programas Metodologia de projeto
Exemplos Algoritmos Paralelos Soma de elementos de um vetor Produto vetorial Multiplicação de matrizes Classificação

68 Considerações Finais 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) Diferentes modelos afetam os outros aspectos da PC Sincronização e comunicação

69 Considerações Finais 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

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

71 Exercício 1 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;

72 Exercício 1-a 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;

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

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

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

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

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

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

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

80 Exercício 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... 8 4 2 5 9 10 1 6 3 7

81 Exercício 4 - Resposta 1; Fork L3; 2; Fork L5; 4; 8; J2: 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.

82 Exercício 5 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; ; exit; L4: 4; goto J4; L9: 9; goto J2; L6: 6; J4: Join; 10; goto J3;

83 Exercício 5 - Resposta 8 2 5 7 1 3 9 11 6 10 4

84 Revisão Expressão da Concorrência
Tipos quanto a “quando”? Tipos quanto a “quem”? Combinações usuais? Tipos mais simples para programador? Tipos mais eficientes? Tipos mais flexíveis?

85 Revisão ... 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?

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

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

88 Revisão … 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?

89 Revisão … 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 …?

90 Revisão ... Outras primitivas Unix sobre identificadores término
código

91 Bibliografia Andrews, G. The Benjamim Cummings, 1991. Silberschatz, A.
Concurrent Programming: Principles and Practice. The Benjamim Cummings, 1991. Foundations of Multithreaded, Distributed and Parallel Programming. Ed Silberschatz, A. Operating Systems Concepts. Addison-Wesley, 5º edição, 1992, e edições seguintes. última versão: 9th Edition. Hardcover: 944 pages. Publisher: Wiley; 9 edition (December 17, 2012). Language: English. ISBN-10: ISBN-13:

92 Bibliografia Tanenbaum, A. S. Livros dos professores da UFRGS
Modern Operating Systems. Prentice-Hall, 1992, e edições seguintes. última versão: 4th Edition. by Hardcover: 1136 pages. Publisher: Pearson; 4 edition (March 20, 2014). Language: English. ISBN-10: X. ISBN-13: Livros dos professores da UFRGS Toscani, S. S., Oliveira, R., Caríssimi, A. Sistemas Operacionais e Programação Concorrente. Editora Sagra-Luzzato, ISBN: páginas. Oliveira, R., Caríssimi, A .Toscani, S. S. Sistemas Operacionais - Volume 11. ed. Bookman. 4ª ed

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


Carregar ppt "Expressão da Concorrência"

Apresentações semelhantes


Anúncios Google