IntroduçãoàProgramaçãoConcorrente/Processos
• Desafiosdaprogramaçãoconcorrente• Processos• Estados,ações,históriasepropriedades• Paralelização:Encontrandopadrõesemumarquivo
DesafiosdaProgramaçãoConcorrente
• SistemasMul$threaded– Sistemasqueapresentammaisthreadsdoqueprocessadores.Ex.:Gerenciadordejanelas.
• SistemasDistribuídos– Sistemasquecooperamentresi,residindoemcomputadoresdis6ntosquesecomunicamatravésdeumarede.Ex.:AWeb.
• SistemasParalelos– Sistemasquenecessitamdegrandepoderdeprocessamento.Ex.:Problemasdeo6mização.
DesafiosdaProgramaçãoConcorrente
• Paradesenvolverprogramasconcorrenteénecessárioconhecertrêselementos:– Regras
• Modelosformaisqueajudamaentenderedesenvolverprogramascorretos.
– Ferramentas• Mecanismosoferecidospelaslinguagensdeprogramaçãoparadescrevercomputaçõesconcorrentes.
– Estratégias• Paradigmasdeprogramaçãoadequadosparaasaplicaçõestratadas
DesafiosdaProgramaçãoConcorrente
• Asaplicaçõesconcorrentesdevemservistaspordoisângulos:– Computabilidade
• Princípiosqueabordamoquepodesercomputadoemumambienteconcorrente.
– Desempenho• Avaliaçãodoaumentonodesempenho.
Processos
• OsSistemasOperacionaisatuaisexecutamváriosprogramasdeformaconcorrente,cadaumdosquaisseapoderandodaCPUporumadeterminadafa6adetempo.
• Omecanismodetrocasrápidasentreosprogramaéchamadodemul;programação.
Processos• Conceito
– Abstraçãodeumprogramaemexecução.
• Asinformaçõessobreoestadodeexecuçãodeumprogramacons6tuemocontextodeumprocesso.
• Sãoelas:– Códigodoprograma– Dadosarmazenadosnamemória– Pilhadeexecução– Conteúdodosregistradores– Descritoresdosarquivosabertos
Processosintmain(){intx,y,z;x=f1(10,20);z=f3(50,60);return0; }
Parâmetros(p1,p2)Variáveislocais(a,b)
intf1(intp1,intp2){inta=p1+p2;intb=p1*p2;returna+f2(a,b);}
RetornodafunçãoContadordeprograma(10324)
Endereço10324
ParâmetrosVariáveislocais
RetornodafunçãoContadordeprograma
f1()
f2()
Fazomesmoparaf3()
Apontadordapilha
End.doquadroanterior
Processos
• Chamadasdesistema– Meiopeloqualosprogramasdeusuárioconversamcomosistemaoperacional.
– Formade“proteger”amáquinadosprogramasdeusuário.– Tiposdechamadas:
• Gerenciamentodeprocessos• Gerenciamentodearquivos• Gerenciamentodosistemadediretório
ProcessosChamadasdesistemaparaogerenciamentodeprocessos
Chamada Descrição
pid=fork() Criaumprocessofilhoidên6coaoprocessopai.
pid=waitpid(pid,&statloc,op6ons) Criaumprocessofilhoeaguardooseutermino.
s=execve(name,argv,environp) Criaumprocessofilhoapar6rdeumprogramaexternoeumconjuntodeparâmetros.
exit(status) Terminaaexecuçãodoprocessocorrenteeretornaseuestado.
kill() Finalizaumprocesso.
fork()eexit()#include <unistd.h> /* Symbolic Constants */#include <sys/types.h> /* Primitive System Data Types */ #include <errno.h> /* Errors */#include <stdio.h> /* Input/Output */#include <sys/wait.h> /* Wait for Process Termination */#include <stdlib.h> /* General Utilities */int main() { pid_t childpid; /* variable to store the child's pid */ int retval, status; /* child process: user-provided return code
and parent process: child's exit status */ childpid = fork(); if (childpid >= 0) { /* fork succeeded */ if (childpid == 0) { /* fork() returns 0 to the child process */ printf("CHILD: I am the child process!\n"); printf("CHILD: My PID: %d\n", getpid()); printf("CHILD: Parent's PID: %d\n", getppid()); printf("CHILD: Value of copy of childpid is: %d\n", childpid); printf("CHILD: Sleeping for 1 second...\n"); sleep(1); /* sleep for 1 second */ printf("CHILD: Enter an exit value (0 to 255): "); scanf(" %d", &retval); printf("CHILD: Goodbye!\n"); exit(retval); /* child exits with user-provided return code */ }
fork()eexit() else { /* fork() returns new pid to the parent process */ printf("PARENT: I am the parent process!\n"); printf("PARENT: My PID: %d\n", getpid()); printf("PARENT: Value of copy of childpid: %d\n", childpid); printf("PARENT: Wait for child to exit.\n"); wait(&status); /* wait for child to exit, and store its status */ printf("PARENT: Child's exit code: %d\n", WEXITSTATUS(status)); printf("PARENT: Goodbye!\n"); exit(0); /* parent exits */ } } else { /* fork returns -1 on failure */ perror("fork"); /* display error message */ exit(0); }}
Nestedfork()
int pid = fork(); if (pid == 0){ int pid2 = fork(); if (pid2 == 0) execv("pathtoproducer", NULL); else execv("pathtoconsumer", NULL); } else {
fork()eexecve()#include <stdio.h>
int main( void ) { char *argv[3] = {"Command-line", ".", NULL}; int pid = fork(); if ( pid == 0 ) { execve( "find", argv ,NULL); } wait( 2 ); printf("Finished executing the parent process\n - the child won't get here--\n you will only see this once\n" ); return 0;}
$gccexec-a.c-oexec-a$./exec-a../exec-a./exec-a.c./src./src/stdarg.c./src/getpid.c./src/fork.cFinishedexecu6ngtheparentprocess-thechildwon'tgethere--youwillonlyseethisonce$
fork()int main(void) {pid_t pid;
if ( (pid = fork()) < 0)err_sys("fork error");
else if (pid == 0) { /* first child */if ( (pid = fork()) < 0)
err_sys("fork error");else if (pid > 0)exit(0); /* parent from second fork == first child */sleep(2);printf("second child, parent pid = %d\n", getppid());exit(0);}
if (waitpid(pid, NULL, 0) != pid) /* wait for first child */err_sys("waitpid error");
exit(0);}
execve()
#include<stdio.h>main(int argc,char *argv[],char *envp[]){ printf("File name: %s\n",argv[0]); printf("%s %s",argv[0],argv[1]);
}
#include<stdio.h>#include<stdlib.h>#include<unistd.h>
main() { char *temp[] = {"hello","world",NULL}; execve("hello",temp,NULL); printf("world");}
$ gcc hello.c -o hello $ gcc execve.c -o execve $./execve Filename: hello hello world
fork(),exit(),_exit()ewaitpid()
int main(void) { pid_t pid; pid = fork(); if (pid == -1) {
perror("fork failed"); exit(EXIT_FAILURE); } else if (pid == 0) { printf(”Child process!\n"); _exit(EXIT_SUCCESS); } else {
int status; (void)waitpid(pid, &status, 0); } return EXIT_SUCCESS;}
#include <sys/types.h> /* pid_t */#include <sys/wait.h> /* waitpid */#include <stdio.h> #include <stdlib.h> /* exit */#include <unistd.h> /* _exit, fork */
Processos
• Criaçãodeprocessos– Quatroeventosprincipaismo6vamacriaçãodeprocessos:
• Iníciodosistema.• Execuçãodeumachamadadesistemaparacriaçãodeprocesso(fork())poroutroprocesso.
• Requisiçãodousuário.• Iníciodeumjobemlote.
Processos
• Términodeprocessos– Condiçõesdetérmino
• Saídanormal(voluntária–chamadaexit()). • Saídaporerro(voluntária).• Errofatal(involuntário).• Cancelamentoporumoutroprocesso(involuntário–chamadakill()).
Processos• Estadosdeumprocesso
– Ciclodevida
Emexecução
ProntoBloqueado
1 2
4
3
1. OprocessobloqueiaaguardandoumaE/S.2. Oescalonadorselecionaoutroprocesso.3. Oescalonadorselecionaesteprocesso.4. AE/Storna-sedisponível.
Processos
Gerenciamentodeprocessos Gerenciamentodememória Gerenciamentodearquivos
RegistradoresContadordeprogramaPalavradeestadodoprogramaPonteirodepilhaEstadodoprocessoPrioridadeParâmetrosdeescalonamentoIden6ficador(ID)doprocessoProcessopaiGruposdoprocessoSinaisMomentoemqueoprocessoiniciouTempousadodaCPUTempodeCPUdofilhoMomentodopróximoalarme
PonteiroparaosegmentodecódigoPonteiroparaosegmentodedadosPonteiroparaosegmentodepilha
Diretório-raizDiretóriodetrabalhoDescritoresdearquivoIden6ficador(ID)dousuárioIden6ficadordogrupo
� Implementaçãodeprocessos
Estados,ações,históriasepropriedades
• Estado– Consistenosvaloresdasvariáveisdoprogramaemumdadomomentodurantesuaexecução.
• Açõesatômicas– Umprocessoexecutaumasequênciadeinstruções,asquaissãoimplementadasporumaoumaisaçõesindivisíveis,denominadasaçõesatômicas.
Estados,ações,históriasepropriedades
• Histórias– Aexecuçãodeumprogramaconcorrenteresultaemumentrelaçamento(interleaving)desequênciasdeaçõesatômicasexecutadaspelosprocessos.
– Umahistóriaéumasequênciadeestadoss0às1...àsnpelaqualpassaumprogramacorrenteemumaexecuçãoqualquer.
Estados,ações,históriasepropriedades• Histórias
P1 Begin
I1; I2; I3;
End;
P2 Begin
I4; I5; I6;
End;
P1&P2 I1; I4; I5; I2; I3; I6;
� OnúmerodehistóriaspossíveisédeOnde,n=númerodeprocessosem=númerodeinstruçõesatômicasemcadaprocesso.
Estados,ações,históriasepropriedades
• Propriedades– Umapropriedadeéumatributoválidoparatodasaspossíveishistóriasdeumprogramaconcorrente.
– Duaspropriedadessãodesejadasemumso{wareconcorrente:• Safetyproperty• Livenessproperty
Estados,ações,históriasepropriedades
• Safetyproperty– Garantequeoprogramanuncaentraemumestadoindesejado,ouseja,umestadoemqueasvariáveistemvaloresindesejados.
– Falhaslevamaumcomportamentoindesejado.– Exemplos
• Ausênciadedeadlock:Processosnãodeixamdeexecutar,esperandoporeventosquenuncaocorrem.
• Exclusãomútua:Nomáximoumprocessoexecutaumaregiãocrí6ca.
Estados,ações,históriasepropriedades
• Livenessproperty– Garantequeoprogramaemalgummomentoentraránoestadodesejado.
– Falhaslevamàausênciadeumcomportamentoesperado.– Exemplo
• Terminação:Umprogramaemalgummomentoterminará.• Entradaeventual:Umprocessoaguardandoentrarnaregiãocrí6ca.
Leituracomplementar
• hwp://www.gnu.org/so{ware/libc/manual/html_node/POSIX-Safety-Concepts.html#POSIX-Safety-Concepts
Paralelização:Encontrandopadrõesemumarquivo
• Comooprogramaanteriorpodeserparalelizado?• Oprincipalrequisitoparaaparalelizaçãodeumprogramaéqueelecontenhapartesindependentes.
Paralelização:Encontrandopadrõesemumarquivo
• Independênciadeprocessosparalelos– Considerequeoconjuntodeleituradeumapartedeumprogramasejaformadopelasvariáveisqueelelêmasnãoaltera,eoconjuntodeescritaspelasvariáveisqueelealtera.Duaspartesdeumprogramasãoindependentesseoconjuntodeescritadecadaparteédisjuntodeambososconjuntosdeleituraeescritadaoutraparte.
Açõesatômicaseocomandoawait
• Naexecuçãodeumprogramaconcorrente,nemtodososentrelaçamentosdeaçõesatômicassãoaceitáveis.
• Opapeldasincronizaçãoéevitarosentrelaçamentosindesejados.
• Issopodeserfeitoatravésdeduasmaneiras:– Agruparaçõesdegranularidadefinaemaçõesdegranularidadegrossa;
– Congelaraexecuçãodeumprocessoatéqueumacondiçãosejasa6sfeita.
Açõesatômicaseocomandoawait
• Açõesatômicasdegranularidadefina– Umaaçãoatômicaéaquelaquecausamudançadeestadodeformaindivisível,istoé,qualquerestadointermediárioquepossaexis6rnaimplementaçãodaaçãonãoévisívelporoutrosprocessos.
– Umaaçãoatômicadegranularidadefinaéaquelaqueéimplementadadiretamentepelohardware.
Açõesatômicaseocomandoawait• Açõesatômicasdegranularidadefina
int y = 0, z = 0; co x = y + z; #op1 // y = 1; #op2 z = 2; #op3 oc;
Ordem y z x
op1-op2-op3 1 2 0
op2-op3-op1 1 2 3
op2-op1-op3 1 2 1
Oresultadox=2épossívelporqueop1nãoéatômica!
Considerandoqueasoperaçõessãoatômicas:
Açõesatômicaseocomandoawait• Açõesatômicasdegranularidadefina
int y = 0, z = 0; co x = y + z; #op1 // y = 1; #op2 z = 2; #op3 oc;
W(x)2
W(y)1
R(y)0 R(z)2
W(z)2
P1
P2
Ordem:op1-op2-op3
Açõesatômicaseocomandoawait
• Açõesatômicasdegranularidadefina– Existemduassituaçõesnasquaisumaatribuiçãovaisecomportarcomosefosseatômica:
• Aexpressãodoladodireitonãofazreferênciaanenhumavariávelalteradaporoutroprocesso;
• Aatribuiçãosa6sfazapropriedadeAt-Most-Once.
Açõesatômicaseocomandoawait
• PropriedadeAt-Most-Once– Umareferênciacrí;caemumaexpressãoéumareferênciaaumavariávelmodificadaporoutroprocesso.
◦ Umaatribuiçãosa6sfazapropriedadeAt-Most-Oncese(1)contémnomáximoumareferênciacrí6caenãoélidoporoutroprocesso,ou(2)nãopossuireferênciascrí6cas,casonoqualpodeserlidoporoutroprocesso.
Açõesatômicaseocomandoawait
• PropriedadeAt-Most-Once int x = 0, y = 0;
co x = y + 1; #op1 // y = y + 1; #op2 oc;
Ordem x y
op1-op2 1 1
op2-op1 2 1
Considerandoquetodasasoperaçãosãoatômicas:
Asoperaçõesparecemseratômicas,poiselassa6sfazemapropriedadeAt-Most-Once.
Especificandosincronização:Comandoawait
• Eminúmerassituações,necessitamosexecutarumasequênciadeinstruçõescomosefosseumaúnicaaçãoatômica.– Ex.:Operaçõesbancárias.
int y = 0, z = 1; co x = y + z; #op1 // y = 1; #op2 z = x; #op3 oc;
< >
Especificandosincronização:Comandoawait
• Exclusãomútua
<await (B)>
<x = x + 1; y = y + 1>
� Sincronizaçãoporcondição
<S;>
<await (count > 0);>
� Ambos<await (B) S;>
Esperaatéquecountsejamaiorquezero.
Especificandosincronização:Comandoawait
• Açõesatômicasincondicionais– SãoaquelasquenãocontémumacondiçãodeesperaB.– Ex.:Açõesatômicasdegranularidadefinaougrossaeinstruçõesawaitemqueacondiçãodeguardaésempreverdadeira.
• Açõesatômicascondicionais– InstruçõesawaitcomumacondiçãodeguardaB.
Produtor/Consumidor#include <iostream>using namespace std;#include <unistd.h>#include "sem.h"
int CreateProcess(void (*)()); /* func. prototype */int psem, csem; /* semaphores */int *pn;
main() { void producer(), consumer(); pn = (int *)shmcreate(sizeof(int)); *pn = 0; csem = semcreate(0); psem = semcreate(1); CreateProcess(producer); consumer(); // let parent be the consumer semdelete(csem); semdelete(psem); shmdelete((char *)pn);}
Produtor/Consumidor
void producer() { int i; for (i=0; i<5; i++) { semwait(psem); (*pn)++; // increment n by 1 semsignal(csem); }} void consumer() { int i; for (i=0; i<5; i++) { semwait(csem); cout << "n is " << *pn << '\n'; // print value of n semsignal(psem); }}
Produtor/Consumidor
int CreateProcess(void (*pFunc)()) { int pid;
if ((pid = fork()) == 0) { (*pFunc)(); exit(0); } return(pid);}
Leituracomplementar
• hwp://cs.unitbv.ro/~costel/solr/semafoare/shm.h• hwp://cs.unitbv.ro/~costel/solr/semafoare/shm.c
Exercícios
• Usarawaitnoexemplodebuscaporpadrãoemarquivodetexto
• Usarawaitnoproblemaprodutor/consumidor(cópiadearray)
• Implementarcomprocessos(fork())J
Exercícios
• Quantashistóriaspossíveis?• Quaisvaloresfinaissãopossíveisparaxey?
int x = 0, y = 0; co x = x + 1; x = x + 2; // x = x + 2; y = y – x; oc
Top Related