Buscar

Programação para Ambiente Web II: THREADS

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 51 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

THREADS 
Programação para Ambiente Web II 
Prof. Thiago Meirelles Ventura 
UFMT – IC – 2014/2 
Agenda 
•  Conceitos 
•  Características de processos 
•  Características de threads 
•  Thread x Processo 
•  Utilização de threads 
•  Exemplos 
•  Gerenciamento de threads 
•  Sincronização de threads 
•  Implementação 
•  Exercício 
Conceitos 
•  Processo 
 
Um programa em execução. 
 
 
 
 
 
 
 
Conceitos 
•  Processo 
 
Um programa em execução, 
 
sendo constituído de: 
•  código executável 
•  dados referentes ao código 
•  pilha de execução 
•  valor do contador de 
programa 
•  valor do apontador do 
apontador de pilha 
•  valores dos demais 
registradores do hardware 
•  conjunto de outras 
informações necessárias 
para a execução dos 
programas 
 
Conceitos 
•  Thread 
 
Unidade básica de utilização da CPU. 
 
 
 
 
 
 
 
Conceitos 
•  Thread 
 
Unidade básica de utilização da CPU. 
 
Possui seu próprio contador de programa, sua 
pilha e seus registradores. Porém, compartilham 
todos o mesmo espaço de endereçamento (como 
se fossem uma única entidade). 
 
Também chamado de lightweight process. 
 
Conceitos 
http://www-di.inf.puc-rio.br/~endler/courses/inf1019/transp/cap-02.pdf 
Conceitos 
http://www.alexandrelobao.com/Jogos/artigos/Multithread.asp 
Conceitos 
•  Gerência de processos 
•  É uma das principais funções de um sistema operacional 
•  Possibilita aos programas alocar recursos, compartilhar dados, 
trocar informações e sincronizar suas execuções. 
Conceitos 
•  Gerência de processos 
•  Em sistemas multiprogramáveis os processos são executados 
concorrentemente, compartilhando o uso do processador, memória 
principal e dispositivos de E/S, dentre outros recursos. 
 
Conceitos 
•  Gerência de processos 
•  Nos sistemas com múltiplos processadores não só existe a 
concorrência de processos pelo uso do processador como também 
a possibilidade de execução simultânea de processos nos 
diferentes processadores. 
Conceitos 
•  Estados de um processo 
Características de processos 
Características de processos 
Características de threads 
•  Permite ter múltiplos fluxos de controle. 
•  Todas as threads de um processo compartilham a 
memória e os recursos desse processo. 
•  Pode “ler e escrever” em qualquer local, mesmo na pilha 
de outras threads - o que significa que não há qualquer 
forma de proteção de acesso entre as threads. 
•  Operam de forma semelhante a processos quanto ao seu 
estado. Podem ser pronto, bloqueado, executando e 
terminado. 
•  Podem criar threads filhas. 
Thread x Processo 
 
 
Criar ou terminar uma thread é mais 
rápido que criar ou terminar um 
processo. 
Thread x Processo 
 
 
O chaveamento de duas threads (do 
mesmo processo) gasta menos tempo 
que o chaveamento entre dois 
processos diferentes. 
Thread x Processo 
 
 
As threads de um processo 
compartilham memória e arquivos e 
podem se comunicar sem a 
intermediação (invocação) do núcleo. 
Thread x Processo 
 
 
Aplicações que requerem o 
compartilhamento de buffers (por 
exemplo, produtores e consumidores) 
se beneficiam da utilização de threads. 
Thread x Processo 
 
 
 
Implementação mais fácil. 
Utilização de threads 
•  Permitir a exploração do paralelismo real oferecido por 
máquinas multiprocessadores 
 
•  Aumentar número de atividades executadas por unidade 
de tempo 
•  Aumentar o tempo de resposta, possibilidade de associar 
threads a dispositivos de entrada/saída 
•  Sobrepor operações de cálculo com operações de 
entrada e saída 
Exemplos 
•  Leitura contínua de dados de um dispositivo de entrada 
•  Em alguns casos o programa não pode parar o seu 
processamento para fazer a leitura de um dado. 
•  Uma thread pode ficar responsável apenas para ler os dados 
Exemplos 
•  Editor de texto 
•  Thread para fazer correção ortográfica 
•  Thread para fazer gravação automática 
•  Thread para sugerir palavras 
•  ... 
Exemplos 
•  Programa de chat on-line 
•  Uma thread para cada conversa 
http://tech.gaeatimes.com/ 
Exemplos 
•  Grande quantidade de processamento 
•  Utilizar de paralelismo 
•  Uma thread diferente para cada processamento 
Gerenciamento de threads 
•  Nível do usuário 
•  Nível do núcleo 
•  Gerenciamento misto 
Gerenciamento de threads 
•  Nível do usuário 
Gerenciamento de threads 
•  Nível do usuário - Características 
•  Todo o gerenciamento é feito pela aplicação. 
•  Há uma biblioteca que oferece todo o suporte necessário em modo 
usuário, sem a necessidade de chamadas ao sistema. 
•  O núcleo não conhece a existência de threads. 
Gerenciamento de threads 
•  Nível do usuário - Vantagens 
•  Possibilidade de um SO que não suporta threads, implementar 
aplicações multithreads. 
•  Threads em modo usuário são rápidos e eficientes, por dispensar 
acesso ao núcleo do sistema para a criação, eliminação, 
sincronização e troca de contexto das threads. 
Gerenciamento de threads 
•  Nível do usuário - Desvantagens 
•  Se uma thread é bloqueada, provavelmente o processo todo será 
bloqueado. 
•  Incapacidade de múltiplas threads em um processo serem 
executadas por processadores diferentes simultaneamente. 
Gerenciamento de threads 
•  Nível do núcleo 
Gerenciamento de threads 
•  Nível do núcleo - Características 
•  Implementadas diretamente pelo núcleo do sistema. 
•  O núcleo gerência threads (incluindo criação e escalonamento). 
Gerenciamento de threads 
•  Nível do núcleo - Vantagens 
•  No caso de múltiplos processadores, as threads de um mesmo 
processo podem ser executadas simultaneamente. 
•  Não há problemas com relação a compartilhamento de variáveis, 
tratamento de sinais e chamadas síncronas. 
•  Se uma thread é bloqueada, o núcleo ainda pode executar outra 
thread do mesmo processo. 
 
Gerenciamento de threads 
•  Nível do núcleo - Desvantagem 
•  Dez vezes mais lento que o modo usuário. 
Gerenciamento de threads 
•  Gerenciamento misto 
Gerenciamento de threads 
•  Gerenciamento misto 
•  Tenta combinar as vantagens dos outros dois tipos (usuário e 
núcleo). 
•  Maior flexibilidade. 
•  Ainda tem desvantagens dos outros dois tipos. 
Sincronização de threads 
•  Qual valor será escrito na tela? 
Thread 1 
public void run() { 
 soma = soma + 5; 
} 
Thread 2 
public void run() { 
 soma = soma * 3; 
} 
public static void main(String[] args) { 
 ... 
 static int soma = 1; 
 thread1.start(); 
 thread2.start(); 
 System.out.println("%d", soma); 
} 
Sincronização de threads 
 
 
Quando duas ou mais threads podem simultaneamente 
alterar às mesmas variáveis globais, poderá ser necessário 
sincronizar o acesso a esta variável para evitar problemas. 
Sincronização de threads 
•  A solução para estes casos é garantir a exclusão mútua 
•  Apenas um processo tem autorização para acessar o recurso de 
cada vez. 
•  O trecho do programa onde é feito o acesso ao recurso 
compartilhado é denominado região crítica. 
•  Os mecanismos que implementam a exclusão mútua utilizam um 
protocolo de acesso à região crítica. 
•  Toda vez que um processo for executar sua região crítica, ele é 
obrigado a passar por um controle de entrada e outro de saída. 
Sincronização de threads 
pthread_mutex_lock( &mutex1 ); 
 
 ... 
 
 seção crítica 
 
 ... 
 
pthread_mutex_unlock( &mutex1 ); 
 
Implementação 
•  Java 
•  Java (Android) 
•  C# 
•  C 
•  PHP 
Implementação 
•  Java 
public class RunnableExample{ 
 public static void main(String[] args) { 
 Thread thread1 = new Thread(new RunnableThread(), "thread1"); 
 Thread thread2 = new Thread(new RunnableThread(), "thread2"); 
 RunnableThread thread3 = new RunnableThread("thread3"); 
 
 thread1.start(); 
 thread2.start(); 
 try { 
 Thread.currentThread().sleep(1000); 
 } catch (InterruptedException e) { 
 } 
 
 System.out.println(Thread.currentThread()); 
 } 
} 
Implementação 
•  Java 
class RunnableThread implements Runnable { 
 Thread runner; 
 
 public RunnableThread() { 
 } 
 
 public RunnableThread(String threadName) { 
 runner = new Thread(this, threadName); 
 System.out.println(runner.getName()); 
 runner.start(); 
 } 
 
 public void run() { 
 System.out.println(Thread.currentThread()); 
 } 
} 
Implementação 
•  Java (Android) 
public void onClick(View v) { 
 new Thread(new Runnable() { 
 public void run() { 
 final Bitmap bitmap = loadImageFromNetwork("http://
example.com/image.png"); 
 mImageView.post(new Runnable() { 
 public void run() { 
 mImageView.setImageBitmap(bitmap); 
 } 
 }); 
 } 
 }).start(); 
} 
Implementação 
•  C# 
public class MyClass { 
 public static void Main() { 
 Console.WriteLine(”Antes do início das threads"); 
 
 Thread tid1 = new Thread(new ThreadStart(MyThread.Thread1)); 
 Thread tid2 = new Thread(new ThreadStart(MyThread.Thread2)); 
 
 tid1.Start(); 
 tid2.Start(); 
 } 
} 
Implementação 
•  C# 
using System; 
using System.Threading; 
 
public class MyThread { 
 public static void Thread1() { 
 for (int i = 0; i < 10; i++) { 
 Console.WriteLine("Thread 1: {0}", i); 
 } 
 } 
 
 public static void Thread2() { 
 for (int i = 0; i < 10; i++) { 
 Console.WriteLine("Thread 2: {0}", i); 
 } 
 } 
} 
Implementação 
•  C 
int main (int argc, char *argv[]) { 
 pthread_t thread[5]; 
 int rc; 
 long t; 
 for(t=0; t < 5; t++){ 
 printf(”Em main: criando thread %ld\n", t); 
 rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); 
 if (rc){ 
 printf("ERRO: %d\n", rc); 
 exit(-1); 
 } 
 } 
 pthread_exit(NULL); 
} 
Implementação 
•  C 
#include <pthread.h> 
#include <stdio.h> 
 
void *PrintHello(void *threadid) { 
 long tid; 
 tid = (long)threadid; 
 printf("Hello World! Thread #%ld!\n", tid); 
 pthread_exit(NULL); 
} 
Implementação 
•  PHP 
require_once( 'Thread.php' ); 
 
if( ! Thread::available() ) { 
 die( 'Threads não são suportadas' ); 
} 
 
// Método que será chamado para a thread 
function processImage( $_image ) { 
 // código para o processamento de imagem 
} 
Implementação 
•  PHP 
$threads = array(); 
$index = 0; 
 
foreach( new DirectoryIterator( ’/images' ) as $item ) { 
 if( $item->isFile() ) { 
 $threads[$index] = new Thread( 'processImage' ); 
 $threads[$index]->start( $item->getPathname() ); 
 ++$index; 
 } 
} 
 
// Espera todas as threads finalizarem 
while( !empty( $threads ) ) { 
 foreach( $threads as $index => $thread ) 
 if( ! $thread->isAlive() ) 
 unset( $threads[$index] ); 
 sleep( 1 ); 
} 
Exercício 
•  Implemente um programa que simule a venda on-line de 
ingressos para um show. 
•  A cada 10 segundos é liberado um lote de 20 ingressos 
•  No total serão liberados 4 lotes 
•  Há 100 pessoas querendo comprar ingressos 
•  Cada pessoa tenta comprar um ingresso de 3 em 3 segundos 
•  Cada pessoa só pode comprar 1 ingresso 
•  Sinalize os momentos que um lote ficou disponível, que um lote se 
esgotou e que uma pessoa comprou um ingresso 
•  Linguagem de programação: livre 
•  Apresentar em: 17/10

Outros materiais