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

Programar uma rotunda em C

Discussão em 'Programação' iniciada por mcanas, 29 de Novembro de 2007. (Respostas: 17; Visualizações: 2041)

  1. mcanas

    mcanas Power Member

    Oi pessoal,
    estou aqui a fazer um projecto para uma disciplina (Sistemas Operativos) onde tenho de programar uma rotunda em C com vários semáforos. Mas estou aqui com algumas dificuldade para implementar isto. O enunciado é este.
    Eu vou ter 4 entradas para a rotunda controladas por semáforos e haverá também 4 saídas mas estas sem necessidade de ter semáforo. Cada via de entrada pode estar sempre a produzir carros.
    A minhas grandes dúvidas são como será melhor fazer isto a nível de produtores e consumidores e como irei fazer depois a sincronização.
    Eu primeiro queria ter a rotunda a funcionar bem com os carros para depois então partir para os peões e o eléctrico.

    Agradecia imenso que me pudessem dar umas luzes que estou mesmo à toa com isto.
     
  2. programar em C... ou C++...


    precisas de um "mini caixotinho... **** you."

    tenta fazer por ti mesmo... não recorras ao facilitismo... não seras um bom profissional.

    mais tarde vais perceber o que te digo... eu percebi, e dei a volta.

    fora brincadeiras... pensa... assembler..................
     
  3. Consu

    Consu Power Member

    Se já souberes o que são forks, signals, pipes, memória partilhada e semáforos talvez já comeces a fazer uma ideia do que será preciso. Pensa bem para que é que serve cada um desses elementos, depois, se tiveres uma dúvida mais concreta, aí sim, coloca aqui para ver se alguém consegue ajudar.
    Repara que naquilo que escreveste não referiste uma dúvida concreta, apenas referes qual é o enunciado e o que tens de fazer...
     
  4. slack_guy

    slack_guy Power Member

    O exercício é muito interessante, é daquelas coisas que, se tivesse tempo, me metia a brincar com isso.
    Vais reparar em dois problemas (de acordo com os requisitos) com consequências óbvias:
    1) dentro das rotundas não deve haver semáforos;
    2) transportes ferroviários não atravessam rotundas e, muito menos, largam passageiros dentro delas.
    Este tipo de solução nunca (a menos que haja um vereador amigo do tio do irmão do zé) veria a luz verde para construção. Mas não deixa de ser um exercício interessante.
     
    Última edição: 29 de Novembro de 2007
  5. fonte

    fonte Power Member

    Rotunda da boavista:P
     
  6. mcanas

    mcanas Power Member

    Isto é pra programar em C. E tou a pedir apenas uma ideia de como pôr as coisas a funcionar e não que me façam o projecto. Não percebo qual a ideia de facilitismo que está aqui... não tou a pedir a ninguém que me faça...

    Pois eu também não conheço rotundas com semaforos e passadeiras a meio..
    A minha grande dúvida é mesmo conseguir fazer a sincronização entre as coisas, já dei voltas e mais voltas e não consigo por isto a funcionar. Se faça apenas 1 produtor para todas as vias de entrada ou um produtor para cada via de entrada... é que se fizer 1 produtor único vou-me deparar com um problema que é o facto de não puder ter um contador a dar informação dos carros em espera nos semaforos.

    Resumindo o que eu gostava era de ter uma noção de como resolver problemas de n produtores para 1 consumidor ou n produtores para n consumidores, para assim ter uma ideia mais clara de como resolver o meu problema.
    Tenho pesquisado na net mas não tenho encontrado nada, só 1 produtor para 1 consumidor.
     
    Última edição: 29 de Novembro de 2007
  7. HecKel

    HecKel The WORM

    Por acaso discordo de ambos, e indo um pouco offtopic, devo realçar que existem bastantes rotundas com semáforos e existem transportes públicos que atravessa literalmente uma rotunda, aliás, o código da estrada até prevê isso ;)

    Querem exemplos?
    Não sei se conhecem Lisboa, mas para mim é um excelente exemplo para este caso, rotundas grandes (marquês, relógio e afins) necessitam de semáforos a meio para controlar o fluxo de transito a entrar e a sair.

    Quanto aos transportes públicos que atravessam rotundas, vejam o caso de eléctricos (e na Margem Sul do Tejo teremos o metro de superfície), o próprio código da estrada diz que nestes casos quem tem prioridade é este transporte público ;)

    Quanto a passadeiras em rotundas, que me recorde nunca vi, mas não questiono a existência de tal coisa ;)

    Quanto ao trabalho em si, julgo que para a sincronização até tens tudo o que precisas..., semáforos. Acho que o enunciado dá mesmo a entender que deves usar semáforos em C para controlares a sincronização dos processos, e a meu ver até vai resultar bastante bem :)
     
  8. AragTey

    AragTey Power Member

    Como já foi dito semaforos deve ser a melhor opção....progcura no google por

    Interprocess communication (IPC)

    tens ai muita informação acerca de como lidar com comunicações.....podes ver esta página...até tempo o tipico problema dos filósofos a comer esparguete :lol:

    http://www.csd.abdn.ac.uk/~jrl/teach/CS3008/lecture/l10/lec.htm
     
  9. mcanas

    mcanas Power Member

    Para resolver o problema vou usar semáforos e memória partilhada.
    Mas o que ainda me está a dar que fazer a sincronizar aquela tralha toda...
    Obrigado pelo link.;)
     
  10. MadOnion

    MadOnion Folding Member

    E talvez signals(para o ctrlC, se o teu programa terminar assim).
    De resto, fiz um projecto este ano (entreguei a semana passada), sobre elevadores. Também era em C e envolvia semaforos e memória partilhada.
    No meu caso tinha 3 terminais abertos(1 processo distribuidor(onde os utente chamavam o elevador), e 2 processos elevador(onde o elevador deslocava-se e deixava os utentes no destino)).
    Não precisei de forks nem de nada disso.
    A chave está em perceber como funcionam os semaforos, como decrementar(sem_wait) e como incrementar(sem_post), tenta fazer o desenho da solução(ou eventual solução), e começa a implementar o teu programa por partes.

    Boa sorte!
     
  11. mcanas

    mcanas Power Member

    Obrigado pelas dicas. ;)
     
  12. petersaints

    petersaints Power Member

    Por acaso estou a fazer o mesmo projecto :P E tb ando a dar cabeçadas naquilo... O problema é mesmo os semaforos no meio (ja para não falar das passadeiras). É que um carro pode ter que passar por varios semaforos para chegar ao destino. Se fossem só semáforos externos era muito mais facil.

    Já agora @MadOdin... sem fork() como? Se tenho que criar varios processos...

    Mas basicamente aqui tem que se usar semaforos e muita memoria partilhada...
     
    Última edição: 1 de Dezembro de 2007
  13. petersaints

    petersaints Power Member

    Uma questão... quando faço mais que dois processos (pai e filho) qual a melhor forma dos criar ? É criar um pid2 e mais condições... ou um filho cria outro filho que cria outro e por ai fora?? Ja testei essa segunda hipotese e parece funcionar:P

    Basicamente a minha pergunta é :P Como é que se criam varios processos filhos do mesmo pai?
     
    Última edição: 1 de Dezembro de 2007
  14. MadOnion

    MadOnion Folding Member

    Eu tinha dois programas, distribuidor.c e o elevador.c
    No terminal abria uma sessão distribuidor.c e noutros 2 terminais abria uma sessão de cada um dos elevadores. Eles comunicavam entre si atrás de semaforos(sem falar na memória partilhada), alias os professores disseram que não era preciso usar forks. Cada terminal era, já de si, um processo.
    Como comunicavam entre si? Ambos os programas(distribuidor e elevador), partilhavam o ID da memoria partilhada, e o ID dos semaforos(atender e mutex(garante exclusão mutua)).
    Para criar memória partilhada usei o shm_open, ftrucante e mmap. Para semaforos usei o sem_open, sem_wait e sem_post. Basta fazer man *funcao* para mais informações.
     
    Última edição: 3 de Dezembro de 2007
  15. Estou com muitos problemas para começar a resolver isto tb, quase me arrisco a dar 50 € a quem me puser isto a bombar...LOL
     
  16. napalm

    napalm Power Member

    por €50 nem um programador na Índia se ia dar ao trabalho.
     
  17. AragTey

    AragTey Power Member

    Investimento do capital:

    Pega nos 50 euros vai comprar um bom livro....muitos snacks, depois fecha-te no quarto e toca a martelar no problema.

    ;)
     
  18. é claro que estava a gozar, apenas estava a exprimir o quanto estou com dificuladades de arranjar uma solução para este problema, de qualquer das maneiras aceitam-se ajudas de como fazer varios produtos-1consumidor.
     

Partilhar esta Página