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

Post on 19-Jan-2021

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

VariáveisCompartilhadaseModelosdeMemória

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

Motivação

x++

Motivação

x++

x=x+1

Motivação

x++

x=x+1

lêxsomaumgravax

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

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..."

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

x++

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;

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)

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

x=...;done=true;

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

x=...;done=true;

tmp=done;while(!tmp){}

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

Possíveisotimizaçõesdocompilador

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

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

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

distintaporoutrosnúcleos.

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

Conceitos• Execuçãodeumprogramamultithreaded podeservistacomo

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

algumaexecuçãointercaladadessespassos

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

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

Conceitos

r2=y;w=r2;

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

Conceitos

r2=y;w=r2;

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

r2=y;

w=r2;

r1=x;v=r1;

y=2; Condiçãodecorrida

Proposta• Escrevercódigolivredecondiçõesdecorrida.

• Aimplementaçãogarantea“consistênciasequencial”.

if(x)y=true

if(y)x=true

x=y=false

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.

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

sejamexecutadosaomesmotemponãoescrevamouleiameescrevamasmesmasvariáveis.

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

acessamomesmoobjetooupelomenosnãomodificamoobjeto.– Bibliotecaprecisaassegurarqueacessosaobjetosdistintoseacessos

deleituraaobjetosnãointroduzemcondiçõesdecorrida.

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

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

corrida“benignas”.

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.

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.

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).

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.

top related