variáveis compartilhadas e modelos de memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf ·...

28
Variáveis Compartilhadas e Modelos de Memória

Upload: others

Post on 19-Jan-2021

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

VariáveisCompartilhadaseModelosdeMemória

Page 2: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Referências§ ThreadsBasics

Hans-J.Boehmhttp://www.hpl.hp.com/personal/Hans_Boehm/c++mm/threadsintro.htmlNovembro de2008/Janeirode2011(revisado)

§ YouDon’tKnowJackAboutSharedVariablesorMemoryModelsHans-J.BoehmeSarita V.AdveCommunicationsoftheACMFevereiro de2012

Page 3: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação

x++

Page 4: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação

x++

x=x+1

Page 5: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação

x++

x=x+1

lêxsomaumgravax

Page 6: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação

x++

x=x+1

lêxsomaumgravax

lêx//x=0

somaum//x=0

gravax//x=1

lêx//x=0

somaum//x=0

gravax//x=1

x=0

Page 7: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação

x++

x=x+1

lêxsomaumgravax

lêx//x=0

somaum//x=0

gravax//x=1lêx //x=1somaum//x=1gravax//x=2lêx//x=2somaum//x=2gravax//x=3lêx//x=3(...)somaum//x=998gravax//x=999

lêx//x=0

somaum//x=0

gravax//x=1

x=0

nãosepodenempensarem"algumasperdaspodemsertoleradas..."

Page 8: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Basedecimal;• Palavrasdememóriacomtrêsdígitos;• xcomseisdígitos.

x++

Page 9: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Basedecimal;• Palavrasdememóriacomtrêsdígitos;• xcomseisdígitos.

x++

tmp_hi=x_hi;tmp_lo=x_lo;(tmp_hi,tmp_lo)++;x_hi=tmp_hi;x_lo=tmp_lo;

Page 10: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Basedecimal;• Palavrasdememóriacomtrêsdígitos;• xcomseisdí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=1tmp_lo=x_lo;//tmp_lo=999(tmp_hi,tmp_lo)++;//tmp_hi=2

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

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

//tmp_lo=0x_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)

Page 11: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Protocolodeentradaemregiãocríticaporbusywaiting.while(!done){}...=x;

x=...;done=true;

Page 12: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Protocolodeentradaemregiãocríticaporbusywaiting.while(!done){}...=x;

x=...;done=true;

tmp=done;while(!tmp){}

tmp=done;if(!tmp)while(true){}

Possíveisotimizaçõesdocompilador

Page 13: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Protocolodeentradaemregiãocríticaporbusywaiting.while(!done){}...=x;

x=...;done=true;

tmp=done;while(!tmp){}

tmp=done;if(!tmp)while(true){}

Possíveisotimizaçõesdocompilador

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

x=...;done=true;

done=false

OK

Page 14: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Protocolodeentradaemregiãocríticaporbusywaiting.while(!done){}...=x;

x=...;done=true;

tmp=done;while(!tmp){}

tmp=done;if(!tmp)while(true){}

Possíveisotimizaçõesdocompilador

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

x=...;done=true;

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

done=true;

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

done=false

OK

loopinfinito

loopinfinito

Page 15: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Mesmonaausênciadeotimizaçõesdocompilador...• Gravaçõesexecutadasporumnúcleoobservadasemordem

distintaporoutrosnúcleos.

Page 16: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Motivação• Mesmonaausênciadeotimizaçõesdocompilador...• Gravaçõesexecutadasporumnúcleoobservadasemordem

distintaporoutrosnúcleos.

while(!done){}y=x; //y=???

x=3133;done=true;

done=true;

x=3133;

Execuçãodonúcleo1Gravaçõesdonúcleo2observadaspelonúcleo1 Execuçãodonúcleo2

Page 17: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Conceitos• Execuçãodeumprogramamultithreaded podeservistacomo

execuçãointercaladadepassosdecadathread• execuçãoé“sequencialmente consistente”seequivalea

algumaexecuçãointercaladadessespassos

– LinguagenscomoJava,C11eC++11oferecem “consistênciasequencial”paraprogramasquenãopossuemcondiçõesdecorrida.

Page 18: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Conceitos• Duasoperaçõesemmemóriasãoconsideradasconflitantes

quandoacessamamesmalocalizaçãodememóriaepelomenosumadelaséumaescrita.

• condiçãodecorriga:operaçõesconflitantesemthreadsdistintasquepodemserexecutadas“aomesmotempo”.– execução“aomesmotempo”significaexecutar imediatamentedepois

navisãointercaladadeexecuçãosequencialdepassosdecadathread.– operaçõesdesincronizaçãonãocontam

• ausênciadecondiçõesdecorrida:nãohácondiçõesdecorridaemnenhumaexecuçãosequencialmente consistente

Page 19: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Conceitos

r2=y;w=r2;

r1=x;v=r1;y=2;

Page 20: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Conceitos

r2=y;w=r2;

r1=x;v=r1;y=2;

r2=y;

w=r2;

r1=x;v=r1;

y=2; Condiçãodecorrida

Page 21: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Proposta• Escrevercódigolivredecondiçõesdecorrida.

• Aimplementaçãogarantea“consistênciasequencial”.

if(x)y=true

if(y)x=true

x=y=false

Page 22: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Consequências• Emprogramaslivresdecondiçõesdecorrida:

– Percepçãodeexecuçãoatômicadeblocosdecódigosemsincronização;

– Indiferençaemrelaçãoàgranularidadedaatualizaçãodamemória(porbytesouporpalavras,porexemplo);

– Percepçãodeexecuçãoemumúnicopassodechamadasdebibliotecassemsincronizaçãointerna;

– Reduçãodacomplexidadederaciocinarsobreprogramasmultithreaded.

Page 23: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Consequências• Basta(!)garantirqueblocosdecódigosemsincronizaçãoque

sejamexecutadosaomesmotemponãoescrevamouleiameescrevamasmesmasvariáveis.

• Bibliotecaspodemdividiraresponsabilidadeporevitarcondiçõesdecorridaentrecódigodoclienteedabiblioteca:– Clienteprecisaassegurarqueduaschamadassimultâneasnão

acessamomesmoobjetooupelomenosnãomodificamoobjeto.– Bibliotecaprecisaassegurarqueacessosaobjetosdistintoseacessos

deleituraaobjetosnãointroduzemcondiçõesdecorrida.

Page 24: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

ExclusãoMútua• Formamaiscomumdeevitarcondiçõesdecorrida.• Nãofuncionabemcomrotinasdetratamentodesinaise

interrupções.• Custodedesempenho.• Empthreads,emparticular,incidênciadebugsecondiçõesde

corrida“benignas”.

Page 25: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

VariáveisdeSincronização• Comovariáveisnormais(dedados),masacessossão

consideradosoperaçõesdesincronização.• Admitemacessosapartirdemúltiplasthreads semimplicar

condiçãodecorrida.• Exemplos:

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

• Adequadasparacasossimplesdevariáveiscompartilhadas;inadequadasparaestruturasdedadoscomplexas.

Page 26: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Linguagens• Java:

– Garanteconsistênciasequencialparaprogramaslivresdecondiçõesdecorrida.

– Localizaçõesdememória=camposdeobjetoouelementosdearray.– Conjuntocomplexoderegrasparadefinirocomportamentode

objetoscompartilhadosentrethreads, inclusivequandoocorremcondiçõesdecorrida.

– Qualquerobjetopodeserutilizadocomolock paraumblocodecódigosincronizado:synchronized ( objeto ) {

região crítica}

– Suportetambémaoperaçõesexplícitasdelock.– Variáveisdesincronização(volatile)nãopodemserelementosde

array egarantematomicidadeapenasnoacessoàmemória.

Page 27: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

Linguagens• C++11:

– Garanteconsistênciasequencialparaprogramaslivresdecondiçõesdecorrida.

– Suporteexplícitoathreads napróprialinguagem(std::thread).– Semcomportamentodefinidoparacondiçõesdecorrida.– Suportealocks comoperaçõesexplícitas(std::mutex).– Variáveisdesincronização(atomic)garantematomicidadenoacessoà

memóriaeemalgumasoperações (como++,porexemplo).

Page 28: Variáveis Compartilhadas e Modelos de Memórianoemi/pcp-16/aula2/askyrme_sharedvars.pdf · execução intercalada de passos de cada thread • execução é “sequencialmente consistente”

estadodascoisas• Garantirausênciadecondiçõesdecorridaaindaéum

problemadifícil.• Avançosrecentes:

– Detecçãodinâmicadecondiçõesdecorrida;– Suportedehardwareparageraçãodeexceçõesparacondiçõesde

corrida;– Anotaçõesdelinguagensdeprogramaçãoparaeliminarcondiçõesde

corridaduranteaconcepçãodeprogramas.

• Viabilidadecomercialaindareduzida.