Unix Process
Todos vocês já usaram...
Tudo isso estásendo executadoatravés de umPROCESSO
Um pouco de história- A programação unix existe desde 1970- Foi inventado nos laboratórios Bell (Bell labs)- Os conceitos ...
Processos- Quem sabe a diferença entre userland e kernel?
ProcessosKernel- É a camada que está em cima do hardware. Ouseja, é o homem do meio entre toda interação queacontece entre...
ProcessosUserland- É onde todos os seus programas são executados- Seu programa pode fazer muita coisa semprecisar do kerne...
ProcessosSystem call- Qualquer comunicação entre o kernel e userlandé feita através de system calls- É a interface que con...
ProcessosProcess identifier (pid)- Todo processo possui um identificador único- Nada mais é que um número sequencial. É assi...
ProcessosParents process (ppid)- Todo processo rodando no seu sistema possuium pai- O processo pai é o processo que invoco...
ProcessosFile descriptors- Representa arquivos abertos- Em unix tudo é arquivo!. Isso significa que dispositivos são tratad...
ProcessosFile descriptors- Não são compartilhados entre processos que nãoestão relacionados- Eles vivem e morrem com o pro...
ProcessosFile descriptors- Apenas recursos abertos possuem filedescriptors- Todo processo unix vem com três recursosabertos...
ProcessosEnvironment variables- São pares chave-valor que possuem dados paraos processos- Todo processo herda variáveis de...
ProcessosArgumentos- ARGV: argument vector- É uma forma de passar argumentos para osprocessosp ARGV$ ruby argv.rb foo bar ...
ProcessosPossuem nome- Todo processo possue um nome e esse nomepode ser mudado durante seu runtime>> puts $PROGRAM_NAME- É...
ProcessosPossuem um código de finalização- Todo processo, ao finalizar, possui um código- É um número entre 0-255 que denota...
ProccessCAN use theFORK
ProcessosFork- É um dos conceitos mais poderosos daprogramação unix- Permite que um processo em execução crie outroprocess...
ProcessosFork- O processo filho herda uma cópia de todamemória usada pelo processo pai bem como todosos file descriptorsReca...
ProcessosForkif forkputs “entrando no if”elseputs “entrando no else”end=> entrando no if=> entrando no elseWTF???- O métod...
ProcessosForkputs “processo pai #{Process.pid}”if forkputs “entrando no if atraves do processo #{Process.pid}”elseputs “en...
ProcessosForkMulticore Programming- Não é garantido de ser distribuido através dasCPUs disponíveis. Depende do SO- É preci...
ProcessosProcessos orfãosfork do5.times dosleep 1puts “Eu sou orfão!”endendabort “Parent process died ...”- O que acontece...
ProcessosCoW Friendly- Copiar toda memória na hora do fork pode serconsiderado um overhead- Sistemas Unix modernos emprega...
ProcessosCoW Friendlyarr = [1,2,4]fork do# nesse momento não há copia de memória# a leitura é feita de forma compartilhada...
ProcessosCoW Friendly- MRI não é CoW friendly. O garbage collector utiliza um algoritmo ‘mark-and-sweep’ que não é compatí...
ProcessosPodem esperar- Realizar um fork e não esperar o resultado éinteressante para tarefas assincronasmessage = “Opa, b...
ProcessosPodem esperarfork do5.times dosleep 1puts “Eu sou orfão!”endend- Basta utilizar em ruby: Process.waitProcess.wait...
Podem esperar- Process.waitProcessos. É uma chamada bloqueante que faz o processopai esperar por um de seus filhos terminar...
ProcessosPodem esperar- Condições de corrida. O que acontece quando um processo pai demorapara realizar a chamada ao metod...
ProcessosZombieee- É sempre bom limpar os processos filhos- O Kernel guarda informações de todos osprocessos filhos em um fil...
ProcessosZombieeemessage = “Opa, bão?”recipient = “rodrigo.diley@dito.com.br”pid = fork doStatsCollector.record message, r...
ProcessosZombieee- Todo processo filho que termina e não possuiseus status coletado é considerado zombiepid = fork { sleep(...
ProcessosRecebem sinais- Process.wait é uma chamada bloqueante- Como esperar por processos filhos em processospais que estã...
ProcessosRecebem sinaischild_process = 3dead_process = 0child_process.times dofork dosleep 3endendtrap(:CHLD) dowhile pid ...
ProcessosRecebem sinais- É uma forma de comunicação assincrona- Quando um processo recebe um sinal do Kernelas seguintes a...
ProcessosRecebem sinais- Os sinais são enviados através do Kernel- Basicamente, o Kernel é o middleman utilizadopelos proc...
ComputadorLIGADO rodandotask remotaNUNCA MAIS
ProcessosRecebem sinais- Se sua tarefa já estiver rodando em um consolebasta enviar o sinal de stop para que a tarefa seja...
ProcessosPodem se comunicar- Existem algumas formas de realizar IPC (Inter-process communication). Pipe. Sockets
ProcessosPodem se comunicar- Pipe. É um caminho de mão única de fluxo de dadosreader, writer = IO.pipe => [#<IO:fd 5>, #<IO...
ProcessosPodem se comunicar- Pipe. É um recurso compartilhado como qualqueroutroreader, writer = IO.pipe => [#<IO:fd 5>, #...
ProcessosPodem se comunicar- Sockets. Pode ser um socket unix, para comunicaçãolocal. Pode ser um socket tcp, para comunic...
ProcessosDeamon- São processos que rodam em background e quenão estão ligados a nenhum terminal controladopelo usuário- Te...
ProcessosDeamon- Process group e session group$ git log | grep shipped | less- Todo sinal enviado para o pai de um process...
OBRIGADO!@sergiohenriquesergio.miranda@dito.com.br
Próximos SlideShares
Carregando em…5
×

Unix Process

570 visualizações

Publicada em

Tech Talk realizado na Dito Internet sobre processos unix. O objetivo foi mostrar um pouco mais desse universo para o pessoal de TI.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
570
No SlideShare
0
A partir de incorporações
0
Número de incorporações
142
Ações
Compartilhamentos
0
Downloads
11
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Unix Process

  1. 1. Unix Process
  2. 2. Todos vocês já usaram...
  3. 3. Tudo isso estásendo executadoatravés de umPROCESSO
  4. 4. Um pouco de história- A programação unix existe desde 1970- Foi inventado nos laboratórios Bell (Bell labs)- Os conceitos e técnicas de programação unixnão são novidades. Essas técnicas vão além daslinguagens de programação.- Essas técnicas não são modificadas há décadas
  5. 5. Processos- Quem sabe a diferença entre userland e kernel?
  6. 6. ProcessosKernel- É a camada que está em cima do hardware. Ouseja, é o homem do meio entre toda interação queacontece entre a userland e o hardware- Essas interações incluem coisas como:. Ler/Escrever no diretório de arquivos. Enviar arquivos pela rede. Alocar memória. Tocar música através dos auto-falantesDevido ao seu poder, nenhum programa possuiacesso direto ao Kernel
  7. 7. ProcessosUserland- É onde todos os seus programas são executados- Seu programa pode fazer muita coisa semprecisar do kernel:. Realizar operações matemáticas. Realizar operações com strings. Controle de fluxo através de operações lógicasMas se você quiser fazer várias coisas legais teráque utilizar o kernel
  8. 8. ProcessosSystem call- Qualquer comunicação entre o kernel e userlandé feita através de system calls- É a interface que conecta o kernel e a userland- Define as interações que são permitidas entre oseu programa e o hardware
  9. 9. ProcessosProcess identifier (pid)- Todo processo possui um identificador único- Nada mais é que um número sequencial. É assimque o kernel vê o seu processo: como um número>> puts Process.pid || $$ #system call: getpid- Não está ligado a nenhum aspecto do conteúdodo processo.- Pode ser entendido por qualquer linguagem deprogramação
  10. 10. ProcessosParents process (ppid)- Todo processo rodando no seu sistema possuium pai- O processo pai é o processo que invocou outrodeterminado processo.>> puts Process.ppid #system call: getppid- O ppid pode ser importante quando estivermosdetectando processos deamons
  11. 11. ProcessosFile descriptors- Representa arquivos abertos- Em unix tudo é arquivo!. Isso significa que dispositivos são tratados comoarquivo, sockets e pipes são tratados comoarquivos e arquivos são tratados como arquivos!- Qualquer momento que você abrir um recurso, éatribuido um número de file descriptor a esserecurso
  12. 12. ProcessosFile descriptors- Não são compartilhados entre processos que nãoestão relacionados- Eles vivem e morrem com o processo que elesestão ligados>> file = File.open(“path/to/the/file”)>> file.fileno=> 3- É através do fileno que o kernel consegue mantero controle dos recursos que seu processo estáutilizando
  13. 13. ProcessosFile descriptors- Apenas recursos abertos possuem filedescriptors- Todo processo unix vem com três recursosabertos. STDIN. STDOUT. STDERR- Existe uma limitação de 1024 file descriptorsabertos por processo
  14. 14. ProcessosEnvironment variables- São pares chave-valor que possuem dados paraos processos- Todo processo herda variáveis de ambiente deseus pais- São definidas por processo e são globais paracada processo$ MESS=‘teste’ ruby -e “puts ENV[‘MESS’]”
  15. 15. ProcessosArgumentos- ARGV: argument vector- É uma forma de passar argumentos para osprocessosp ARGV$ ruby argv.rb foo bar -ba[“foo”, “bar”, “-ba”]
  16. 16. ProcessosPossuem nome- Todo processo possue um nome e esse nomepode ser mudado durante seu runtime>> puts $PROGRAM_NAME- É uma forma eficiente de comunicar a tarefa queestá sendo desenvolvida=> irb
  17. 17. ProcessosPossuem um código de finalização- Todo processo, ao finalizar, possui um código- É um número entre 0-255 que denota se oprocesso finalizou com sucesso ou não- A finalização com um código 0 indica que tudoocorreu como esperado- Mas... Os outros códigos são utilizados comoforma de comunicação
  18. 18. ProccessCAN use theFORK
  19. 19. ProcessosFork- É um dos conceitos mais poderosos daprogramação unix- Permite que um processo em execução crie outroprocesso, utilizando recursos de programaçãopara isso- O novo processo criado é uma cópia exata doprocesso original
  20. 20. ProcessosFork- O processo filho herda uma cópia de todamemória usada pelo processo pai bem como todosos file descriptorsRecapitulando...- O ppid do processo filho é o pid do processo pai.- O processo filho possui o mesmo mapa de filedescriptors que o processo pai
  21. 21. ProcessosForkif forkputs “entrando no if”elseputs “entrando no else”end=> entrando no if=> entrando no elseWTF???- O método fork retorna duas vezes (ele cria outroprocesso, lembra??)- Retorna uma vez no processo pai e uma vez noprocesso filho
  22. 22. ProcessosForkputs “processo pai #{Process.pid}”if forkputs “entrando no if atraves do processo #{Process.pid}”elseputs “entrando no else atraves do processo #{Process.pid}”end=> processo pai 2000=> entrando no if atraves do processo 2000=> entrando no else atraves do processo 2010- O processo filho é finalizado após executar ocódigo que está no else- O retorno do fork no processo pai é o pid do filho.Já no processo filho o fork retorna nil
  23. 23. ProcessosForkMulticore Programming- Não é garantido de ser distribuido através dasCPUs disponíveis. Depende do SO- É preciso ser feito com cuidado!# system call => fork
  24. 24. ProcessosProcessos orfãosfork do5.times dosleep 1puts “Eu sou orfão!”endendabort “Parent process died ...”- O que acontece com um processo filho quandoseu pai morre?. Nada!
  25. 25. ProcessosCoW Friendly- Copiar toda memória na hora do fork pode serconsiderado um overhead- Sistemas Unix modernos empregam uma técnicachamada Copy on Write para evitar o overhead- A cópia da memória é evitada até que algumaescrita seja necessária- Dessa forma o processo pai e o processo filhocompartilham a memória até uma escrita serrealizada pelo processo filho
  26. 26. ProcessosCoW Friendlyarr = [1,2,4]fork do# nesse momento não há copia de memória# a leitura é feita de forma compartilhadaputs arrendfork do# Ao modificar o array uma cópia do array precisa ser feita# para o processo filhoarr << 4end- Isso mostra que realizar um fork é rápido- Os processos filhos possuem uma cópia dosdados modificados. O resto pode sercompartilhado
  27. 27. ProcessosCoW Friendly- MRI não é CoW friendly. O garbage collector utiliza um algoritmo ‘mark-and-sweep’ que não é compatível com cow. O algoritmo realiza uma iteração por todo objetoexistente marcando se o mesmo deve ser coletadoou não. Dessa forma, quando o garbage collector rodartoda memória sera copiada para o processo filho
  28. 28. ProcessosPodem esperar- Realizar um fork e não esperar o resultado éinteressante para tarefas assincronasmessage = “Opa, bão?”recipient = “rodrigo.diley@dito.com.br”fork doStatsCollector.record message, recipientend#continua o envio da mensagem- Mas em alguns outros casos você quer manter ocontrole sobre seus processos filhos
  29. 29. ProcessosPodem esperarfork do5.times dosleep 1puts “Eu sou orfão!”endend- Basta utilizar em ruby: Process.waitProcess.waitabort “Processo pai morreu ...”=> “Eu sou orfão!”=> “Eu sou orfão!”=> “Eu sou orfão!”=> “Eu sou orfão!”=> “Eu sou orfão!”=> “Processo pai morreu ...”
  30. 30. Podem esperar- Process.waitProcessos. É uma chamada bloqueante que faz o processopai esperar por um de seus filhos terminar aexecução. É você que precisa saber qual processo estásendo terminado. Process.wait retorna o pid doprocesso filho
  31. 31. ProcessosPodem esperar- Condições de corrida. O que acontece quando um processo pai demorapara realizar a chamada ao metodo wait?. O Kernel coloca todas as informações de exit dosprocessos filhos em uma fila!. Se Process.wait for chamado e não existirprocesso filho será lançada uma exception
  32. 32. ProcessosZombieee- É sempre bom limpar os processos filhos- O Kernel guarda informações de todos osprocessos filhos em um fila, estão lembrados?- Se nós não retirarmos ela de lá, quem irá?NINGUEM- Estamos gastando mal os recursos do Kernel
  33. 33. ProcessosZombieeemessage = “Opa, bão?”recipient = “rodrigo.diley@dito.com.br”pid = fork doStatsCollector.record message, recipientendProcess.detach(pid)#continua o envio da mensagem- Arrumando nosso exemplo- Basicamente, Process.detach dispara uma novathread que terá como terefa esperar o processofilho terminar
  34. 34. ProcessosZombieee- Todo processo filho que termina e não possuiseus status coletado é considerado zombiepid = fork { sleep(1) }puts pidsleep$ ps -ho pid,state -p [pid do processo]- O status impresso será z ou Z+
  35. 35. ProcessosRecebem sinais- Process.wait é uma chamada bloqueante- Como esperar por processos filhos em processospais que estão sempre ocupados?. Basta trabalhar com sinais!. CHLD é o sinal que o kernel envia para oprocesso pai indicando que um processo filho foifinalizado
  36. 36. ProcessosRecebem sinaischild_process = 3dead_process = 0child_process.times dofork dosleep 3endendtrap(:CHLD) dowhile pid = Process.wait(-1, Process::WNOHANG)puts piddead_process += 1exit if dead_process == child_processendendloop do(Math.sqrt(rand(44)) ** 8).floorsleep 1end
  37. 37. ProcessosRecebem sinais- É uma forma de comunicação assincrona- Quando um processo recebe um sinal do Kernelas seguintes ações podem ser tomadas:. Ignorar. Realizar algum comportamento específico. Realizar o comportamento padrão
  38. 38. ProcessosRecebem sinais- Os sinais são enviados através do Kernel- Basicamente, o Kernel é o middleman utilizadopelos processos para enviarem sinais uns aosoutros
  39. 39. ComputadorLIGADO rodandotask remotaNUNCA MAIS
  40. 40. ProcessosRecebem sinais- Se sua tarefa já estiver rodando em um consolebasta enviar o sinal de stop para que a tarefa sejainterrompida- Após sua interrupção basta colocá-la para rodarem background através do comando bg- Basta remover o vínculo com o terminal atravésdo comando disown
  41. 41. ProcessosPodem se comunicar- Existem algumas formas de realizar IPC (Inter-process communication). Pipe. Sockets
  42. 42. ProcessosPodem se comunicar- Pipe. É um caminho de mão única de fluxo de dadosreader, writer = IO.pipe => [#<IO:fd 5>, #<IO:fd 6>]writer.write(“Galo doido não perde em casa”)writer.closeputs reader.read=> “Galo doido não perde em casa”. É um stream de dados!
  43. 43. ProcessosPodem se comunicar- Pipe. É um recurso compartilhado como qualqueroutroreader, writer = IO.pipe => [#<IO:fd 5>, #<IO:fd 6>]fork doreader.close10.times do#trabalhando...writer.puts “Quase acabando”endendwriter.closewhile message = reader.gets$stdout.puts messageend
  44. 44. ProcessosPodem se comunicar- Sockets. Pode ser um socket unix, para comunicaçãolocal. Pode ser um socket tcp, para comunicaçãoremota- Outra possível solução seria RPC
  45. 45. ProcessosDeamon- São processos que rodam em background e quenão estão ligados a nenhum terminal controladopelo usuário- Tem um processo deamon que é muitoimportante para o sistema operacional. É o pai de todos. É o processo chamado init, seuppid é 0 e o seu pid é 1
  46. 46. ProcessosDeamon- Process group e session group$ git log | grep shipped | less- Todo sinal enviado para o pai de um processgroup é encaminhado para os filhos- Todo sinal encaminhado para um session groupé encaminhado para os processos que fazem partedesse grupo
  47. 47. OBRIGADO!@sergiohenriquesergio.miranda@dito.com.br

×