1 of 43

Concorrência e paralelismo no desenvolvimento de aplicações

Anny Caroline Correa Chagas

2 of 43

Quem sou eu?

Participante do programa Google Summer of Code 2018

Bolsista de iniciação tecnológica no Laboratório de Ciência da Computação (LCC)

Técnico em informática pelo Colégio Realengo [2011-2013]

Concluindo o bacharelado em Ciência da Computação pela UERJ [2014-2018]

3 of 43

Um pouco �sobre �multitarefas

Computadores Monotarefa

permitiam executar uma única tarefa por vez

Apple DOS

MS-DOS

primeiro passo para a multitarefa, com o uso de TSR’s

Sistemas operacionais atuais

  • Tarefas tratadas como processos;
  • Conceito de escalonador de processos: escolhe que processo deve executar;
  • Priorização de tarefas;

4 of 43

Os escalonadores

5 of 43

  • As tarefas 3 e 4 precisam esperar alguma tarefa terminar de executar

Processador

com 2 núcleos

Núcleo 1

Núcleo 2

Tarefa 1

Tarefa 2

Tarefa 3

Tarefa 4

?

  • Aumentar a quantidade de núcleos de processamento
  • Utilizar uma tarefa específica para controlar quem executa e por quanto tempo

6 of 43

Multiplexação por tempo

  • Cada programa usa o recurso por um dado intervalo de tempo
  • Vários programas residentes na memória
  • Cada programa usa a CPU em um intervalo de tempo.

A

B

C

A

B

C

A, B, C: programas

Sistema Operacional

7 of 43

Entrada e saída

  • A CPU não fica ociosa em operações de E/S.

A

B

C

A

Sistema Operacional

Requisição de E/S

Término de E/S

8 of 43

SO

9 of 43

Serviços do Sistema Operacional

  • Interface de usuário (GUI e CLI)
  • Execução de programas
  • Operações de I/O
  • Manipulação do sistema de arquivos
  • Comunicações
  • Memória compartilhada
  • Troca de Mensagens
  • Detecção de erros
  • Alocação de Recursos
  • Contabilização (estatísticas / responsabilidade)
  • Proteção e segurança

10 of 43

Estados de

um processo

  • Novo: O processo está sendo criado
  • Em execução: Instruções estão sendo executadas
  • Em espera (ou bloqueado): aguardando por algum evento ocorra (conclusão de I/O ou recebimento de um sinal)
  • Pronto: esperando para ser atribuído a um processador
  • Concluído: O processo terminou a sua execução

11 of 43

Transições

NOVO

PRONTO

EM ESPERA

EM EXECUÇÃO

CONCLUÍDO

admitido

conclusão de evento ou I/O

espera por evento ou I/O

saída

escalonado

interrupção

12 of 43

NOVO

PRONTO

EM ESPERA

EM EXECUÇÃO

CONCLUÍDO

admitido

conclusão de evento ou I/O

espera por evento ou I/O

saída

escalonado

interrupção

  • Processo P
  • É admitido
  • É escolhido para execução
  • Solicita uma operação de I/O e é bloqueado
  • O I/O é finalizado
  • É escolhido para execução (novamente)
  • É interrompido
  • É escolhido para execução (pela terceira vez)
  • É concluído

13 of 43

Processos

14 of 43

  • Informalmente, um processo é a execução de um programa junto com os dados usados por ele�
  • “Um processo é uma instância em execução de um aplicativo. O que isso significa? Bem, por exemplo, quando você clica duas vezes no ícone do Microsoft Word, você inicia um processo que executa o Word”.�
  • Sistema operacional trata a criação, execução e encerramento de processos

O que é um

processo

Um programa em execução

15 of 43

16 of 43

“Dados usados no processo” - Espaço de endereçamento

Pilha: parâmetros de função, endereços de retorno e variáveis locais.�

Heap: alocação dinâmica�

Dados do processo: globais�

Texto: código executável do processo

17 of 43

Pilha de execução

int multiplica(int N1, int N2) {� int resultado;� resultado = N1 * N2;� return(resultado);�}

int main(void) {� int v1, v2, resultado;� v1 = 3;� v2 = 5;

resultado = multiplica(v1, v2);� printf("Resultado = %d\n", resultado);�}

18 of 43

  • Um processo tem um ambiente de execução independente. Geralmente possui um conjunto completo e privado de recursos básicos de tempo de execução; em particular, cada processo tem seu próprio espaço de memória.

O que é um

processo

Um programa em execução

19 of 43

Threads

20 of 43

  • Um processo tem duas partes:
    • O fluxo de controle;
    • O espaço de endereçamento�
  • Uma thread consiste somente no fluxo de controle e numa pilha de memória independente �
  • O escalonamento de uma thread é uma operação mais simples, já que não envolve a mudança integral do espaço de endereçamento.

O que é uma

Thread

Uma linha de execução

21 of 43

“Um thread é um caminho de execução dentro de um processo. Além disso, um processo pode conter várias threads. Quando você inicia o Word, o sistema operacional cria um processo e começa a executar a thread principal desse processo”.

22 of 43

Diferenças

23 of 43

… “a diferença essencial entre uma thread e um processo é o trabalho que cada um é usado para realizar. As threads são usadas para pequenas tarefas, enquanto os processos são usados para tarefas mais "pesadas" - basicamente a execução de aplicativos.

Propósito

24 of 43

Threads dentro do mesmo processo compartilham o mesmo espaço de endereço, enquanto diferentes processos não.

Isso permite que as threads leiam e gravem nas mesmas estruturas e variáveis de dados, além de facilitar a comunicação entre elas. A comunicação entre processos - também conhecida como IPC, ou inter-process communication - é bastante difícil e exige muitos recursos.

Memória

25 of 43

Desenvolvimento de aplicações

26 of 43

Na programação sequencial todas as instruções de um programa são executadas através de uma única linha de execução

Programação

Sequencial

Fluxo único de execução

tarefa 1

tarefa 2

tarefa 3

27 of 43

Na programação concorrente e paralela um programa pode ser executado através de diversas linhas de execução

Programação

Concorrente

e Paralela

vários fluxos de execução

tarefa 1

tarefa 2

tarefa 3

28 of 43

Não se pode supor nenhuma ordem de execução

Problemas

X = 1

X = 2*X

X = 3+X

X = 1

X = 2*X

X = 3+X

5

?

29 of 43

  • Preciso de mecanismos de sincronismo�
  • Preciso identificar se meu problema é realmente paralelizável�
  • Preciso de “travas” para quando uma operação estiver sendo realizada

30 of 43

“Travas” - Locks

  • Operações não acontecem de maneira atômica, na verdade.
  • X = 1, inicialmente

T1

T2

lê X

X = 2*X

lê X

X = 3 + X

escreve X

31 of 43

Benefícios da programação concorrente

  • Ganho de desempenho se houver paralelismo físico�
  • Ganho de desempenho no acesso a dispositivos de hardware - o acesso a discos ou a dispositivos de rede não precisa bloquear toda a aplicação, mas apenas uma thread�
  • Maior responsividade da aplicação�
  • Se adequa melhor a alguns problemas

32 of 43

Exemplo �AudioLab Geo

33 of 43

34 of 43

Exemplo AudioLab Geo

Browser

35 of 43

E em outros

ambientes?

36 of 43

  • Um único processador�
  • Aplicações concorrentes por natureza�
  • Modelo Síncrono

Arduino

37 of 43

38 of 43

Modelos de Concorrência

Assíncrono

  • sincronismo explícito
  • implementação complexa
  • execução paralela

Síncrono

  • livre de sincronização
  • tende a ser mais simples
  • execução serializada

39 of 43

Exemplo

Piscar um led a cada 1 segundo

Parar ao pressionar um botão, mantendo o LED sempre acesso �(mesmo após soltar o botão)��

40 of 43

Alternativa

41 of 43

“Sistemas reativos interagem continuamente e em tempo real com o ambiente sob os quais estão inseridos. Eles representam um campo amplo de aplicações e plataformas: de jogos eletrônicos em desktops, passando por apps em celulares, até a emergente internet das coisas em sistemas embarcados”.

Programação reativa

42 of 43

Céu-Arduino

loop do

par/or do

loop do

await 1s;

_leds_toggle();

end

with

await PRESS;

end

end

43 of 43

  1. O programa inicia na “reação de boot” em apenas uma trilha. �
  2. Trilhas ativas executam até esperarem ou terminarem. Esse passo é conhecido como “reação” e sempre executa em tempo limitado. �
  3. A ocorrência de um evento de entrada acorda todas as trilhas esperando aquele evento. Repete o “passo 2”.