concorrencia101
  • Introdução
  • First things first
  • Agradecimentos
  • Parte I - Concorrência no sistema operacional
    • O que é o programa no sistema operacional
    • Escalonador preemptivo de tarefas
    • Uma nota sobre escalonamento cooperativo
    • Propriedades de um processo
    • Clone de processo (forking)
    • Clone leve de processo (thread)
    • Todo processo tem uma thread principal
    • Uma nota sobre paralelismo
    • Principais desafios em cenário de concorrência
      • Race condition
      • Sincronização com locks
      • Modelo de atores
    • E o I/O?
      • Latência de CPU vs Latência de I/O
      • Chamadas bloqueantes
      • Chamadas não-bloqueantes
      • Assincronismo e escalonamento cooperativo
    • Vamos colocar em prática...
  • PARTE II - Concorrência em diferentes linguagens
    • Definindo ambientes de execução
    • Concorrência em C
      • Forking de processos
      • Threads
      • Race condition e sincronização de threads com mutex
      • Desafios com o uso de threads
      • Thread Pool em C
      • Green threads
      • Modelo de Atores
      • Trabalhando com I/O
    • Concorrência em Ruby
      • Forking de processos
      • Threads
      • Race condition, YARV, GVL e paralelismo em Ruby
      • Modelo de Atores
      • Trabalhando com I/O
Powered by GitBook
On this page
  1. Parte I - Concorrência no sistema operacional
  2. Principais desafios em cenário de concorrência

Modelo de atores

PreviousSincronização com locksNextE o I/O?

Last updated 4 months ago

Com modelo de atores podemos modelar nosso sistema concorrente onde cada unidade de execução é um ator:

  • possui identificação única

  • possui estado privado (não compartilha estado), ou seja, apenas o ator é responsável por modificar seu estado interno

  • se comunica através do envio de mensagens, seja por meio de canais, filas, etc

Como podemos ver na imagem acima, é possível concluir que um ator é bastante semelhante a um objeto em OOP.

Me perdoem

A grande diferença é que o ator é feito exclusivamente para cenários de concorrência, onde a implementação do ator pode ser baseada tanto em kernel threads quanto user threads, caso o runtime tenha a implementação.

O ponto principal para entendermos aqui é que o estado não é compartilhado, ou seja, é como se tivéssemos uma cópia única de todos os atributos do ator em diferentes threads mas com diferentes valores, aumentando assim o uso de memória total do sistema.

Com atores, eliminamos a necessidade de sincronização com locks.

Há vantagens e desvantagens em ambas as abordagens, lembre-se de que não existe bala de prata