quarta-feira, 2 de abril de 2014

Relação entre as Threads e os Processos

RICARDO DE MAGALHÃES SIMÕES - Sobre o Autor
Doutorando em Engenharia Elétrica, Mestre em Informática (2006) e Bacharel em Ciência da Computação (2003), todos pela Universidade Federal do Espírito Santo. Atualmente, Professor Substituto de Informática no CEFET-ES, Professor de Programação I no Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas à Distância no CEFET- ES, professor de Sistemas Operacionais pela ESAB. Tem experiência na área de Ciência da Computação, com ênfase em Desenvolvimento de Algorítmos, Educação de Informática para estudantes do Ensino Médio, atuando principalmente nos seguintes temas: Informática Básica, Programação nas linguagem C/C++/C#, Java, Pascal.
Página pessoal:
Curriculo Lattes::

UNIDADE 6
Objetivo: Conhecer o funcionamento das threads, e a relação entre as threads e os processos.
Threads

1. Definição De Thread

A tradução literal da palavra thread é linha, e em computação pode ser entendida como a linha (ou instrução) de programa em execução. Mas o conceito de thread estende o simples conceito de linha de programa, pois uma thread não é definida isoladamente, e sim em conjunto com outras threads: “Threads são partes independentes de um processo em execução”. A diferença básica entre threads e processos é: um processo não compartilha um mesmo recurso do computador simultaneamente com outro processo, enquanto que uma thread pode compartilhar um mesmo recurso simultaneamente com outras threads (dentro do mesmo processo).

Várias threads são executadas simultaneamente pelo processador, pois são partes distintas de um processo, como por exemplo: uma thread que irá realizar a soma de dois números pode ser executada simultaneamente com uma outra thread que irá gravar uma informação no disco-rígido. Dentro do processador, onde realmente será feito o comando de execução, ocorrem algumas etapas para se completar uma operação: leitura e decodificação da instrução, leitura dos dados, execução da instrução, leitura e apresentação da resposta (existem diferenças na quantidade de etapas entre os processadores, e também na nomenclatura utilizada por cada um). Quando o processador começa a executar uma thread, após as primeiras etapas, já fica liberado para iniciar a execução de outra thread, desta maneira as threads serão executadas de maneira quase simultânea.

Os processadores possuem um ou mais núcleos de processamento, e cada núcleo possui internamente várias unidades de processamento, cada unidade responsável por um tipo:

comparação numérica, aritmética, cálculos com números decimais (ponto flutuante), etc. Cada unidade pode estar executando uma thread independente, e os processadores que conseguem realizar essa execução realmente simultânea são denominados de Processadores Multi-Threading ou Hiper-Threading (dependendo do fabricante).

A execução de threads (parcial ou totalmente simultâneas) dependerá, além do processador, do sistema operacional, pois o mesmo irá gerenciar a execução das threads de maneira semelhante à realizada com os processos. As threads são administradas por meio das Chamadas ao Sistema.

Em último caso, praticamente não mais utilizado nos dias atuais, os próprios programas podem ter internamente estruturas de gerenciamento de suas próprias threads, um exemplo clássico é o Internet Explorer utilizado no antigo sistema Windows 3 (anterior ao Windows 95). O Windows 3 não oferecia suporte à execução de várias threads, mas o Internet Explorer realizava a execução de várias threads através de mecanismos internos do próprio programa.

2. Diferenças entre Threads e Processos

As threads se diferenciam dos processos nas seguintes propriedades:

Os processos em execução no computador utilizam os recursos de modo exclusivo, não permitindo que outro processo (nem mesmo do próprio programa) acesse o mesmo recurso que já estiver em uso;

As Threads podem compartilhar a utilização de um recurso, mas este compartilhamento ocorre apenas dentro de um único processo (pois o compartilhamento entre processos não existe).

Os processos possuem uma grande quantidade de informação associada a eles, informações que são utilizadas pelo sistema operacional para gerenciar a execução de vários processos sem que aconteçam erros;

Threads não necessitam de muita informação para gerenciamento, pois são específicas de cada processo, tornando seu gerenciamento mais fácil e rápido.

Quando o sistema operacional vai realizar a Troca de Contexto de um processo para outro, várias informações têm que ser salvas, os recursos utilizados têm que se manter bloqueados, e o trecho de execução (linha de código) do processo têm que ser salva para que o mesmo possa continuar a execução em um segundo momento. Quando a Troca de Contexto é feita nas threads de um processo, a operação é realizada com uma velocidade maior, pois será necessário salvar uma quantidade mínima de informação e o trecho de execução da thread, os recursos se mantêm inalterados. Por isso, atualmente, os programas e sistemas operacionais são feitos para tirarem o máximo proveito das threads, e consequentemente tirar o máximo proveito dos recursos do computador. Em computadores equipados com vários processadores, ou com um processador de vários núcleos, a utilização de threads aumentará significativamente o desempenho do sistema, pois as threads são mais facilmente executadas simultaneamente que os processos.

Um exemplo de programa que utiliza múltiplas threads é o Internet Explorer, pois ao montar uma página de hiper-texto, cria uma thread para cada item na página (texto, figuras, animação, música, vídeo) assim as múltiplas threads podem ir montando o conteúdo da página à medida em que os dados são recebidos pelo computador. Outro programa que utiliza múltiplas threads é o Adobe Acrobat Reader, em que um documento PDF é exibido ao usuário antes de terminar o seu carregamento, as threads nesse caso compartilham a mesma área de memória onde estão armazenadas as informações do arquivo. O programa Word não oferece esse recurso, um documento do Word só é exibido ao usuário depois de inteiramente carregado na memória principal do computador.

A Troca de Contexto entre as threads pode ser feita de duas maneiras: Preemptiva e Cooperativa. Na Troca Preemptiva o sistema operacional tem total controle da thread, é ele que determina o momento de ocorrência da Troca de Contexto. Na Troca Cooperativa cada thread tem o próprio controle e determina o momento de interromper a execução e passar o processador para outra thread. A desvantagem na Troca Cooperativa é a possibilidade de uma thread assumir o processador por muito tempo, não permitindo que outra thread seja executada, e a desvantagem da Troca Preemptiva é a possibilidade de o sistema operacional interromper uma thread em um momento crítico indevido, causando uma situação anormal no sistema.

Alguns sistemas operacionais fazem distinção entre as threads executadas por um processo do próprio sistema e as threads executadas por processos relativos a programas do usuário. As threads do sistema são gerenciadas no Modo Kernel, que entre outras coisas realiza a Troca de Contexto Preemptiva, e as threads do usuário são gerenciadas no Modo Usuário, em que as Trocas de Contexto são Cooperativas.

3. Concorrência

As threads em um mesmo processo compartilham os mesmos recursos do computador. Isto implica em Acesso Concorrente aos recursos, e Execução Concorrente das instruções do programa. Para exemplificar, imagine uma situação em que duas threads irão realizar uma operação de gravação de dados em uma mesma área de memória (na mesma variável no código fonte), sendo que as threads só poderão realizar a operação se não houver dados naquela área. Nesse caso, as threads não poderão acessar essa área simultaneamente, pois se isso acontecer, apenas uma gravação de uma das threads será armazenada, ou então haverá uma mistura dos dados gravados, o que poderá comprometer a continuação da execução do processo (causando travamento no programa).

Para evitar que isso aconteça, alguns mecanismos de proteção devem ser implementados, mecanismos de comunicação e sincronização na execução das threads, mas não podem ser complexos, pois poderiam dificultar o gerenciamento das trocas de contexto entre as threads. Esses mecanismos são criados no Sistema Operacional por meio de rotinas e estruturas de dados que realizem o controle do acesso aos recursos do computador e a rápida manipulação das threads.

Essas situações em que uma thread realiza uma operação simultânea com outra thread são denominadas Condição de Corrida ou Condição de Disputa, em que as threads irão competir para conseguir o acesso exclusivo ao recurso necessário para realizar as operações daquele instante.

Nenhum comentário:

Postar um comentário