• Nenhum resultado encontrado

Variáveis Compartilhadas e Modelos de Memória

N/A
N/A
Protected

Academic year: 2022

Share "Variáveis Compartilhadas e Modelos de Memória"

Copied!
28
0
0

Texto

(1)

Variáveis Compartilhadas e

Modelos de Memória

(2)

Referências

§

Threads Basics

Hans-J. Boehm

http://www.hpl.hp.com/personal/Hans_Boehm/c++mm/threadsintro.html Novembro de 2008 / Janeiro de 2011 (revisado)

§

You Don’t Know Jack About Shared Variables or Memory Models

Hans-J. Boehm e Sarita V. Adve Communications of the ACM Fevereiro de 2012

(3)

Motivação

x++

(4)

Motivação

x++

x = x + 1

(5)

Motivação

x++

x = x + 1 lê x

soma um

grava x

(6)

Motivação

x++

x = x + 1 lê x

soma um grava x

lê x // x = 0 soma um // x = 0 grava x // x = 1

lê x // x = 0 soma um // x = 0 grava x // x = 1 x = 0

(7)

Motivação

x++

x = x + 1 lê x

soma um grava x

lê x // x = 0 soma um // x = 0 grava x // x = 1 lê x // x = 1 soma um // x = 1 grava x // x = 2 lê x // x = 2 soma um // x = 2 grava x // x = 3 lê x // x = 3 (...)

soma um // x = 998 grava x // x = 999

lê x // x = 0 soma um // x = 0

grava x // x = 1 x = 0

não se pode nem pensar em "algumas perdas podem ser toleradas..."

(8)

Motivação

• Base decimal;

• Palavras de memória com três dígitos;

• x com seis dígitos.

x++

(9)

Motivação

• Base decimal;

• Palavras de memória com três dígitos;

• x com seis dígitos.

x++

tmp_hi = x_hi;

tmp_lo = x_lo;

(tmp_hi, tmp_lo)++;

x_hi = tmp_hi;

x_lo = tmp_lo;

(10)

Motivação

• Base decimal;

• Palavras de memória com três dígitos;

• x com seis dígitos.

x++

tmp_hi = x_hi;

tmp_lo = x_lo;

(tmp_hi, tmp_lo)++;

x_hi = tmp_hi;

x_lo = tmp_lo;

tmp_hi = x_hi; // tmp_hi =1 tmp_lo = x_lo; // tmp_lo=999 (tmp_hi, tmp_lo)++; // tmp_hi=2

// tmp_lo=0 x_hi = tmp_hi; // x_hi=2 x_lo=tmp_lo; // x_lo=0

tmp_hi = x_hi; // tmp_hi =0 tmp_lo = x_lo; // tmp_lo=999 (tmp_hi, tmp_lo)++; // tmp_hi=1 // tmp_lo=0 x_hi = tmp_hi; // x_hi=1

// x_lo=999 // x=1999

x_lo = tmp_lo; // x=2000

x = 999 (x_hi = 0, x_lo = 999)

(11)

Motivação

• Protocolo de entrada em região crítica por busy waiting.

while (!done) {}

... = x; x = ...;

done = true;

(12)

Motivação

• Protocolo de entrada em região crítica por busy waiting.

while (!done) {}

... = x; x = ...;

done = true;

tmp = done;

while (!tmp) {}

tmp = done;

if (!tmp)

while (true) {}

Possíveis otimizações do compilador

(13)

Motivação

• Protocolo de entrada em região crítica por busy waiting.

while (!done) {}

... = x; x = ...;

done = true;

tmp = done;

while (!tmp) {}

tmp = done;

if (!tmp)

while (true) {}

Possíveis otimizações do compilador

while (!done) {}

... = x

x = ...;

done = true;

done = false

OK

(14)

Motivação

• Protocolo de entrada em região crítica por busy waiting.

while (!done) {}

... = x; x = ...;

done = true;

tmp = done;

while (!tmp) {}

tmp = done;

if (!tmp)

while (true) {}

Possíveis otimizações do compilador

while (!done) {}

... = x

x = ...;

done = true;

while (!done) {} x = ...;

done = true;

while (!done) {}

x = ...;

done = true;

done = false

OK loop infinito

loop infinito

(15)

Motivação

• Mesmo na ausência de otimizações do compilador...

• Gravações executadas por um núcleo observadas em ordem

distinta por outros núcleos.

(16)

Motivação

• Mesmo na ausência de otimizações do compilador...

• Gravações executadas por um núcleo observadas em ordem distinta por outros núcleos.

while (!done) {}

y = x; // y = ???

x = 3133;

done = true;

done = true;

x = 3133;

Execução do núcleo 1 Gravações do núcleo 2

observadas pelo núcleo 1 Execução do núcleo 2

(17)

Conceitos

• Execução de um programa multithreaded pode ser vista como execução intercalada de passos de cada thread

• execução é “sequencialmente consistente” se equivale a alguma execução intercalada desses passos

– Linguagens como Java, C11 e C++11 oferecem “consistência

sequencial” para programas que não possuem condições de corrida.

(18)

Conceitos

• Duas operações em memória são consideradas conflitantes quando acessam a mesma localização de memória e pelo menos uma delas é uma escrita.

• condição de corriga: operações conflitantes em threads distintas que podem ser executadas “ao mesmo tempo”.

– execução “ao mesmo tempo” significa executar imediatamente depois na visão intercalada de execução sequencial de passos de cada thread.

– operações de sincronização não contam

• ausência de condições de corrida: não há condições de

corrida em nenhuma execução sequencialmente consistente

(19)

Conceitos

r2 = y;

w = r2; r1 = x;

v = r1;

y = 2;

(20)

Conceitos

r2 = y;

w = r2; r1 = x;

v = r1;

y = 2;

r2 = y;

w = r2;

r1 = x;

v = r1;

y = 2; Condição de corrida

(21)

Proposta

• Escrever código livre de condições de corrida.

• A implementação garante a “consistência sequencial”.

if (x)

y = true

if (y)

x = true x = y = false

(22)

Consequências

• Em programas livres de condições de corrida:

– Percepção de execução atômica de blocos de código sem sincronização;

– Indiferença em relação à granularidade da atualização da memória (por bytes ou por palavras, por exemplo);

– Percepção de execução em um único passo de chamadas de bibliotecas sem sincronização interna;

– Redução da complexidade de raciocinar sobre programas multithreaded.

(23)

Consequências

• Basta (!) garantir que blocos de código sem sincronização que sejam executados ao mesmo tempo não escrevam ou leiam e escrevam as mesmas variáveis.

• Bibliotecas podem dividir a responsabilidade por evitar

condições de corrida entre código do cliente e da biblioteca:

– Cliente precisa assegurar que duas chamadas simultâneas não acessam o mesmo objeto ou pelo menos não modificam o objeto.

– Biblioteca precisa assegurar que acessos a objetos distintos e acessos de leitura a objetos não introduzem condições de corrida.

(24)

Exclusão Mútua

• Forma mais comum de evitar condições de corrida.

• Não funciona bem com rotinas de tratamento de sinais e interrupções.

• Custo de desempenho.

• Em pthreads, em particular, incidência de bugs e condições de

corrida “benignas”.

(25)

Variáveis de Sincronização

• Como variáveis normais (de dados), mas acessos são considerados operações de sincronização.

• Admitem acessos a partir de múltiplas threads sem implicar condição de corrida.

• Exemplos:

– volatile int (Java) – atomic<int> (C++)

• Adequadas para casos simples de variáveis compartilhadas;

inadequadas para estruturas de dados complexas.

(26)

Linguagens

• Java:

– Garante consistência sequencial para programas livres de condições de corrida.

– Localizações de memória = campos de objeto ou elementos de array.

– Conjunto complexo de regras para definir o comportamento de objetos compartilhados entre threads, inclusive quando ocorrem condições de corrida.

– Qualquer objeto pode ser utilizado como lock para um bloco de código sincronizado:

synchronized ( objeto ) { região crítica

}

– Suporte também a operações explícitas de lock.

– Variáveis de sincronização (volatile) não podem ser elementos de array e garantem atomicidade apenas no acesso à memória.

(27)

Linguagens

• C++11:

– Garante consistência sequencial para programas livres de condições de corrida.

– Suporte explícito a threads na própria linguagem (std::thread).

– Sem comportamento definido para condições de corrida.

– Suporte a lockscom operações explícitas (std::mutex).

– Variáveis de sincronização (atomic) garantem atomicidade no acesso à memória e em algumas operações (como ++, por exemplo).

(28)

estado das coisas

• Garantir ausência de condições de corrida ainda é um problema difícil.

• Avanços recentes:

– Detecção dinâmica de condições de corrida;

– Suporte de hardware para geração de exceções para condições de corrida;

– Anotações de linguagens de programação para eliminar condições de corrida durante a concepção de programas.

• Viabilidade comercial ainda reduzida.

Referências

Documentos relacionados

O uso da SGS permitiu a obtenção do cenário mais crítico em valores máximos de cada pixel e em probabilidade (%) de ocorrência da resistência do solo à penetração em

§ 3º O limite da responsabilidade civil da empresa proprietária do veículo de comunicação ou da agência noticiosa será acrescido de 50% (cinqüenta por cento), nas hipóteses

Quando ha pouco lemos uma aprecia­ ção bem feita e fundada não menos em factos a respeito da continuidade, pouco intervallada, dos congressos catholicos em França, encontramos

Ex 2: Entre as mulheres que tinham entre 6-16 anos quando imigraram da Inglaterra e país de Gales para a Austrália, as taxas entre as imigrantes se aproximaram das taxas

Ø Utilize sempre o aspirador com os filtros instalados para evitar reduçao do poder de aspiraçao do aparelho.. Ø Desligue o aparelho da corrente antes de mudar o saco ou

responsável pelo equilíbrio hormonal do corpo, controlando hormônios essenciais para a vida, qualquer problema que acontece nela pode resultar em perda de

OBSERVAÇÃO: A consulta aos cadastros referente aos itens J e K será realizada em nome da empresa licitante e também de seus sócios, por força do artigo 12

Um byte pode representar um número, um caractere (letra), ou outro objeto, como veremos oportunamente. Eventualmente, quando for necessário armazenar um valor relativamente