domingo, 18 de novembro de 2012

THREADS - O que são? Qual sua função?

THREADS - O que são? Qual a sua função?



THREADS

Basicamente escrevemos nossos simples códigos com um único fluxo de controle. Quando isso acontece, o programa irá executar passo a passo as linhas de código. Quando se trata de um programinha bobo, ter um único fluxo de controle não é relevante.

As threads são trechos de códigos com o intuito de executar processo de forma paralela. As threads permitem que varias execuções ocorram no ambiente do aplicativo. Desta forma ao se utilizar de threads de forma correta, teremos melhor aproveitamento de memória e ganho de tempo.

O sistema operacional que usamos no dia-a-dia, seja Windows, Linux ou qualquer outro é carregado de multi threads que são gerenciadas pelo próprio sistema operacional.

O termo multithreading diz respeito aos conjuntos de threads existentes em um mesmo aplicativo.

Exemplo de uso de threads é a planilha de excel: Enquanto estamos inserindo dados na planilha ela ao mesmo tempo pode estar salvando todo o documento.

Quem distribui as threads aos processadores é o S.O, mas é importante verificar se algum programa pode estar rodando na função de alta prioridade, pois isso faz o S.O alocar um núcleo somente para aquele programa. Desta forma, se isto estiver ocorrendo, a distribuição ficará comprometida.


ESTADOS DE UMA THREAD:

*New Thread - A thread está se inicializando, ainda não há recursos do sistema alocado para ela ainda. Quando neste estado, você só pode iniciar a execução dela (start) ou a aniquilar (stop).

*Runnable - Significa que a thread está na agulha, só aguardando a sua execução. Os métodos a serem utilizados quando ela está neste estado são: Start - inicia a execução da thread requisitando os recursos necessários e também chama o método Run - que faz o que está implementado no código da thread.

*Not Runnable - Significa thread parada - Os métodos que são utilizados para parar uma thread de algum jeito específico são: Sleep - faz a thread parar por um tempo pré determinado, desta forma a thread pára e retorna a execução automaticamente quando estoura este tempo pré determinado. Suspend - suspende a execução de uma thread, quando isto ocorre fica-se aguardando o método Resume - que faz retornar a execução da thread suspensa. A thread também pode ser bloqueada por I/O, se isto ocorrer, fica dependente da I/O ser completada.
 
*Dead - Significa o término natural da thread - O método Run termina ou fazemos uso do método Stop.
 
 
MULTITHREADING NO CHIP:
 
Todas as CPUs atuais tem condições de utilizar de multithreading, trata-se de uma abordagem para evitar a ociosidade do processador em um determinado processo.
 
Aqui vou dar um exemplo de multithread de granularidade fina com a utilização de 3 threads. Consideremos cada etapa (a1, a2 ...) como um ciclo do relógio. O "X" representa ociosidade do processador na execução da thread, por algum motivo a thread não foi executada naquele ciclo. Observe abaixo.
 
Ex: THREAD A
A1 A2 X X A3 A4 A5 X X A6 A7
 
Ex: THREAD B
B1 X X B2 X X B3 B4 B5 B6 B7
 
Ex: THREAD C
C1 C2 C3 C4 X C5 C6 X X C7
 
O multithreading de granularidade fina utiliza o processador em um rodízio circular, aproveitando todos os ciclos do relógio, não deixando a cpu ociosa (como ocorreu no exemplo acima). A CPU é utilizada em velocidade integral. Veja abaixo como ficaria o exemplo utilizando a granularidade fina com a utilização das três threads citadas acima:
 
Ex: Granularidade Fina : THREAD D
A1 B1 C1 A2 B2 C2 A3 B3 C3 ...
 
Abaixo dou um exemplo de multithread de granularidade grossa, neste exemplo, utilizado por alguns desenvolvedores, nessa abordagem, a thread A é iniciada até a primeira ociosidade ou protelação e se desperdiça um ciclo. Neste ponto a execução é transferida para B1 até ocorrer a primeira ociosidade ou protelação, quando novamente há transferência de execução e quem passa a ser executado é C1.
 
Ex: Granularidade Grossa : THREAD E
A1 A2 X B1 X C1 C2 C3 C4 X A3 A4 A5
 
Nestes exemplos que utilizei, estou considerando apenas uma instrução por cada ciclo do relógio. Hoje é possível emitir múltiplas instruções por ciclo. Isto é conseguido com uma CPU superescalar dual. Darei mais três exemplos de multithreading, um de multithreading fino superescalar (F), outro de multithreading grosso superescalar (G) e outro de multithreading simultâneo (H).
 
Ex: Granularidade Fina Superescalar : THREAD F
-note que cada coluna representa duas instruções sendo executadas num unico ciclo.
 
A1 B1 C1 A3 B2 C3 A5 B3 C5 A6 B5 C7
A2  X  C2 A4  X  C4 X   B4 C6 A7 B6 C8
 
Ex: Granularidade Grossa Superescalar: THREAD G
-note que cada coluna representa duas instruções sendo executadas num unico ciclo
 
A1 B1 C1 C3 A3 A5 B2 C5 A6 B3 B5
A2  X  C2 C4 A4  X   X  C6 A7  X  B6
 
Ex: Simultâneo : THREAD H
-note que cada coluna representa duas instruções sendo executadas num único ciclo
 
A1 B1 C2 C4 A4 B2 C6 A7 B4 B6 C7
A2 C1 C3 A3 A5 C5 A6 B3 B5 B7  X
 
Estes foram exemplos de como utilizar multi thread a fim de aproveitar melhor um aplicativo e aproveitar melhor os recursos do sistema.
 
Há um outro fator a se pensar : Já que a execução de partes de uma thread ocorre a cada ciclo do relógio porque não aumentar a velocidade do relógio? Por que não colocar duas Cpus em único chip? Aumentar a velocidade do relógio desagradavelmente pode trazer problemas - um relógio mais rápido gasta mais energia, isto é um diferencial negativo em caso de notebooks ou outros dispositivos que utilizem bateria  - um relógio mais rápido faz o processador esquentar muito mais e há de se dissipar este calor. Colocar duas cpus em único chip equivale a duplicar a área do chip e aumentar o custo de produção e não ter garantia de ganho. Por estes motivos o uso de thread tem sido uma constante para resolver problemas de aproveitamento do processador.
 
Bem, quis dar uma breve explicação do que é thread e qual a sua função. Espero uma lida em um próximo post.
 
Fabiano Lopes, 18 de novembro, 14:18
SD
 
 
 
 
 
 
 

Nenhum comentário:

Postar um comentário

GOSTOU? NÃO GOSTOU? TEM ALGO IMPORTANTE A ACRESCENTAR?
Comente, seu comentário é importante !