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
  • O quê é um ator?
  • Trabalhando com atores em C
  1. PARTE II - Concorrência em diferentes linguagens
  2. Concorrência em C

Modelo de Atores

PreviousGreen threadsNextTrabalhando com I/O

Last updated 4 months ago

Outra forma de trabalhar com kernel threads que seja thread-safe, ou seja, utilizando threads de modo que não tenhamos problemas com condições de corrida, é através da implementação de modelo de atores.

Em tópicos anteriores vimos que a diferença entre processo e thread é que processos não compartilham memória, ao passo que threads compartiham memória. Isto por si só torna a utilização de processos segura em termos de race condition, mas com a desvantagem de utilizar bastante memória.

E se quisermos utilizar threads sem compartilhar memória, é possível? Sim, através da técnica de modelo de atores.

O quê é um ator?

Um ator, no contexto de concorrência, é uma "thread" (ou unidade de concorrência) que tem algumas propriedades muito parecidas com um processo do sistema operacional:

  • não compartilha memória, ou seja, um ator tem seu próprio estado privado

  • possui identificação única no sistema

  • se comunica com outros atores através do envio de mensagens

As mensagens são enviadas para estruturas de fila, que usam aterminologia "inbox", ou caixa de entrada. Cada ator tem sua própria inbox para receber as mensagens.

Sendo assim, ao trabalhar com atores, não precisamos nos preocupar com uso de mutexes nem outro tipo de sincronização, pois somente o ator pode alterar seu próprio estado.

Trabalhando com atores em C

Para o nosso azar, o GCC não traz uma implementação padrão ou ferramental para trabalharmos com modelo de atores. Mas algumas bibliotecas externas implementam a técnica:

: uma implementação de modelo de atores que utiliza pthreads

: implementação de ator utilizando os building blocks do ZeroMQ

libactor
czmq/zactor