Escolar Documentos
Profissional Documentos
Cultura Documentos
e Distribuída
Aula 4 – Memória Compartilhada
• Testar a aplicação:
• Teste o executor service na thread da atividade 1
• Então...
• Em situações em que os dados devem ser
compartilhados, cada processo é obrigado a se
preocupar com o que os outros estão fazendo
• Quando atualizam os dados compartilhados (seção
crítica do código) é necessário usar mecanismos que
garantam exclusão mútua
COMUNICAÇÃO ENTRE PROCESSOS
• Seção/Região Crítica:
• É uma área de código de um algoritmo que acessa um recurso
compartilhado que não pode ser acessado concorrentemente
por mais de um processo
• O objetivo é tornar a operação sobre o recurso compartilhado
atômica
• Alguns mecanismos de sincronização são necessários para
implementar a entrada e a saída de uma seção crítica para
assegurar o seu uso exclusivo
Threads e memória
• Heap
• Todos os objetos criados em um aplicativo Java têm espaço alocado na memória
chamado Heap.
• Esses objetos vivem enquanto são referenciados em algum lugar no aplicativo.
• Stack (Pilha)
• Threads executando um método ou invocando uma série de métodos precisariam
de espaço na memória para armazenar variáveis locais e argumentos de método -
esta área da memória é chamada de Stack.
• Cada método chamado pelo thread é empilhado sobre a chamada do método
anterior, chamada de “frames de pilha”.
Compartilhando memória
public class sharedmem {
public static void main(String[] args) {
entre threads vetorCalc vcalc = new vetorCalc(1);
Thread c1 = new Thread( () -> vcalc.add(10,0,10));
Thread c2 = new Thread( () -> vcalc.add(100,10,20));
• Diferentes threads c1.start();
c2.start();
podem compartilhar vcalc.mostra();
}
o mesmo objeto e
seus atributos static class vetorCalc{
int[] meuvetor = new int[20];
• Nesse exemplo o public vetorCalc(int i) {
Arrays.fill(meuvetor, i);
compartilhamento }
public void mostra() {
não gera for(int i:meuvetor)
System.out.println(i);
concorrência }
public void add(int a, int inicio, int fim) {
• Veremos mais for(int i=inicio;i<fim;i++)
adiante como lidar meuvetor[i] += a;
}
com a concorrência }
PARALELISMO EM JAVA
• Testar a aplicação:
• Mude o tamanho do vetor e divida
a operação em 3 threads
threads
vetorCalc vcalc = new vetorCalc(1);
Thread c1 = new Thread( () -> vcalc.add(10,0,10));
Thread c2 = new Thread( () -> vcalc.add(100,10,20));
• Sincronização: c1.start();
c2.start();
• Usando o join() para garantir que try {
c1.join();
as threads terminaram antes de } catch( InterruptedException e) {
System.out.println("c1 foi interrompida"+e);
continuar e usar seus resultados }
try {
static class vetorCalc{ c2.join();
int[] meuvetor = new int[20]; } catch( InterruptedException e) {
public vetorCalc(int i) { System.out.println("c2 foi interrompida"+e);
Arrays.fill(meuvetor, i); }
}
public void mostra() {
vcalc.mostra();
for(int i:meuvetor) }
System.out.println(i);
}
public void add(int a, int inicio, int fim) {
try {
Thread.sleep(2000);
} catch( InterruptedException e) {
System.out.println("thread foi interrompida"+e);
}
for(int i=inicio;i<fim;i++)
meuvetor[i] += a;
}
}
PARALELISMO EM JAVA
Definição:
Ato de executar um programa de computador, um conjunto de
programas ou outras operações, a fim de avaliar o desempenho relativo
de um objeto, normalmente executando uma série de testes padrões e
ensaios nele.
https://pt.wikipedia.org/wiki/Benchmark_(computa%C3%A7%C3%A3o)
• Testar a aplicação
• Obtenha o tempo em
milissegundos para a operação de
soma do vetor por uma constante
num vetor de 1.000.000 de
posições usando 2, 5 e nenhuma
thread
Speedup:
Comparar desempenho entre dois sistemas, ou duas versões de um
mesmo sistema
Relação entre os tempos de execução
“Com uso de buffers temos um speedup de 1,2”
𝑇𝑇1 𝑇𝑇𝑠𝑠𝑒𝑒𝑟𝑟𝑖𝑖𝑎𝑎𝑙𝑙
𝑆𝑆 = 𝑆𝑆𝑝𝑝 =
𝑇𝑇2 𝑇𝑇𝑝𝑝𝑎𝑎𝑟𝑟𝑎𝑎𝑙𝑙𝑒𝑒𝑙𝑙𝑜𝑜
Universidade Católica de Brasília
Ciência da Computação
PARALELISMO EM JAVA
• Testar a aplicação
• Obtenha o speedup para a
operação de soma do vetor por
uma constante num vetor de
1.000.000 de posições usando 2, 5
e 10 threads
Prioridade da Thread:
Valor de 1 a 10; 5 é o default padrão
A thread herda a prioridade da thread que a
criou
Modificada com setPriority(int)
Obtida com getPriority()
Escalonamento: Threads com prioridades
iguais são escalonadas em round-robin, com
cada uma ativa durante um quantum.
Instrumentação
Para monitoramos o comportamento específico devemos modificar o
código-fonte para coletar dados de desempenho
Tracing
Técnica que registra a entrada e saída do processador em regiões
do código-fonte
Precisão do Relógio
Medição de tempo usa primitivas para ler o valor do relógio em
instantes específicos
Universidade Católica de Brasília Programação Concorrente e Distribuída
Ciência da Computação Prof. Edson Francisco da Fonseca
PROCESSADOR MULTICORE
Definição:
É o processador que tem dois ou mais núcleos de processamento
(cores) no interior de um único chip
https://pt.wikipedia.org/wiki/Processador_multin%C3%BAcleo
Vantagens:
Resfriamento
Economia de energia
Licença de software
Desvantagens:
Ajustes no SO
Ajustes do software
Hyperthreading (Intel)
A CPU expõe dois contextos de execução por núcleo físico. Isso significa que
um núcleo físico agora funciona como dois “núcleos lógicos" que podem lidar
com diferentes threads de software.
https://www.intel.com.br/content/www/br/pt/gaming/resources/hyper-
threading.html
Turbo Boost (Intel) e Turbo Core (AMD)
Aumentam a frequência do core durante pequenos intervalos de tempo sempre
que o processador não estiver quente demais
Em alguns casos desligam alguns cores e aumentam a frequência dos restantes
• No Windows:
• Inicie o gerenciador de tarefa
• Escolha a aba de desempenho
• Clique com o botão direito do
mouse no gráfico da CPU
• Escolha “Alterar gráfico >>
processadores lógicos
Testando
Perguntas?
Universidade Católica de Brasília
Ciência da Computação
Obrigado!!!
Atividade!
GRANDES
Universidade Católica de Brasília
Ciência da Computação