Sistema operacional - Multi-Threading

O que é Thread?

Um thread é um fluxo de execução através do código do processo, com seu próprio contador de programa que mantém o controle de qual instrução executar a seguir, registros do sistema que mantêm suas variáveis ​​de trabalho atuais e uma pilha que contém o histórico de execução.

Um thread compartilha com seus threads pares algumas informações, como segmento de código, segmento de dados e arquivos abertos. Quando um thread altera um item de memória de segmento de código, todos os outros threads percebem isso.

Um tópico também é chamado de lightweight process. Threads fornecem uma maneira de melhorar o desempenho do aplicativo por meio do paralelismo. Threads representam uma abordagem de software para melhorar o desempenho do sistema operacional, reduzindo a sobrecarga do thread que é equivalente a um processo clássico.

Cada thread pertence a exatamente um processo e nenhum thread pode existir fora de um processo. Cada thread representa um fluxo de controle separado. Threads foram usados ​​com sucesso na implementação de servidores de rede e servidor web. Eles também fornecem uma base adequada para a execução paralela de aplicativos em multiprocessadores de memória compartilhada. A figura a seguir mostra o funcionamento de um processo single-threaded e um multithread.

Diferença entre processo e thread

SN Processo Fio
1 O processo é pesado ou exige muitos recursos. Thread é leve, consumindo menos recursos do que um processo.
2 A comutação de processos precisa de interação com o sistema operacional. A troca de thread não precisa interagir com o sistema operacional.
3 Em vários ambientes de processamento, cada processo executa o mesmo código, mas tem sua própria memória e recursos de arquivo. Todos os threads podem compartilhar o mesmo conjunto de arquivos abertos, processos filhos.
4 Se um processo for bloqueado, nenhum outro processo poderá ser executado até que o primeiro seja desbloqueado. Enquanto um encadeamento está bloqueado e esperando, um segundo encadeamento na mesma tarefa pode ser executado.
5 Vários processos sem usar threads usam mais recursos. Vários processos encadeados usam menos recursos.
6 Em vários processos, cada processo opera independentemente dos outros. Um thread pode ler, escrever ou alterar os dados de outro thread.

Vantagens da linha

  • Threads minimizam o tempo de troca de contexto.
  • O uso de threads fornece simultaneidade dentro de um processo.
  • Comunicação eficiente.
  • É mais econômico criar e alternar threads de contexto.
  • Threads permitem a utilização de arquiteturas de multiprocessadores em maior escala e eficiência.

Tipos de linha

Threads são implementados de duas maneiras -

  • User Level Threads - Tópicos gerenciados pelo usuário.

  • Kernel Level Threads - Threads gerenciados pelo sistema operacional que atuam no kernel, um núcleo do sistema operacional.

Threads de nível de usuário

Nesse caso, o kernel de gerenciamento de encadeamentos não está ciente da existência de encadeamentos. A biblioteca de threads contém código para criar e destruir threads, para passar mensagens e dados entre threads, para agendar a execução de threads e para salvar e restaurar contextos de threads. O aplicativo começa com um único thread.

Vantagens

  • A troca de threads não requer privilégios de modo Kernel.
  • O thread de nível de usuário pode ser executado em qualquer sistema operacional.
  • O agendamento pode ser específico do aplicativo no segmento de nível do usuário.
  • Os threads no nível do usuário são rápidos de criar e gerenciar.

Desvantagens

  • Em um sistema operacional típico, a maioria das chamadas do sistema são bloqueadas.
  • O aplicativo multithread não pode tirar vantagem do multiprocessamento.

Threads de nível de kernel

Nesse caso, o gerenciamento do thread é feito pelo Kernel. Não há código de gerenciamento de encadeamento na área de aplicativo. Threads de kernel são suportados diretamente pelo sistema operacional. Qualquer aplicativo pode ser programado para ser multithread. Todos os threads em um aplicativo são suportados em um único processo.

O kernel mantém informações de contexto para o processo como um todo e para threads individuais dentro do processo. O agendamento pelo Kernel é feito com base em threads. O Kernel realiza a criação, programação e gerenciamento de threads no espaço do Kernel. Os threads do kernel geralmente são mais lentos para criar e gerenciar do que os threads do usuário.

Vantagens

  • O kernel pode agendar simultaneamente vários threads do mesmo processo em vários processos.
  • Se um thread em um processo for bloqueado, o Kernel pode agendar outro thread do mesmo processo.
  • As próprias rotinas do kernel podem ser multithread.

Desvantagens

  • Os threads do kernel geralmente são mais lentos para criar e gerenciar do que os threads do usuário.
  • A transferência de controle de um thread para outro dentro do mesmo processo requer uma mudança de modo para o Kernel.

Modelos de multithreading

Alguns sistemas operacionais fornecem um encadeamento de nível de usuário combinado e um recurso de encadeamento de nível de kernel. Solaris é um bom exemplo dessa abordagem combinada. Em um sistema combinado, vários threads no mesmo aplicativo podem ser executados em paralelo em vários processadores e uma chamada de sistema de bloqueio não precisa bloquear todo o processo. Modelos de multithreading são três tipos

  • Relacionamento de muitos para muitos.
  • Muitos para um relacionamento.
  • Relacionamento um para um.

Modelo muitos para muitos

O modelo muitos-para-muitos multiplexa qualquer número de threads de usuário em um número igual ou menor de threads de kernel.

O diagrama a seguir mostra o modelo de encadeamento muitos para muitos em que 6 encadeamentos de nível de usuário são multiplexados com 6 encadeamentos de nível de kernel. Neste modelo, os desenvolvedores podem criar quantos threads de usuário forem necessários e os threads de Kernel correspondentes podem ser executados em paralelo em uma máquina com multiprocessador. Este modelo fornece a melhor precisão em simultaneidade e quando um thread executa uma chamada de sistema de bloqueio, o kernel pode agendar outro thread para execução.

Modelo Muitos para Um

O modelo muitos para um mapeia muitos encadeamentos de nível de usuário para um encadeamento de nível de kernel. O gerenciamento de threads é feito no espaço do usuário pela biblioteca de threads. Quando o thread faz uma chamada de sistema de bloqueio, todo o processo será bloqueado. Apenas um thread pode acessar o Kernel por vez, portanto, vários threads não podem ser executados em paralelo em multiprocessadores.

Se as bibliotecas de thread em nível de usuário forem implementadas no sistema operacional de forma que o sistema não as suporte, então as threads do Kernel usarão os modos de relacionamento muitos para um.

Modelo Um para Um

Há um relacionamento um a um do encadeamento no nível do usuário com o encadeamento no nível do kernel. Este modelo oferece mais simultaneidade do que o modelo muitos para um. Ele também permite que outro thread seja executado quando um thread faz uma chamada de sistema de bloqueio. Ele oferece suporte a vários threads para executar em paralelo em microprocessadores.

A desvantagem desse modelo é que a criação de thread do usuário requer o thread do Kernel correspondente. OS / 2, Windows NT e Windows 2000 usam um modelo de relacionamento um para um.

Diferença entre Thread de Nível de Usuário e Nível de Kernel

SN Tópicos em nível de usuário Thread de nível de kernel
1 Threads no nível do usuário são mais rápidos de criar e gerenciar. Threads no nível do kernel são mais lentos para criar e gerenciar.
2 A implementação é feita por uma biblioteca de threads no nível do usuário. O sistema operacional oferece suporte à criação de threads de kernel.
3 O thread no nível do usuário é genérico e pode ser executado em qualquer sistema operacional. O encadeamento no nível do kernel é específico para o sistema operacional.
4 Aplicativos multithread não podem tirar proveito do multiprocessamento. As próprias rotinas do kernel podem ser multithread.