Expresso da Concorrncia Autoria 4 Alunos de turma

  • Slides: 82
Download presentation
Expressão da Concorrência

Expressão da Concorrência

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

Autoria 4 Alunos de turma de SOII 4 C. Geyer 4 Versão – V 24. 4, 2014 -2

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

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

Resumo geral dos slides 4 Apresentação das principais formas (mecanismos) de criação e gerência

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

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, . .

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.

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

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

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

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

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

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) •

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

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 – Open. MP

Tipos de criação 4 Outros casos – estática-explícita • SR (linguagem proposta por [Andrews

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

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?

Conceito 4 Grafo de Precedência – grafo (usualmente) acíclico dirigido, no qual cada nó

Conceito 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

Grafo de Precedência 4 Cada nodo representa um processo; 4 Cada arco indica a

Grafo de Precedência 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: Pi Pj – Pj só pode ser executado após Pi, ou seja, Pj depende de Pi

Grafo de Precedência - Exemplo 1 Programa: I 1 I 2 I 3 I

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

Grafo de Precedência - Exemplo 1 Início I 3 I 4 Fim I 2

Grafo de Precedência - Exemplo 1 Início I 3 I 4 Fim I 2 Grafo de Precedência correspondente ao programa apresentado

Grafo de Precedência - Exemplo 2 4 Considere um grafo de precedência com as

Grafo de Precedência - Exemplo 2 4 Considere um grafo de precedência com as seguintes relações de precedência: – – C 2 e C 3 podem ser executados depois da execução de C 1; C 4 pode ser executado depois da execução de C 2; C 5 e C 6 podem ser executados depois da execução de C 4; C 7 só pode ser executado depois da execução de C 5, C 6 e C 3;

Grafo de Precedência - Exemplo 2 C 5 C 2 C 1 C 4

Grafo de Precedência - Exemplo 2 C 5 C 2 C 1 C 4 C 6 C 3 C 7

Grafo de Precedência 4 Limitações – não representa comunicação contínua (repetida) entre dois processos

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

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

Conceito 4 Fork/Join – As instruções fork e join foram introduzidas por Conway [1963]

Conceito 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;

Fork 4 A instrução fork L produz duas execuções concorrentes (fluxo, tarefa) num programa.

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

Fork 4 Para ilustrar este conceito, considere o seguinte segmento de programa: – Ci é um comando qualquer (inclusive composto) C 1; fork L; C 2; . . . . L: C 3; // L é um rótulo

Fork 4 Parte do grafo de precedência C 1 Fork C 2 C 3

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

Join 4 A instrução join agrupa concorrentes em uma. duas computações – Cada uma

Join 4 A instrução join agrupa concorrentes em uma. duas computações – 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 L 1; . . .

Join - Exemplo 1 count : = 2; fork L 1; . . . C 1; goto L 2; L 1: C 2; L 2: join count; C 2 C 1 Join C 3 Parte do grafo de precedência para a programa ao lado

Fork/Join - Exemplo C 1; count : = 3; fork L 1; C 2;

Fork/Join - Exemplo C 1; count : = 3; fork L 1; C 2; C 4; fork L 2; C 5; goto L 3; L 2: C 6; goto L 3; L 1: C 3; L 3: join count; C 7; Ver grafo de precedência correspondente

Fork/Join 4 É importante notar que a execução de uma instrução fork divide uma

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;

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; –

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: •

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 - 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”

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

Join - Variações 4 Join usando exit – o processo que executa join espera

Join - Variações 4 Join usando exit – o processo que executa join espera pelo término de um filho; – processo filho termina por exit; . . . – Exemplo: I 1; fork LI 3; I 2; join; I 4; GOTO LI 5; LI 3: I 3; exit;

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

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

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

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

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 Morte – Final da procedure (ou método) – Exit

Thread 4 Modelo usual de variáveis – Variáveis estáticas • Compartilhadas entre as threads

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

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

Conceito 4 Parbegin/end – comando de alto nível para especificação da concorrência; • comando

Conceito 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

Parbegin/End 4 Todos os comandos são encapsulados entre o parbegin e parend e devem

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 C 1; C 2; …; 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 Co C 1 C 2 C n+1 .

Parbegin/End 4 grafo de precedência que Co C 1 C 2 C n+1 . . . Cn corresponde à sintaxe dada anteriormente 4 C 0 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

Parbegin/End - Exemplo 1 C 1; parbegin C 3; begin C 2; C 4;

Parbegin/End - Exemplo 1 C 1; parbegin C 3; begin C 2; C 4; parbegin C 5; C 6; parend; C 7; Ver grafo de precedência correspondente

Parbegin/End - Vantagens e Desvantagens 4 Vantagens: – Mais legível; – Maior facilidade na

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

Conceito 4 Vetor de Processos – necessita a criação de um vetor de tarefas

Conceito 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 •

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

Vetor de processos - Exemplo 1 4 Declaração do vetor: var a[1: n]: real;

Vetor de processos - Exemplo 1 4 Declaração do vetor: var a[1: n]: real; 4 Código: // sintaxe SR 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

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

Vetor de processos - Exemplo 2 4 Declaração das matrizes: (sintaxe SR) var a[1:

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

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 Open. MP – Padronizada – Para programação

Vetor de processos - caso 4 Biblioteca Open. MP – 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

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

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

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á

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 : = X 1 * X 2; V : = X 3 * X 4; Y : = V * X 5; Z : = V * X 6; Y : = W * Y ; ANS : = Y + Z;

Exercício 1 -a 4 Reescreva o seguinte programa usando instruções parbegin/parend. Certifique-se de que

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 : = X 1 * X 2; V : = X 3 * X 4; T : = Y 1 + Y 2; Y : = V * T; Z : = V * X 6; W : = W * Y ; ANS : = Y + Z;

Exercício 1 - Resposta parbegin W : = X 1 * X 2; begin

Exercício 1 - Resposta parbegin W : = X 1 * X 2; begin V : = X 3 * X 4; parbegin Y : = V * X 5; Z : = V * X 6; parend; Y : = W * Y ; ANS : = Y + Z;

Exercício 2 4 Transforme o grafo de precedência abaixo em um programa usando fork/join:

Exercício 2 4 Transforme o grafo de precedência abaixo em um programa usando fork/join: C 2 C 5 C 1 C 3 C 6 C 4

Exercício 2 -a 4 Transforme o grafo de precedência abaixo em um programa usando

Exercício 2 -a 4 Transforme o grafo de precedência abaixo em um programa usando fork/join: C 2 C 5 C 6 C 1 C 3 C 8 C 7 C 4

Exercício 2 - Resposta C 1; fork C 2; LJ 3: C 5; LJ

Exercício 2 - Resposta C 1; fork C 2; LJ 3: C 5; LJ 4: C 6; LC 3; LC 4; LC 3: C 3; goto LJ 3; LC 4: C 4; goto LJ 4; join; 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

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ê. C 3 C 4 C 1 C 6 C 2 C 5 FIM

Exercício 3 - Resposta C 1; fork C 2; fork C 4; LJ 5:

Exercício 3 - Resposta C 1; fork C 2; fork C 4; LJ 5: LJ 3: C 6; LI 3; LC 3: C 3; goto LJ 3; LI 5: C 5; goto LJ 5; LI 5; join; Transformação do grafo de precedência em um programa utilizando instruções fork/join

Exercício 3 - Resposta C 1; parbegin C 3; begin C 2; parbegin C

Exercício 3 - Resposta C 1; parbegin C 3; begin C 2; parbegin C 4; C 5; parend; C 6; 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

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

Exercício 4 - Resposta 1; Fork L 3; 2; Fork L 5; 4; 8;

Exercício 4 - Resposta 1; Fork L 3; 2; Fork L 5; 4; 8; J 2: Join J 3: Join; 10; exit; L 3: 3; Fork L 7; 6; J 1: Join; goto J 3; L 7: L 5: 7; goto J 1; 5; 9; goto J 2; 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 L 3 cria ó processo 3. O join de rótulo J 1 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

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

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

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

Revisão 4 Tipos quanto a “quando”? 4 Tipos quanto a “quem”? 4 Combinações usuais?

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

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? –

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

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

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? –

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

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

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

Especificações Autores Ingrid de Vargas Mito Maíra Colling Wenzel ingrid@aton. inf. ufrgs. br maira@aton.

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