Threads

  • fluxo de controle dentro de um processo (linha de execução)
  • possui um inicio e um fim, como um programa em sequência
  • permite paralelismo → permite utilizar vários cores
  • permite que o programa seja responsivo → faz com que outras tarefas continuem em execução
  • Pode ajudar a simplificar o código, dividindo-o em partes menores e independentes
  • pode usar memória compartilhada para trocada de informações e etc
  • pode haver conexão inter-threads (usando memória compartilhada e mecanismos de sincronia)
  • representa a execução de um programa também
  • menor unidade agendavel de um processo
  • todos os threads dentro de um processo compartilham dos mesmo recursos do processo
  • executado a partir de um processo
  • mais leve e eficiente que processos, já que compartilha recursos ao invés de pedir novos
  • contexto é menor, já que utiliza apenas parte do contexto do processo em si
  • Troca de contexto é mais rápida e eficiente
  • criação é mais rápida
  • contexto é composto por → conjunto de registradores, pilha, PC, ponteiro para tabela de processos, ponteiro para arquivos, etc. Apenas o especifico para cada tarefa de cada thread

Estados de um thread

  • new → criado, mas não iniciado
  • runnable → pronto para ser executado
  • running → está em execução
  • waiting → aguardando recurso externo
  • terminated → acabou a execução

Transições de estados de um thread

  • execução para aguardando
  • aguardando para pronto
  • execução para terminated
  • execução para pronto → foi interrompido

<a href=\geeksforgeeks" loading="lazy" src="/posts/ciencias-da-computacao-dia-268-0a370bbhdcb0a/image_445.png">

Tipos de threads

Modo user

  • implementado na zona do user
  • usa libs locais
  • virtualiza as threads usando código
  • não interage com o kernel
  • Ao usar I/O o processo inteiro é bloqueado
  • escalonador só toma conta do processo (não sabe que há threads a serem executadas)
  • cada processo tem sua tabela de threads
  • cada processo usa seu algoritmo para escalonar threads
  • menor overhead do kernel
  • não usa os multi-cores com as threads
  • melhor para processos CPU bound

Modo Kernel

  • threads são geridas pelo SO
  • troca de contexto é mais lenta
  • apenas uma thread é bloqueada ao usar I/O
  • aproveita os multi-cores
  • mais portável
  • mais escalável
  • mais complexo de implementar
  • melhor para processos I/O bound

Processo

  • cada um tem sua memória virtual endereçável
  • possui contexto maior → PC, pilha, tabela de paginas, etc.
  • um processo único possui no mínimo uma thread (uma linha de execução)
  • usa IPC ou RPC para se comunicarem entre si
  • melhores para isolar tarefas
  • mais seguros por terem um espaço de memória diferente para cada um (são mais isolados entre si)