1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Programação por processos

Discussão em 'Programação' iniciada por rui.m, 8 de Janeiro de 2009. (Respostas: 26; Visualizações: 2138)

  1. Boas!
    Precisava de uma ajuda... tenho de fazer um trabalho em que tenho de utilizar 3 processos, um le do teclado, outro tranforma o que eu num gráfico e o outro exibe diferentes mensagens consuante o valor introduzido.... Será que alguém me pode dar umas dicas?
     
  2. arkannis

    arkannis Power Member

    Errr... é suposto adivinhar os detalhes?
    Em que linguagem? Para que sistema operativo?
     
  3. nasic

    nasic Power Member

    Não mencionaste a linguagem...
    Eu acho que uma boa solução é utilizar memoria partilhada. Ou então, utilizar processos filhos, através de forks.
    Tenta investigar um pouco no google sobre a materia!
     
  4. Desculpem! Esqueci-me... É em C... Eu sei que tenho de usar processos, e neste caso como são 3 usarei (avo, pai, filho)... Mas como ligo isso com a memoria partilhada? E como interligar os processos... Tá-me a fazer confusão...
     
  5. nasic

    nasic Power Member

    Confesso que essa matéria já la vai e nao me recordo muito bem..
    Mas penso que, se vais usar processos filhos enão não precisas de mem. partilhada para nada...visto que em cada um dos processos tens toda a informação do processo anterior.
    Consulta o google:D
    Podes começar por aqui
     
  6. napalm

    napalm Power Member

    O método habitual para comunicar entre processos pai e filho são pipes. Google it e bom trab.
     
  7. Pois... O problema é que não tou a conseguir fazer a ligação entre processos... É isso que me atrapalha:(
     
  8. napalm

    napalm Power Member

    Se não nos dás detalhes não te podemos ajudar.
     
  9. O trabalho consta na implementação de um programa que permita monitorizar em tempo real, o consumo de fonte de água. O sistema de monitorização é constituído por três sensores (processos). Um dos sensores le do teclado a quantidade de água disponivel, o segundo sensor exibe no ecra a quantidade de água disponivel sob a forma de uma barra horizontal e o último sensor alerta, exibindo no ecran a mensagem "RESERVA", sempre que a quantidade de água disponível descer abaixo dos 8 litros, caso contrário, exibe a mensagem "NORMAL".
     
  10. Rebelo6

    Rebelo6 Power Member

    Uma maneira simples de implementares isso é o processo que le do teclado abrir um pipe para cada um dos outros 2 processos e através do pipe escrever o numero que leu. Cada um dos outros dois processos apenas precisa de ler do pipe e fazer o que lhes compete.

    Percebeste?
     
  11. Mas neste caso poderia-se considerar um programa com 3 processos certos? E não é necessário usar memória partilhada?
     
  12. Rebelo6

    Rebelo6 Power Member

    Sim para fazeres como disse terias de criar 2 processos filhos usando 2 vezes a chamada fork().

    Em relação à memória partilhada, precisas mesmo de usar memória partilhada ou és tu que queres? É que convém ter uns conhecimentos base para fazer este tipo de exercícios. Para usares correctamente a memória partilhada tens de garantir a sincronização entre os processos, por exemplo com uso de semáforos (apesar de que para este exercício simples como apenas um dos processos escreve na memória em princípio não haveria nenhum problema).

    Mas se quiseres mesmo usar memória partilhada tens a função

    int shmget(key_t key, int size, int flags)

    que te permite criar/utilizar um pedaço de memória partilhada.

    Depois tens

    char *shmat ( int shmid, char *shmaddr, int shmflg )

    int shmdt ( char *shmaddr)

    que te permitem ligar ou desligar a memória partilhada.

    Se quiseres dá um vista de olhos no site

    http://www.dei.isep.ipp.pt/~orlando/so2/memoria-partilhada.htm

    tem la um exemplo de escrita e um de leitura em memória partilhada.
     
  13. Então quer dizer que akilo que me tentas-te dizer é que ficaria com um processo pai (aquele que le do teclado) e depois dois processos filhos (um para o gráfico e o outro para o resto), é isso?
    Uma das recomendações era para utilizar a memoria partilhada como o valor do depósito...
     
  14. Rebelo6

    Rebelo6 Power Member

    Sim é isso.

    O processo pai lê da consola o valor e escreve-o na memória partilhada.

    Os filhos lêem da memória partilhada e desempenham a sua função.

    Vê os 2 exemplos que estão no site que mencionei anteriormente e tenta perceber. Depois é só adaptares ao teu problema.

    A estrutura do teu programa fica algo do tipo,

    criar zona de memória partilhada;
    criar processos filhos;
    if (get_pid() == pid filho 1)
    lê da memória partilhada e escreve na consola um gráfico

    else if (get_pid() == pid filho 2)
    lê da memória partilhada e escreve na consola RESERVA ou NORMAL

    else if (get_pid() == pid pai)
    lê da consola e escreve na memória partilhada.

    Vais ficar com algo deste género
     
  15. Ok! Obrigado Rebelo6 :)
    vou juntar tudo o que disses-te e deste e fazer isto...
    Obrigadão!!!
     
  16. Só mais uma cena.... Durante todo este processo vou ter de arranjar uma expressão matemática, para contabilizar o consumo de água, apartir da altura em que o motor começa a trabalhar... Essa parte do programa pode ficar feita na memória partilhada???

    Ou é de outra maneira???
     
    Última edição: 9 de Janeiro de 2009
  17. Rebelo6

    Rebelo6 Power Member

    Se precisares que essa informação seja partilhada para esses três processos sim podes usar memória partilhada.

    Podes criar uma estrutura com 2 inteiros em que um corresponde ao nível da água e outro ao consumo.

    Depois em vez de criares uma zona de memória partilhada para apenas um inteiro crias para essa estrutura.
     
  18. raVemjr

    raVemjr I'm cool cuz I Fold

    Não tenho bem a certeza, mas com memória partilhada não seria necesserário haver sincronização?
     
  19. Rebelo6

    Rebelo6 Power Member

    Sim tal como disse num post acima para o exercício ficar mesmo bem feito deveria ser garantida a sincronização dos processos no acesso a memória. Tal como eu referi podíamos por exemplo usar semáforos para garantir a sincronização.

    Só não introduzi directamente o uso de semáforos no pseudo código que fiz porque o que pretendia mesmo era que o rui.m percebesse primeiro o que tem de fazer. Não quis introduzir tudo de uma só vez para não parecer muito confuso.

    Mas pronto para ficar correcto no corpo de cada um dos if's atrás referidos tem de acrescentar a exclusão mútua nos acessos de leitura e escrita em memória.

    Ficaria algo do género:

    if(pid = pai)
    lê da consola;
    pede exclusão mútua;
    escreve em memória;
    liberta a exclusão mútua;

    o mesmo padrão repete-se para cada um dos outros processos.
     
  20. raVemjr

    raVemjr I'm cool cuz I Fold

    Pode-se também utilizar sockets, não? Ouy pipes como sugeriram. Quando houver uma actualizacao dos dados, esse processo comunica aos outros dois as alteracoes. Utilizava-se um selectzinho e tá a andar...
     

Partilhar esta Página