Programação concorrente (processos e  threads )
Por que precisamos dela? Para utilizar o processador completamente Paralelismo entre CPU e dispositivos de I/O  Para modelar o paralelismo do mundo real
Para que mais de um computador/processador possa ser utilizado para resolver
o problema Considere como exemplo encontrar o caminho através de um labirinto Programação concorrente
Busca Sequencial no Labirinto
Busca Concorrente no Labirinto
Há um longo debate sobre se a concorrência deve ser definida na linguagem de programação ou deixada para o sistema operacional Ada, Java e C# fornecem concorrência
C e C++ não Concorrência na linguagem ou no SO?
Formas de implementar uma coleção de tarefas executando concorrentemente Multiprogramação as tarefas multiplexam suas execuções num único processador (pseudo-paralelismo) Multiprocessamento as tarefas multiplexam suas execuções num sistema multiprocessador onde
há acesso a uma memória compartilhada (acoplamento forte. e.g.: multicore) Processamento distribuído as tarefas multiplexam suas execuções em vários processadores que não
compartilham memória (acoplamento fraco. e.g. LAN´s, WAN,s) Implementação de  tarefas concorrentes
Inclui: contador de programa (PC), pilha, dados Conceito de processo
Estados de um  processo (tarefa)
Process Control Block (PCB)
Chaveamento de contexto
Árvore de Processos
Memória compatilhada
Troca de mensagens
Pipes
Semáforos
Monitores
Sockets
RMI ( remote method invotation )
RPC ( remote procedure calls ) IPC (comunicação entre processos)
Problemas de concorrência Condições de disputa: o resultado depende da ordem de execução (imprevisível)

Parte1c

  • 1.
  • 2.
    Por que precisamosdela? Para utilizar o processador completamente Paralelismo entre CPU e dispositivos de I/O Para modelar o paralelismo do mundo real
  • 3.
    Para que maisde um computador/processador possa ser utilizado para resolver
  • 4.
    o problema Considerecomo exemplo encontrar o caminho através de um labirinto Programação concorrente
  • 5.
  • 6.
  • 7.
    Há um longodebate sobre se a concorrência deve ser definida na linguagem de programação ou deixada para o sistema operacional Ada, Java e C# fornecem concorrência
  • 8.
    C e C++não Concorrência na linguagem ou no SO?
  • 9.
    Formas de implementaruma coleção de tarefas executando concorrentemente Multiprogramação as tarefas multiplexam suas execuções num único processador (pseudo-paralelismo) Multiprocessamento as tarefas multiplexam suas execuções num sistema multiprocessador onde
  • 10.
    há acesso auma memória compartilhada (acoplamento forte. e.g.: multicore) Processamento distribuído as tarefas multiplexam suas execuções em vários processadores que não
  • 11.
    compartilham memória (acoplamentofraco. e.g. LAN´s, WAN,s) Implementação de tarefas concorrentes
  • 12.
    Inclui: contador deprograma (PC), pilha, dados Conceito de processo
  • 13.
    Estados de um processo (tarefa)
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
    RMI ( remotemethod invotation )
  • 24.
    RPC ( remoteprocedure calls ) IPC (comunicação entre processos)
  • 25.
    Problemas de concorrênciaCondições de disputa: o resultado depende da ordem de execução (imprevisível)
  • 26.
    Regiões críticas: partesdo código onde ocorrem as condições de disputa. Solução:
  • 27.
    exclusão mútua e.g. Memória compartilhada : x=x+1; carrega o valor de x num
  • 28.
    registrador, incrementa, armazenao valor do registrador em x. Princípios para boa solução de exclusão mútua 1) Nunca dois processos simultaneamente em suas regiões críticas 2) Nada pode ser afirmado sobre velocidade ou número de CPUs 3) Nenhum processo fora da sua região crítica pode bloquear outros 4) Nenhum processo pode esperar eternamente para entrar em sua região crítica t1 t2 t3 t4 P4 P3 P2 P5 request start release leave
  • 29.
    São números inteiros: typedef int Semaphore;
  • 30.
    Seu valor podeapenas ser inicializado: Semaphore x = 0; Não pode ser manipulado diretamente x++;
  • 31.
  • 32.
    x=10; A manipulaçãotem que ser feita através de duas primitivas: down e up down :diminui o valor do semáforo (bloqueia se <0) down(&x); up : aumenta o valor do semáforo (desbloqueia se <0) up(&x); Nomes alternativos:
  • 33.
  • 34.
    up = signal= V Semáforos
  • 35.
    de usuário ede núcleo Threads (fluxos de execução) Modelo antigo: uma thread por processo Modelo novo: várias threads por processo Dados que devem ser mantidos para cada thread
  • 36.
    Muitos para umModelos multithreading muitos para muitos um para um
  • 37.
    Problemas clássicos desincronização Produtor-consumidor (buffer limitado) Semaphore mutex=1; Semaphore vazios=N; Semaphore cheios=0; void produtor (void) { while(true){ // produz item down(&vazios); down(&mutex); // adiciona item up(&mutex); up(&cheios); } } void consumidor (void) { while(true){ down(&cheios); down(&mutex); // remove item up(&mutex); up(&vazios); // consome item } } Produtor Consumidor Buffer Cheios Vazios consumidor produtor
  • 38.
    Problemas clássicos desincronização Rendez-vous Semaphore x=0; Semaphore y=0; void thread1 (void) { // a1 up(&x); down(&y); // a2 } void thread2 (void) { // b1 up(&y); down(&x); // b2 } Considere o código abaixo e suponha que se deseje que a Instrução a1 seja executada antes de b2 e b1 antes de a2 void thread1 (void) { // a1 // rendez-vous // a2 } Void thread2 (void) { // b1 // rendez-vous // b2 }
  • 39.
    Problemas clássicos desincronização Leitores e Escritores Bloco de Dados leitor leitor escritor escritor
  • 40.
    Assíncrona (semespera) Requer armazenamento de mensagens ( buffer ) -> buffers potencialmente infinitos O que fazer quando o buffer estiver cheio?
  • 41.
    void send (Taskdestino, Msg msg);
  • 42.
    void receive (Taskorigem, Msg *msg); Sincronização e comunicação baseadas em mensagens Tarefa P1 Tarefa P2 send message receive message message tempo tempo
  • 43.
    Síncrona Não requer buffer Facilita a implementação
  • 44.
    Conhecida como Rendezvous void send (Task destino, Msg msg); void receive (Task origem, Msg *msg); Sincronização e comunicação baseadas em mensagens send message receive message time time blocked M
  • 45.
    Remote invocation (e.g.Ada) Conhecida como rendezvous estendida Status send (Task destino, Msg msg); Status receive (Task origem, Msg *msg); Sincronização e comunicação baseadas em mensagens Task P1 Task P2 send message receive message time time blocked M reply
  • 46.
    Nomeação das tarefasDireta -> simplicidade
  • 47.
    O transmissor nomeiao receptor explicitamente
  • 48.
    void send( Taskt, Msg m);
  • 49.
    Indireta ->auxilia a decomposição do software (a mailbox pode ser vista
  • 50.
    como uma interfaceentre as várias partes do programa)
  • 51.
    o transmissor nomeiauma entidade intermediária (canal, mailbox , link ou
  • 52.
  • 53.
    void send( MailBoxmb, Msg m); Sincronização e comunicação baseadas em mensagens
  • 54.
  • 55.
    Ambos, TX eRX, nomeiam um ao outro (ou à caixa de correio).
  • 56.
    void send( Taskt, Msg m);
  • 57.
  • 58.
    void send( Mailboxmb, Msg m);
  • 59.
  • 60.
  • 61.
    o receptor nãonomeia a origem e recebe mensagens de todas as tarefas (ou de
  • 62.
    todas as caixasde correio) void receive (Msg *m); Sincronização e comunicação baseadas em mensagens
  • 63.
    [1] Real-TimeSystems and Programming Languages . Burns A., Wellings A. 2nd edition [2] Análise de Sistemas Operacionais de Tempo Real Para Applicações de Robótica e Automação. Aroca R. V. Dissertação de Mestrado. [3] Operating System Concepts . Silberschatz, Galvin, Gagne. 8 th edition
  • 64.
    [4] Sistemas OperacionaisModernos. Tanenbaum 2a edição Bibliografia