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

Uma nota sobre escalonamento cooperativo

Até agora falamos de um modelo escalonamento que é o preemptivo, e que atende de forma eficiente muitos sistemas operacionais modernos.

Mas antes mesmo do modelo preemptivo se tornar predominante, muitos sistemas utilizavam o escalonamento cooperativo. Nesse modelo, cada processo controlava explicitamente quando liberar a CPU para outros processos. Isso era feito ao atingir certos pontos no código em que o processo voluntariamente "cedia" o controle ao sistema operacional.

Daí o nome escalonamento cooperativo

Entretanto, o modelo cooperativo traz algumas limitações, pois um erro de programação como loop infinito por exemplo, pode fazer um processo monopolizar a CPU, caindo num cenário de CPU starvation para os outros processos.

Há também o fato de que o modelo cooperativo depende muito de uma boa implementação de cada programa, o que dificulta garantir tempos de resposta rápidos para tarefas críticas na CPU.

Mas calma, o modelo cooperativo tem suas vantagens...

O escalonamento cooperativo é usado em contextos específicos, como em sistemas embarcados simples ou em algumas linguagens de programação ou frameworks/bibliotecas que implementam concorrência cooperativa com o modelo de corrotinas - que vamos abordar mais a frente no guia.


Bom, se você prestou bem atenção até aqui, eu não fiz uma menção sequer a threads. É proposital, acho que devemos dissociar este conceito de concorrência às threads (em um primeiro contato)

PreviousEscalonador preemptivo de tarefasNextPropriedades de um processo

Last updated 5 months ago