Sobes.tech
Middle+

O que são os green threads (threads verdes)?

sobes.tech IA

Resposta da IA

Os threads verdes são threads geridos ao nível do espaço de utilizador, não pelo sistema operativo. Não são exibidos diretamente nos threads do SO. O agendamento e a troca de contexto entre threads verdes são realizados em tempo de execução da linguagem de programação ou por uma biblioteca especializada.

Características principais:

  • Gestão: Realizada completamente em tempo de execução.
  • Recursos: Requerem menos recursos do sistema (memória e tempo de CPU) em comparação com os threads nativos do SO para criação e troca.
  • Agendamento: Não preemptivo (multitarefa cooperativa). O thread deve ceder explicitamente o controlo para que outro thread verde possa ser executado.
  • Paralelismo: Devido ao agendamento não preemptivo e à gestão no espaço de utilizador, os threads verdes não suportam explicitamente execução paralela em processadores multinúcleo sem mecanismos adicionais (por exemplo, usar múltiplos processos, cada um com seus próprios threads verdes).

No Ruby, especialmente em versões antigas (antes da 1.9) e com MRI (Matz's Ruby Interpreter), eram usados threads verdes. Isto causava problemas de desempenho em sistemas multinúcleo, pois apenas um thread verde podia ser executado num dado momento, bloqueado pelo Global Interpreter Lock (GIL). Em versões mais recentes do MRI e em implementações alternativas (JRuby, Rubinius), são usados threads nativos do SO.

# Exemplo de uso de threads em Ruby (dependendo da versão e implementação, podem ser verdes ou nativos)
t1 = Thread.new do
  puts "Thread 1 iniciado"
  sleep(1)
  puts "Thread 1 terminado"
end

t2 = Thread.new do
  puts "Thread 2 iniciado"
  sleep(1)
  puts "Thread 2 terminado"
end

t1.join # Aguarda a conclusão do thread t1
t2.join # Aguarda a conclusão do thread t2

puts "Todos os threads terminaram"

Comparação entre threads verdes e nativos:

Característica Threads verdes Threads nativos do SO
Gestão Espaço de utilizador Núcleo do SO
Criação/Comutação Mais barato Mais caro
Agendamento Cooperativo (não preemptivo) Preemptivo
Paralelismo Limitado (um CPU) sem mecanismos Completo (múltiplos CPUs)
Chamadas bloqueantes Bloqueiam todo o interpretador/proc Bloqueiam apenas o thread nativo atual

No contexto do Ruby moderno (a partir da 1.9 e versões superiores do MRI), os threads Thread são threads nativos do SO. Os threads verdes, como modelo principal de paralelismo, são agora raros no MRI, mas podem ser encontrados em bibliotecas específicas ou em run-times alternativos.