C + Semaforos

kanguru

Portugal@Home Member
Boas. Tenho um projecto de SO para fazer, so que não sei como começar. Não venho pedir que façam por mim mas se possivel podiam me ajudar a compreender um exemplo de código fornecido pelo prof:

http://comp.ist.utl.pt/ec-so/labs/exemplos/tabacaria.zip

Dentro do zip existem varios ficheiros, eu entendo o que a maior parte faz, mas não percebo o que faz o auxiliar.c. Pq usam um processo auxiliar para kontrolar o processo fumador (ver dentro do zip)? Pq não ser a tabacaria a controlar esses semaforos?

Agradecia ajuda urgentemente para ver se percebo como funciona o sistema de semaforos e avançar com o projecto. Obrigado.
 
com 170 alunos por ano, n csgs arranjar ng q te explique bem isso?
pois eu bem te entendo lol..

em relação á dúvida em sí :)
o auxiliar é só um ficheiro de exemplo, q penso q n tem nada a ver com o resto do prog
 
tem a ver pq é o que faz ligaçao do fumador ah tabacaria, mas não percebo pq tantas voltas. Não conheço ninguem com a cadeira que perceba disto :P Amanha devo encontrar por la alguem que possa chatear, so que como queria avançar alguma coisa hj, vim aqui :)
 
O objectivo disto e simples. garantir que as acções sao unicas. passando a explicar
tens o auxiliar que garante que so o fumador ou a tabacaria acede ao ficheiro com o stock disponivel.
tabacaria adiciona 1
fumador retira 1
tabacaria actualiza stock
fumador actualiza stock
se acontece isto ficas com informação errada no sistema, e com os semaforps garantes que só um acede ao "sistema", ficando "vermelho" para o outro "utilizador".
 
portanto, o fumador e tabacaria controlam os semaforos entre eles, e o auxiliar serve para controlar o estado das variaveis globais?
 
Pensa desta forma o auxiliar é o porteiro que te deixa entrar numa casa, mas nessa casa so pode estar uma pessoa de cada vez.
Se a casa estiver vazia ele deixa-te entrar, se alguem tiver la dentro coloca o sinal a vermelho e mais ninguem entra, ate o outro sair, depois do outro sair o semaforo fica verde, e outra pessoa já pode entrar.
 
kanguru disse:
hmmm como alterarias duma forma geral para o porteiro deixar entrar por exemplo 10 gajos?
ai tens de ter um semaforo inicializado a 10.(tipo com um vector).. e vais decrementando a medida ke vao entrando e incrementando a medida ke vai saindo
 
E se não souber o tamanho de inicio? uma das koisas do projecto é:
- um nr indefinido de processos estão à espera da ordem de um principal
- o principal dá a ordem e os processos fazem tudo
- quando terminam todos os processos, o principal faz outra coisa qqr.

Neste momento arranjei uma maneira "ao desenrasca" em que uso um metodo que não me parece o ideal:
uso uma opção que vi no man do semops em que o semaforo "deixa passar" se estiver a 0, e assim fico com um sem binário facil de controlar. Mas o problema é que nas aulas aprende-se o contrário e não tou a ver como fazer ao contrário :|
 
kanguru disse:
E se não souber o tamanho de inicio? uma das koisas do projecto é:
- um nr indefinido de processos estão à espera da ordem de um principal
- o principal dá a ordem e os processos fazem tudo
- quando terminam todos os processos, o principal faz outra coisa qqr.

Neste momento arranjei uma maneira "ao desenrasca" em que uso um metodo que não me parece o ideal:
uso uma opção que vi no man do semops em que o semaforo "deixa passar" se estiver a 0, e assim fico com um sem binário facil de controlar. Mas o problema é que nas aulas aprende-se o contrário e não tou a ver como fazer ao contrário :|

so se for comum semaforo e + uma variavel de condição... mas essa veriavel teria de estar em memoria partilhada pra poder ser acedida por varios processos, ou seja era mais um caso de exclusao mutua ke terias de implementar...
mas tu tens a certeza ke o numero de processos com permisssao de entrada é dinâmico?
 
Sim, aquilo vai-se metendo processos a correr, os que calhar, e depois há um que dá ordem pa iniciarem, e por fim kuando todos acabarem esse principal faz outras coisas.

Podes me dar um exemplo de como fazer isso do semaforo e variavel? eu sei como por a variavel a memoria partilhada.

pensei em fazer algo do genero:
Código:
if(variavel == ze) 
assinalar(semaforo.init)

e os outros processos iriam usar o espera(semaforo.init), mas ao fazer espera aquilo decrementa e assim so pode entrar um processo na mesma. Não tou a ver como mando todos ao mesmo tempo avançarem.
 
se bem percebi as funções :
assinalar(semaforo.init)
espera(semaforo.init)
foram dadas pelos profs certo?
nao sei como elas funcionam no entando posso recomendar-te uma exelente bibliografia :D aki:
ESTG - Sistemas Operativos
tens ta as descrições de como isso funciona mmo a pata e como funciona a sinalização de varios processos ..
saca a parte de semaforos está exelente e tem la um exemplo parecido com o que keres
 
tks pela ajuda. Amanha vou ver esses pdfs.

Quanto às funções não sao bem dadas pelos profs, mas é o que eles usam nos exemplos e nas aulas, so que os exemplos que eles deram são todos binários e não é isso que preciso :)
 
Curiosamente aqui na EST-Setúbal o projecto de SO também é semáforos. Isso mete threads e tal. Ai o que vale é que é so pó semestre que vem. E podemos implementar o projecto na linguagem que quisermos (normalmente é C# ou Java).
 
Pois, a mim o projecto é sobre mta m*rda, semaforos, sockets, mailboxs, pipes, sinais etc, mas pa começar tenho so a parte dos semáforos. Os vossos pdfs tão porreiros, tem o codigo o as coisas explicadas. A minha cadeira é um bocado mal dada, os acetatos têm uns topicos e algum codigo, nada explicado. E as aulas são às 8 da manhã que um gajo nem fixa nada.
 
kanguru disse:
Pois, a mim o projecto é sobre mta m*rda, semaforos, sockets, mailboxs, pipes, sinais etc, mas pa começar tenho so a parte dos semáforos. Os vossos pdfs tão porreiros, tem o codigo o as coisas explicadas. A minha cadeira é um bocado mal dada, os acetatos têm uns topicos e algum codigo, nada explicado. E as aulas são às 8 da manhã que um gajo nem fixa nada.
por acaso aki na ESTG essas cadeiras são mto bem dadas... e fica-se a perceber as coisas, os pdf's e as listagem de codigo tb estão simples de perceber.. este ano tb andamos a dar semaforos e threads mas em Sistemas Distribuidos e Paralelos... é mto mais fixe, mete isso tudo e muito mais, vamos fazer um servidor em C, e depois clientes em java ... vai ser altamente :D:001:
 
Boas. Continuo com o projecto, agora ando um bocado enrascado com mapeamento de ficheiro em memoria.

Tenho o ficheiro com o seguinte formato:
quantidade alimento

estilo:
1 banana
10 ananas
1000 arroz

etc, e ao mapear o ficheiro obtive uma string que corresponde ao ficheiro todo. Ora agora qual a forma mais eficiente de obter a quantidade e o nome?

Optei por definir um tamanho fixo para cada linha e assim leio por exemplo 20 em 20 caracteres e daí saco o numero e defino o resto como a string. Mas isto parece-me pouco eficiente pois a string fica com os espaços até preencher os 20 caracteres.

Alguma ideia luminosa?
 
kanguru disse:
Conhecem alguma funçao estilo sscanf mas que tenha um limite de bytes a ler?

while ((read = getline (&line, &len, file)) != -1) {

linha = (char *) malloc (strlen (line) + 1);
strcpy(linha,line);

assim poes o ke les do getline na variavel linha, alocada dinamicamente...

mas nada que um "man getline" n te explique melhor :)
 
Back
Topo