Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
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.