Programação Avançada Processos, Threads e IPC

56
Programação Avançada Processos, Threads e IPC Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012

description

Programação Avançada Processos, Threads e IPC. Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012. Introdução. Processos Threads IPC – Interprocess Communication Memória Compartilhada Sockets Pipes. Processos. Processo Programa em execução - PowerPoint PPT Presentation

Transcript of Programação Avançada Processos, Threads e IPC

Programao Avanada

Programao AvanadaProcessos, Threads e IPCProf. Natalia Castro FernandesMestrado em Telecomunicaes UFF2 semestre/2012IntroduoProcessos

Threads

IPC Interprocess CommunicationMemria CompartilhadaSocketsPipesProcessosProcessoPrograma em execuoExecuo sequencialInclui:Contador de programaPilhaSeo de dadosO processoContm mltiplas partes

Cdigo, tambm chamado de seo de textoAtividade atual, incluindo o contador de programa e os registradores de processoMemriaPilha com dados temporriosParmetros de funes, endereo de retorno, variveis locaisSeo de dadosContm variveis globaisHeap Memria alocada dinamicamente?ProcessosPrograma x processoPrograma passivoProcesso ativoO programa se torna um processo quando carregado na memria

Sistema OperacionalExecute A

ABusca programa no discoCarrega programa na memriaProcesso criado!DiscoMemriaUsurio

ACriando processos com o fork#include #include #include int main(){pid_t pid;/* fork another process */pid = fork();if (pid < 0) { /* error occurred */fprintf(stderr, "Fork Failed");return 1;}else if (pid == 0) { /* child process */execlp("/bin/ls", "ls", NULL);}else { /* parent process *//* parent will wait for the child */wait (NULL);printf ("Child Complete");}return 0;}Exemplos em Python:

teste_fork3.py at teste_fork7.py

Ateno!!!!!O fork s funciona em Linux para Pythonrvore de processos

Finalizao de processosProcesso executa a sua ltima linha e pede ao sistema operacional para delet-lo (exit)Recursos do processos so desalocados pelo sistema operacionalProcesso pai pode terminar a execuo de um processo filho (abort)Exemplos de motivaoProcesso filho excedeu os recursos alocadosTarefa passada ao filho no mais necessriaProcesso pai est sendo finalizado, e alguns sistemas operacionais no permitem que o filho continue executando aps o pai ter sido finalizadoFinalizao em cascata ThreadsThreads so processos levesDiferentes tarefas da aplicao podem ser implementadas como threads separadosAplicvel apenas s tarefas que possam ser paralelizadasExemplos:Atualizar o displayBuscar dadosVerificar correo ortogrficaMotivaoA criao de processos muito custosaCriao de threads mais simples

Vantagens do uso de threadsSimplificao do cdigoAumento da eficinciaProcessos mono e multithreads

11BenefciosMelhora o tempo de resposta Programa continua executando mesmo que algum thread seja bloqueado (thread no espao de kernel)Compartilhamento por padro dos recursos do processo No precisa de tcnicas para criar uma memria compartilhada mais simples criar um thread do que um processo No precisa alocar novos recursos e fcil trocar contexto entre threadsAumenta o paralelismo Em mquinas com multiprocessamento12Programao com mltiplos coresSistemas com mltiplos cores impulsionam novas formas de programar Maior eficincia na execuo de programasContudo, existem algumas dificuldades possvel paralelizar?As tarefas paralelizveis tem a mesma importncia?Quais conjuntos de dados pertencem a cada thread?Se duas threads usam dados dependentes, como sincronizar o acesso?Como depurar o processo, se existem mltiplos caminhos de execuo?ThreadsExemplosEx_sem_thread.pyEx_sem_thread_processo.pyEx_thread.pyEx_threadv2.pyEx_thread_mais_legal.pyEx_thread_mais_legal_completo.pyEx_legal_final.py

14Comunicao interprocessosProcessos em um sistema podem ser independentes ou cooperativosProcessos cooperativos podem afetar ou serem afetados por outros processosProcessos independentes no podem afetar ou serem afetados pela execuo de outro processoRazes para cooperao interprocessosCompartilhamento de dadosAumento da velocidade de computaoModularidadeConveninciaComunicao interprocessosCooperao entre processos depende da interprocess communication (IPC)

Dois modelos de IPCMemria compartilhadaTroca de mensagens

Modelos de comunicao

Envio de mensagensMemria compartilhadaSincronizaoEnvio de mensagens pode ser tanto blocante quanto no-blocanteOperao blocante considerada sncronaO send blocante bloqueia o emissor at que a mensagem seja recebidaO receive blocante bloqueia o receptor at que a mensagem esteja disponvelOperao no-blocante considerada assncronaO emissor envia a mensagem e continuaO receptor recebe uma mensagem vlida ou nuloExemplos em PythonCompartilhamento de variveisshared_mem.py a shared_memv3.pyOBS:Multiprocessing API para processos cooperativosQueue() Cria fila compartilhadaput(), get()Process(codigo do novo processo, argumentos)start(), is_alive()Exemplos em PythonCompartilhamento de variveisshared_memv4.pyMultiprocessingValue(tipo, valor) --- compartilhando um nmeroArray(tipo,lista)Join() Bloqueia o pai at o filho terminarShared_memv4b.py

Comunicao em sistemas cliente-servidorSockets

Pipes

SocketsUm socket definido como um ponto de extremidade para a comunicao Concatenao de IP e portaExemplo:O socket 161.25.19.8:1625 se refere a porta 1625 no host 161.25.19.8

A comunicao consiste de um par de socketsExemplos em PythonSocketSocket-client.py e socket-server.pySocket-client-udp.py e socket-server-udp.pySocket-client.py e socket-server-multiple.py

PipeAtua como um condutor permitindo que dois processos se comuniquem

Pipes comuns permitem a comunicao em um estilo produtor-consumidor padroFuncionamentoO produtor escreve em uma ponta do pipeO consumidor l a sada na outra pontaPortanto, pipes comuns so unidirecionaisRequerem relao de pai-filho entre processos comunicantes

Pipes nomeadosPipes nomeados so mais potentes que pipes comunsComunicao bidirecionalNo h necessidade de relao pai-filhoPode ser usado por diversos processosDisponvel tanto em UNIX quanto em WindowsExemplos em PythonPipeEx-pipe.pyAcesso ConcorrenteAcesso concorrente a um dado compartilhado pode resultar em inconsistncia

Para manter a consistncia, preciso garantir uma execuo ordenada dos processos cooperativos (que esto interagindo por meio de uma estrutura compartilhada)

Estudo da concorrncia entre processos atravs de modelosExemplo: Produtor-consumidor

27Problema do Produtor-ConsumidorProdutor e consumidor so dois processos distintosO produtor produz e coloca o produto no bufferO consumidor consome produtos que esto no bufferConsequnciasO buffer passa a ser uma estrutura compartilhadaO produtor no pode colocar um produto em um buffer cheioO consumidor no pode consumir um produto se o buffer estiver vazioA varivel compartilhada count pode ser usada para saber o nmero de elementos no momento dentro do bufferEventualmente, o count pode ser atualizado simultaneamente pelo produtor e pelo consumidorAtualizao no uma tarefa atmica (indivisvel)

Produtor def produtor():seed()global counti=0while (True):sleep(random())#Tempo para simular o processo produzindo a informaoif count=BUFFER_SIZE):pass29Consumidor def consumidor():seed()global countwhile (True):if count>0:buffer.pop(0)count = count -1sleep(random()) #Tempo para simular o processo consumindo a informaoelse:while(count0:buffer.pop(0)count = count -1

sleep(random()) #Tempo para simular o processo consumindo a informaoelse:while(count10):print "ERRO!!!!, pois o buffer estourou!!!"

Seo crticaSeo crtica40RevisoComo proteger a seo crtica?Enquanto um produtor est na seo crtica, nenhum outro produtor ou consumidor pode entrar na seo crticaSeo crtica = seo aonde se atualiza ou se compara as variveis compartilhadasEnquanto um consumidor est na seo crtica, nenhum outro consumidor ou produtor pode entrar na seo crtica

SemforosSignal e waitOperaes atmicas na modificao do semforoModificam o valor do sinal

signal (S) { S++; }

int sinal=1;

wait(sinal);

Regio crtica;

signal (sinal);wait (S) { while S value--; if (S->value < 0) { add this process to S->list; block(); } }signal(semaphore *S) { S->value++; if (S->value list; wakeup(P); }} int sinal=1;

wait(sinal);

Regio crtica;

signal (sinal);S pode variar entre infinito e 1. Se S=1, o processo acessa a regio crtica.

Permite fazer a fila de processos esperando.SemforosSignal e wait + block e wakeupwait(semaphore *S) { S->value--; if (S->value < 0) { add this process to S->list; block(); } }signal(semaphore *S) { S->value++; if (S->value list; wakeup(P); }} int sinal=1;

wait(sinal);

Regio crtica;

signal (sinal);No tem espera ocupada!DeadlockDeadlock Acontece quando dois ou mais processos esto esperando por um evento que s poderia ser executado por um dos processos em esperaExemploImagine que S e Q so dois semforos inicializados em 1

P0 P1 wait (S); wait (Q); wait (Q); wait (S);. .. .. . signal (S); signal (Q); signal (Q); signal (S);45Resolvendo o Produtor-ConsumidorBuffer de tamanho N

Semforo mutex inicializado em 1

Semforo full inicializado em 0

Semforo empty inicializado em NControla o acesso ao bufferControla o nmero de espaos ocupados no bufferControla o nmero de espaos vazios no buffer46Resolvendo o Produtor-ConsumidorProdutor

do {

// produce an item in nextp

wait (empty); wait (mutex);

// add the item to the buffer

signal (mutex); signal (full); } while (TRUE);No pode trocar a ordem!Espera ter um vazio para usar e usaPede acesso ao bufferLibera o acesso ao bufferAumenta o nmero de espaos ocupados47The structure of the consumer process

do { wait (full); wait (mutex);

// remove an item from buffer to nextc

signal (mutex); signal (empty); // consume the item in nextc

} while (TRUE);Espera ter um cheio para usar e usaPede acesso ao bufferLibera o acesso ao bufferAumenta o nmero de espaos vaziosResolvendo o Produtor-Consumidor48Semforos e Locks em Pythonthreading.Lock()Retorna um objeto do tipo lockUsa acquire() e release()Uma vez que um thread d um acquire, os demais threads que tentarem fazer o acquire ficaro bloqueados at que o thread d um releaseApenas um liberado e os demais, caso existam, ficam na filathreading.RLock()Semelhante ao Lock, mas um mesmo thread pode pedir o Rlock mais de uma vez sem se auto-bloquear. Contudo, o nmero de releases precisa ser igual ao nmero de acquires para liberar o LockExemplos em PythonEx_threadv2.pyEx-thread-lock.pyEx-thread-lockv2.pyEx-thread-lockv3.pyEx-thread-lockv4.py

Semforos e Locks em Pythonthreading.Semaphore([value])Retorna um objeto do tipo semforoRecebe um valor inicial do contador e bloquear apenas quando o nmero ficar negativoValor padro do contador 1threading.BoundedSemaphore([value])Semelhante ao Semaphore, mas garante que o valor inicial nunca ser excedido.Valor padro do contador 1Exemplos em PythonEx-semaphore.pyEx-semaphorev2.pyEx-semaphorev3.pyEx-semaphorev4.pyEx-semaphorev5.py

Exemplo produtor-consumidorProdutor-consumidor.pyProdutor-consumidor-processv3.pyProdutor-consumidor-processv4.py

ExercciosQuatro processos externos transmitiro informaes de temperatura para um processo central, que por sua vez responder com sua prpria informao de temperatura e indicar se o processo inteiro se estabilizou. Cada processo externo receber sua temperatura inicial na criao e recalcular uma nova temperatura de acordo com a frmula:Nova_temp_ext = (temp_ext*3+2*temp_central)/5O processo central recalcula a temperatura pela frmula:Nova_temp_central = (2*temp_central+4_temperaturas_ext_recebidas)/6Inicialmente, cada processo externo enviar sua temperatura para o processo central. Se as temperaturas enviadas pelos 4 processos na ltima iterao forem iguais, ento o sistema se estabilizou. O processo central deve avisar aos demais que concluiu sua execuo e qual foi a temp_central estabilizada e terminar. Os demais processos devero imprimir a informao recebida na tela e terminar. Enquanto o sistema no estiver estvel, o processo central dever enviar, no fim de cada iterao, o valor da temperatura central para cada um dos processos e esperar suas respostas.Implemente esse sistema utilizando processos e sockets.Adaptado do livro Fundamentos de Sistemas OperacionaisExercciosRepita o problema anterior, usando memria compartilhada ao invs de socket.Nesse caso, no existir processo central. Uma estrutura dever ser compartilhada, contendo a temperatura atual de cada processo e uma temperatura central.Cada processo, ao perceber que as temperaturas se igualaram, deve escrever na tela o valor da temperatura final e terminar. importante garantir que a estrutura s ser lida ou atualizada por um processo de cada vez.

ExercciosRepita o problema anterior, tirando o controle de acesso de leitura e escrita s variveis compartilhadas. Execute o programa e diga se o controle foi importante ou no e porqu.ExerccioFaa um servidor resolver de DNS simplificado, utilizando threads. Cada conexo recebida dever ser tratada por um novo thread. O servidor receber do cliente um nome e dever retornar, via socket, o IP correspondente. Use a funo socket.gethostbyname(hostname) para traduzir os nomes em IP.ExerccioExplique o que mutex.Explique e demonstre como um semforo pode ser usado para criar um mutex.Explique e demonstre como um semforo pode ser usado para controlar um nmero de elementos.