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

C + Semaforos

Discussão em 'Programação' iniciada por kanguru, 27 de Outubro de 2005. (Respostas: 29; Visualizações: 4315)

  1. kanguru

    kanguru [email protected] 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.
     
  2. 777

    777 Power Member

    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
     
  3. kanguru

    kanguru [email protected] Member

    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 :)
     
  4. Pluster

    Pluster Power Member

    vou tentar dar uma olhada....
     
  5. manta

    manta Power Member

    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".
     
  6. kanguru

    kanguru [email protected] Member

    portanto, o fumador e tabacaria controlam os semaforos entre eles, e o auxiliar serve para controlar o estado das variaveis globais?
     
  7. manta

    manta Power Member

    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.
     
  8. kanguru

    kanguru [email protected] Member

    hmmm como alterarias duma forma geral para o porteiro deixar entrar por exemplo 10 gajos?
     
  9. acrobat

    acrobat Power Member

    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
     
  10. kanguru

    kanguru [email protected] Member

    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 :|
     
  11. acrobat

    acrobat Power Member

    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?
     
  12. kanguru

    kanguru [email protected] Member

    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.
     
  13. acrobat

    acrobat Power Member

    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
     
  14. kanguru

    kanguru [email protected] Member

    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 :)
     
  15. Sandman

    Sandman Power Member

    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).
     
  16. kanguru

    kanguru [email protected] Member

    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.
     
  17. acrobat

    acrobat Power Member

    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:
     
  18. kanguru

    kanguru [email protected] Member

    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?
     
  19. kanguru

    kanguru [email protected] Member

    Conhecem alguma funçao estilo sscanf mas que tenha um limite de bytes a ler?
     
  20. acrobat

    acrobat Power Member

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

Partilhar esta Página