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.