Programação Paralela em Arquiteturas Multi-Core/Programação em Pthreads: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Flores (discussão | contribs)
Sem resumo de edição
Flores (discussão | contribs)
Linha 51:
----
 
UmaUm thread, algumas vezes chamada um '''processo peso leve''', é um fluxo seqüencial de controle dentro de um programa. UmBasicamente, programaconsiste podeem teruma maisunidade básica de utilização da CPU, compreendendo um ID, um contador de programa, um conjunto de registradores e uma pilha. Um processo tradicional tem um único thread executandode aocontrole. mesmoSe tempoo eprocesso possui múltiplos threads de controle, ele pode realizar mais do que uma tarefa executandoa tarefascada diferentesmomento. Essa possibilidade abre portas para um novo modelo de programação.
 
Threads são diferentes de processos nos seguintes pontos<ref>http://www.llnl.gov/LCdocs/pthreads/index.jsp</ref>:
Linha 73:
Introduzem-se aqui termos e conceitos utilizados na programação multi-threaded.
 
* '''Escalonamento''': normalmente feito pelo sistema operacional, ele determina quais threads executam em determinado momento.
 
* '''Sincronização''': quando um programa pára em um ponto, esperando que determinadas threads terminem seu trabalho, diz-se que houve a sincronização entre as threads.
 
* '''Granularidade''': é o tamanho do trabalho atribuído a cada thread antes que elas se sincronizem. Um programa que seja dividido em partes pequenas entre as threads tem granularidade fina; um programa que faz com que suas threads tenham muito trabalho antes de se sincronizarem tem granularidade grossa.
 
* '''Zona crítica''': uma parte do código que tem comportamento indeterminado caso seja executada por mais de uma thread ao mesmo tempo é chamada de zona crítica.
Um exemplo é quando duas threads tentam realizar, ao mesmo tempo, a incrementação de uma variável. Pode ser que uma execute apenas depois de a outra acabar de incrementar a variável, como pode ser que as duas comecem a incrementá-la ao mesmo tempo, dando um resultado incorreto. Esse caso de acesso à zona crítica é chamado de condição de corrida.
 
* '''Condição de corrida''': quando duas threads modificam uma variável ao mesmo tempo, ocorre uma condição de corrida; só que nessa corrida, a thread que modificar o valor por último é a que tem seu resultado armazenado. Ocorre em situações como a descrita no exemplo de zona crítica.
 
* '''Fechaduras (locks)''': utilizadas para garantir o acesso de uma única thread a determinada porção do código. Utilizadas normalmente para proteger zonas críticas. Quando uma thread atinge uma fechadura, ela confere se está trancada. Se não estiver, ele a tranca, e continua a executar o código. Todas as threads que chegarem à fechadura após isso esperarão que a fechadura seja destrancada, que ocorre quando a primeira thread atinge o comando de unlock. Quando isso ocorre, apenas uma das threads que estavam esperando consegue continuar, enquanto as outras esperam mais, e assim por diante.
 
* '''Semáforos''': semelhantes a locks. Impõem uma condição para que determinada sessão do código seja acessada. Por exemplo, a operação que realiza i = i + 1 só pode ocorrer se uma determinada variável s for igual a 0. Se isso ocorrer, o acesso é liberado para essa operação. Se não, todas as threads que chegarem ao semáforo esperam que a condição seja atingida.
 
* '''Deadlocks''': ocorrem quando determinada thread espera por um resultado de outra thread, e vice-versa. O que ocorre é que, como uma está esperando pela outra, nenhuma segue em frente para fornecer o resultado para outra, e o programa fica parado.
 
==== Benefícios ====
 
Seguem as quatro categorias principais dos benefícios da programação com ''multithreads'':
 
* '''Capacidade de Resposta:''' A estruturação de uma aplicação intereativa em ''multithreads'' pode permitir a um programa continuar executando mesmo se parte dele estiver bloqueada ou realizando uma operação prolongada, aumentando desse modo a capacidade de resposta para o usuário. Por exemplo, um navegador de web ''multithread'' poderá permitir uma interação de usuário em ''thread'' enquanto uma imagem estará sendo armazenada em outro ''thread''.
 
* '''Compartilhamento de Recursos:''' Os ''threads'' compartilham, por padrão, a memória e os recursos do processo ao qual pertencem. A vantagem do compartilhamento de código é permitir que uma aplicação tenha diversos ''threads'' de atividade, todos dentro do mesmo espaço de endereçamento.
 
* '''Economia:''' A alocação de memória e recursos para a criação de processos é custosa. Por outro lado, como os ''threads'' compartilham recursos do processo ao qual pertencem, é mais econômico criar ''threads'' e comutar seus contextos. Em geral, consome muito mais tempo criar e gerenciar processos do que ''threads''.
 
* '''Utilização de Arquiteturas de Multiprocessadores:''' As vantagens da criação de ''multithreads'' podem ser bastante aumentadas em uma arquitetura de multiprocessadores, onde cada ''thread'' pode ser executado em paralelo em um processador diferente. Um processo com um único ''thread'' pode executar somente em uma CPU, não importa quantas estejam disponíveis. A execução de ''multithreads'' em máquinas com múltiplas CPUs aumenta a concorrência.
 
==== Suporte dos sistemas operacionais ====