Programar uma rotunda em C

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.
 
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..................
 
Técnicas de sincronização/comunicação entre processos (como por exemplo, forks, signals, pipes, memória partilhada e semáforos) utilizadas e respectiva explicação.
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...
 
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:
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.

Rotunda da boavista:P
 
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...

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.

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:
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 :)
 
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.;)
 
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.;)

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!
 
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!

Obrigado pelas dicas. ;)
 
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:
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:
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...

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:
é 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.
 
Back
Topo