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