tpa 2

46
Sumário Técnicas Avançadas de Programação Prof. João Marcos M. da Silva Departamento de Engenharia de Telecomunicações Escola de Engenharia Universidade Federal Fluminense Agosto de 2011 Prof. João Marcos Meirelles da Silva Aula 02 — pg. 1/33

description

tecnicas de programação avançada 2

Transcript of tpa 2

SumrioTcnicas Avanadas de ProgramaoProf. Joo Marcos M. da SilvaDepartamento de Engenharia de TelecomunicaesEscola de EngenhariaUniversidade Federal FluminenseAgosto de 2011Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 1/33SumrioSumrio1Processos Concorrentes I2ExercciosProf. Joo Marcos Meirelles da Silva Aula 02 pg. 2/33SumrioSumrio1Processos Concorrentes I2ExercciosProf. Joo Marcos Meirelles da Silva Aula 02 pg. 2/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasSumrio1Processos Concorrentes IIntroduoIdenticao de ProcessosPrimitivas2ExercciosProf. Joo Marcos Meirelles da Silva Aula 02 pg. 3/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasSobre os processosOs processos so programas carregados na memria docomputador e podem ser classicados como pesados ou leves.Processos PesadosOs processos pesados so os programas tradicionais, possuindo umconjunto de operaes iniciais bsicas que comeam a suaexecuo. Estas operaes iniciais so o que chamamos de thread.A funo void main de um programa escrito em C uma threadinicial.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 4/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasSobre os processosAteno importante entender que cada programa , ao menos, umprocesso e que cada processo possui uma srie de atributos:PIDPPIDUID e GIDetc...Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 5/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAtributos de um processoPIDO Process Identication um nmero deidenticao nico. O primeiro processo chama-seinite recebe o PID de nmero 1;PPIDNenhum processo executado de forma independentedos outros. Todos os processos no sistema, comexceo do init, possuem um processo pai. O atributoParent Process IDarmazena o PID do processo pai.UID e GIDO User IDe o Group IDauxiliam para que osprocessos sejam executados conforme os privilgiosde uma conta de usurio e o seu grupo associado.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 6/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAtributos de um processoVariveis de ambienteCada processo herda do processo paialgumas variveis de ambiente que guardam algunsvalores que podem ser utilizados pelo processo emexecuo;Diretrio de trabalhoOs processos tambm so associados a umdiretrio de trabalho, onde podem fazer a leitura e agravao em disco.=;Temporizadores O Kernel mantm registros da hora em que osprocessos so criados, bem como o tempo de CPUque eles consomem durante a sua execuo.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 7/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAtributos de um processoAlm de um estado de execuo (ready, waite exec), um processoocupa uma rea de memria formada basicamente por 3 partes:Figure: Estrutura de um processo.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 8/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAtributos de um processoText Segment O segmento de cdigo contm as instrues demquina geradas na compilao do programa;User Data Segment O segmento de dados de usurio contm asvariveis utilizadas pelo programa;System Data Segment O segmento de dados do sistema contmos valores dos registradores da CPU quando noestiver sendo executado por algum motivo.Ateno !Como as instrues so separadas dos dados, possvelcompartilhar o mesmo cdigo entre vrios programas em execuo.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 9/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAtributos de um processoUm mesmo programa pode ser ativado mais de uma vez, dandoorigem a vrios processos. Nesse caso, o segmento de cdigo compartilhado entre eles, conforme mostrado na Figura abaixo:Figure: Compartilhamento do segmento de cdigo entre processos.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 10/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAtributos de um processoImportanteTodos os processos que existam ao mesmo tempo soconcorrentes. Eles podem funcionar completamente independentesuns dos outros, ou ocasionalmente necessitar de sincronizao ecooperao.Se certas operaes podem ser logicamente executadas emparalelo, temos os chamados processos paralelos.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 11/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasRacing ConditionsRacing ConditionsSuponha que 3 processos compartilham o acesso a varivel A. Doisdeles fazem operaes de modicao e um imprime o valor davarivel.Processo 1 A = A + 5;Processo 2 A = A + 1;Processo 3 Imprimir A;Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 12/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasSumrio1Processos Concorrentes IIntroduoIdenticao de ProcessosPrimitivas2ExercciosProf. Joo Marcos Meirelles da Silva Aula 02 pg. 13/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasIdenticando um processoO identicador de cada processo PID fornecido pelo SistemaOperacional. A linguagem C tem diferentes primitivas quepermitem conhecer este nmero.Essas primitivas esto declaradas no cabealho unistd.h.pid_t getpid() A funo getpid() retorna o nmero do processoem execuo;pid_t getppid() A funo getppid() retorna o nmero do processopai que criou o processo em execuo.pid_t getpgrp() Esta funo retorna o GID do processo.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 14/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasExemplo1:#include#includeintmain(){printf(Eusouoprocesso\%d.Meupaio\%d.OIDdogrupodeprocessoo\%d.\n,getpid(),getppid(),getpgrp());exit(0);}Paracompilar,salvecomomeupid.c:#gccmeupid.c-omeupid#./meupidProf. Joo Marcos Meirelles da Silva Aula 02 pg. 15/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasSumrio1Processos Concorrentes IIntroduoIdenticao de ProcessosPrimitivas2ExercciosProf. Joo Marcos Meirelles da Silva Aula 02 pg. 15/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasA primitiva EXECA primitiva exec representada pelas funes:execl()execle()execlp()execv()execve()execvp()Cada uma das funes desta famlia trocam a imagem do processoem execuo pela imagem de outro processo.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 16/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasA primitiva EXECO arquivo que ser chamado por estas funes precisa ser umarquivo binrio ou script para ser interpretado por um outroprocesso;O arquivo precisa ter permisses de execuo;Essas funes no retornam nenhum valor que indique seusucesso uma vez que o processo em execuo inteiramentetrocado pelo processo novo;No caso de falha, as funes retornam o valor -1. Essas funes esto declaradas em unistd.h.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 17/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasA primitiva EXECAteno !Um script, para ser interpretado no Linux, precisa iniciar com aindicao de qual programa ser usado para a sua interpretao.Para fazer isso, sua primeira linha deve comear com:#!/caminho/programaProf. Joo Marcos Meirelles da Silva Aula 02 pg. 18/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasint execv(const char *arquivo, char const *argv[ ])Exemplo2:#include#includeintmain{char*cmd[]={"cat","/etc/passwd",(char*)0};printf("Vouchamaroprogramacatparalerocontedode/etc/passwd.\n");execv("/bin/cat",cmd);printf("Estamensagemnoserimpressa.\n");exit(0);}Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 19/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasA primitiva SYSTEMA primitiva system() executa um programa especicado comparmetro e retorna ao processo original quando este termina. Oprocesso original no substitudo, mas congelado.A primitiva system() recebe apenas um nico valor, onde ocomando e seus parmetros devem ser passados como uma nicavarivel string.Esta funo retorna -1 em caso de erro. Se for bem sucedida, afuno retorna o cdigo de sada do programa chamado. Estecdigo poder ser lido atravs da macro WEXITSTATUS(status).Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 19/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasint system(const char *string)Exemplo3:#include#includeintmain{printf("Vouchamaroprogramacatparalerocontedode/etc/issue.\n");system("/bin/cat/etc/issue");printf("Estamensagemserimpressa.\n");exit(0);}Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 20/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAs primitivas FORK e WAITAs primitivas fork() e wait() foram as primeiras para especicarconcorrncia. O fork() inicia um novo processo que compartilha oespao de endereamento do processo pai (criador).Ambos os processos, pai e lho, continuam a execuo em paralelo.Esta funo retorna um valor que pode ser utilizado no controle deexecuo.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 20/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAs primitivas FORK e WAITCaractersticas do fork() em Unix/Linux:Ele duplica o processo que executa a chamada e os doisexecutam o mesmo cdigo;Cada processo tem o seu prprio espao de endereamento,com cpia de todas as variveis, que so independentes emrelao s variveis do outro processo;Ambos executam a instruo seguinte chamada de sistema;O retorno da chamada fork() para o processo pai contm aidenticao do PID do processo lho recm criado;Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 21/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAs primitivas FORK e WAITO retorno da chamada fork() para o processo lho zero;Pode-se selecionar o trecho de cdigo que ser executadopelos processo com instruo condicional if ;A sincronizao entre os processos pai e lho feita com aprimitiva wait(), que bloqueia o processo que a executa atque um processo lho termine.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 22/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasint fork(void)Exemplo4:#include#includeintmain{intid;id=fork();if(id!=0){printf("Eusouopaieesperopelomeufilho%d.\n",id);wait(0);printf("Meufilhoacaboudeterminar...vouterminartambm!\n");}else{printf("Eusouofilho%deespero10segundos.\n",getpid());sleep(10);printf("Jespereievouembora...\n");}}Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 22/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasExemplo5:#include#includeintmain{intpid;printf("MeuPID%d.Voucriarumprocessofilho.\n",getpid());pid=fork();if(pid==0){printf("\t\tProcessofilhocriadocomPID=%d.\n",getpid());printf("Vouficarexecutandoindefinidamente.\n");for(;;);}else{sleep(5);printf("Oprocessopaiterminaedeixaofilhorfo.\n");printf("Vejaseoprocessofilhocontinuarodandocomocomando\n");printf("ps\n");}exit(0);}Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 23/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAs primitivas FORK e WAITHerana entre Pai e FilhoOs processos lhos herdam uma duplicata de todos os descritoresdos arquivos abertos do processo pai. Se o processo lhomovimenta o ponteiro dentro de um arquivo, o processo pai irfazer a prxima movimentao na nova posio.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 23/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasExemplo6:#include#include#include#include#includeintmain{intpid,fd;char*pidnum,c;inti,r;printf("MeuPID%d.\n",getpid());printf("VougravarmeunmerodePIDnoarquivomeupid.\n");if((fd=open("meupid",O_CREAT|O_RDWR|O_TRUNC,S_IRWXU))==-1){printf("Noconseguicriaroarquivomeupid.\n");exit(-1);}sprintf(pidnum,"%dsurpresa",getpid());if(write(fd,pidnum,15)==-1){printf("Noconseguiescrevernoarquivo.");Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 23/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasexit(-1);}printf("Jescrevionmero.Fechandooarquivo.\n");close(fd);printf("Vouabriroarquivonovamenteparaleitura.\n");if((fd=fopen("meupid",O_RDONLY,S_IRWXU))==-1){printf("Nofoipossvelabriroarquivo.\n");exit(-1);}printf("Voucriarumprocessofilhoagora.\n");pid=fork();if(pid==-1){perror("Nofoipossvelcriarumprocessofilho.\n");exit(-1);}elseif(pid==0){printf("\t\tSouoprocessofilho.MeuPID=%d.\n",getpid());printf("\t\tVouleroarquivoquejestavaabertopeloprocessopaiantes.\n");printf("\t\tdaminhacriaoequeeuherdei.\n");for(i=1;i>8));}exit(0);}Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 27/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAs primitivas EXIT, ABORT e KILLAs primitivas que implementam o trmino de processos podem serde dois tipos:exit() Termina o processo normalmente e seus recursos soliberados pelo sistema operacional;abort(pid), kill(pid) So utilizados pelo processo pai para terminarforadamente os processos lhos.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 27/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAs primitivas EXIT, ABORT e KILLProcessos Zombie possvel que um determinado processo lho termine por algummotivo inesperado, se torne um processo zombie (ou defunct). Osprocessos zombie no podem ser terminados com o comando kill,porque eles j no existem mais. preciso terminar o processo pai.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 28/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasExemplo8:Processozombie (zombie.c)#include#include#includeintmain{intpid;printf("MeuPID%devoucriarumprocessofilho.\n",getpid());pid=fork();if(pid==0)/*Aquicomeamasinstruesdoprocessofilho.*/{printf("\t\tMeuPID%defuicriadopor%d.\n",getpid(),getppid());printf("\t\tVerifiqueosprocessosemexecuocomocomandops.\n");sleep(10);printf("Processofilhoterminadonormalmente.\n");exit(0);}else /*Aquicomeamasinstruesdoprocessopai.*/{ for(;;);}}Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 29/33Processos Concorrentes IExercciosIntroduoIdenticao de ProcessosPrimitivasAs primitivas EXIT, ABORT e KILLPara compilar e executar o programa, digite:#gcc zombie.c -o zombie#./zombie &Para nalizar o processo zombie, digite:#killall zombieProf. Joo Marcos Meirelles da Silva Aula 02 pg. 29/33Processos Concorrentes IExercciosAtributos de ProcessosIdenticao de ProcessosSumrio1Processos Concorrentes I2ExercciosAtributos de ProcessosIdenticao de ProcessosProf. Joo Marcos Meirelles da Silva Aula 02 pg. 30/33Processos Concorrentes IExercciosAtributos de ProcessosIdenticao de ProcessosExerccio 1:Em uma mquina Linux, abra um terminal e digite o comando top.Verique quais as informaes (colunas) so exibidas e tenteidenticar algumas delas. O que voc encontrou?Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 31/33Processos Concorrentes IExercciosAtributos de ProcessosIdenticao de ProcessosSumrio1Processos Concorrentes I2ExercciosAtributos de ProcessosIdenticao de ProcessosProf. Joo Marcos Meirelles da Silva Aula 02 pg. 32/33Processos Concorrentes IExercciosAtributos de ProcessosIdenticao de ProcessosExerccio 2:Abra um terminal em uma mquina Linux e digite:#pstree -c -pDescreva o que voc est vendo.Prof. Joo Marcos Meirelles da Silva Aula 02 pg. 33/33